68

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

You may want to delete the .swp file now.

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

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

12 ответов12

69

Немного более простой способ:

Из эмулятора терминала:

vim filename

Затем выберите восстановить, и если вы хотите удалить своп вы пишете (сохранить) , а затем сделать это изнутри Vim:

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

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

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

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

32

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

Введите ls -a ВСЕ файлы в каталоге

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

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

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

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

6

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

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

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

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

6

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

из описания:

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

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

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

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

1

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

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

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

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

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

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

find | grep ".searchRefineVertTabs.jsp.swp"

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

rm ./.searchRefineVertTabs.jsp.swp
0

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

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

-1

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

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

Пример:

rm -f .rc.local.swp

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .