
Мне нужен просмотр различий в реальном времени во время редактирования файла. vimdiff
может сделать что-то нужное мне, например, выделить различия между двумя файлами.
Однако есть два недостатка, vimdiff
которые меня сдерживают.
Во-первых, он не может буферизировать один и тот же файл независимо, чтобы разрешить сравнение diff
. Эту проблему можно легко обойти. У меня есть следующий скрипт оболочки (назовем его diffvim
), чтобы vimdiff
буферизировать один и тот же файл независимо (создавая временную копию редактируемого файла).
#!/bin/sh
# Differentially Viming
TMPDIR=/tmp/diffvim
FILENM=$1
FILEBN=$(basename $FILENM)
if [ ! -d "$TMPDIR" ]; then
mkdir $TMPDIR
fi
cp $FILENM $TMPDIR/$FILEBN && vimdiff $FILENM $TMPDIR/$FILEBN
Вторым недостатком vimdiff
является то, что редактированиенедифференцированныйчасти одной из двух копий одного и того же файла не запускают diff
пересчет различий. Это нужно сделать вручную, вызвав :diffupdate
. Я хочу, чтобы этот пересчет был автоматизирован. Относительно удобный способ, который я чувствую, — это запустить его, когда я выхожу изВСТАВЛЯТЬрежим и введитеНОРМАЛЬНЫЙmode. Это снова можно легко сделать, добавив следующее сопоставление в мой .vimrc
файл:
inoremap <Esc> <Esc>:diffu<CR>
Однако это пока не идеальное решение. Потому что если я сделаю редактирование вНОРМАЛЬНЫЙрежим, то есть без входа и выхода изВСТАВЛЯТЬmode, пересчет все равно не будет запущен автоматически после завершения редактирования. Поэтому я добавляю еще одно сопоставление в свой .vimrc
файл:
nnoremap <Esc> :diffu<CR>
Но в этот раз происходит что-то странное. Когда я открываю файл для редактирования, некоторые стандартные сочетания клавиш не срабатывают. Например, если я нажимаю клавишу h
или l
(то есть, любая из них является первой командой, которую я ввожу после открытия файла), все это приводит меня кВСТАВЛЯТЬmode, while key jили Gdelete строку или все содержимое и т. д. Но если после открытия файла я Escсначала нажимаю клавишу , то эти команды работают нормально.
Есть идеи, что пошло не так? Есть ли у вас способ обойти это?
решение1
Посмотрев autocmd
в vimdoc, я думаю, что нашел решение, которое делает именно то, что мне нужно:
autocmd CursorMoved,CursorMovedI * diffupdate
Большое спасибо Инго за его предложение!
решение2
<Esc>
также используется в нескольких кодах специальных клавиш и играет роль в печати на терминале.
Плохая идея перегружать его, особенно чем-то таким инвазивным, как вы сделали. Используйте другой ключ, например <Leader><Leader>
, или определите триггер для событий:
:autocmd InsertEnter,InsertLeave * diffupdate