2011-01-28 21 views
6

Yo uso https://github.com/cakebaker/scss-syntax.vim para resaltar la sintaxis SCSS (o SASS) archivos en vim, que funciona muy bien para el resaltado de sintaxis. Sin embargo, el complemento no viene con un archivo de sangrado y tengo problemas para escribir uno.¿Cómo se definen las sangrías en vim basadas en llaves?

me gustaría establecer la sangría a tener este aspecto:

enter image description here

Sin embargo, si lo hago gg=G, me sale:

enter image description here

Sospecho que no lo hace entender sangría anidada basada en llaves. He intentado todas las diferentes combinaciones de

set cindent

set nocindent

set autoindent

set smartindent

y trató de utilizar el código de Tab key == 4 spaces and auto-indent after curly braces in Vim, incluyendo

set tabstop=2

set shiftwidth=2

set expandtab

... pero los apoyos anidados guión no parece funcionar.

Creo que me gustaría escribir un archivo de sangría personalizado, y todo lo que necesito es una sangría basada en llaves con niveles anidados. ¿Cómo debo ir sobre esto? Si alguien tiene un archivo de sangría para tipos de archivos con sintaxis similar, también será genial.

Respuesta

10

Este es un truco rápido, basado en el código de sangría de perl incorporado (en indent/perl.vim). Con suerte, puede usarlo para obtener lo que quiere hacer. Consulte los comentarios más detallados en el código de sangría perl u otro de los archivos en el directorio de sangrado para obtener más detalles.

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 

Guardar archivo como ~/.vim/indent/something.vim donde something es el tipo de archivo (reemplace ~/.vim con la ruta a vimfiles si estás en Windows.

También puede ser que desee pegar esto en el inicio del archivo (pero sólo si no hay alguna otra declaración guión que podrían ser carga por primera vez):

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

Esto funcionó como un encanto Gracias por una respuesta tan rápida – chibicode

+0

, señor, son impresionantes !! Esta salvados.. ¡mi día! –

Cuestiones relacionadas