Як позбутися попереджень при відкритті файлу, у якому є файл .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

Це повідомлення насправді є досить важливим, якщо ви дбаєте про те, щоб не втратити текст, який ви потенційно не зберегли. Це не повинно вважатися дратівливим і не повинно спричиняти поспішного видалення файлу swap або налаштування vimна запуск без нього.

Будь-який файл , який ви редагування з vimматиме відповідний файл підкачки при редагуванні , яка vimвикористовується для відстеження змін. Коли ви вийдете з редагування файлу, vimавтоматично відкинете відповідний файл підкачки. Тому наявність файлу swap та ваша спроба написати поверх початкового файлу повинні стати причиною для розгляду та відповідних дій.

Два сценарії, представлені в повідомленні ( E325: ATTENTION Found a swap file), насправді є досить поширеними: (1) або інша vimпрограма редагує той самий файл, який ви намагаєтесь відредагувати (насправді це може бути інша людина - у цьому випадку це справді не має сенсу просто сліпо видалити файл swap - або це може бути ви в іншому вікні або вкладці терміналу), або (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нічого не повертається , це означає, що різниці немає, і можна безпечно видалити і файл swap, і другий файл:

rm .notes.swp notes2

У цей момент відкрийте оригінальний файл і продовжуйте так, ніби ніколи не було проблем:

vim notes

Якщо diffщось повертає , це означає, що в оригінальному файлі (через файл swap) відбулися зміни, які завдяки відновленню були збережені у другий файл.

Оскільки ці зміни фіксуються у другому файлі, ви можете видалити файл swap та перезаписати вихідний файл другим:

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

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

У цей момент відкрийте оригінальний файл і продовжуйте так, ніби ніколи не було проблем:

vim notes

Це здається великою роботою, але як тільки ти звикнеш до робочого процесу, це займає приблизно 20 секунд.


2
Не можу повірити, що це не прийнята відповідь. Це прекрасно. +1
Девід

настільки краще, ніж прийнята відповідь. Бажаю, щоб у нас був спосіб вирішити це!
Майкл Дюррант

1
Не завжди буває так, що повідомлення корисне. Якщо я редагую файл, мені байдуже, чи змінився файл з мого початку редагування , на даний момент я намагаюся його зберегти , а не чи редагую його в іншому вікні vim. Для мене цілком чудово відкривати файл у двох терміналах, доки збереження файлу не переплутаються. Vim дійсно потребує мене, коли я намагаюся зберегти, а не тоді, коли я його відкриваю.
Кен Саймон

На жаль, це не дає відповіді на запитання, це лише говорить про те, що я не повинен ігнорувати екран нагрів. Мій сценарій полягає в тому, що я вже відкрив файл у vim (можливо, для редагування), хочу бачити різні частини файлу одночасно поруч і не хочу розбивати буфери, оскільки clang_complete продовжує змінювати розмір буферів . У цьому випадку я насправді хочу знати, як відкрити файл лише в Vim і змусити його ігнорувати файл swap.
Лелантран

@Lelanthranvim -n file_name
user664833

19

Вставлене повідомлення передбачає, що файл "нотатки" все ще відкритий в іншому сеансі Vim. Однозначно не дуже гарна ідея редагувати файл, який редагується в іншому місці.

Якщо це повідомлення неправильне, вам потрібно визначити, як ваш сеанс Vim невідповідно вийшов, і уникнути цього в майбутньому.

Що стосується відновлення, то це може бути проблемою в цьому одному випадку, оскільки "нотатки" новіші, ніж файл Vim .swp, пов'язаний з ним, але ви все одно можете спробувати. Просто переконайтеся, що ви скопіювали спочатку свій файл "примітки" в резервне місце.

Було б непогано прочитати " :help recover.txt".

Урок полягає в тому, що ви не повинні бачити це повідомлення, і що ви є засобом, що десь неправильно десь пішло. Це (мабуть) не вина Віма.

Якщо в цей момент ви все одно абсолютно не налаштовані не дозволяти Vim створювати .swp файли, щоб ви могли відновитись після збоїв та інших пов'язаних з цим проблем, можете " set noswapfile" поставити " ~/.vimrc.


1
БУДЬ ОБЕРЕЖНИЙ! Я майже втратив всю свою роботу, возившись з VIM. Скопіюйте свій код, перш ніж щось спробувати.
Squirrl

Я настійно пропоную читачам переглянути відповідь від користувача664833 ( Це повідомлення насправді досить важливе ... ), оскільки я думаю, що він дає набагато кращу інформацію та поради, що ця відповідь imho
Michael Durrant

11

Ви можете використовувати -n, щоб відкрити vim без використання swapfile :

Щоб це робити весь час, просто покладіть

alias vim='vim -n' 

у файлі .bashrc або .bash_aliases

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

\vim

3
Я б не рекомендував завжди працювати без swapfile, але "-n" - це саме те, що мені потрібно. Я зазвичай використовую файл swap. Однак, використовуючи Vim як різний інструмент, я хотів би мати можливість переглядати файли, які я редагую, без тих, що дають мені це повідомлення або заважають моєму файлу swap.
Agentlien

1
Мені подобається ця відповідь - вона коротка, точна і відповідає на власне питання!
Лелантран


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

І це все.

Пам'ятайте, що файли свопу є для того, щоб захистити вас, і вам не слід їх повністю відключати.


Але що робити, якщо немає vi(m)процесу?
Скотт

-2

Я вирішив це питання трьома простими кроками:

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

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

3 :) Тепер підтвердьте, що файл ".swp" видалено.

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


3
Чому в світі ви б запропонували rm -rfвидалити файл? Я замінив -rfна більш розумний-i
Nifle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.