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

84

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

You may want to delete the .swp file now.

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

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

Peeja
источник
См. Здесь 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.

... и выберите удалить на этот раз.

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

Есть также соответствующие советы по этому вопросу о переполнении стека (где я нашел этот совет).

miyalys
источник
16
У меня нет deleteвыбора, есть только: [O] pen (E) dit (R) ecover (Q) uit (A) bort, что мне делать?
Арне
4
@Arne: Из моего опыта это обычно означает, что файл в данный момент открывается в другом экземпляре vim?
miyalys
1
Опция [D] elete появилась только после того, как я обновился до Vim 7.4
jmlarson
@ У меня была такая же проблема. Но через некоторое время, примерно через час, я перезапустил 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.Т.е. , возможно , у вас есть еще один ВИМ запущенного процесса , который вызывает этот параметр , чтобы скрыть. Это также может объяснить, почему у вас есть swpфайл в первую очередь!
Lqueryvg
39

Чтобы очистить все файлы 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
    
Shwaydogg
источник
14

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

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

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

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

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

Волчок
источник
4
Это не очень просто. Я должен покинуть Vim, перейти в каталог подкачки, запомнить имя файла и, возможно, решить, будет ли он file.swpили нет file.swo. Тогда я должен вернуться туда, где я был. Удар :e- намного более простое решение.
Пиджа
1
ls: cannot access +A: No such file or directory
Джонатан
это то, что мне нужно
user5510975
7

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

из описания:

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

Нет, AFAIK, ты ничего не упустил. Vimпродолжает сохранять файл подкачки в качестве резервной копии, пока вы явно не удалите его.

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

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

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

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

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

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

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

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

Эти файлы меня тоже раздражали, но я установил параметр в .vimrc - set noswapfile чтобы vim не создавал его, а вместо этого оставлял файлы в памяти.

Dmitrii
источник
Согласно ОП, файлы подкачки полезны, поэтому отключение их может быть не лучшим вариантом.
Кусалананда
Не выключайте файлы подкачки. Если ваша машина сломается, вы потеряете свою работу.
Lqueryvg
Конечно, эта опция подразумевает риски, и, как я знаю, эти файлы подкачки были созданы при появлении редакторов vi *, когда его сбои случались очень часто. Теперь я могу сказать, что vim работает стабильно, и они существуют как устаревшая вещь, imho.
Дмитрий
1

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

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

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

рубль
источник
1

Вот фрагмент для добавления .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

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

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

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

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

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

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

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

find | grep ".searchRefineVertTabs.jsp.swp"

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

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

Вы можете использовать,

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

Пример:

rm -f .rc.local.swp
RizonBarns
источник
Технически это работает, но это не так просто при текущем принятом ответе.
Peeja
Плюс <ext>здесь избыточен, так как имя файла по крайней мере в Linux включает ноль или более расширений.
Павел Шимерда