2012-06-10 109 views
22

我使用vim和vim-golang插件。這個插件附帶a function called :Fmt,它使用gofmt這個命令行可執行文件「重新格式化」源代碼。vim - 保存時自動格式化golang源代碼

我想在每次保存文件時調用:Fmt函數,因此它會不斷重新格式化。我認爲這應該用autocmd指令完成。但我有兩個疑問:

  1. 我找不到執行該功能的方法。我嘗試在autocmd行的末尾寫入Fmt和:Fmt,但它似乎不起作用。我想我錯過了一些東西,比如「打電話」。
  2. 我只想在保存文件類型爲'go'的文件時發生這種情況。我不知道如何結合這兩個條件 - 我可以根據文件類型激活變量,並且我可以做一些小事,例如刪除尾隨空格,只要保存文件,但是分開。

所以這是我到目前爲止有:

" 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 FileType go autocmd BufWritePre <buffer> Fmt 

這樣做的缺點是,如果文件類型不斷被設定多次,你我也會多次運行格式化。這可以通過自定義:augroup解決,但現在變得非常複雜。或者,如果您確定這是用於Go緩衝區的唯一BufWritePre autocmd,則可以使用:autocmd! BufWritePre ...(帶!)。

+0

哇,令人難以置信的廣泛的答案,非常感謝!我結束了使用第二個選項 - 我不打算重置文件類型。謝謝! – kikito

+1

如果你需要'Fmt'命令的普通輸出(我總是看到'X lines filtered'),你可能需要添加'silent': 'autocmd FileType go autocmd BufWritePre silent Fmt' – djd

+1

它已經在'vim -gocode'插件https://github.com/Blackrush/vim-gocode/blob/master/ftplugin/go/fmt.vim#L20 –

1

如果你使用摺疊,gofmt會破壞它們(打開關閉的摺疊,關閉打開的摺疊)。 爲了保持褶皺,因爲他們在那裏使用下面的自動命令

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

它使用的寄存器Z標記光標位置,因爲:mkview和:的loadView(至極保存和恢復倍)將光標移動由於某種原因。