Bagaimana cara menghilangkan peringatan ketika membuka file yang memiliki file .swp?

46

Bagaimana saya bisa menghilangkan peringatan yang mengganggu ketika saya membuka file yang memiliki file .swp? Atau, bagaimana saya tidak menghasilkan file .swp? Contoh peringatan:

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:
James
sumber

Jawaban:

44

Pesan ini sebenarnya cukup penting jika Anda khawatir tidak kehilangan teks yang berpotensi tidak Anda simpan. Seharusnya tidak dianggap menjengkelkan, dan tidak boleh menyebabkan Anda buru-buru menghapus file swap atau mengkonfigurasi vimuntuk berjalan tanpa itu.

File apa pun yang Anda edit vimakan memiliki file swap yang sesuai saat Anda mengedit , yang vimdigunakan untuk melacak perubahan. Ketika Anda berhenti mengedit file, vimsecara otomatis akan membuang file swap yang sesuai. Oleh karena itu, keberadaan file swap, dan upaya Anda untuk menulis melampaui file asli, harus menjadi pertimbangan dan tindakan yang tepat.

Dua skenario yang disajikan dalam pesan ( E325: ATTENTION Found a swap file) sebenarnya cukup umum: (1) salah satu vimprogram lain sedang mengedit file yang sama yang Anda coba edit (sebenarnya bisa orang lain - dalam hal ini benar - benar tidak masuk akal untuk hanya menghapus file swap secara membabi buta - atau itu bisa Anda di jendela terminal lain atau tab), atau (2)vim sesi sebelumnya macet (paling sering ini terjadi ketika Anda mengedit jarak jauh, dan sesi jaringan terputus - di mana Jika sesi vim tidak keluar secara normal, dan .swpfile tetap tertinggal; contoh lain dari skenario kedua ini adalah Anda secara tidak sengaja menutup jendela atau tab terminal yang memiliki vimsesi aktif atau berlatar belakang ).

Ketika saya menjumpai pesan ini, saya pertama kali berpikir apakah saya mengedit file ini di jendela atau tab terminal lain, karena saya biasanya beroperasi dengan beberapa jendela terminal dengan masing-masing beberapa tab:

masukkan deskripsi gambar di sini

Jika saya menyadari bahwa saya sedang mengedit di tempat lain, dan dapat kembali ke sana , saya kemudian tekan qtombol untuk (Q)uitsesi tambahan ini, dan kembali ke pengeditan melalui vimsesi asli .

Kadang-kadang jika saya tidak sepenuhnya yakin, saya (Q)uitkemudian berlari jobsuntuk memverifikasi apakah saya menjalankan vimterminal yang sama persis; jika tidak ada yang muncul, saya berlari ps -ef | grep vimuntuk memeriksa apakah saya menjalankan di vimtempat lain (yaitu di jendela atau tab terminal lain). Intinya, saya selalu mencoba untuk melanjutkan pengeditan melalui vimsesi asli .


Jika saya yakin bahwa saya tidak dapat kembali ke sesi pengeditan asli, dan saya masih disajikan dengan opsi berikut, maka saya tekan runtuk (R)ecover.

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

Menekan r, Anda akan melihat pesan seperti ini:

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

Jika, di sisi lain, saya tidak lagi dihadapkan dengan opsi-opsi itu, karena saya berada di shell prompt, maka saya menjalankan vimdengan -ropsi, sebagai berikut:

vim -r notes

Pesan yang dihasilkan akan serupa:

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

Either way, tekan ENTERuntuk melanjutkan, dan Anda akan melihat file Anda.

Catatan: Jika Vim ragu tentang apa yang ditemukannya, Vim akan memberikan pesan kesalahan dan menyisipkan baris dengan "???" dalam teks. Jika Anda melihat pesan kesalahan saat memulihkan, cari di file untuk "???" untuk melihat apa yang salah. Anda mungkin ingin memotong dan menempel untuk mendapatkan teks yang Anda butuhkan.

Komentar yang paling umum adalah "??? LINES MISSING". Ini berarti bahwa Vim tidak dapat membaca teks dari file asli. Ini dapat terjadi jika sistem macet dan sebagian file asli tidak disimpan.

