Как установить автоиндент после открытых скобок - PullRequest
7 голосов
/ 12 января 2020

Когда я набираю открывающую скобку, за которой следует новая строка, я бы хотел, чтобы курсор автоматически указывал одно значение табуляции - так же, как это делается с открытой фигурной скобкой или открытой квадратной скобкой. По какой-то причине он выравнивает два значения табуляции.

Мне особенно интересно, как это работает для файлов .dart.

Вот мой .vimr c:

set tabstop=2
set softtabstop=2
set shiftwidth=2
set autoindent
set expandtab

Чего мне не хватает? Спасибо.

1 Ответ

3 голосов
/ 22 января 2020

, поэтому в 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
...