2012-06-10 14 views
22

Estoy usando vim con el complemento vim-golang. Este complemento viene con a function called :Fmt que "reformatea" el código fuente usando gofmt, un ejecutable de línea de comandos.vim - formato automático del código fuente de golang al guardar

Deseo invocar la función: Fmt cada vez que guardo el archivo, por lo que se vuelve a formatear continuamente. Creo que esto debería hacerse con una directiva autocmd. Pero tengo dos dudas:

  1. No he podido encontrar la manera de ejecutar la función. Intenté escribir Fmt y: Fmt al final de la línea autocmd, pero no pareció funcionar. Creo que extraño algo, como "llamar".
  2. Quiero que esto suceda solo al guardar un archivo de tipo de archivo 'ir'. No sé cómo combinar esas dos condiciones: puedo activar variables según el tipo de archivo, y puedo hacer cosas pequeñas, como eliminar espacios finales, cada vez que se guarda un archivo, pero por separado.

Así que esto es lo que tengo hasta ahora:

" I can set variables for go like this 
autocmd FileType go setlocal noexpandtab shiftwidth=4 tabstop=4 softtabstop=4 nolist 

" I can clean trailing spaces(conserving cursor position) on save like this 
autocmd BufWritePre * kz|:%s/\s\+$//e|'z 

" None of these worked: 
autocmd BufWritePre,FileType go Fmt 
autocmd BufWritePre,FileType go :Fmt 

Respuesta

54

El FileType caso no se dispara en el búfer escribe; BufWritePre es el correcto, pero debe proporcionar un patrón de archivo, p. *.go:

autocmd BufWritePre *.go Fmt 

El único inconveniente es que esto duplica la detección de la ir tipo de archivo. Se podría delegar esta enganchando en el caso FileType, y luego definir el autocmd formato para cada búfer Ir utilizando el especial <buffer> patrón:

autocmd FileType go autocmd BufWritePre <buffer> Fmt 

Esto tiene el inconveniente de que si el tipo de archivo siempre consigue el sistema varias veces, Ejecutará el formateo varias veces, también. Eso podría resolverse a través de un :augroup personalizado, pero ahora se vuelve realmente complejo. O bien, si realmente está seguro de que este es el único BufWritePre autocmd para los almacenamientos intermedios Go, puede usar :autocmd! BufWritePre ... (con un !).

+0

Guau, respuesta increíblemente extensa, ¡muchas gracias! Terminé usando la segunda opción: no tengo planeado restablecer el tipo de archivo. ¡Gracias! – kikito

+1

Es posible que desee agregar 'silent' si necesita una salida normal del comando' Fmt' (Seguí viendo 'X lines filtered'): ' autocmd FileType vaya autocmd BufWritePre Silencio Fmt' – djd

+1

Ya está en 'vim -scripts de código de Google https://github.com/Blackrush/vim-gocode/blob/master/ftplugin/go/fmt.vim#L20 –

1

Si usa pliegues, gofmt los ensucia (abre los pliegues cerrados, cierra los abiertos). Para mantener pliegues a medida que donde el uso de los siguientes AutoCommand

autocmd FileType go autocmd BufWritePre <buffer> execute "normal! mz:mkview\<esc>:Fmt\<esc>:loadview\<esc>`z" 

Utiliza el registro Z a la posición del cursor marcar porque: y mkview: loadView (wich guardar y restaura los dobleces) mueven el cursor por alguna razón.

Cuestiones relacionadas