Подтвердить что ты не робот

Vim - автоматически форматирование исходного кода golang при сохранении

Я использую vim с плагином vim-golang. Этот плагин имеет функцию под названием: Fmt, которая "переформатирует" исходный код, используя gofmt, исполняемый файл командной строки.

Я хочу вызывать функцию Fmt каждый раз, когда я сохраняю файл, поэтому он постоянно переформатируется. Я думаю, что это должно быть сделано с помощью autocmd. Но у меня есть два сомнения:

  • Я не мог найти способ выполнить функцию. Я попытался направить Fmt и: Fmt в конце строки autocmd, но он, похоже, не работал. Я думаю, что я что-то пропустил, как "позвонить".
  • Я хочу, чтобы это произошло только при сохранении файла filetype '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
4b9b3361

Ответ 1

Событие FileType не срабатывает при записи буфера; BufWritePre является правильным, но вам необходимо предоставить шаблон файла, например. *.go:

autocmd BufWritePre *.go Fmt

Единственным недостатком является то, что это дублирует обнаружение файла типа go. Вы можете делегировать это, подключившись к событию FileType, а затем определите автозапуск форматирования для каждого буфера Go, используя специальный шаблон <buffer>:

autocmd FileType go autocmd BufWritePre <buffer> Fmt

Это имеет недостаток, что если тип файла когда-либо устанавливается несколько раз, вы также будете запускать форматирование несколько раз. Это можно решить с помощью пользовательского :augroup, но теперь он становится очень сложным. Или, если вы действительно уверены, что это единственный autocmd BufWritePre для буферов Go, вы можете использовать :autocmd! BufWritePre ...!).

Ответ 2

Если вы используете сгибы, gofmt испортит их (открывает закрытые складки, закрывает открытые). Чтобы сохранить складки, когда они используют следующую автокоманду

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

Он использует регистр z, чтобы пометить позицию курсора, потому что: mkview и: loadview (которые сохраняют и восстанавливают складки) по какой-либо причине перемещают курсор.