Какой самый простой способ удалить файлы подкачки Vim, из которых я уже восстановлен?

160341
Peeja

Иногда Vim вылетает и оставляет мне файл подкачки. Это потрясающе. Затем я открываю файл, который редактировал, и Vim спрашивает меня, хочу ли я восстановить. Да, спасибо. Когда это будет сделано, Вим говорит мне,

You may want to delete the .swp file now. 

Почему, да, я делаю. Как я могу это сделать? Я подумал, что он просто снова начнет использовать старый файл подкачки в качестве файла подкачки и очистит его при выходе, но это не так. Он создает новый, очищает его, и когда я снова открываю файл, он снова предлагает мне восстановиться после первого.

Конечно, я что-то упустил.

67

12 ответов на вопрос

70
miyalys

A slightly simpler way:

From the terminal emulator:

vim filename 

Then choose recover, and if you want to delete the swap you write (save) and then do this from within vim:

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

...and choose delete this time.

I just found out about this, and I think I'll do that from now on. Then I won't accidentally overwrite a working file either, if the recovery turned out corrupt (though I've never tried that before).

There are also relevant tips on this question on Stack Overflow (where I found this tip).

У меня нет опции `delete`, есть только: [O] pen (E) dit (R) ecover (Q) uit (A) bort, что мне делать? Arne 8 лет назад 12
@Arne: Из моего опыта это обычно означает, что файл в данный момент открывается в другом экземпляре vim? miyalys 8 лет назад 3
Опция [D] elete появилась только после того, как я обновился до Vim 7.4 jmlarson 7 лет назад 1
@ У меня была такая же проблема. Но через некоторое время, примерно через час, я перезапустил vim, и опция была доступна. ПК не был перезагружен в то время. vim может подумать, что запущен другой процесс vim. Вот почему это не показывает вариант. ka3ak 7 лет назад 0
Для тех, кто говорит, что не видит опцию `(D) elete`, смотрите`: help swap-существующие`; quote `В Unix этот выбор предлагается только тогда, когда процесс, который создал файл подкачки, по-видимому, не работает. Т.е., возможно, у вас запущен другой процесс vim, который вызывает скрытие этой опции. Это также может объяснить, почему у вас есть файл `swp`! Lqueryvg 6 лет назад 3
30
Shwaydogg

Чтобы очистить все файлы vim Swap в каталоге:

Если вы уверены, что вам не нужны какие-либо файлы подкачки vim в дереве каталогов, и вы хотите избавиться от них, вы можете использовать следующую команду в каталоге, когда vim не запущен (даже в другом окне или даже в другом логине). сессия):

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

Некоторое вдохновение и мысли пришли из удаления ненужных .swp файлов в группах Google. Это удалит все файлы, чьи имена заканчиваются .swk, .swl, .swm, .swn, .swo, или .swp в текущем дереве каталогов.

Это может быть не то, что вы хотите, по нескольким причинам:

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

    Кроме того, не все файлы подкачки заканчиваются на .swp. Если Vim необходимо создать файл подкачки, а файл, заканчивающийся на .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 Flash. Вы можете изменить регулярное выражение, если вы работаете с этими файлами.»Это также соответствует .sav, .snd(звуковые данные) .sql, .src, .srt(SubRip видео формат субтитров), и многие другие широко распространенные расширения.

  • Это может быть излишним. Как уже говорилось, он будет удалять все файлы, чьи имена заканчиваются .swk, .swl, .swm, .swn, .swo, или .swp. Но, очевидно, файлы подкачки vim обычно являются «точечными» файлами. Если вы редактируете hello.cpp, файл подкачки может быть .hello.cpp.swp. Как показано (но не объяснено) в ответе рубля, безопаснее удалять только файлы, имена которых начинаются с точки; например, с

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

Тип, ls -aкоторый перечисляет ВСЕ файлы в каталоге

введите rm .whatever.your.swpи нажмитеenter

Это так просто.

Любой файл, который показан .перед, является скрытым файлом и обычно не виден.

Помните, что изменения являются немедленными и постоянными, поэтому будьте осторожны.

Это не очень просто. Я должен покинуть Vim, перейти в каталог подкачки, запомнить имя файла и, возможно, решить, является ли он `file.swp` или` file.swo`. Тогда я должен вернуться туда, где я был. Нажав `: e` - это гораздо более простое решение. Peeja 10 лет назад 2
`ls: невозможно получить доступ + A: нет такого файла или каталога` Jonathan 8 лет назад 1
это то что мне нужно user5510975 5 лет назад 0
6
toogley

Btw. некоторые плагины делают это автоматически: autoswap.vim

из описания:

  1. Файл уже открыт в другом сеансе Vim в другом окне?
  2. Если это так, перейдите в окно, где мы редактируем этот файл.
  3. В противном случае, если файл подкачки старше самого файла, просто избавьтесь от него.
  4. В противном случае, откройте файл только для чтения, чтобы мы могли посмотреть и сохранить его.
Может кто-нибудь сказать мне, почему vim не может иметь разумного поведения по умолчанию, без плагинов? Pavel Šimerda 6 лет назад 3
5
Avio

No, AFAIK you're missing nothing. Vim continues to keep the swapfile as a backup until you explicitly delete it.

Simply save and quit and reopen the same file again. You'll be prompted (again) with

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

Now just press d :)

В самом деле? Я имею в виду, я знал это. Но это глупо. Это конечно не "просто". Peeja 11 лет назад 11
Кстати, в чем разница между прекращением и прерыванием? trusktr 10 лет назад 1
в моем случае нет опции Удалить. что я должен делать? (Я сохранил, вышел и снова открыл) Paschalis 9 лет назад 5
Вам не нужно сначала выходить из vim, просто наберите: e После того как вы выбрали «все равно редактировать» или «восстановить» файл, и вы получите возможность удалить его 00prometheus 6 лет назад 0
1
Oli Comber

Vim, как и большинство команд Unix, является простым и явным, а не предполагаемым и неявным.

Вы поправляетесь с (r). Если вам не нравится восстановление или восстановление повреждено, вы можете отказаться от него. Если вам это нравится, вы можете сохранить файл. Файл восстановления не удаляется для вас, потому что это не является явным и не будет правильным для 100% ситуаций.

Таким образом, вы (r) обнаруживаете (w) обряд и (q) выход, затем либо редактируете снова и выбираете (d) elete или «rm .myfile.js.swp» и редактируете снова. Это быстро и всегда, с точки зрения Vim, 100% правильное поведение.

Хорошо, тогда есть ли способ заставить vim указать мне путь к файлу подкачки? Я счастлив запустить вторую команду для удаления файла подкачки (на самом деле мне нравится его явность), но я бы хотел команду для удаления файла подкачки, где бы он ни находился. Например, у меня есть отдельный каталог swapfile. Если два открытых файла имеют одинаковое базовое имя, я не могу программно решить, какой файл подкачки является правильным для текущего буфера. Peeja 10 лет назад 0
Это правда, но было бы неплохо обеспечить простую опцию «Восстановить и удалить». Это также, вероятно, легко реализовать. Я сделаю это когда-нибудь, когда закончу ходить в школу, если это еще не было сделано. trusktr 10 лет назад 1
Большинство команд unix просты, явны и имеют разумное поведение по умолчанию. Восстановление Vim не простое, UX такой же плохой, как в LibreOffice, поведение совершенно неправильное, и результатом, во многих случаях, является потеря данных. Pavel Šimerda 6 лет назад 1
1
rouble

Вот более полное регулярное выражение для очистки всех файлов подкачки vim на основе собственного файла Gitub для Gimub для Vim

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

Будьте осторожны, хотя это более полное решение, оно удалит любые файлы изображений .svg и файлы .swf Adobe Flash. Вы можете изменить регулярное выражение, если вы работаете с этими файлами.

1
nate

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

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 

Дополнительная информация : файл может иметь более 1 файла подкачки. Причина в том, что файл подкачки с расширением по- .swpпрежнему существует и vimбудет продолжать создавать новые из-за этого. Чтобы узнать, .swpсуществует ли :

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

Приведенный выше фрагмент кода повторяет тот же процесс, но удаляет все файлы подкачки.

Надеюсь это поможет.

0
JosephHarriott

Из руководства :h swap:

Вы можете увидеть имя текущего файла подкачки, используемого с командой: :sw[apname]

Предупреждение ... это, вероятно, не имя файла, который нужно удалить. Пока вы не удалите файл `.swp`, команда`: sw`, вероятно, будет давать вам имя файла `.swo` - которое * не * то, что вы хотите удалить. Lqueryvg 6 лет назад 0
0
Kaleem Ullah

если вас спросят, нажмите, Dчтобы удалить файл подкачки текущего файла.

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

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

найти / найти файл:

find | grep ".searchRefineVertTabs.jsp.swp" 

а затем удалите этот файл:

rm ./.searchRefineVertTabs.jsp.swp 
Меня * спрашивают *, но мой выбор - * восстановить *. Вопрос в том, как удалить его только * после * восстановления, поскольку в этом больше нет необходимости. Кажется, неудача vim не сделать это для меня. Но принятый ответ - самый чистый рабочий процесс, который я нашел до сих пор. Peeja 8 лет назад 1