#vim
Вопрос:
Когда я вводлю открытую скобку, за которой следует новая строка, я бы хотел, чтобы курсор автоматически указывал одно значение вкладки-так же, как это делается с открытой фигурной скобкой или открытой квадратной скобкой. По какой-то причине он делает отступы между двумя значениями табуляции.
Я особенно заинтересован в том, чтобы это работало должным образом для файлов .dart.
Вот мой .vimrc:
set tabstop=2
set softtabstop=2
set shiftwidth=2
set autoindent
set expandtab
Что я упускаю? Спасибо.
Комментарии:
1. Вероятно, зависит от типа файла. Кстати, рекомендуется не связываться с tabstop (он определяет ширину отображения реального символа вкладки, который вы не всегда можете контролировать за пределами vim. Лучше оставить это в покое, чтобы вы всегда видели вкладки одинаковой ширины и использовали пробелы для выравнивания, если необходимо)
2. Спасибо за комментарий. Удалена остановка табуляции, но по-прежнему возникает та же проблема. Особенно заинтересован в том, чтобы это работало для файлов .dart.
3. Вы могли бы определить эту карту:
inoremap <silent> (<cr> (<cr>)<up><end><cr><tab>
Ответ №1:
таким образом, в vim есть несколько вариантов отступа ( пожалуйста, смотрите :h C-indenting
для лучшего понимания), также есть отличная статья о vimways https://vimways.org/2019/indentation-without-dents/ ( настоятельно рекомендуется)
1. smartindent
Это самый простой из них, он мало что делает. :h 'smartindent'
Отступ вставляется автоматически:
- После строки, заканчивающейся на» {«.
- После строки, начинающейся с ключевого слова из «cinwords».
- Перед строкой, начинающейся с»} » (только с помощью команды «O»).
2. cindent
посмотрите :h cindent
, что он может перезаписать smartindent
то, что вы сейчас испытываете ( что вы хотите изменить).
3. indentexpr
теперь это реальная сделка, она мощная, и большинство подключаемых устройств используют эту опцию, теперь реальный вопрос в том, как ее использовать
что-то вроде этого
setlocal indentexpr=GetMyCustomIndent()
" Only define the function once
if exists("*GetMyCustomIndent") | finish | endif
function! GetMyCustomIndent()
return 0
endfunction
вы можете создать свою функцию, которую vim вызовет, чтобы узнать, сколько отступов ей нужно вставить
Результатом должно быть количество пробелов отступа (или -1 для сохранения текущего отступа). Чтобы выполнить выбор пользователя о
'shiftwidth'
возвратеindentlvl * shiftwidth()
так что, как вы можете видеть здесь, это очень мощный вариант, с помощью которого вы можете многое сделать. Я рекомендую прочитать статью о vimways
большую часть материала здесь я скопировал с документацией vim и из статьи, так что полная заслуга принадлежит vim-doc и Акселю Форсману, автору статьи
или вы можете использовать плагин
или
вы можете скопировать туда функцию отступа и внести некоторые изменения :p https://github.com/dart-lang/dart-vim-plugin/blob/master/indent/dart.vim
function! DartIndent()
" Default to cindent in most cases
let indentTo = cindent(v:lnum)
let previousLine = getline(prevnonblank(v:lnum - 1))
let currentLine = getline(v:lnum)
" Don't indent after an annotation
if previousLine =~# '^s*@.*
let indentTo = indent(v:lnum - 1)
endif
" Indent after opening List literal
if previousLine =~# '[
amp;amp; !(currentLine =~# '^s*]')
let indentTo = indent(v:lnum - 1) amp;shiftwidth
endif
return indentTo
endfunction