Come faccio a definire i rientri in vim sulla base di parentesi graffe?
-
26-10-2019 - |
Domanda
https://github.com/cakebaker/scss-syntax.vim per evidenziare la sintassi SCSS (o SASS ) file sul vim, che funziona molto bene per l'evidenziazione della sintassi. Tuttavia, il plugin non viene fornito con un file di rientro e sto avendo problemi a scrivere uno.
vorrei impostare il rientro a guardare in questo modo:
Tuttavia, se lo faccio gg=G
, ottengo:
Ho il sospetto che non capisce trattino nidificato sulla base di parentesi graffe. Ho provato tutte le diverse combinazioni di
set cindent
set nocindent
set autoindent
set smartindent
e ha cercato di utilizzare il codice tasto Tab == 4 spazi e auto-trattino dopo la parentesi graffe in Vim , tra cui
set tabstop=2
set shiftwidth=2
set expandtab
... ma le parentesi annidate come rientro non sembra mai di lavoro.
Credo che potrei voler scrivere un file di rientro personalizzato, e tutti hanno bisogno I è indentazione basa sulla bretelle con livelli nidificati. Come devo fare per questo? Se qualcuno ha un file di rientro per i tipi di file con sintassi simile, che sarà grande come bene.
Soluzione
Questo è un trucco veloce, basato sul built-in codice indentazione perl (in indent/perl.vim
). Speriamo che si può utilizzare per ottenere ciò che si vuole fare. Vedi le osservazioni più dettagliate sia nel codice Perl indentazione o nell'altro uno dei file nella directory trattino per maggiori dettagli.
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
Salva il file come ~/.vim/indent/something.vim
dove something
è il tipo di file (sostituire ~/.vim
con il percorso vimfiles
se siete su Windows.
Si potrebbe anche voler attaccare questo all'inizio del file (ma solo se non c'è qualche altra dichiarazione trattino che potrebbe essere caricato per la prima):
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1