Apa cara termudah untuk menghapus swapfile Vim yang sudah saya pulihkan?

84

Terkadang Vim crash dan membuat saya swapfile. Itu luar biasa. Kemudian saya membuka file yang sedang saya edit dan Vim bertanya apakah saya ingin memulihkan. Ya, terima kasih. Setelah selesai, Vim memberi tahu saya,

You may want to delete the .swp file now.

Kenapa, ya, saya lakukan. Bagaimana aku melakukan itu? Saya pikir itu hanya akan mulai menggunakan swapfile lama sebagai swapfile lagi dan membersihkannya ketika saya berhenti, tapi itu tidak benar. Itu membuat yang baru, membersihkan yang di atas, dan ketika saya membuka file lagi itu meminta saya lagi untuk memulihkan dari yang pertama.

Tentunya saya kehilangan sesuatu.

Peeja
sumber
Lihat di sini vi.stackexchange.com/questions/13518/... "Opsi" Hapus itu "tidak ditampilkan jika proses Vim masih berjalan" dan perhatikan komentar tentang sesi TMUX yaitu pastikan Anda tidak memiliki Vim masih berjalan (juga, layar GNU) di latar belakang di suatu tempat, lihat di sini vi.stackexchange.com/questions/13518/…
zenaan

Jawaban:

81

Cara yang sedikit lebih sederhana:

Dari emulator terminal:

vim filename

Kemudian pilih pulihkan , dan jika Anda ingin menghapus swap yang Anda tulis (simpan) dan kemudian lakukan ini dari dalam vim:

:e          // no argument needed. It assumes the current buffer.

... dan pilih hapus kali ini.

Saya baru tahu tentang ini, dan saya pikir saya akan melakukannya mulai sekarang. Maka saya tidak akan sengaja menimpa file yang berfungsi baik, jika pemulihan ternyata rusak (meskipun saya belum pernah mencobanya sebelumnya).

Ada juga tips yang relevan tentang pertanyaan ini tentang Stack Overflow (di mana saya menemukan tip ini).

miyalys
sumber
16
Saya tidak punya deletepilihan, hanya ada: [O] pena (E) dit (R) ecover (Q) uit (A) bort, apa yang harus saya lakukan?
Arne
4
@ Andre: Dari pengalaman saya itu biasanya berarti file saat ini dibuka dalam contoh lain dari vim?
miyalys
1
Opsi [D] elete hanya muncul setelah saya memperbarui ke Vim 7.4
jmlarson
@ Andre saya punya masalah yang sama. Tetapi setelah beberapa waktu, satu jam atau lebih, saya memulai kembali vim dan pilihan itu tersedia. PC tidak direstart pada waktu itu. vim mungkin berpikir bahwa proses vim lain sedang berjalan. Itu sebabnya tidak menunjukkan opsi.
ka3ak
6
Bagi mereka yang mengatakan tidak melihat (D)eleteopsi, lihat :help swap-exists; kutipan On Unix this choice is only offered when the process that created the swap file does not appear to be running.Ie mungkin Anda memiliki proses vim lain berjalan yang menyebabkan opsi ini disembunyikan. Mungkin juga menjelaskan mengapa Anda memiliki swpfile di tempat pertama!
Lqueryvg
39

Untuk Bersihkan SEMUA vim Tukar File di Direktori:

Jika Anda yakin tidak memerlukan swap file vim di pohon direktori dan ingin menyingkirkannya, Anda dapat menggunakan perintah berikut di direktori saat vim tidak berjalan (bahkan di jendela lain atau bahkan login yang berbeda sidang):

find . -type f -name "*.sw[klmnop]" -delete

Beberapa inspirasi dan pemikiran datang dari Menghapus file .swp sampah di Google Groups. Ini akan menghapus semua file yang namanya berakhir dengan .swk, .swl, .swm, .swn, .swo, atau .swp di pohon direktori saat ini.

