, поэтому в 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'
return indentlvl * shiftwidth()
, так что, как вы можете видеть здесь, это очень мощный вариант, с которым вы можете многое сделать. Я рекомендую прочитать статью на vimways
большая часть материала, который я здесь скопировал, с документацией vim и со статьей, так что вся заслуга принадлежит vim-do c и Акселю Форсману автору статьи
или вы можете использовать плагин
или
, вы можете скопировать туда функцию отступа и сделать некоторые изменения: 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 =~# '\[$' && !(currentLine =~# '^\s*\]')
let indentTo = indent(v:lnum - 1) + &shiftwidth
endif
return indentTo
endfunction