Який найпростіший спосіб видалити swap-файли Vim, з яких я вже відновився?


84

Іноді Vim вибивається і залишає мені свопфайл. Це круто. Потім я відкриваю файл, який я редагував, і Вім запитує мене, чи хочу я відновити. Я, дякую. Коли це закінчиться, Вім каже мені:

You may want to delete the .swp file now.

Чому, так, я. Як це зробити? Я подумав, що він просто знову почне використовувати старий swapfile як swapfile і очистити його, коли я вийду, але це неправда. Це робить нове, очищає це, і коли я знову відкриваю файл, знову запропонує мені відновитись з першого.

Звичайно, я щось пропускаю.


Дивіться тут vi.stackexchange.com/questions/13518/… "Параметр" Видалити його "не відображається, якщо процес Vim все ще запущений", і зверніть увагу на коментар до сесій TMUX, тобто будьте впевнені, що Vim ще не працює (також екран GNU) десь у фоновому режимі, дивіться тут vi.stackexchange.com/questions/13518/…
zenaan

Відповіді:


81

Трохи простіший спосіб:

З емулятора терміналу:

vim filename

Потім виберіть відновлення , і якщо ви хочете видалити своп, напишіть (збережіть), а потім зробіть це в межах vim:

:e          // no argument needed. It assumes the current buffer.

... і виберіть цей час видалити .

Я щойно дізнався про це, і думаю, що буду робити це відтепер. Тоді я випадково не перезапишу робочий файл, якщо відновлення виявиться пошкодженим (хоча я ніколи цього не пробував).

Також є відповідні поради щодо цього питання щодо переповнення стека (де я знайшов цю пораду).


16
У мене немає deleteваріанта, є лише: [O] перо (E) dit (R) ecover (Q) uit (A) bort, що мені робити?
Арн

4
@Arne: З мого досвіду, який зазвичай означає, що файл зараз відкрито в іншому екземплярі vim?
miyalys

1
Параметр [D] elete з’явився лише після того, як я оновив до Vim 7.4
jmlarson

@Arne У мене була така ж проблема. Але через деякий час, годину або близько того, я перезапустив vim і варіант був доступний. ПК не було перезапущено в той час. vim може подумати, що працює інший процес vim. Ось чому він не показує варіант.
ka3ak

6
Тим, хто каже, що не бачить (D)eleteваріанти, див :help swap-exists. цитуйте, On Unix this choice is only offered when the process that created the swap file does not appear to be running.тобто, можливо, у вас є ще один запущений процес vim, який спричиняє приховування цього параметра. Це також може пояснити, чому у вас swpв першу чергу файл!
Lqueryvg

39

Щоб очистити ВСІ файли обміну vim в каталозі:

Якщо ви впевнені, що вам не потрібні файли swap-файлу vim у дереві каталогів і хочете позбутися їх, ви можете використовувати таку команду в каталозі, поки vim не працює (навіть не в іншому вікні чи навіть іншому вході сесія):

find . -type f -name "*.sw[klmnop]" -delete

Деякі натхнення та думки з’явилися з видалення непотрібних .swp файлів у Google Groups. Це видалить всі файли , чиї імена закінчуються .swk, .swl, .swm, .swn, .swo, або .swp в поточному дереві каталогів.

