У меня есть следующие строки в моем .vimrc
:
:function GitCommitMsg()
: set tw=62
: if getline(1) == ""
: 1
: r!git diff -w --minimal --cached
: 1d
: endif
: set syntax=diff
:endf
:au BufRead,BufNewFile COMMIT_EDITMSG call GitCommitMsg()
В течение многих лет вышеприведенное прекрасно работало с Vim 7.x, но стало плохо работать под Vim 8 на Ubuntu 18.
Внутри оператора if
выполняется новый коммит. Идея состоит в том, чтобы предоставить некоторый контент при создании нового коммита, но в противном случае оставить сообщение в покое.
Когда выполняется этот интерьер, ни set tw=62
, ни set syntax=diff
не вступают в силу. Наблюдаемые значения 72
и gitcommit
соответственно.
Каким-то образом условный вызов :r!
вызывает проблему. Если мы закомментируем это:
:function GitCommitMsg()
: set tw=62
: if getline(1) == ""
: 1
": r!git diff -w --minimal --cached
: 1d
: endif
: set syntax=diff
:endf
:au BufRead,BufNewFile COMMIT_EDITMSG call GitCommitMsg()
, тогда set tw=62
и set syntax=diff
вступят в силу во всех случаях.
Обратите внимание, что :r!git diff
работает: вывод git diff ...
загружается в буфер, а ведущая пустая строка удаляется 1d
.
Причина не в частности git diff
или контент, который он производит; проблема сохраняется независимо от того, какие выходные данные команды мы читаем с :r!
. Так, например, это все еще имеет проблему:
:function GitCommitMsg()
: set tw=62
: if getline(1) == ""
: 1
: r!echo foo
: 1d
: endif
: set syntax=diff
:endf
:au BufRead,BufNewFile COMMIT_EDITMSG call GitCommitMsg()
Как мы можем прочитать вывод команды в буфер в середине обработки au
без нежелательных побочных эффектов, таких как засорение настроек?