Yang mengatakan, saya belum pernah melihat ???tanda - tanda itu, jadi ini pasti kejadian yang benar-benar langka .


Selanjutnya, simpan (yaitu menulis) konten ke file lain (biasanya saya hanya menambahkan "2" ke akhir nama file asli):

:w notes2

Selanjutnya, keluar dari vimsesi ini secara paksa :

:q!

Selanjutnya, bandingkan dua file:

diff notes notes2

Jika diffpengembalian tidak ada , itu berarti tidak ada perbedaan, dan aman untuk menghapus file swap dan file kedua:

rm .notes.swp notes2

Pada titik ini, buka file asli dan lanjutkan seolah-olah tidak pernah ada masalah:

vim notes

Jika diffmengembalikan sesuatu , itu berarti file asli (melalui file swap) memiliki perubahan itu, berkat pemulihan, telah disimpan ke file kedua.

Karena perubahan tersebut ditangkap dalam file kedua, Anda aman untuk menghapus file swap dan menimpa file asli dengan yang kedua:

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

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

Pada titik ini, buka file asli dan lanjutkan seolah-olah tidak pernah ada masalah:

vim notes

Ini sepertinya banyak pekerjaan, tetapi begitu Anda terbiasa dengan alur kerja, dibutuhkan sekitar 20 detik maks.

user664833
sumber
2
Tidak percaya ini bukan jawaban yang diterima. Itu sempurna. +1
David
jauh lebih baik daripada jawaban yang diterima. Seandainya kita punya cara untuk mengatasi ini!
Michael Durrant
1
Tidak selalu halnya bahwa pesan itu berguna. Jika saya mengedit file, saya peduli jika file telah berubah sejak saya mulai mengedit , saat ini saya mencoba menyimpannya , bukan apakah saya juga mengeditnya di jendela vim lain. Tidak apa-apa bagi saya untuk membuka file di dua terminal, asalkan menyimpan ke file tidak interleave. Vim hanya perlu mengomel saya ketika saya mencoba menyimpan, bukan ketika saya membukanya.
Ken Simon
Sayangnya ini tidak menjawab pertanyaan, hanya mengatakan bahwa saya tidak boleh mengabaikan layar cerewet. Skenario MY adalah bahwa saya sudah membuka file dalam vim (untuk mengedit, mungkin), ingin melihat bagian-bagian berbeda dari file pada saat yang bersamaan, dan tidak ingin membagi buffer karena clang_complete terus mengubah ukuran buffer. . Dalam hal ini, saya sebenarnya ingin tahu cara membuka file yang hanya bisa dibaca di Vim dan membiarkannya mengabaikan file swap.
Lelanthran
@Lelanthranvim -n file_name
user664833
19

Pesan yang ditempelkan menunjukkan Anda masih memiliki file "catatan" terbuka di sesi Vim lain. Jelas bukan ide yang baik untuk mengedit file yang sedang diedit di tempat lain.

Jika pesan itu salah, Anda perlu menentukan bagaimana sesi Vim Anda keluar dengan tidak tepat dan menghindarinya di masa mendatang.

Sedangkan untuk memulihkan, itu mungkin menjadi masalah dalam hal ini karena "catatan" lebih baru daripada file .im. Vw yang terkait dengannya, tetapi Anda masih dapat mencoba. Pastikan Anda menyalin file "catatan" Anda ke lokasi cadangan terlebih dahulu.

Akan menjadi ide yang bagus untuk membaca " :help recover.txt".

Pelajaran di sini adalah bahwa Anda tidak seharusnya melihat pesan ini, dan bahwa Anda berarti Sesuatu yang Salah. Ini (mungkin) bukan kesalahan Vim.

Jika saat ini Anda masih benar-benar bertekad untuk tidak membiarkan Vim membuat file .swp agar Anda dapat pulih dari kerusakan dan masalah terkait lainnya, Anda dapat " set noswapfile" memasukkan ~/.vimrc.