Ini mungkin bukan yang Anda inginkan, karena beberapa alasan:

  • Seperti yang dinyatakan, ia mencari pohon direktori saat ini  ; yaitu, direktori saat ini dan semua subdirektori, secara rekursif. Itu melampaui apa yang ditanyakan, dan mungkin dianggap berlebihan.
  • Sebagaimana dinyatakan, itu akan menghapus semua file yang namanya berakhir dengan .swk, .swl, .swm, .swn, .swo, atau .swp, dan bukan hanya .swpGary Johnson berkata ,

    Juga, tidak semua file swap berakhiran .swp. Jika Vim perlu membuat file swap dan yang berakhiran .swp sudah ada, Vim akan menggunakan ekstensi .swo untuk yang baru dan .swn setelah itu. Saya pikir itu hanya terus mundur melalui alfabet. Jadi menggunakan sesuatu seperti

      \*.sw[nop] 
    

    atau bahkan

      \*.sw? 
    

    akan lebih teliti.

    Penulis asli posting ini mengatakan,

    'klmnop' mungkin berlebihan, tetapi itu biasanya memastikan saya mendapatkan semuanya.

  • Di sisi lain, itu mungkin kurang.  rubel menyarankan

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    

    yang cocok dengan semua ekstensi tiga huruf (huruf kecil) mulai dari .saahingga .swp. Dia menambahkan, “Berhati-hatilah, sementara ini adalah solusi yang lebih lengkap, itu akan mengeluarkan file gambar .svg dan .swf adobe flash file. Anda mungkin ingin memodifikasi regex jika Anda bekerja dengan file-file.”Hal ini juga cocok .sav, .snd(data suara), .sql, .src, .srt(SubRip video yang subtitle format), dan banyak ekstensi umum lainnya.

  • Mungkin berlebihan. Sebagaimana dinyatakan, itu akan menghapus semua file yang namanya berakhir dengan .swk, .swl, .swm, .swn, .swo, atau .swp. Tetapi, tampaknya, file swap vim biasanya merupakan file “dot”. Jika Anda mengedit hello.cpp, file swap mungkin .hello.cpp.swp. Seperti yang ditunjukkan (tetapi tidak dijelaskan) dalam jawaban rouble , lebih aman untuk menghapus hanya file yang namanya dimulai dengan titik; misalnya dengan

    find . -type f -name ".*.sw[klmnop]" -delete
    
Shwaydogg
sumber
14

Ketik ls -ayang mencantumkan SEMUA file dalam direktori

ketik rm .whatever.your.swpdan tekanenter

Sesederhana itu.

File apa pun yang tampil dengan .di depan adalah file tersembunyi dan biasanya tidak terlihat.

Ingatlah bahwa perubahan itu bersifat segera dan permanen jadi berhati-hatilah.

Wolfy
sumber
4
Itu tidak terlalu sederhana. Saya harus meninggalkan Vim, menavigasi direktori swap, mengingat nama file, dan mungkin memutuskan apakah itu file.swpatau file.swo. Maka saya harus kembali ke tempat saya sebelumnya. Memukul :eadalah solusi yang lebih sederhana.
Peeja
1
ls: cannot access +A: No such file or directory
Jonathan
ini yang saya butuhkan
user5510975
7

Btw. beberapa plugin melakukannya secara otomatis untuk Anda: autoswap.vim

dari uraian:

  1. Apakah file sudah terbuka di sesi Vim lain di jendela lain?
  2. Jika demikian, tukar ke jendela tempat kami mengedit file itu.
  3. Jika tidak, jika swapfile lebih tua dari file itu sendiri, singkirkan saja.
  4. Jika tidak, buka file hanya-baca sehingga kami dapat melihatnya dan dapat menyimpannya.
toogley
sumber
6
Adakah yang bisa memberitahu saya mengapa vim tidak dapat memiliki perilaku yang masuk akal secara default, tanpa plugin?
Pavel Šimerda
6

Tidak, AFAIK Anda tidak melewatkan apa pun. Vimterus menyimpan swapfile sebagai cadangan hingga Anda menghapusnya secara eksplisit.

Cukup simpan dan keluar dan buka kembali file yang sama. Anda akan diminta (lagi) dengan

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it

Sekarang cukup tekan d:)

Avio
sumber
11
Benarkah? Maksudku, aku tahu itu. Tapi itu bodoh. Ini tentu tidak "sederhana".
Peeja
1
Ngomong-ngomong, apa perbedaan antara berhenti dan batal?
trusktr
5
tidak ada opsi Hapus dalam kasus saya. apa yang harus saya lakukan? (Saya menyelamatkan, berhenti, dan dibuka kembali)
Paschalis
Anda tidak perlu keluar dulu dari vim, cukup ketik: e <return> setelah Anda memilih "sunting" atau "pulihkan" pada file, dan Anda akan mendapatkan opsi untuk menghapusnya
00prometheus
2

Vim, seperti kebanyakan perintah Unix, sederhana dan eksplisit, bukan dengan asumsi dan implisit.

Anda pulih dengan (r). Jika Anda tidak menyukai pemulihan atau pemulihannya rusak, Anda dapat membuangnya. Jika Anda menyukainya, Anda dapat menyimpan file. File pemulihan tidak dihapus untuk Anda karena ini tidak eksplisit dan tidak akan benar untuk 100% situasi.

Jadi Anda (r) ecover, (w) rite dan (q) uit, lalu edit lagi dan pilih (d) hapus atau "rm .myfile.js.swp" dan edit lagi. Ini cepat dilakukan dan selalu, dari sudut pandang Vim, 100% perilaku yang benar.

