Редактирование в режиме Live diff в vim

Редактирование в режиме Live diff в vim

Мне нужен просмотр различий в реальном времени во время редактирования файла. 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

Связанный контент