Як я можу відновити вихідний файл із .swp-файлу?


57

Я спробував відкрити файл .swp , використовуючи viі , catале вона показує сміття.


Ви використовуєте vi чи vim?
frabjous

Це працює з emacs? (або піднесений, нано, ред. тощо)
відвертий

Відповіді:


94
vim -r .swp

Це переходить у режим відновлення та надає більше інформації. Я думаю, це те, чого ти хочеш.

.swX-файли залишаються позаду, якщо сеанс із збереженим файлом знищений / збивається / трапляється щось інше погане. Вони також присутні під час відкриття незбереженого буфера в сеансі Vim. vim -rчитає ці тимчасові файли та відтворює вміст. Після того, як ви відновити його, просто збережіть його , як зазвичай, наприклад :w newfilename.


8
Саме те, що я шукав. Для будь-кого іншого, саме так ви відновлюєте збережені файли. Вищеописані методи добре працюють, якщо файл уже існує, але ви не можете відкрити файл без імені.
Ерік Ху

17

Для відновлення .swp не потрібно мати оригінальний файл. Просто відкрийте файл так, ніби він існує. vim шукатиме файл із розширенням .swp та пропонує відновити його.

наприклад:

$ ls -a
. .. .test.txt.swp
$ vim test.txt
[...]
Swap file ".test.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Просто натисніть R, щоб відновити його, і: wq файл

Редагувати: Зауважте, що .swp файл містить лише зміни, внесені до файлу (див. Коментар). Це означає, що вам потрібно буде отримати останню копію файлу із резервної копії, а потім використати vim для відновлення останніх змін. Якщо у вас немає резервної копії файлу, вам справді не пощастило.


2
Ви обов'язково повинні мати оригінальний файл, без нього дані у .swp-файлі марні. Див. ": Help swap-file". Бувають ситуації, коли може здатися, що він працює без оригінального файлу, але файл .swp зберігає лише зміну інформації і вимагає певної відправної точки, щоб застосувати цю інформацію під час відновлення.
Гептит

Ви праві, звичайно. Я фактично не знав цього про vim. Але це цілком логічно, оскільки зберігання повної копії оригінального файлу було б величезною тратою. Тоді відповідь: Відновіть файл із резервної копії, а потім використовуйте vim, щоб відновити останні зміни.
Вегар Вестерлунд

Збереження всього файлу за один проміжок часу було б марним, так, але я бачу потенційне значення в накопиченні файлів swp (коли це увімкнено.) З тієї ж причини ви редагуєте через diff і виправляєте оригінал лише при явному збереженні, для мене це має сенс якщо ви можете створити послідовність розрізків, генеруйте часткову суму (дати до сьогодні -> ніч; ніч + сьогодні = поточний) тощо. Я знайшов ': pre [serve] `в мануелі, я думаю, що це працює саме так. У будь-якому випадку, найважливіший рядок:The original file is no longer needed for recovery.
Іван П

Схоже, це працює - :preserveі :set cpoptions=...&залишає у каталозі .swp та .swo файл і пропонує відновити з будь-якого. Використовуючи vim -r <file>ви можете обирати між .swp та .swo. Подальші зміни редагують .swn, .swm тощо, які, як видається, є частковою сумою свопів до цього моменту. Ви можете повернутися до версії за своїм смаком і відредагувати (~ = вилка) або зберегти (~ = сховище). Врешті-решт, ви можете відзначити розміщення файлів своп, демонструвати їх резервні копії тощо. Я можу помилитися з деталями, коли мова йде про більші файли - я не впевнений, як це впливає на додаткові файли підкачки - див. Нижче.
Джон П

(Продовження) - буфер містить прапори, і саме буфер створює файли swap, тому навіть якщо прапори не встановлені з глобальної конфігурації або автозавантаження, вони успадковуються під час самого відновлення. Щоб замінити послідовність відновлення одним файлом відновлення, ви можете перемістити swap, який ви хочете .swp, і приховати решту. Я хотів би дізнатися більше про збіг між відновленням файлів та управлінням сеансом Vim, якщо хтось може заповнити прогалини.
Джон П



7

Прочитавши коментарі Вегара Вестерлунда та Гептита, я хотів дізнатися, в який момент vim потрібен оригінальний файл (або резервна копія) для відновлення з .swp-файлу. Ось що було:

Я відкрив файл 975 рядків, відредагував його в рядку 949 (створив .swpфайл) і вбив процес, а потім видалив оригінал. $ vim Original_Fileзапитав, чи хочу я відновитися після .swp »> так; фактично було відновлено лише перші 68 рядків та останні 34 рядки (починаючи з 8 рядків вище моєї редакції).

Потім я повторив тест з меншими файлами: від 20 до 200 рядків .swp файл містив 100% початкового вмісту. Але в 300 рядках лише перші 68 і 18 останніх рядків (починаючи з 2 рядків вище моєї редакції) були включені до .swp.

Як висновок, добре знати, що vim завжди зберігає "заголовок" і "дно" у файлах .swp. Можливо, є налаштування, щоб контролювати, скільки рядків має містити .swp?

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