Heptite
sumber
1
HATI-HATI! Saya hampir kehilangan semua pekerjaan saya dengan VIM. Salin kode Anda sebelum Anda mencoba sesuatu.
Squirrl
Saya sangat menyarankan pembaca meninjau jawaban oleh user664833 ( Pesan ini sebenarnya cukup penting ... ) karena saya pikir itu memberikan informasi dan saran yang jauh lebih baik bahwa jawaban ini imho
Michael Durrant
11

Anda bisa menggunakan -n untuk membuka vim tanpa menggunakan swapfile :

Untuk melakukan ini sepanjang waktu, cukup cantumkan

alias vim='vim -n' 

dalam file .bashrc atau .bash_aliases Anda

jika Anda perlu menjalankan vim tanpa opsi -n, jalankan saja

\vim
Taman Brad
sumber
3
Saya tidak akan merekomendasikan selalu berjalan tanpa swapfile, tetapi "-n" sebenarnya yang saya butuhkan. Saya menggunakan file swap, biasanya. Namun, ketika menggunakan Vim sebagai alat diff, saya ingin dapat melihat diff file yang saya edit tanpa diffs yang memberi saya pesan ini atau mengganggu file swap saya.
Agentlien
1
Saya suka jawaban ini - singkat, akurat dan menjawab pertanyaan yang sebenarnya!
Lelanthran
2

vim akan menghapus file .swp yang dihasilkan saat Anda keluar dengan benar.

Ignacio Vazquez-Abrams
sumber
1

Bagaimana saya bisa menghilangkan peringatan yang mengganggu ketika saya membuka file yang memiliki file .swp?

Gunakan opsi pesan singkat di ~/.vimrc:

set shortmess=A

Yang juga merupakan default saat menjalankan mode POSIX.

Namun, jangan lakukan ini : ini seperti melepas kantung udara mobil Anda untuk meningkatkan efisiensi bahan bakar. Dalam jangka panjang, Anda akan menghabiskan lebih banyak waktu untuk memulihkan daripada menjawab pertanyaan sebelumnya.

uskup
sumber
1
Dengan asumsi sistem single-user, itu bukan konfigurasi yang mengerikan. Saya suka memiliki banyak tab terminal terbuka, dan kadang-kadang saya ingin mengedit file yang sudah saya kubur di beberapa tab lainnya. Jika saya ingin melakukan beberapa edit cepat itu bagus. Jika saya menemukan diri saya kembali di jendela vim lain, keindahannya adalah itu akan memperingatkan saya maka file telah berubah sebelum saya menyimpannya, dan saya dapat melakukan cepat :euntuk melihat apa yang terjadi (termasuk cepat uuntuk membatalkan kembali ke apa Saya punya di buffer.) Saya suka itu jauh lebih baik daripada menjadi terganggu karena sudah memiliki file terbuka.
Ken Simon
1

Ini terjadi pada saya ketika terminal saya tiba-tiba menutup koneksi saya dengan vi terbuka.

Untungnya saya tidak memiliki perubahan yang hilang.

Untuk menghapus peringatan itu dan membuang swap:

  1. Temukan id proses melihat process ID: 2251 (still running), dalam hal ini 2251
  2. Pastikan Anda mendapatkan id yang benarps 2251
  3. Matikan proses menggunakankill 2251

Dan itu saja.

Ingat swap file ada untuk melindungi Anda, dan Anda tidak harus menonaktifkannya sepenuhnya.

kintsukuroi
sumber
Tetapi bagaimana jika tidak ada vi(m)proses?
Scott
-2

Saya telah memecahkan masalah ini dalam tiga langkah sederhana:

1 :) Jalankan "ls -la" di mana file tersebut ada sehingga Anda dapat melihat file .swp untuk hal yang sama.

2 :) Sekarang "rm -i * .swp" yaitu, hapus file ".swp" dari direktori.

3 :) Sekarang konfirmasikan apakah file ".swp" telah dihapus.

4 :) Sekarang nikmati dari peringatan itu.

Ankur Srivastava
sumber
3
Mengapa Anda menyarankan rm -rfuntuk menghapus file? Saya diganti -rfdengan yang lebih masuk akal-i
Nifle