Це може бути не те, що ви хочете, з кількох причин:

  • Як зазначено, він здійснює пошук у поточному дереві каталогів  ; тобто поточний каталог та всі підкаталоги, рекурсивно. Це виходить за рамки того, що задається питанням, і може вважатися непосильним.
  • Як вже говорилося, він буде видаляти всі файли , чиї імена закінчуються .swk, .swl, .swm, .swn, .swo, або .swp, і не тільки .swpГері Джонсон каже :

    Крім того, не всі файли підкачки закінчуються .swp. Якщо Vim потрібно створити файл swap, а той, який закінчується .swp, вже існує, Vim використовуватиме розширення .swo для нового та .swn після цього. Я думаю, що це просто триває назад через алфавіт. Тож використовуючи щось подібне

      \*.sw[nop] 
    

    або навіть

      \*.sw? 
    

    було б більш ретельним.

    Оригінальний автор цієї публікації каже:

    'klmnop' може бути надмірним, але це зазвичай гарантує, що я їх отримую.

  • З іншого боку, це може бути недооціненим.  рубль пропонує

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    

    який відповідає всім ( в нижньому регістрі) трьохбуквені розширення в діапазоні від .saaдо .swp. Він додає: "Будьте обережні, хоча це більш повне рішення, воно витягне будь-які файли зображень .svg та флеш-файли .swf Adobe. Ви можете змінити регулярний вираз , якщо ви працюєте з цими файлами. »Це також відповідає .sav, .snd(звукові дані) .sql, .src, .srt(SubRip відео формат субтитрів), і багато інших широко поширені розширення.

  • Це може бути зайвим. Як вже говорилося, він буде видаляти всі файли , чиї імена закінчуються .swk, .swl, .swm, .swn, .swo, або .swp, Але, мабуть, файли swap-файлу vim - це зазвичай "крапкові" файли. Якщо ви редагуєте hello.cpp, може бути файл підкачки .hello.cpp.swp. Як показано (але не пояснено) у відповіді rouble , безпечніше видаляти лише файли, імена яких починаються з крапки. наприклад, с

    find . -type f -name ".*.sw[klmnop]" -delete
    

14

Введіть ls -aсписок усіх файлів у каталозі

введіть rm .whatever.your.swpта натиснітьenter

Це так просто.

Будь-який файл, який відображається .спереду, є прихованим файлом і зазвичай не переглядається.

Пам'ятайте, що зміни є негайними та постійними, тому будьте обережні.


4
Це не дуже просто. Я повинен залишити Vim, перейдіть в каталог підкачки, пам'ятайте ім'я файлу, і , можливо , вирішити , чи є це file.swpабо file.swo. Тоді я мушу повернутися туди, де я був. Удар :e- набагато простіше рішення.
Peeja

1
ls: cannot access +A: No such file or directory
Джонатан

це те, що мені потрібно
користувач5510975

7

Btw. деякі плагіни роблять це автоматично для вас: autoswap.vim

з опису:

  1. Чи файл вже відкритий в іншому сеансі Vim в якомусь іншому вікні?
  2. Якщо так, поміняйте місцями у вікні, де ми редагуємо цей файл.
  3. В іншому випадку, якщо swapfile старше самого файлу, просто позбудься його.
  4. В іншому випадку відкрийте файл лише для читання, щоб ми могли його переглянути і можемо зберегти.

6
Хтось може сказати мені, чому vim не може мати розумну поведінку за замовчуванням без плагінів?
Павло Шімерда

6

Ні, AFAIK ти нічого не пропускаєш. Vimпродовжує зберігати swapfile як резервну копію, поки ви явно не видалите його.

Просто збережіть і закрийте і знову відкрийте той самий файл. Вам буде запропоновано (знову) з

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it

Тепер просто натисніть d:)


11
Дійсно? Я маю на увазі, я це знав. Але це дурно. Це, звичайно, не "просто".
Peeja

1
До речі, яка різниця між кинутим і перервати?
trusktr

5
у моєму випадку немає опції Видалити. що я повинен зробити? (Я врятував, кинув і знову відкрив)
Пасхаліс

Вам не потрібно спочатку вийти з vim, просто введіть: e <return>, як тільки ви вибрали файл «все-таки редагувати» або «відновити», і ви отримаєте можливість видалити його
00prometheus

2

Vim, як і більшість команд Unix, простий і явний, а не припущенний і неявний.

Ви одужуєте за допомогою (r). Якщо вам не подобається відновлення або відновлення пошкоджене, ви можете відмовитися від нього. Якщо вам це подобається, ви можете зберегти файл. Файл відновлення для вас не видалено, оскільки це не явно і не буде правильним для 100% ситуацій.

Отже, ви (r) ecover, (w) обряд та (q) uit, потім або відредагуйте ще раз, і виберіть (d) elete або "rm .myfile.js.swp" та відредагуйте ще раз. Це зробити швидко і завжди, з точки зору Віма, 100% правильна поведінка.


