2012-06-10 15 views
22

Używam vima z wtyczką vim-golang. Ta wtyczka jest dostarczana z a function called :Fmt, która "przekształca" kod źródłowy za pomocą gofmt, pliku wykonywalnego z linii poleceń.vim - automatyczne formatowanie kodu źródłowego golang podczas zapisywania

Chcę wywołać funkcję: Fmt za każdym razem, gdy zapiszę plik, dlatego jest on ciągle ponownie formatowany. Myślę, że powinno to być zrobione z dyrektywą autocmd. Ale mam dwa wątpliwości:

  1. Nie mogłem znaleźć sposobu na wykonanie tej funkcji. Próbowałem pisać Fmt i: Fmt na końcu linii autocmd, ale wydawało się, że nie działa. Myślę, że tęsknię za czymś, np. "Zadzwoń".
  2. Chcę, aby tak się stało tylko podczas zapisywania pliku typu pliku 'go'. Nie wiem, jak połączyć te dwa warunki - mogę aktywować zmienne w zależności od typu pliku i mogę robić małe rzeczy, takie jak usuwanie spacji końcowych, zawsze gdy plik jest zapisywany, ale oddzielnie.

Więc to, co mam do tej pory:

" 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 

Odpowiedz

54

Impreza FileType nie strzelać do bufora pisze; BufWritePre jest poprawny, ale musisz podać wzorzec pliku, np. *.go:

autocmd BufWritePre *.go Fmt 

Jedynym minusem jest to, że powiela wykrywanie iść filetype. Można powierzyć to przez spinanie do zdarzenia FileType, a następnie zdefiniować autocmd formatowania dla każdego bufora Go za pomocą specjalnego <buffer> wzoru:

autocmd FileType go autocmd BufWritePre <buffer> Fmt 

ten ma wadę, że jeśli filetype kiedykolwiek zostanie ustawiony wielokrotnie, ty będziesz także uruchamiać formatowanie wiele razy. Można to rozwiązać za pomocą niestandardowego :augroup, ale teraz staje się naprawdę skomplikowane. Lub, jeśli jesteś naprawdę pewny, że jest to jedyny bufor autocmd dla Go, możesz użyć :autocmd! BufWritePre ... (z !).

+0

Wow, niezwykle szeroka odpowiedź, wielkie dzięki! Skończyło się na użyciu drugiej opcji - w ogóle nie planuję resetowania rodzaju pliku. Dzięki! – kikito

+1

Możesz chcieć dodać 'cichy', jeśli potrzebujesz normalnego wyjścia z polecenia' Fmt' (ciągle widziałem 'X linie filtrowane'): ' autocmd FileType go autocmd BufWritePre cichy Fmt' – djd

+1

Jest już w 'vimie -gocode' plugin https://github.com/Blackrush/vim-gocode/blob/master/ftplugin/go/fmt.vim#L20 –

1

Jeśli używasz fałd, gofmt miesza je (otwiera zamknięte fałdy, zamyka otwarte). Aby zachować fałdy jak oni gdzie kliknąć na poniższy autokomendę

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

Korzysta z rejestru oo oznaczyć położenie kursora, ponieważ: mkview oraz: loadview (wich zapisać i przywraca fałdy) przesunąć kursor z jakiegoś powodu.

Powiązane problemy