2011-01-28 87 views
6

我使用https://github.com/cakebaker/scss-syntax.vim來語法突出顯示SCSS(或SASS)vim上的文件,它非常適合語法高亮顯示。但是,該插件沒有附帶縮進文件,因此無法寫入縮進文件。如何在基於大括號的vim中定義縮進?

我想設置縮進看起來像這樣:

enter image description here

但是,如果我做gg=G,我得到:

enter image description here

我懷疑它不瞭解基於大括號的嵌套縮進。我嘗試的

set cindent

set nocindent

set autoindent

set smartindent

所有不同的組合,並試圖從Tab key == 4 spaces and auto-indent after curly braces in Vim使用的代碼,包括

set tabstop=2

set shiftwidth=2

set expandtab

...但嵌套括號縮進似乎永遠不會工作。

我相信我可能想要編寫一個自定義縮進文件,而我所需要的只是基於帶嵌套層的花括號的縮進。我應該怎麼做呢?如果某人有類似語法的文件類型的縮進文件,那也會很好。

回答

10

這是一個基於內置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是你的文件類型(與路徑替換~/.vimvimfiles如果你使用的是Windows。

您也可能想在文件的開頭要堅持這(但前提是沒有可能首先被加載一些其他縮進聲明):

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

這工作就像一個魅力感謝您這麼快的回答 – chibicode 2011-01-28 15:27:18