2011-01-28 14 views
6

Używam https://github.com/cakebaker/scss-syntax.vim do podświetlania składni SCSS (lub SASS) na plikach vim, który działa bardzo dobrze na podświetlanie składni. Jednak wtyczka nie jest dostarczana z plikiem wcięć i ma problem z jej napisaniem.Jak zdefiniować wcięcia w vim na podstawie nawiasów klamrowych?

Chciałbym ustawić wcięcie wyglądać tak:

enter image description here

Jeśli jednak zrobić gg=G, otrzymuję:

enter image description here

Podejrzewam, że nie robi zrozumienie zagnieżdżonego wcięcia na podstawie nawiasów klamrowych. Próbowałem wszystkie różne kombinacje

set cindent

set nocindent

set autoindent

set smartindent

i próbował użyć kodu z Tab key == 4 spaces and auto-indent after curly braces in Vim, w tym

set tabstop=2

set shiftwidth=2

set expandtab

... ale zagnieżdżone szelki wciąć nie wydaje się działać.

Wierzę, że mógłbym napisać niestandardowy plik wcięcia, a wszystko, czego potrzebuję, to wcięcie oparte na nawiasach klamrowych z poziomami zagnieżdżonymi. Jak powinienem to zrobić? Jeśli ktoś ma plik z wcięciem dla typów plików o podobnej składni, będzie to również świetne.

Odpowiedz

10

To szybki hack, oparty na wbudowanym kodzie wcięcia perl (w indent/perl.vim). Mam nadzieję, że możesz go użyć, aby uzyskać to, co chcesz robić. Zobacz bardziej szczegółowe komentarze w kodzie wcięcia perl lub innym jednym z plików w katalogu wcięcia, aby uzyskać więcej szczegółów.

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 

Zapisz ten plik jako ~/.vim/indent/something.vim gdzie something jest twój typ pliku (zastąpić ~/.vim ze ścieżką do vimfiles jeśli jesteś na Windows.

kupili także trzymać to na początku pliku (ale tylko wtedy, gdy nie ma innego tiret deklaracji, które mogą być ładowane pierwszy):

" Only load this indent file when no other was loaded. 
if exists("b:did_indent") 
    finish 
endif 
let b:did_indent = 1 
+0

to działało jak czar Dziękuję za tak szybką odpowiedź – chibicode

+0

Ty, Panie, są niesamowite !! Ten zapisany.. mój dzień! –

Powiązane problemy