巻き毛装具に基づいてVIMのインデントを定義するにはどうすればよいですか?
-
26-10-2019 - |
質問
私が使う https://github.com/cakebaker/scss-syntax.vim 構文の強調表示用 SCSS (また サス)VIM上のファイル。これは、構文の強調表示に非常に適しています。ただし、プラグインにはインデントファイルが付属しておらず、書くのに苦労しています。
インデントを次のように設定したいと思います:
しかし、もしそうなら gg=G
, 、わかります:
ブレースに基づいて、ネストされたインデントを理解していないのではないかと思います。さまざまな組み合わせをすべて試しました
set cindent
set nocindent
set autoindent
set smartindent
からコードを使用しようとしました TABキー== VIMの巻き毛装具の後の4つのスペースとオートインデント 、 含む
set tabstop=2
set shiftwidth=2
set expandtab
...しかし、ネストされたブレースインデントは決して機能しないようです。
カスタムインデントファイルを書きたいと思うかもしれませんが、必要なのはネストされたレベルのブレースに基づいたインデンテーションだけです。どうすればいいですか?誰かが同様の構文を持つフィルタイプのインデントファイルを持っている場合、それも素晴らしいでしょう。
解決
これは、組み込みのPerlインデンテーションコードに基づいたクイックハックです( indent/perl.vim
)。うまくいけば、あなたがやりたいことを手に入れるためにそれを使うことができます。詳細については、PerlインデントコードまたはIndentディレクトリの別のファイルのいずれかのより詳細なコメントを参照してください。
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