Я уже давно использую функцию отмены файлов в Vim. Это очень хорошая особенность.
Однако одно раздражение заключается в том, что очень легко случайно отменить изменения, которые я сделал в последний раз, когда открывал файл; это может быть 2 минуты назад, час назад, на прошлой неделе или месяц назад.
Например, допустим, я открываю файл, делаю несколько изменений, ухожу и изменяю некоторые другие файлы и обнаруживаю, что мои изменения не требовались или, возможно, они были всего лишь несколькими временными инструкциями отладки.
Раньше я мог просто держать uключ, пока Вим не сказал «Уже при самых старых изменениях» :wq
, и все готово. Но теперь я должен быть очень осторожным, чтобы не отменить изменения, которые я сделал в прошлый раз, когда я открыл файл. Нет очевидного способа увидеть, когда вы это делаете.
Есть ли способ сделать это более явным? Например, показывая его где-нибудь, выдавая предупреждение или даже запрашивая подтверждение.
источник
Ответы:
У меня была именно эта проблема. Вот что я добавил в свой vimrc, чтобы исправить это для меня:
Обратите внимание, что вы не устанавливаете
undofile
опцию; вам нужно удалить из вашего vimrc, если у вас есть.Отмена теперь работает как "нормально". Но мы же вручную записывать в файл отмен с
wundo
командой вBufWritePost
.ReadUndo()
Функция вручную считывает файл отката сrundo
и устанавливаетundofile
опцию. Теперь мы можем использовать, uчтобы идти дальше в историю. Я сопоставил это с<Leader>u
.Это может быть лучше. Он перезаписывает предыдущую информацию об отмене, поэтому вы не можете вернуться к предыдущему предыдущему редактированию файла. Но я сам не нуждался в этом.
источник
О-о-о-о, наконец-то появился шанс показать эту изящную команду!
Vim может «вернуться во времени». У него есть
:earlier
команда ...... который может вернуть файл обратно в предыдущее состояние. Это может быть использовано несколькими способами.
Если вы можете сделать приблизительную оценку того, сколько времени вам потребовалось для внесения этих изменений, вы можете указать время для этой команды. Или, например, если вы знаете, что не изменили файл (за исключением изменений, которые хотите отменить) за последний день, вы можете использовать
Если вы записали (сохранили) файл только один раз после внесения изменений, которые хотите отменить, или не сохранили файл вообще, вы можете использовать
Как описано в
:help
тексте, это вернется к ранее написанной версии, если вы только что написали файл, или вернется к последнему разу, когда он был сохранен, если у вас нет сохраненных изменений.Это не дает точного ответа на ваш вопрос, но звучит как проблема XY.
источник
u
и случайно прохожу мимо изменений, которые я сделал прямо сейчас ... Я не уверен, что здесь может быть первоначальная «проблема Х»?:earlier
этом кстати, но мне все еще нужно угадать ; так же, как мне нужно угадать при использованииu
... В некоторых случаях это, вероятно, немного лучше, но я бы предпочел что-то более явное (если это возможно).:ea 5d
. Вы также можете использовать:ea 1f
подход. В любом случае, это гораздо менее гранулировано.Обновление 2015-06-28 : я исправил небольшую ошибку и выпустил ее как плагин . Код плагина немного лучше, так как он снова предупреждает после перемещения курсора; Я рекомендую вам использовать плагин.
Ответ от superjer прекрасно работает, но имеет неприятный побочный эффект, что вы можете отменить изменения только из последнего сеанса Vim, а не все предыдущие сеансы Vim.
Это потому, что
wundo
перезаписывает файл отмены; это не объединено. Насколько я знаю, это не исправить.Итак, вот мое альтернативное решение, оно будет показывать большое красное предупреждающее сообщение, когда вы отменяете изменения из файла отмены.
Это похоже на ответ Инго Карката , но он не требует внешнего плагина и имеет некоторые тонкие различия (вместо звукового сигнала отображается предупреждение, не требует нажатия
u
дважды).Обратите внимание , это только модифицируем
u
и<C-r>
привязывается к нему и неU
,:undo
и:redo
команде.источник
У меня есть следующее, которое останавливается и подает звуковой сигнал, когда отмена достигает постоянного содержимого буфера.
Это интегрируется с плагином repeat.vim; это требует моего плагина ingo-библиотеки .
источник
Мне очень понравилась процитированная идея, поэтому я сделал
:Revert
команду. Я надеюсь, что вы найдете это актуальным для вашего вопроса.Вспомогательные функции
Get_seq
иReal_seq
, основанные на undotree , необходимы, потому чтоundotree()['seq_cur']
иногда их недостаточно, чтобы точно определить текущую позицию в дереве отмены. Вы можете прочитать больше об этом здесь .источник
au
. vimrc там является виновником. Просто оставьте это