VIM - оставляет .swp файлы после сбоя

3076
Brian M. Hunt

Я использую MacVim (snapshot 51)для редактирования файлов Python / HTML / etc в проекте среднего размера. Каждые несколько месяцев моя система блокируется или дает сбой, и Vim оставляет множество файлов. *. Swp. Когда я снова открываю Vim после сбоя и редактирую любой из этих файлов, мне говорят, что «файл подкачки» .xyz.swp «уже существует!» с параметрами [Прервать] [Выйти] [Удалить] [Восстановить] [Редактировать в любом случае] и [Открыть только для чтения].

Эта опция восстановления будет иметь смысл, если в буфере Vim будут изменения, которые не были сохранены во время сбоя. Однако в момент сбоя эти файлы были открыты на фоне Vim и без изменений.

Если возможно, как я могу настроить Vim, чтобы он не задавал этот лишний вопрос при открытии файлов, для которых нет изменений между .swpфайлом и фактическим файлом, например, одним из:

  1. Автоматическое сравнение изменений в файле .swp с файлом, и если изменений нет, просто откройте файл без запроса;

  2. Не хранить файл .swp для файлов без изменений.

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

У меня есть более пятидесяти .swpфайлов для очистки на данный момент, и бессмысленная подсказка - разочарование, которого я был бы благодарен, чтобы избежать.

Спасибо за чтение.

Брайан

7
"Каждые несколько месяцев"? Если ваша система выходит из строя каждые несколько месяцев и вы получаете много файлов .swp, вы, вероятно, выходите из Vim неправильно. Используйте: q, а не просто Ctrl + Z. mcandre 13 лет назад 0
@mcandre: Хм. Я использую `: q`, но файлы подкачки, тем не менее, кажутся зависшими для фоновых буферов. Возможно, это больше моя проблема. В `~ / .vimrc` я не вижу ничего такого, что могло бы удерживать буферы вокруг ... (Кстати, что делает` Ctrl + Z`? В MacVim, похоже, ничего не происходит) Brian M. Hunt 13 лет назад 0
`Ctrl + Z` убивает процесс, запущенный из оболочки (Терминал). Так как вы используете MacVim, это не относится к вашей ситуации, но вы можете попробовать его через терминал… bchang 13 лет назад 0
На самом деле, `Ctrl-Z` ничего не убивает. Это приостанавливает процесс. (Но не в графическом интерфейсе Vims.) Это позволяет вам вернуться к оболочке, сделать некоторые вещи и снова включить Vim. Если вы тем временем убьете оболочку (скажем, закрыв окно терминала), вы * убьете Vim. Peeja 11 лет назад 0

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

4
redacted

Хотя это не совсем то, что вы хотите, это может смягчить проблему:

" Setup backup location and enable set backup set backupdir=$HOME/temp/vim_backups/ "where to put those backups set directory=$HOME/temp/vim_swp/ "this is for swp files  

Создайте эти каталоги, и vim запишет файлы ~ и .swp в центральное место. Гораздо проще убрать таким образом!

Также проверьте recovery.vim - если обнаружен файл .swp, он предложит запустить diff для версии на диске и swp, чтобы вы могли увидеть, что изменилось. Гораздо полезнее этот способ ИМО.

3
GmonC

Я не тестировал его, но как насчет этого решения, представленного на официальной вики-странице vim?

Файл подкачки "..." уже существует! - так разглядеть

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

#!/bin/bash # Expects variables realfile, swapfile, recoveryfile. vim -r "$swapfile" -c ":wq! $recoveryfile" && rm "$swapfile" if cmp "$recoveryfile" "$realfile" then rm "$recoveryfile" else vimdiff "$recoveryfile" "$realfile" fi 

Есть сценарий для этой проблемы также в Stackoverflow .

Это удалит все файлы подкачки, которые соответствуют современным файлам . Все, что не совпадает, отображаются в окне vimdiff, поэтому я могу объединить свои несохраненные изменения.

0
mcandre

Vim автоматически создает файлы .swp в качестве резервной копии именно для такой ситуации: происходит сбой системы. Чтобы отключить создание файла .swp, следуйте этим инструкциям.

Первый результат для Google: vim disable .swp.

@mcandre: Спасибо. Отключение подкачки - наихудший вариант решения проблемы, и учитывая (хотя и низкую вероятность) высокое значение потенциальной потери от неиспользования файлов подкачки, я, вероятно, не буду этого делать. Это бессмысленная подсказка восстановления, которую я хочу избежать. Brian M. Hunt 13 лет назад 0
Вы можете написать сценарий входа, который находит и перемещает все файлы .swp в каталог резервных копий (или даже удаляет их). mcandre 13 лет назад 0
@ Макандре: Спасибо за предложение. Это может сработать, и я подумал об этом, но он не скажет мне, есть ли какие-либо несохраненные изменения в файлах подкачки. Brian M. Hunt 13 лет назад 0
Затем добавьте «diff» в скрипт для сравнения файлов. mcandre 13 лет назад 0
@mcandre: Что бы вы изменили? Есть ли способ извлечь содержимое файла подкачки Vim для сравнения через diff? Brian M. Hunt 13 лет назад 0
Вы должны различать .swp и исходные файлы, удаляя swp, которые эквивалентны. Смотрите man diff (http://unixhelp.ed.ac.uk/CGI/man-cgi?diff). mcandre 13 лет назад 0
@mcandre: содержимое файлов подкачки по определению отличается от содержимого файла. Файлы подкачки являются двоичными контейнерами, используемыми для поддержания состояния Vim, и имеют следующий вид магии (для Vim 7.2): "b0VIM7.2 \ 0 \ 0 \ 0 \ 0". Таким образом, прямая разница бессмысленна. Вы должны извлечь состояние редактора во время последней синхронизации подкачки и сравнить его с файлом. Таким образом, мой вопрос: «Есть ли способ извлечь содержимое файла подкачки Vim для сравнения через diff?» Brian M. Hunt 13 лет назад 0
-1
ayaz

Чтение документации по функции «swap-file» в Vim с помощью команды Vim :help swapпоможет вам понять, как Vim создает файл подкачки и т. Д.

Хотя `: help swap` должен помогать во многих вещах, в данном случае это не так. Как и Роббинс и др. «Изучение редакторов Vi & Vim». Если бы кто-то сделал, мне бы не нужно было публиковать вопрос. ;) Brian M. Hunt 13 лет назад 0