Как установить автоиндент после открытой скобки

#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