Як я можу видалити свою історію скасування в 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

Це працює. Ви не проти пояснити це?
Натан Лонг

Об'єднайте значення параметра скасування рівнів на кінці рядка команд (щоб його можна було відновити) та виконує їх. Для отримання додаткової інформації зверніться до документації: :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.


1
Працюючи нормально з плагіном Gundo та скасовуючи завантаження файлів, ця річ мені дуже зручна. Однак я змінив дві речі: замість звичайної команди редагування (яка сама залишає деяку історію редагування на 7.4), я просто використовую правку! (і завжди пишіть перед тим, як видалити історію скасування). Здається, деякі внутрішні списки не оновлюються належним чином, тому якщо ви хочете використовувати це за допомогою плагіна Gundo, виконайте додаткове редагування! в кінці функцій не дасть їй пізніше помилитися.
ПлазмаHH

@PlasmaHH Чи можете ви, будь ласка, опублікувати функцію очищення історії скасування, тому що я не зрозумів, що ви змінили ... (ви можете, можливо, опублікувати її як відповідь для тих із нас, хто використовує гунду). Спасибі
Бен

5

Мабуть:

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

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


Це працює! Зараз я намагаюся зробити одну команду робити це - бажано :edit!. Для початку я створив функцію ClearUndos () з перерахованими вами командами, але виклик, здається, нічого не робить, тоді як виконання команд індивідуально робить ...
Nathan Long

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Бенуа

це означає, що це вміст функції? Це не працює для мене, але, можливо, я неправильно зрозумів. Також - можливо, перенести це на власну відповідь?
Натан Лонг

Можливо, ви не можете ввести сировину |у вміст команди. Потім створіть функцію, яка виконує те, про що я сказав у своїй відповіді, і встановіть команду call thefunction().
Бенуа

3

"Очистити історію скасування (: w, щоб очистити файл скасування, якщо такий представлений)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Якщо ви встановите "скасувати" на -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для виклику.


У кінці рядка визначення функції потрібно ().
Натан Лонг

Це не дивно - виконання цих команд окремо працює добре, а повторення значень у всій функції показує, що вони встановлені та зняті належним чином. Але запущена функція не скидає мою історію скасування - згодом я все одно можу скасувати кілька разів. Може бути, set ul=команда впливає лише на локальну змінну до тих пір, поки скрипт не завершиться, і оскільки ми змінимо її ще до того, як скрипт вийде, він ніколи не впливає на навколишнє середовище? Ви перевірили цю функцію і чи спрацювала вона - значить, чи є щось дивне в моїй настройці?
Натан Лонг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.