2012-06-10 8 views
22

Sto utilizzando vim con il plug-in vim-golang. Questo plugin viene fornito con a function called :Fmt che "riformatta" il codice sorgente utilizzando gofmt, un eseguibile da riga di comando.vim - formattazione automatica del codice sorgente golang quando si salva

Desidero richiamare la funzione: Fmt ogni volta che salvi il file, quindi viene continuamente riformattato. Penso che questo dovrebbe essere fatto con una direttiva autocmd. Ma ho due dubbi:

  1. Non riesco a trovare un modo per eseguire la funzione. Ho provato a scrivere Fmt e: Fmt alla fine della riga autocmd, ma non sembra funzionare. Penso di perdere qualcosa, come "call".
  2. Voglio che questo accada solo quando si salva un file di tipo file 'vai'. Non so come combinare queste due condizioni: posso attivare variabili a seconda del tipo di file e posso fare piccole cose, come rimuovere gli spazi finali, ogni volta che un file viene salvato, ma separatamente.

Quindi questo è quello che ho finora:

" 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 

risposta

54

L'evento FileType non sparare sul buffer scrive; BufWritePre è quello corretto, ma è necessario fornire un modello di file, ad es. *.go:

autocmd BufWritePre *.go Fmt 

L'unico lato negativo è che questo duplica la rilevazione della andare tipo di file. Si potrebbe delegare questo agganciando nell'evento FileType, e quindi definire l'autocmd formattazione per ogni buffer Go utilizzando lo speciale <buffer> modello:

autocmd FileType go autocmd BufWritePre <buffer> Fmt 

Questo ha lo svantaggio che se il tipo di file sempre viene impostata più volte, è eseguirò anche la formattazione più volte. Questo potrebbe essere risolto tramite un custom :augroup, ma ora diventa davvero complesso. Oppure, se sei davvero sicuro che questo è l'unico autocmd BufWritePre per i buffer Go, è possibile utilizzare :autocmd! BufWritePre ... (con un !).

+0

Wow, risposta incredibilmente ampia, grazie mille! Ho finito per utilizzare la seconda opzione: non ho intenzione di resettare il tipo di file. Grazie! – kikito

+1

Si potrebbe voler aggiungere 'silent' se è necessario un output normale dal comando' Fmt' (ho continuato a vedere 'righe X filtrate '): ' autocmd FileType go autocmd BufWritePre silent Fmt' – djd

+1

È già in 'vim -gocode' plugin https://github.com/Blackrush/vim-gocode/blob/master/ftplugin/go/fmt.vim#L20 –

1

Se si usano le pieghe, gofmt lo incasina (apre le pieghe chiuse, chiude quelle aperte). Per mantenere pieghe come dove utilizzare la seguente autocomando

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

Esso utilizza il registro z per marcare la posizione del cursore perché: mkview e: loadview (goduto salva e ripristina le pieghe) spostare il cursore per qualche ragione.

Problemi correlati