Как я могу определить отступ в VIM на основе вьющихся скоб?
-
26-10-2019 - |
Вопрос
я использую https://github.com/cakebaker/scss-syntax.vim Для выделения синтаксиса SCSS (или же Нахем) файлы на VIM, который очень хорошо работает для выделения синтаксиса. Тем не менее, плагин не поставляется с файлом отступления, и у меня возникают проблемы с написанием его.
Я хотел бы настроить отступ, чтобы выглядеть так:
Однако, если я сделаю gg=G
, Я получил:
Я подозреваю, что он не понимает вложенного отступления на основе бректей. Я попробовал все различные комбинации
set cindent
set nocindent
set autoindent
set smartindent
и попытался использовать код из Ключ TAB == 4 пространства и автоматические после вьющихся скобок в VIM , включая
set tabstop=2
set shiftwidth=2
set expandtab
... но вложенные брекеты, отступая, никогда не работает.
Я полагаю, что я мог бы захотеть написать пользовательский файл отступления, и все, что мне нужно, - это отступление на основе брекетов с вложенными уровнями. Как мне это сделать? Если у кого -то есть файл отступления для филетипов с аналогичным синтаксисом, это также будет здорово.
Решение
Это быстрый взлом, основанный на встроенном коде вентации Perl (в indent/perl.vim
) Надеюсь, вы сможете использовать его, чтобы получить то, что хотите. См. Более подробные комментарии либо в коде в сфере перла, либо в другом из файлов в каталоге отслаивания для получения более подробной информации.
setlocal indentexpr=GetMyIndent()
function! GetMyIndent()
let cline = getline(v:lnum)
" Find a non-blank line above the current line.
let lnum = prevnonblank(v:lnum - 1)
" Hit the start of the file, use zero indent.
if lnum == 0
return 0
endif
let line = getline(lnum)
let ind = indent(lnum)
" Indent blocks enclosed by {}, (), or []
" Find a real opening brace
let bracepos = match(line, '[(){}\[\]]', matchend(line, '^\s*[)}\]]'))
while bracepos != -1
let brace = strpart(line, bracepos, 1)
if brace == '(' || brace == '{' || brace == '['
let ind = ind + &sw
else
let ind = ind - &sw
endif
let bracepos = match(line, '[(){}\[\]]', bracepos + 1)
endwhile
let bracepos = matchend(cline, '^\s*[)}\]]')
if bracepos != -1
let ind = ind - &sw
endif
return ind
endfunction
Сохраните этот файл как ~/.vim/indent/something.vim
куда something
Ваш тип файла (замените ~/.vim
с пути к vimfiles
Если вы на Windows.
Вы также можете придать это в начале файла (но только если нет никакого другого объявления о отступе, которая может быть загружена в первую очередь):
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1