Pregunta

Al sangrar código java con anotaciones, vim insiste en sangrar así:

@Test
    public void ...

Quiero que la anotación esté en la misma columna que la definición del método pero parece que no puedo encontrar una manera de decirle a vim que haga eso, excepto que tal vez use una expresión de sangría pero no estoy seguro de poder usar que junto con el cindent regular.

editar: el complemento de tipo de archivo ya estaba activado. Me confundí un poco acerca de la sangría de los complementos. La respuesta aceptada puede ser un poco intrincada, pero también me funciona.

¿Fue útil?

Solución

Editar: no puedo eliminar mi propia respuesta porque ya ha sido aceptada, pero la respuesta de @ pydave parece ser la Mejor solución (más robusta).


Probablemente debería usar el archivo de sangría para el Tipo de archivo java (en lugar de usar cindent) al establecer la sangría en el tipo de archivo en .

Dicho esto, el archivo de sangrado que viene con el Vim 7.1 de mi distribución de Linux (mirando el vim svn actual, esto todavía es cierto para 7.2) todavía no cuenta para las anotaciones. Por lo tanto, copié /usr/share/vim/vim71/indent/java.vim (vea https://vim.svn.sourceforge.net/svnroot/vim/branches/vim7.1/runtime/indent/java.vim ) a ~ / .vim / indent / java.vim y agregó las siguientes líneas justo antes del final:

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

No estoy seguro de si esto rompe alguna de las otras muescas, pero funciona para mí.

let theIndent = indent(lnum) endif

No estoy seguro de si esto rompe alguna de las otras muescas, pero funciona para mí.

Otros consejos

No debes modificar la configuración de vim incorporada. Sus cambios pueden desaparecer después de una actualización del paquete. Si lo copia en su .vim, no obtendrá ninguna corrección de errores de sangría Java.

En su lugar, coloque lo 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*@.*

De esa manera carga la sangría java de stock y solo modifica la sangría para eliminar las sangrías de anotación.

let theIndent = indent(lnum) endif return theIndent endfunction setlocal indentexpr=GetJavaIndent_improved()

De esa manera carga la sangría java de stock y solo modifica la sangría para eliminar las sangrías de anotación.

Encontré la sugerencia de pydave casi lo que quería, pero quería esto:

@Override
public void ...

y esto:

@Override public void ...

así que reemplacé las expresiones regulares (según las de 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top