2008-10-14 17 views
19

Cuando sangría al código Java con anotaciones, vim insiste en sangría así:¿Cómo hago las anotaciones Java de vim indent correctamente?

@Test 
    public void ... 

Quiero la anotación de estar en la misma columna que la definición del método, pero me parece que no puede encontrar una manera de decirle a vim para hacer eso, excepto tal vez usando una expresión de sangría, pero no estoy seguro de si puedo usar eso junto con el cindent regular.

editar: El plugin de tipo de archivo ya estaba activado Me confundí un poco acerca de la sangría de complementos. La respuesta aceptada puede ser un poco hackosa pero también funciona para mí.

Respuesta

9

Editar: No puedo eliminar mi propia respuesta porque ya se ha aceptado, pero @pydave's answer parece ser la mejor solución (más robusta).


Probablemente deberías estar usando el archivo de sangría para java FileType (en lugar de usar cindent) configurando filetype plugin indent on.

Dicho esto, el archivo de sangría que viene con el Vim 7.1 de mi distribución de linux (mirando el svn vim actual esto sigue siendo cierto para el 7.2) aún no tiene en cuenta las anotaciones. Por lo tanto, he copiado /usr/share/vim/vim71/indent/java.vim (ver https://vim.svn.sourceforge.net/svnroot/vim/branches/vim7.1/runtime/indent/java.vim) a ~/.vim/indent/java.vim y añadirán las siguientes líneas justo antes del final:

let lnum = prevnonblank(v:lnum - 1) 
let line = getline(lnum) 
if line =~ '^\s*@.*$' 
    let theIndent = indent(lnum) 
endif 

no estoy seguro de si este no cumple con alguna de las otras muescas, pero funciona para mí.

+0

Esto no funcionó para mí, lo agregué justo al final. Estoy usando vim 7.2 ¿Qué estoy haciendo mal? – Naseer

+0

: facepalm: funcionó ahora - Lo estaba agregando al final y no al final de la función: D ¡Gracias! – Naseer

+0

Esto funcionó para mí también, gracias. – Lyle

18

No debe modificar la configuración de vim incorporada. Sus cambios podrían desaparecer después de una actualización del paquete. Si lo copias a tu .vim, entonces no obtendrás correcciones de errores de sangría de Java.

En su lugar, poner el siguiente en un nuevo archivo llamado ~/.vim/after/indent/java.vim

function! GetJavaIndent_improved() 
    let theIndent = GetJavaIndent() 
    let lnum = prevnonblank(v:lnum - 1) 
    let line = getline(lnum) 
    if line =~ '^\s*@.*$' 
     let theIndent = indent(lnum) 
    endif 

    return theIndent 
endfunction 
setlocal indentexpr=GetJavaIndent_improved() 

De esta manera se carga el guión de Java y sólo modifica el guión para eliminar los guiones de anotación.

+0

Esto funciona para mí. Thx. – AMing

1

me encontré con la sugerencia de pydave casi lo que quería, pero quería esto:

@Override 
public void ... 

y esto:

@Override public void ... 

así que sustituye la expresión regular (según la pydave, lugar en ~/.vim/after/indent/java.vim):

setlocal indentexpr=GetJavaIndent_improved() 

function! GetJavaIndent_improved() 
    let theIndent = GetJavaIndent() 
    let lnum = prevnonblank(v:lnum - 1) 
    let line = getline(lnum) 
    if line =~ '^\s*@[^{]*$' 
     let theIndent = indent(lnum) 
    endif 

    return theIndent 
endfunction 
Cuestiones relacionadas