2012-06-10 41 views
22

私はvim-golangプラグインでvimを使っています。このプラグインにはa function called :Fmtが付属しており、コマンドライン実行ファイルgofmtを使用してソースコードを「再フォーマット」します。vim - 保存時にgolangのソースコードを自動的にフォーマットする

私はファイルを保存するたびに:Fmt関数を呼び出すので、連続的に再フォーマットされます。私はこれがautocmd指示で行われるべきだと思います。しかし、私は2つの疑問があります:

  1. 私は関数を実行する方法を見つけることができませんでした。私はautmmd行の最後にFmtと:Fmtを書こうとしましたが、うまくいきませんでした。私は "コール"のような何かが恋しいと思う。
  2. ファイルタイプが「go」のファイルを保存するときにのみこれを実行します。私はこれらの2つの条件をどのように組み合わせるのか分かりません。ファイルタイプに応じて変数を有効にすることができます。ファイルを保存するときはいつでも、末尾のスペースを削除するなど、

だから、これは私がこれまで持っているものです。

" 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 

答えて

54

FileTypeイベントがバッファに書き込むには発生しません。 BufWritePreが正しいですが、ファイルパターンを指定する必要があります。 *.go

autocmd BufWritePre *.go Fmt 

唯一の欠点は、これがファイルタイプを行くの検出を複製ということです。あなたはFileTypeイベントにフックすることによって、これを委任した後、特別な<buffer>パターンを用いて、各移動バッファの書式のautocmdを定義することができます。

autocmd FileType go autocmd BufWritePre <buffer> Fmt 

これがあればファイルタイプがこれまでに複数回設定されますという欠点を持っている、あなたは、書式設定を何度も実行します。これはカスタム:augroupで解決できますが、実際は複雑になりました。または、これがGoバッファ用の唯一のBufWritePre autocmdであることが本当に確かであれば、:autocmd! BufWritePre ...!)を使用できます。

+0

うわー、信じられないほど広範な答え、ありがとう!私は2番目のオプションを使用して終了しました - 私はファイルタイプをまったくリセットするつもりはありません。ありがとう! – kikito

+1

'Fmt'コマンドからの通常の出力が必要な場合は、' silent'を追加することができます( '' X lines filtered''が表示されたままです)。 'autocmd FileType go autocmd BufWritePre サイレントFmt' – djd

+1

' vim -gocode'プラグインhttps://github.com/Blackrush/vim-gocode/blob/master/ftplugin/go/fmt.vim#L20 –

1

折り目を使用すると、gofmtはこれらを上に上げます(閉じた折り畳みを開き、開いた折り畳みを閉じます)。 mkviewと::loadViewメソッドは(ウィッヒ保存し、折り目を復元)何らかの理由でカーソルを移動し、彼らはそれがために、カーソル位置をマークするために、Zレジスタを使用して、次の自動コマンド

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

を使用する場合など折り目を維持するために 。

関連する問題