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

46

Как избавиться от надоедливых предупреждений при открытии файла с файлом .swp? Или как вообще не генерировать файлы .swp? Пример предупреждения:

E325: ATTENTION
Found a swap file by the name ".notes.swp"
          owned by: james   dated: Fri Dec  3 17:38:07 2010
         file name: ~james/school/se/project-dir/rottencucumber/doc/notes
          modified: no
         user name: james   host name: james-laptop
        process ID: 2251 (still running)
While opening file "notes"
             dated: Fri Dec  3 18:46:10 2010
      NEWER than swap file!

(1) Another program may be editing the same file.
    If this is the case, be careful not to end up with two
    different instances of the same file when making changes.
    Quit, or continue with caution.

(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r notes"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".notes.swp"
    to avoid this message.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
Джеймс
источник

Ответы:

44

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

Любой файл, который вы редактируете, vimбудет иметь соответствующий файл подкачки во время редактирования , который будет vimиспользоваться для отслеживания изменений. При выходе из редактирования файла vimавтоматически удаляется соответствующий файл подкачки. Следовательно, наличие файла подкачки и ваша попытка перезаписать исходный файл должны стать причиной для рассмотрения и принятия соответствующих мер.

Два сценария, представленные в message ( E325: ATTENTION Found a swap file), на самом деле довольно распространены: (1) либо другая vimпрограмма редактирует тот же файл, который вы пытаетесь редактировать (это может быть другой человек - в этом случае это действительно не имеет смысла) просто слепо удалить файл подкачки - или это может быть вы в другом окне терминала или вкладке), или (2) произошел vimсбой предыдущего сеанса (чаще всего это происходит при удаленном редактировании и разрыве сетевого сеанса - в котором если сессия vim не была завершена нормально, а .swpфайл остался позади, другой пример этого второго сценария - это то, что вы случайно закрыли окно терминала или вкладку, в которой был активный или фоновый vimсеанс).

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

введите описание изображения здесь

Если я понимаю, что редактирую в другом месте и могу вернуться к нему , я нажимаю qклавишу (Q)uitэтого дополнительного сеанса и возвращаюсь к редактированию через исходный vimсеанс.

Иногда, если я не совсем уверен, я (Q)uitзапускаю jobsи проверяю, работаю ли я vimв том же терминале; если ничего не происходит, я запускаю, ps -ef | grep vimчтобы проверить, работаю ли я в vimдругом месте (то есть в другом окне терминала или вкладке). Дело в том, что я всегда пытаюсь возобновить редактирование через исходную vimсессию.


Если я уверен, что не могу вернуться к исходному сеансу редактирования, и мне все еще предлагаются следующие опции, тогда я нажимаю rна (R)ecover.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

Нажав r, вы увидите сообщение, подобное этому:

Swap file ".notes.swp" already exists!
"notes" 18L, 46C
Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

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

vim -r notes

Результирующее сообщение будет похоже:

Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

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

Примечание: если Vim сомневается в том, что он обнаружил, он выдаст сообщение об ошибке и вставит строки с «???» в тексте. Если вы видите сообщение об ошибке во время восстановления, найдите в файле «???» чтобы увидеть, что не так. Вы можете вырезать и вставить, чтобы получить текст, который вам нужен.

Наиболее распространенным замечанием является «??? пропущенные линии». Это означает, что Vim не может прочитать текст из исходного файла. Это может произойти, если система потерпела крах, и части исходного файла не были сохранены.

Тем не менее, я никогда не видел эти ???отметки, так что это должно быть действительно редким явлением.


Затем сохраните (т.е. запишите) содержимое в другой файл (обычно я просто добавляю «2» к концу исходного имени файла):

:w notes2

Затем принудительно выйдите из этой vimсессии:

:q!

Далее сравните два файла:

diff notes notes2

Если diffничего не возвращается , это означает, что разницы нет, и можно безопасно удалить как файл подкачки, так и второй файл:

rm .notes.swp notes2

На этом этапе откройте исходный файл и действуйте так, как будто никогда не было проблем:

vim notes

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

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

rm .notes.swp
remove .notes.swp? y

mv notes2 notes
overwrite notes? (y/n [n]) y

На этом этапе откройте исходный файл и действуйте так, как будто никогда не было проблем:

vim notes

Это кажется большой работой, но как только вы привыкнете к рабочему процессу, это займет максимум 20 секунд.

user664833
источник
2
Не могу поверить, что это не принятый ответ. Это идеально. +1
Дэвид
намного лучше, чем принятый ответ. Жаль, что у нас не было способа решить эту проблему!
Майкл Даррант
1
Это не всегда тот случай, когда сообщение полезно. Если я редактирую файл, меня волнует, изменился ли файл с тех пор, как я начал редактирование , в данный момент я пытаюсь сохранить его , а не редактирую ли я его также в другом окне vim. Для меня совершенно нормально открыть файл в двух терминалах, если сохранение в файл не чередуется. Vim действительно нуждается во мне, когда я пытаюсь сохранить, а не когда я его открываю.
Кен Саймон
К сожалению, это не отвечает на вопрос, а только говорит о том, что я не должен игнорировать нудный экран. Мой сценарий состоит в том, что у меня уже есть файл, открытый в vim (возможно, для редактирования), я хочу одновременно видеть разные части файла и не хочу разделять буферы, потому что clang_complete продолжает изменять размеры буферов , В этом случае я действительно хочу знать, как открыть файл только для чтения в Vim и чтобы он игнорировал файл подкачки.
Лелантран
@Lelanthranvim -n file_name
user664833
19

