Ответ 1
Кто-то может знать лучше, чем я, но здесь первый удар: Да, отступы могут быть настроены. Если ваш файл является признанным языком "filetype", он отступается с использованием правил/кода в соответствующем *.vim файле, найденном в каталоге /indent (e..g, vim/vim72/indent).
Вам нужно будет изменить код, предоставляющий отступ в вашем многострочном массиве, который может включать добавление нового блока if в раздел, который создает отступы, с выражением if, которое соответствует всем и только первым строкам вашего многострочного массивы. Вы должны иметь представление о том, как все работает, исследуя файлы в каталоге /indent.
UPDATE: здесь мода на файл отпечатка c.vim, который должен быть близок к тому, что вы хотите, кажется, работает отлично для меня. Это весь файл:
" Last Change: 2005 Mar 27
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
" C indenting is built-in, thus this is very simple
setlocal cindent
setlocal indentexpr=GetMyCIndent()
function! GetMyCIndent()
let theIndent = cindent(v:lnum)
let m = matchlist(getline(v:lnum - 1),'^\S\+\s\+\S\+\s*=\s*{\s*{\ze.*}[^}*]')
let m2 = matchlist(getline(v:lnum - 1),'}.*}')
if (!empty(m)) && (empty(m2))
let theIndent = len(m[0]) - 1
endif
return theIndent
endfunction
let b:undo_indent = "setl cin<"
Единственная проблема (я думаю) с этим кодом заключается в том, что он даст такой же отступ массиву массивов, который будет завершен в одной строке. Чтобы избежать изменения шаблона для соответствия только тогда, когда на линии есть одна закрывающая скобка, а не две. (Кроме того, вы могли бы просто сделать отдельный тест.) Это займет немного финализации, но не должно быть слишком сложно. (Кроме того, если вы расширяете текущий шаблон, вам нужно использовать маркер \ze в шаблоне, чтобы пометить конец совпадения, который вы хотите сохранить в m [0], который будет после второго открывающего скобки, который является последним символом в текущем шаблоне.) Я ПЕРЕСМОТРЕННЫЙ КОД ВЫШЕ ДЕЛАТЬ ОТДЕЛЬНЫМ ИСПЫТАНИЕМ (с использованием переменной m2), ЧТО Я ДУМАЮ, РЕШЕНО ПРОБЛЕМУ. Не уверен, какие другие мелкие детали нужно позаботиться.
Одним из вариантов было бы сказать, что вы хотите это отступы, когда в строке есть как минимум две открывающие скобки, а последняя строка char - это запятая. Это действительно лучший способ, поскольку он позволяет вам иметь пары, триплеты и т.д. Элементов в строке:
let m = matchlist(getline(v:lnum - 1),'^\S\+\s\+\S\+\s*=\s*{\s*{\ze.*,\s*$')
if !empty(m)
let theIndent = len(m[0]) - 1
endif