[about] [index] [prev] [2022-07-16 15:01:50+03:00] [b6692e5ff393fc54ea8e6c568d1e7e2fb7795560]
Topics: [go][vim]

Снова про форматирование кода в Vim

http://www.git.stargrave.org/?p=dotfiles.git;a=commitdiff;h=1e761ea8af276caa2ff605cb4d7d0a63fac51a36
http://www.git.stargrave.org/?p=dotfiles.git;a=commitdiff;h=f0f5d759e21858dc6a50f88ce80cdec24493a52c
В 3a417a68fd72f8b882dfc760b7dd6fa3a3940cd4 писал про то, что можно
существенно упростить вызов форматировалки кода. Но был не прав: оно не
учитывает что команда может упасть и выдать ошибки. И в моём случае
полностью перетирает содержимое выводом об ошибке.

Оказалось, что Go-шный родной плагин не делает ничего лишнего: проверяет
код ошибки, парсит вывод с ошибками из текущего буфера, заполняя quickfix,
дальше выполняет undo. Использование самого буфера как временное хранилище
мне нравится. Плагин был сделан отлично. Но я его портировал на vim9script.

Но есть другая проблема: если были ошибки, то из-за перетирания всего
буфера, его changelist становится полностью невалидным. Я делаю :Fmt,
получаю ошибку, но уже ни одна команда перемещения по изменениями у меня
не отработает. Можно вызвать команду через system(), получить её вывод и
код возврата, ничего не делая с буфером. Но я не нашёл способа как бы
обновить весь буфер не инвалидировав changelist, тогда как equalprg
вызов оставляет его почти полностью неизменным.

Поэтому в фоне (если вызывать system() или systemlist(), то они
скармливают данные не через pipe, а через временный файл) запускаю
equalprg, агрегирую её строчки, и при плохом коде возврата заполняю
ими quickfix. В противном случае вызываю =-форматирование.

[leave comment]