Вставленное сообщение говорит о том, что у вас по-прежнему открыт файл "notes" в другом сеансе Vim. Это определенно не очень хорошая идея редактировать файл, который редактируется в другом месте.

Если это сообщение неверно, вам нужно определить, как неправильно завершился сеанс Vim, и избегать этого в будущем.

Что касается восстановления, это может быть проблемой в этом случае, так как «notes» новее, чем связанный с ним файл Vim .swp, но вы все равно можете попробовать. Просто убедитесь, что вы сначала скопировали файл «Заметки» в резервное хранилище.

Было бы неплохо прочитать " :help recover.txt".

Урок здесь состоит в том, что вы не должны видеть это сообщение, и что вы имеете в виду что-то где-то пошло не так. Это (вероятно) не вина Вима.

Если на этом этапе вы по-прежнему абсолютно не хотите, чтобы Vim создавал файлы .swp, чтобы вы могли восстановиться после сбоев и других связанных с этим проблем, вы можете указать " set noswapfile" в ~/.vimrc.

Heptite
источник
1
БЫТЬ ОСТОРОЖЕН! Я почти потерял всю свою работу, возиться с VIM. Скопируйте код, прежде чем пытаться что-либо.
Белка
Я настоятельно рекомендую читателям просмотреть ответ пользователя user664833 ( Это сообщение на самом деле очень важно ... ), так как я думаю, что оно дает гораздо лучшую информацию и совет, что этот ответ imho
Майкл Даррант
11

Вы можете использовать -n, чтобы открыть vim без использования файла подкачки :

Чтобы сделать это все время, просто поставьте

alias vim='vim -n' 

в вашем файле .bashrc или .bash_aliases

если вам когда-либо понадобится запустить vim без опции -n, просто запустите

\vim
Брэд Паркс
источник
3
Я бы не рекомендовал всегда работать без файла подкачки, но «-n» - это именно то, что мне нужно. Я обычно использую файл подкачки. Однако, используя Vim в качестве инструмента сравнения, я хотел бы иметь возможность просматривать различия файлов, которые я редактирую, без этих различий, дающих мне это сообщение или мешающих моему файлу подкачки.
Agentlien
1
Мне нравится этот ответ - он короткий, точный и отвечает на реальный вопрос!
Лелантран
2

vim удалит сгенерированный файл .swp при правильном выходе из него.

Игнасио Васкес-Абрамс
источник
1

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

Используйте опцию коротких сообщений в вашем ~/.vimrc:

set shortmess=A

Что также является значением по умолчанию при работе в режиме POSIX.

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

епископ
источник
1
Предполагая однопользовательскую систему, это не так уж ужасно в конфигурации. Мне нравится иметь много открытых вкладок терминала, и иногда я хочу отредактировать файл, который я уже похоронил в другой вкладке. Если я хочу сделать несколько быстрых правок, это нормально. Если я окажусь еще в другом окне VIM, красота в том , что он будет предупреждать то , что файл был изменен , прежде чем я сохранить его, и я могу сделать быстро , :eчтобы увидеть , что произошло ( в том числе быстрый , uчтобы отменить спиной к тому , что Я имел в буфере.) Мне нравится это намного лучше, чем ворчание о том, что у меня уже есть открытый файл.
Кен Саймон
1

Это случилось со мной, когда мой терминал неожиданно закрыл мое соединение с открытым vi.

К счастью, я не потерял никаких изменений.

Чтобы удалить это предупреждение и отменить обмен:

  1. Найти идентификатор процесса , глядя на process ID: 2251 (still running), в данном случае это 2251
  2. Убедитесь, что вы получили правильный идентификаторps 2251
  3. Убить процесс, используяkill 2251

Вот и все.

Помните, что для защиты вас существуют файлы подкачки, и вам не следует полностью их отключать.

kintsukuroi
источник
Но что, если нет vi(m)процесса?
Скотт
-2

Я решил эту проблему в три простых шага:

1 :) Запустите "ls -la" там, где файл существует, чтобы вы могли просмотреть файл .swp для него.

2 :) Теперь "rm -i * .swp", т.е. удалите файл ".swp" из каталога.

3 :) Теперь подтвердите, был ли удален файл .swp.

4 :) Теперь наслаждайтесь этими предупреждениями.

Анкур Шривастава
источник
3
С rm -rfкакой стати вы бы предложили удалить файл? Я заменил -rfна более толковый-i
Nifle