Як я можу безпечно скасувати зміни, які я можу або не міг внести?


12

Занадто часто я роблю помилку введення тексту з неправильним фокусуванням вікна (і робив це кілька разів за допомогою автентифікатора USB). У програмах із великою кількістю гарячих клавіш (Gmail, VLC, Vim) це часто є непередбачуваним наслідком внесення небажаних модифікацій.

Я іноді можу простежити свої кроки і запам'ятати, що я набрав, щоб виправити будь-які зміни або скасувати будь-які налаштування, які я змінив, якщо я рано піймав. На жаль, це не завжди так.

У Vim у мене могло статися щось таке нешкідливе і очевидне, як зміна рядка тексту, який легко скасувати. Або я міг би несвідомо змінити щось не так легко визначити. Якщо я випадково наберіть послідовність непотрібних команд у Vim, як я можу перевірити чи скасувати зміни чи зміни в налаштуваннях?


1
Шукаєте дію "повернення"? :e!зробив би це
Джаспер

1
Я думаю, :e!було б погано, якщо ви не збереглися з останнього правильного стану, і uможе бути недостатньо, якщо ви набрали купу матеріалів. (Якщо ви date month, наприклад, набрали текст , ви б видалили тег, встановили позначку та здійснили пошук, який було б досить заплутано скасувати через u.)
wchargin

1
@WChargin Не кажучи про те, що uє частиною послідовності, виконуючи деякі скасування в середині.
йо '

Відповіді:


14

Викликати

:undolist

щоб побачити, коли ви внесли останній набір змін. Якщо це говорить про те, що було внесено кілька змін, наприклад, "3 секунди тому", і ви знаєте, що ви лише навмисно змінили це, скажімо, хвилину тому, тоді виконуйте

:earlier 10s

повернути до потрібного стану. Інакше, якщо останніх змін не буде, вам нічого не потрібно робити.


Далі посилання: :help undo-tree .


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. Отож, тут має виплачуватися будь-який кредит.


3

Мені здається, простою відповіддю на це є натискання, uпоки ви не скасуєте зміну, яку хотіли зберегти, а потім натисніть Ctrl-R.


0

Як і @superjer, я продовжую натискати, uпоки червоний [+]маркер у моєму статусному рядку не зникне.

set statusline=%f\ %#Error#%m%##

Можливо, буде непогано мати ключ для автоматичного скасування повернення до останнього немодифікованого стану. Але :e!це також приємне рішення; в ці дні Vim навіть збереже ваші "відкинуті" зміни в історії скасування.
joeytwiddle

5
Ця команда є :earlier 1f. В 1fозначає «1 попереднє збережений стан», тому він буде йти назад в попередній раз ви зберегли файл. Якщо буфер модифікований, це скасовує всі модифікації. Якщо буфер не змінено (тобто він зараз знаходиться в збереженому стані), він перейде до попереднього часу, коли ви зберегли файл.
Jamessan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.