Когда мы редактируем файл, мы обычно делаем много ОТМЕНЫ подряд, скажем, 20 раз. В VIM это обычно выполняется нажатием u
20 раз, и это заставляет VIM «подниматься» в стеке истории на 20 позиций. Если вы затем определитесь change
, все эти последние 20 команд истории будут потеряны и заменены на change
. Я хотел бы сделать change
без потери этих 20 позиций. Так что, я думаю, я бы хотел сказать VIM прекратить запись истории, прежде чем я это сделаю change
, и возобновить историю позже (не хочу change
в истории).
РЕДАКТИРОВАТЬ
Попытка быть более ясным: у меня есть функция, FF
которая обновляет последние строки файла при записи в буфер. Итак, если я выполню 20 undos + write
, последний write
откроет новую ветку отмены. Я попытался добавить undojoin
внутрь FF
(пытаясь следовать предложению jlmg ниже), но последовательность write-undo-write выдает ошибку: отмена не разрешена после отмены . Вместо этого я мог бы сделать некоторые sed ....
после ухода vim
, но так как я использую это через, SSH
я предпочитаю решение только для vim (выполнение команды после выгрузки буфера не записывает в файл).
РЕДАКТИРОВАТЬ 2 Попробуйте сделать это в VIM: откройте пустой файл и выполните:
i1<ESC>:wa2<ESC>:wa3<ESC>:wa4<ESC>uu:w
Если сейчас вы сделаете a <CTRL>R
, VIM напишет «3» обратно, а дальше <CTRL>R
вы получите 4
. Это происходит ДАЖЕ, если вы делаете :w
после каждого <CTRL>R
. Тем не менее, если каждый раз, когда вы делаете a, :w
вы выполняете функцию через BufWritePre
, the <CTRL>R
не будет писать 3
обратно. И это то, что я хочу сделать, именно поэтому я написал, чтобы «приостановить его», но, возможно, то, что я спрашиваю, не возможно, кроме работы с полной undotree()
.
vi
, но для меняvi
команда отмены отменяется один раз, а затем приu
повторном нажатии отменяет отмену («повторить»). Это настоящий ви. Поэтому я и другие пользователи этого сайта могут не знать ответа на ваш вопрос.vim.se
, я бы попробовал это. Во всяком случае, кажется, Сато знает, как помочь.sed
желаемый результат , но sed не может отменить ваши действия, так как же это сработает? Если бы вы смогли «приостановить историю», какое поведение вы бы ожидали от vim, когда вы потом отмените действия? Единственное поведение, которое я мог визуализировать, - это сгруппировать эти изменения (вместе с отменами) в один блок отмены, отсюда и мой ответ. Но если это не так, то что?Ответы:
Вам не нужно приостанавливать историю Vim. Фактические данные образуют дерево, и вы можете получить его с помощью
undotree()
функции. Есть, конечно, несколько плагинов, которые превращают это в нечто более удобное для пользователя, например , gundo , mundo и undotree . Если вы также включите отмену сохранения (ср.:h undo-persistence
), Вы можете легко перемещаться по всей истории изменений файла.источник
undotree()
должно помочь?change
вообще не появлялся нигде, ни в деревеhistory
, ни вundo
дереве. Вот почему мой вопрос был «приостановить историю».:earlier
, который принимает единицу времени и пересечет ветки отмены при необходимости (например,:earlier 1h
заставляет буфер выглядеть так, как это делал час назад). Если вы не можете использовать единицу времени (потому что изменения были слишком близко друг к другу?), Вам придется использоватьg-
для обхода дерева отмены несколько шагов за раз.Если я вас правильно понимаю, то вы хотите, чтобы после этого отмена
change
отменяла это, а 20 отмен.Когда vim выполняет функцию или команду, все ее действия отменяются вместе. Я не уверен, что эти действия могут включать отмены. Может быть, эта часть документации может помочь:
Увы, я пытался использовать
:undo 2 | undojoin | normal ohi
, но я получил сообщение об ошибкеE790: undojoin is not allowed after undo
.Однако, если действия выполняются в такой функции:
затем вызов его с помощью
:call F()
выполняетundo
и другие действия в одном блоке отмены. Обратите внимание: поскольку вы используете отмену, вы создаете новую ветку отмены. После этого вы можете использовать команду обычного режимаg-
, чтобы отменитьF()
; использованиеu
будет как:undo 3
в начале.источник
undo
, все, что вы делаете в своей функцииF()
, не открывало новую ветку отмены. В моем случаеF()
выполняется каждый раз, когда я записываю файл, и если я делаю,undo
а затем записываю файл,F()
открывается новая ветвь отмены. Я попытался сundojoin
в началеF()
, но последовательность записи уничтожьте-записи выдает ошибку:undojoint not allowed after undo
.:undojoin
не сработало для того, что вы хотели, упомянув ту же ошибку, и я не предлагал использовать:undojoin
в началеF()
.F()
предназначен для того, чтобы делать то, что:undojoin
не мог, то есть объединять отмены и другие команды в одном блоке отмены.g-
иg+
.