Гаразд, то чи є спосіб отримати vim, щоб передати мені шлях до файлу swap? Я радий запустити другу команду для видалення swapfile (насправді, мені подобається явність цього), але я хотів би, щоб команда видалила свопфайл, де б він не був. Наприклад, у мене є окремий каталог swapfile. Якщо два відкритих файлу мають одне і те ж базове ім'я, я не можу програмно визначити, який правильний свопфайл для поточного буфера.
Peeja

1
Правда, але запропонувати простий варіант "Відновити та видалити" було б непогано. Це також, ймовірно, легко здійснити Tom. Я зроблю це колись, коли закінчу йти до школи, якщо цього ще не зробили.
trusktr

1
Більшість команд unix є простими, явними та мають розумну поведінку за замовчуванням. Відновлення Vim не просте, UX так само погано, як і у LibreOffice, поведінка очевидно неправильна, і в багатьох випадках результат втрати даних.
Павло Шімерда

1

Ці файли мене також дратували, але я встановив опцію в .vimrc - set noswapfile щоб запобігти створенню Vim і, натомість, збереженню файлів у пам'яті.


На думку ОП, swapfiles корисні, тому їх вимкнення може виявитися не найкращим варіантом.
Кусалаланда

Не вимикайте файли swap. Якщо ваша машина вийде з ладу, ви втратите роботу.
Lqueryvg

Звичайно, цей варіант передбачає ризики, і, як я знаю, ці файли своп були зроблені при появі редакторів vi *, коли збої траплялися дуже часто. Тепер я можу сказати, що vim працює стабільно, і вони існують як спадщина, imho.
Дмитро

1

Ось більш повний регекс для очищення всіх файлів своп-файлів vim на основі власного файлу githgnore Github для Vim

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

Але будьте обережні, хоча це більш повне рішення, воно витягне будь-які файли зображень .svg та флеш-файли .swf Adobe. Ви можете змінити регулярний вираз, якщо ви працюєте з цими файлами.


1

Ось фрагмент, який потрібно додати .vimrc. Він видаляє всі файли swap, які пов'язані з поточним буфером файлів, та скидає розширення swap.

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

Після зустрічі з труднощами можна виконати :DeleteFileSwaps Це чудово, якщо поєднувати з командами :windoабо :tabdo.

:tabdo DeleteFileSwaps 

Додаткові відомості : Файл може мати більше одного файлу своп. Причина в тому, що файл swap, з розширенням .swp, все ще існує і vimзавдяки ньому буде створювати нові. Щоб дізнатись, чи .swpіснують:

  • З цільовим файлом, відкритим у vim, виконайте, :swщоб отримати поточний файл swap.
  • Перевірте каталог, в якому міститься поточний файл swap.
  • Потім перевірте, чи каталог містить файл swap з іменем відкритого файлу і має розширення .swp.

Розташований вище фрагмент слід за тим самим процесом, але видаліть усі файли підкачки.

Сподіваюся, це допомагає.


0

З посібника :h swap:

Ви можете побачити ім'я поточного файлу swap, який використовується з командою: :sw[apname]


Попередження ... це, ймовірно, не ім'я файлу, який потрібно видалити. Поки ви не видалите .swpфайл, :swкоманда, ймовірно, дасть вам ім'я .swoфайлу - що не є тим, що ви хочете видалити.
Lqueryvg

0

якщо вас запитають, тоді натисніть, Dщоб видалити файл swap поточного файлу.

якщо ви цього не зробите, вам доведеться робити це вручну.

один з альтернативних способів зробити це:

щоб знайти / знайти файл:

find | grep ".searchRefineVertTabs.jsp.swp"

а потім видаліть цей файл:

rm ./.searchRefineVertTabs.jsp.swp

1
Я маю запитав, але мій вибір , щоб відновити . Питання полягає в тому, як її видалити одразу після відновлення, оскільки це більше не потрібно. Здається, невдача vim не зробити цього для мене. Але прийнята відповідь - це найчистіший робочий процес, який я знайшов поки що.
Peeja

-1

Ви можете використовувати,

rm -f .<filename>.<ext>.swp

Приклад:

rm -f .rc.local.swp

Це технічно спрацьовує, але це нині не так просто, як на сьогодні прийнято відповідь.
Peeja

Плюс <ext>тут є зайвим, оскільки ім'я файлу принаймні в Linux включає нульове або більше розширень.
Павло Шімерда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.