2012-06-10 44 views
22

Tôi đang sử dụng vim bằng plugin vim-golang. Plugin này đi kèm với a function called :Fmt rằng "định dạng lại" mã nguồn bằng cách sử dụng gofmt, một dòng lệnh thực thi.vim - tự động định dạng mã nguồn golang khi lưu

Tôi muốn gọi hàm: Fmt mỗi khi tôi lưu tệp, vì vậy nó được định dạng lại liên tục. Tôi nghĩ rằng điều này nên được thực hiện với chỉ thị autocmd. Nhưng tôi có hai nghi ngờ:

  1. Tôi không thể tìm cách thực hiện chức năng. Tôi đã thử viết Fmt và: Fmt ở cuối dòng autocmd, nhưng nó dường như không hoạt động. Tôi nghĩ rằng tôi bỏ lỡ một cái gì đó, như "gọi".
  2. Tôi muốn điều này xảy ra chỉ khi lưu một tệp filetype 'go'. Tôi không biết cách kết hợp hai điều kiện đó - tôi có thể kích hoạt các biến tùy thuộc vào loại tệp và tôi có thể thực hiện các công cụ nhỏ, như xóa dấu cách, bất cứ khi nào tệp được lưu, nhưng được phân tách.

Vì vậy, đây là những gì tôi có cho đến nay:

" 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 

Trả lời

54

Sự kiện FileType không bắn vào đệm viết; BufWritePre là đúng, nhưng bạn cần cung cấp mẫu tệp, ví dụ: *.go:

autocmd BufWritePre *.go Fmt 

Nhược điểm duy nhất là điều này bản sao phát hiện của đi filetype. Bạn có thể ủy thác này bằng cách gắn vào sự kiện FileType, và sau đó xác định autocmd định dạng cho mỗi đệm Go bằng <buffer> mô hình đặc biệt:

autocmd FileType go autocmd BufWritePre <buffer> Fmt 

này có nhược điểm là nếu filetype bao giờ được đặt nhiều lần, bạn cũng sẽ chạy định dạng nhiều lần. Điều đó có thể được giải quyết thông qua một tùy chỉnh :augroup, nhưng bây giờ nó trở nên thực sự phức tạp. Hoặc, nếu bạn thực sự chắc chắn rằng đây là chỉ BufWritePre autocmd cho bộ đệm Đi, bạn có thể sử dụng :autocmd! BufWritePre ... (với số !).

+0

Wow, câu trả lời vô cùng rộng lớn, cảm ơn rất nhiều! Tôi đã kết thúc bằng cách sử dụng tùy chọn thứ hai - tôi không có kế hoạch đặt lại loại tệp nào cả. Cảm ơn! – kikito

+1

Bạn có thể muốn thêm 'im lặng' nếu bạn cần đầu ra bình thường từ lệnh' Fmt' (tôi tiếp tục thấy 'X dòng được lọc'): ' autocmd FileType go autocmd BufWritePre im lặng Fmt' – djd

+1

Nó đã có trong 'vim -gocode' plugin https://github.com/Blackrush/vim-gocode/blob/master/ftplugin/go/fmt.vim#L20 –

1

Nếu bạn sử dụng nếp gấp, gofmt sẽ làm lộn xộn những thứ này (nó sẽ mở các nếp gấp đóng, đóng các nếp gấp). Để giữ nếp gấp như họ nơi sử dụng autocommand sau

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

Nó sử dụng thanh ghi z để đánh dấu vị trí con trỏ vì: mkview và: loadview (mà lưu và phục hồi các nếp gấp) di chuyển con trỏ đối với một số lý do.

Các vấn đề liên quan