2011-01-28 12 views
6

Io uso https://github.com/cakebaker/scss-syntax.vim per l'evidenziazione della sintassi SCSS (o SASS) file su vim, che funziona molto bene per l'evidenziazione della sintassi. Tuttavia, il plug-in non viene fornito con un file di rientro e non riesco a scriverne uno.Come si definiscono i rientri in vim in base alle parentesi graffe?

vorrei impostare il rientro a guardare come questo:

enter image description here

Tuttavia, se lo faccio gg=G, ottengo:

enter image description here

ho il sospetto che non è così capire il rientro annidato basato su parentesi graffe. Ho provato tutte le diverse combinazioni di

set cindent

set nocindent

set autoindent

set smartindent

e cercato di utilizzare il codice Tab key == 4 spaces and auto-indent after curly braces in Vim, compresi

set tabstop=2

set shiftwidth=2

set expandtab

... ma le parentesi annidate trattino non sembra funzionare.

Credo che potrei voler scrivere un file di rientro personalizzato e tutto ciò di cui ho bisogno è un rientro basato su parentesi con livelli nidificati. Come dovrei andare su questo? Se qualcuno ha un file di indentazione per i tipi di file con sintassi simile, sarà altrettanto utile.

risposta

10

Questo è un attacco rapido, basato sul codice di indentazione perl incorporato (in indent/perl.vim). Spero che tu possa usarlo per ottenere ciò che vuoi fare. Vedi i commenti più dettagliati nel codice di indentazione perl o in uno dei file nella directory indent 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 
+0

Il tutto ha funzionato come un fascino Grazie per una risposta così rapida – chibicode

+0

Lei, signore, sono impressionanti !! Questo salvati.. mio giorno! –

Problemi correlati