Как я могу безопасно отменить изменения, которые я мог или не мог сделать?

12

Слишком часто я делаю ошибку, печатая с неправильным фокусом окна (и делал это несколько раз с помощью USB-аутентификатора). В программах с большим количеством горячих клавиш (Gmail, VLC, Vim) это часто приводит к непреднамеренным последствиям нежелательных изменений.

Иногда я могу проследить свои шаги и вспомнить, что я набрал, чтобы исправить любые изменения или отменить любые настройки, которые я настроил, если поймаю себя рано. К сожалению, это не всегда так.

В Vim у меня может быть что-то столь же безобидное и очевидное, как изменение строки текста, которую легко отменить. Или я мог бы по незнанию изменить что-то, что не так легко идентифицировать. Если я случайно ввожу последовательность нежелательных команд в Vim, как я могу проверить и отменить любые изменения или изменения настроек?

Johnb
источник
1
Вы ищете "возврат" действий? :e!сделал бы это
Джаспер
1
Я думаю, :e!было бы плохо, если вы не сохранили с последнего правильного состояния, и uможет быть недостаточно, если вы набрали кучу вещей. (Если вы наберете date month, например, то вы удалили бы тег, установили метку и выполнили бы поиск, что было бы очень u
сложно
1
@WChargin Не говоря уже о том, чтобы uбыть частью последовательности, выполняя некоторые отмены в середине.
лет»

Ответы:

14

Invoke

:undolist

чтобы увидеть, когда вы сделали последний набор изменений. Если в нем говорится, что было сделано несколько изменений, например, «3 секунды назад», и вы знаете, что изменили его только намеренно , скажем, минуту назад, то выполните

:earlier 10s

вернуться в желаемое состояние. В противном случае, если нет недавних изменений, вам не нужно ничего делать.


Далее ссылка: :help undo-tree .

wchargin
источник
4

Чтобы перефразировать вопрос, вы ищете способ просмотреть или иным образом получить уведомление об изменениях, внесенных в файл, а затем использовать функцию отмены. Там может быть другой способ или даже плагины, которые поддерживают это. Но я объясню, что я использовал для той же цели.

Вы комбинируете существующую функцию vim, чтобы сделать это. Например, вы можете определить функцию, такую ​​как:

" Function: View changes after the last save
function! s:DiffSinceSave()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
  exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffSinceSave()

Вы можете позвонить позже и даже назначить комбинацию клавиш.

" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>

Это откроет окно сравнения с разделенным окном, которое покажет вам изменения, сделанные с момента последнего сохранения. После того, как вы определили сделанные изменения, вы можете выйти из этого представления и использовать другие функции vim, такие как отмена и отмена дерева и т. Д., Или даже плагины для возврата к предыдущим состояниям.

Я понимаю, что это не идеально, потому что для этого нужно иметь определенный рабочий процесс. Но это работает довольно хорошо. И с другой стороны, мы не меняем принцип работы vim и не полагаемся ни на что вне.

Я надеюсь, что вы найдете это полезным. Некоторое время назад я адаптировал это решение из фрагментов, найденных в Интернете, включая vim Wikia. Так вот, где любой кредит должен.

gaveen
источник
3

Мне кажется, простой ответ на этот вопрос - нажимать uдо тех пор, пока вы не отмените изменение, которое вы хотели сохранить, затем нажмите Ctrl-R.

superjer
источник
0

Как и @superjer, я продолжаю нажимать, uпока красный [+]маркер в моей строке состояния не исчезнет.

set statusline=%f\ %#Error#%m%##
joeytwiddle
источник
Было бы неплохо иметь ключ для автоматической отмены возврата к последнему неизмененному состоянию. Но :e!это также хорошее решение; В эти дни Vim даже сохранит ваши «отмененные» изменения в истории отмен.
Joeytwiddle
5
Эта команда есть :earlier 1f. В 1fозначает «1 предыдущее сохраненное состояние», поэтому он будет идти обратно в предыдущий раз вы сохранили файл. Если буфер изменен, то это отменяет все модификации. Если буфер не был изменен (т. Е. Он в данный момент находится в сохраненном состоянии), он перейдет к предыдущему разу, когда вы сохранили файл.
jamessan