Bagaimana saya bisa menggunakan undofile?

36

Item berita terakhir di vim.org berbicara tentang penggunaan 'undofile' untuk menyimpan riwayat Anda dan membatalkan perubahan bahkan setelah reboot:

Fitur yang saya nikmati menggunakan diri saya sendiri tidak diketahui banyak pengguna, seperti yang saya temukan akhir pekan lalu. Selain membatalkan dengan level sebanyak yang Anda suka, Vim juga menawarkan penyimpanan informasi undo dalam file. Jadi Anda dapat keluar dari Vim, reboot komputer Anda dan masih membatalkan perubahan yang Anda buat. Lihat bantuan untuk 'undofile'. (Bram Moolenaar)

Bagaimana saya bisa mengaktifkan dan menggunakan fitur ini?

Batalkan
sumber
2
Bram mungkin sedang membicarakan acara ini
Kurt Pfeifle

Jawaban:

37

Versi paling sederhana adalah: buat ~/.vim/undo-dir/direktori dan tambahkan berikut ini ke .vimrc:

set undodir=~/.vim/undo-dir
set undofile

Namun, ini bukan tanpa cacat, dan lebih baik dibaca terus. Dari saya sendiri .vimrc:

" Let's save undo info!
if !isdirectory($HOME."/.vim")
    call mkdir($HOME."/.vim", "", 0770)
endif
if !isdirectory($HOME."/.vim/undo-dir")
    call mkdir($HOME."/.vim/undo-dir", "", 0700)
endif
set undodir=~/.vim/undo-dir
set undofile

Saya lebih suka untuk tidak mengacaukan direktori acak dengan membatalkan file. Jadi saya mengatur undodiropsi, yang menempatkan semuanya dalam satu direktori undo. Itu menyisakan satu masalah — saya malas, dan tidak merasa ingin membuat direktori itu di semua mesin saya (saya menggunakan sistem kontrol versi untuk menyinkronkan saya .vimrcdi banyak mesin). Untungnya, cukup mudah untuk memiliki Vim memeriksa dan membuat direktori jika tidak ada.

Perhatikan juga 0700mode pada direktori undo (itu izin penuh untuk pemilik, tidak ada izin untuk orang lain). File mana yang saya edit, kapan, dll. Harus tetap pribadi. Dan karena ini adalah direktori yang hanya dapat saya akses, saya tidak perlu khawatir tentang orang lain yang meletakkan symlink di sana, atau file undo mereka sendiri, atau apa pun yang Anda harus khawatir tentang menggunakan direktori sementara sistem.

Akhirnya, tidak menjadi direktori sistem sementara, itu tidak tunduk pada kebijakan pembersihan tempfile sistem. Seringkali, itu cukup singkat — sekitar seminggu. Tetapi agar tidak tumbuh selamanya, saya memasukkan yang berikut ini ke dalam crontab:

# m h  dom mon dow   command
 43 00 *   *   3     find /home/anthony/.vim/undo-dir -type f -mtime +90 -delete

Jadi setelah 90 hari tidak dimodifikasi, mereka dihapus. (Jujur, mereka tidak terlalu besar, Anda dapat dengan mudah meninggalkan mereka selamanya dengan betapa murahnya disk. Tetapi pertimbangkan juga privasi Anda sendiri jika mesin Anda pernah dikompromikan.)

derobert
sumber
Terima kasih atas jawaban terinci @derobert! Saya tahu ini adalah pertanyaan lama, tetapi saya telah mencoba untuk menemukan cara vimscript untuk menghapus file unduhan vim lama ( vi.stackexchange.com/questions/16053/… ). Saya pikir akan lebih bersih untuk melakukannya dengan cara itu, tetapi terbukti tidak mudah. Apakah Anda pernah berpikir untuk menggunakan vimscript untuk menghapus file vim lama? Jika tidak, apakah Anda masih menggunakan crontab di atas vimscript?
Logan
1
@Logan Menggunakan skrip vim hanya akan berfungsi saat vim sedang berjalan, dan juga bagaimana jika ada beberapa vim yang berjalan? Garis cron itu sederhana, tidak menderita dari masalah-masalah itu, dan jelas benar ...
derobert
Tampaknya mkdir()fungsi mendukung pembuatan beberapa struktur direktori dengan "p"opsi untuk {path}parameter. Jadi skrip di atas bisa disederhanakan sedikit. Menggunakan call mkdir($HOME."/.vim/undo-dir", "p", 0700)karya untuk saya di Vim 7.4.160 setidaknya.
jdhao