From: Sergey Matveev Date: Sat, 16 Jul 2022 12:01:50 +0000 (+0300) Subject: Снова про форматирование кода в Vim X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=b6692e5ff393fc54ea8e6c568d1e7e2fb7795560;p=stargrave-blog.git Снова про форматирование кода в 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. В противном случае вызываю =-форматирование. ---