Praktik terbaik swap-file VIM?

14

Setiap kali saya menghentikan sesi di vim dengan kehilangan koneksi saya, saya agak dipenuhi dengan dred (namun saya terus menggunakan vim ... saya benar-benar seorang masokis) karena ketika saya membuka file saya lagi tumpukan tumpukan swap- file sedang menunggu untuk mengambil kesempatan menghancurkan pekerjaan saya. Apa praktik terbaik untuk bekerja dengan file swap vim? Apakah Anda hanya memilih yang terbaru? Jika file berfungsi seperti yang Anda harapkan, apakah Anda hanya menghapus file swap? Bagaimana Anda menyingkirkannya?

Leandand00
sumber
5
Swap file ada untuk melindungi pekerjaan Anda. Pertimbangkan untuk menggunakan layar gnu.
1
Saya tidak ingin mematikan fungsi; itu menjengkelkan tetapi karena Anda menyatakan berguna.
leeand00
1
Saya hanya ingin tahu cara menggunakannya dengan benar.
leeand00
2
@Dvalval Saya menggunakan tmux
leeand00
2
Jika Anda menggunakan tmux, Anda tidak perlu khawatir kehilangan koneksi: cukup pasang kembali ke sesi Anda saat terhubung kembali. Anda mungkin juga tertarik dengan mosh dan di plugin Recover @ ChristianBrabandt .
Kaya

Jawaban:

22

Jangan Panik!

Memulihkan file selalu aman, karena vim tidak pernah menulis perubahan apa pun sampai Anda menulisnya sendiri. Jadi memulihkan dari file swap dan kemudian menutup tanpa menyimpan tidak akan mengubah apa pun.

Atur swapfile Anda:

Dapatkan vim untuk meletakkan semua file swap Anda di tempat yang sama, sehingga Anda selalu tahu di mana mereka berada:

set directory^=$HOME/.vim/swap//

atau dimanapun Anda suka. Gunakan //di akhir nama file membuat vim menggunakan jalur file absolut untuk nama file swap sehingga Anda tidak mendapatkan collision nama. Pastikan direktori itu ada, atau vim tidak akan menggunakannya (itu tidak akan membuatnya untuk Anda).

Catatan: Ini hanya berfungsi pada variabel lingkungan, jika Anda ingin menggunakan variabel vimscript maka kita perlu menggunakan beberapa :executesihir:

execute "set directory^=".my_vim_home_var."/swap//"

Perbedaannya adalah:

Bantuan vim menunjukkan perintah yang sangat berguna untuk digunakan dalam situasi ini: :DiffOrig. Ini bukan perintah vim default , jadi salin implementasi dari :h :DiffOrigke vimrc Anda. (Ini juga $VIMRUNTIME/defaults.vimjika Anda memiliki vim8). Sekarang, Anda dapat memulihkan file dan menjalankan DiffOrig untuk mendapatkan vimdiff tentang apa yang berubah dari versi yang tidak dimodifikasi.

Jika Anda ingin membandingkan konten beberapa file swap, pulihkan file Anda dengan setiap file swap yang berbeda, dan kemudian tulis hasilnya ke file sementara. Sekarang muat file dan jalankan :diffthisdi setiap file, buat perubahan yang Anda inginkan, tulis kembali ke file asli, dan hapus file sementara dan tukar.

Perintah yang berguna:

:swapname: dapatkan nama yang digunakan vim untuk file swap untuk buffer saat ini ( :h :swapname) :recover: memulihkan file yang dipilih, sama seperti ketika Anda memulai vim dan tekan R( :h :recover)

Lihat bantuannya:

Vim memiliki seluruh bagian dari manual user pada pemulihan: :usr_11.txt
referensi bantuan Vim pada swap file: :h swap-file, h recovery
Bantuan pada pilihan direktori (untuk menetapkan lokasi file swap)::h 'directory'

Sunting: Contoh yang dimodifikasi untuk pengaturan direktori, sebagaimana ditunjukkan dalam komentar oleh @B Layer

flemingfleming
sumber
Bagaimana dengan saat Anda berakhir dengan banyak file swap? Karena banyak koneksi yang terputus?
leeand00
1
Saya menyebutkannya di paragraf kedua "Diff the Differencces". Setelah Anda menggunakan diffs untuk menentukan perubahan mana yang ingin Anda hapus, hapus semua file sementara dan file swap lama yang Anda buat (sekarang Anda tahu di mana semua file swap itu).
flemingfleming
1
FYI, Anda tidak perlu menggunakan exec... set directory^=$HOME/.vim/swap//berfungsi dengan baik selama $HOMEmerupakan variabel lingkungan yang diinisialisasi. Lihat :h expand-env. Juga bekerja dengan dictionary, undodirdan backupdiruntuk beberapa nama.
B Layer
Terima kasih telah mengingatkan saya tentang itu! Saya menggunakan variabel vimscript dalam konfigurasi saya sebagai gantinya, karenanya mengeksekusi, dan lupa variabel lingkungan tidak memerlukan itu. Kalau dipikir-pikir, saya mungkin hanya perlu menggunakan vim untuk mengatur variabel lingkungan sebagai gantinya.
flemingfleming
2

Secara pribadi, saya telah menonaktifkan file swap dan cadangan, karena cenderung membuat file swap dan file cadangan di mana-mana dan sering menimbulkan konflik. Persisten-undo Vim jauh lebih dapat diandalkan dan bebas kesalahan.

Vim saat ini telah terus-menerus diurungkan, ini merupakan metode cadangan yang jauh lebih bagus. Setiap kali, Anda menekan Esc, status file saat ini ditangkap.

Anda dapat menggunakan :undolist, atau plugin seperti gundo , atau undo-tree untuk menelusuri riwayat undo Anda.

Untuk menggunakan vim dengan cara ini:

  • buat direktori tempat Anda mengedit histori untuk setiap file yang akan diambil
  • beri tahu vim untuk menggunakan direktori itu
  • aktifkan persistent undo

Di shell:

mkdir ~/.vim/undodir

Di Vim

set undodir=~/.vim/undodir
set undofile

Untuk mematikan file swap: :set noswapfile

alpha_989
sumber
1
Ada beberapa masalah yang cukup besar dengan jawaban ini. 1. Persistent undo menyelesaikan masalah lain untuk menukar file (dan 'writebackup'menangani masalah lain). Mengaktifkan pembatalan yang persisten tidak akan membantu jika komputer Anda mogok. Anda dapat berdebat bahwa menukar file tidak perlu untuk alasan lain (stabilitas OS modern, keberadaan UPS), tetapi Anda belum melakukannya dalam jawaban ini. 2. pengaturan 'undodir' tidak memungkinkan undo persisten! Anda perlu mengatur 'undofile'ini
Kaya