Oli Comber
sumber
Oke, lalu apakah ada cara untuk mendapatkan vim untuk memberi saya jalan ke file swap? Saya senang menjalankan perintah kedua untuk menghapus swapfile (pada kenyataannya, saya suka penjelasannya), tetapi saya ingin perintah untuk menghapus swapfile di mana pun. Sebagai contoh, saya punya direktori swapfile terpisah. Jika dua file terbuka memiliki nama samaran yang sama, saya tidak dapat secara terprogram memutuskan mana swapfile yang benar untuk buffer saat ini.
Peeja
1
Benar, tetapi menyediakan opsi "Pulihkan dan hapus" yang sederhana akan menyenangkan. Mungkin juga mudah untuk diterapkan. Saya akan melakukannya suatu hari nanti ketika saya selesai sekolah jika belum selesai.
trusktr
1
Kebanyakan perintah unix sederhana, eksplisit dan memiliki perilaku default yang masuk akal. Pemulihan Vim tidak sederhana, UX seburuk di LibreOffice, perilaku ini jelas salah dan hasilnya, dalam banyak kasus, adalah kehilangan data.
Pavel Šimerda
1

File-file ini juga mengganggu bagi saya, tetapi saya mengatur opsi dalam .vimrc - set noswapfile untuk mencegah vim membuatnya dan, sebaliknya, menyimpan file dalam memori.

Dmitrii
sumber
Menurut OP, swapfile berguna, jadi mematikannya mungkin bukan pilihan terbaik.
Kusalananda
Jangan mematikan swap file. Jika mesin Anda mogok, Anda akan kehilangan pekerjaan.
Lqueryvg
Tentu saja opsi ini mengandung risiko, dan seperti yang saya tahu file swap ini dibuat pada saat muncul vi * editor ketika crash sering terjadi. Sekarang saya bisa mengatakan vim berfungsi dengan stabil dan mereka ada sebagai warisan, imho.
Dmitrii
1

Berikut ini adalah regex yang lebih lengkap untuk membersihkan semua file swap vim berdasarkan file gitignore Github untuk Vim

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

Hati-hati, meskipun ini adalah solusi yang lebih lengkap, itu akan mengeluarkan file gambar .svg dan .swf adobe flash file. Anda mungkin ingin memodifikasi regex jika Anda bekerja dengan file-file itu.

rubel
sumber
1

Ini cuplikan untuk ditambahkan .vimrc. Ini menghapus semua file swap yang terkait dengan buffer file saat ini dan mengatur ulang ekstensi swap.

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

Setelah bertemu dengan keadaan sulit, seseorang dapat menjalankan :DeleteFileSwaps Ini bagus jika digabungkan dengan :windoatau :tabdoperintah.

:tabdo DeleteFileSwaps 

Rincian lebih lanjut : File dapat memiliki lebih dari 1 file swap. Alasannya karena file swap, dengan ekstensi .swp, masih ada dan vimakan terus membuat yang baru karenanya. Untuk mengetahui apakah .swpada:

  • Dengan file target terbuka di vim, jalankan :swuntuk mendapatkan file swap saat ini.
  • Periksa direktori tempat file swap saat ini terkandung.
  • Kemudian periksa apakah direktori berisi file swap dengan nama file yang terbuka dan memiliki ekstensi .swp.

Cuplikan di atas mengikuti proses yang sama, tetapi hapus semua file swap.

Semoga ini membantu.

nate
sumber
0

Dari manual :h swap:

Anda dapat melihat nama file swap saat ini yang digunakan dengan perintah: :sw[apname]

Joseph Harriott
sumber
Peringatan ... yang mungkin bukan nama file yang perlu Anda hapus. Sampai Anda menghapus .swpfile, :swperintah itu mungkin akan memberi Anda nama .swofile - yang bukan yang ingin Anda hapus.
Lqueryvg
0

jika Anda ditanya, tekan Duntuk menghapus file swap file saat ini.

jika tidak maka Anda harus melakukannya secara manual.

salah satu cara alternatif untuk melakukan ini adalah:

untuk mencari / mencari file:

find | grep ".searchRefineVertTabs.jsp.swp"

dan kemudian hapus file ini:

rm ./.searchRefineVertTabs.jsp.swp
Kaleem Ullah
sumber
1
Aku sedang bertanya, tapi pilihan saya adalah untuk memulihkan . Pertanyaannya adalah bagaimana menghapusnya setelah saya pulih, karena itu tidak lagi diperlukan. Sepertinya kegagalan vim untuk tidak melakukan itu untuk saya. Tetapi jawaban yang diterima adalah alur kerja terbersih yang saya temukan sejauh ini.
Peeja
-1

Anda dapat gunakan,

rm -f .<filename>.<ext>.swp

Contoh:

rm -f .rc.local.swp
RizonBarns
sumber
Secara teknis ini berfungsi, tetapi tidak semudah jawaban yang diterima saat ini.
Peeja
Plus <ext>berlebihan di sini karena nama file setidaknya di Linux termasuk nol atau lebih ekstensi.
Pavel Šimerda