Как я могу отменить мою историю отмен в Vim?

23

Отменить приятно иметь в Vim. Но иногда, в известном хорошем моменте, я хочу стереть свою историю отмены - чтобы иметь возможность использовать uдля отмены отдельных изменений, но только назад к определенной точке. (Например, это может быть когда я последний раз совершал.)

Один из способов сделать это - закрыть и снова открыть файл - история отмены начинается с этого момента. Но это хлопоты.

В прошлом я достиг этого с :edit!. Но в Vim 7.3 это не отменяет историю отмен.

Есть ли другой способ сделать это, кроме закрытия файла?

Натан Лонг
источник
так что вы на самом деле просто хотите восстановить состояние файла, как оно было при последнем коммите? Вы хотите, по сути, просто переназначить клавишу 'u' на что-то вроде git checkout -f fileили hg rollback file?
Акира
@akira - нет, я хочу иметь возможность использовать uдля отмены отдельных изменений, но не после того момента, когда я последний раз совершал. Точно так же, как если бы, каждый раз, когда я совершал коммит, я закрывал файл и снова открывал его. Что и делалось :edit!раньше - это было похоже на закрытие файла и его повторное открытие. Это НЕ ДОЛЖНО быть привязано к точке фиксации, это как раз тот момент, когда я бы чаще всего этого хотел.
Натан Лонг
Ах, это делает проблему намного яснее. Вы должны немного изменить свой вопрос.
Акира

Ответы:

11
:set undoreload=0 | edit

должен делать то, что вы просите.

Стивен
источник
1
Ха! Просто отключите эту функцию, а? :) Не уверен, почему мне потребовалось так много времени, чтобы заметить это.
Натан Лонг
7

Старый: редактировать! поведение в одной строке:

:exe "set ul=-1 | e! | set ul=" . &ul
Aldrik
источник
Это работает. Не могли бы вы объяснить это?
Натан Лонг
Объедините значение параметра undolevels в конце строки команд (чтобы его можно было восстановить) и выполните их. Для получения дополнительной информации обратитесь к документации: :h :exe, :h :bar, :h :set-args, :h 'ul'и :h :edit!.
Олдрик
6

Функция Бенуа у меня не сработала, но я нашел что-то похожее в руководстве vim здесь:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

Я добавил его в функцию, добавил в свой vimrc, и, похоже, он отлично работает на vim 7.3:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

Это может быть использовано с :ClearUndo.

Nycto
источник
1
Работая нормально с плагином Gundo и отменой перезагрузки файлов, эта вещь очень удобна для меня. Однако я изменил две вещи: вместо обычной команды редактирования (которая сама по себе оставляет историю редактирования на 7.4, кажется), я просто использую редактирование! (и всегда пишите перед удалением истории отмены). Кажется, что некоторые внутренние списки не обновляются должным образом, поэтому, если вы хотите использовать это с плагином Gundo, сделайте дополнительное редактирование! в конце функции предотвратит ошибку позже.
PlasmaHH
@PlasmaHH Не могли бы вы опубликовать функцию для очистки истории отмены, потому что я не понимаю, что вы изменили ... (вы могли бы опубликовать это как ответ для тех из нас, кто использует gundu). Спасибо
Бен
5

Вероятно:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul'это псевдоним для 'undolevels').

Benoit
источник
Это работает! Теперь я пытаюсь заставить одну команду сделать это - желательно :edit!. Для начала я создал функцию под названием ClearUndos () с указанными вами командами, но ее вызов, похоже, ничего не делает, тогда как выполнение команд по отдельности делает ...
Натан Лонг,
3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Бенуа
это должно быть содержимое функции? Это не работает для меня, но, возможно, я неправильно понял. Кроме того - может быть, переместить это в свой ответ?
Натан Лонг
Может быть, вы не можете поместить raw |в командный контент. Затем создайте функцию, которая делает то, что я сказал в своем ответе, и установите команду на call thefunction().
Бенуа
3

Msgstr "Очистить историю отмен ((w, чтобы очистить файл отмены, если есть)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Когда вы устанавливаете 'undolevels' в -1, информация отмены не очищается сразу, это происходит при следующем изменении, то есть m-1, которое фактически не меняет ваш текст.
  • Когда 'undofile'включено, :wчтобы очистить файл отмены или цепочку, как UndoClear|w.
Бор
источник
1

В скрипте:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

Затем используйте, :Resetчтобы позвонить.

Benoit
источник
Ваша строка определения функции нуждается () в конце.
Натан Лонг
Это странно - выполнение этих команд по отдельности работает нормально, и отображение значений во всей функции показывает, что они установлены и не установлены соответствующим образом. Но запуск функции не сбрасывает мою историю отмен - после этого я все еще могу отменять несколько раз. Может быть, set ul=команда влияет только на локальную переменную до тех пор, пока сценарий не завершится, и, поскольку мы изменим ее обратно до завершения работы сценария, она никогда не повлияет на среду? Вы тестировали эту функцию и она работала - значит, что-то странное в моей настройке?
Натан Лонг