Menggunakan pengurungan persisten Vim?

96

Salah satu fitur baru di Vim 7.3 adalah 'persistent undo', yang memungkinkan undotree untuk disimpan ke file saat keluar dari buffer.

Sayangnya, saya belum bisa mengaktifkannya dengan benar, atau saya pasti salah menggunakannya. Inilah yang saya coba sejauh ini:

Saya menambahkan yang berikut ini ke ~ / .vimrc

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

Setelah ini, saya seharusnya dapat membuka file apa pun, mengeditnya, lalu menyimpan-menutupnya, dan ketika saya membukanya lagi saya harus dapat membatalkan / mengulang seolah-olah saya tidak akan pernah pergi. Sayangnya, tampaknya tidak demikian, karena tidak ada undofile yang pernah ditulis.

Catatan:

  1. Saya menggunakan Win 7 menggunakan Vim 7.3 dari proyek Vim tanpa krim. Pengurungan yang terus-menerus telah dipanggang.

  2. $ HOME / .vim / undo ada di sistem file saya

duckworthd
sumber
38
Sekadar stres, poin 2) sangat penting. Vim tidak akan membuat direktori untuk Anda dan pembatalan terus-menerus tidak akan berfungsi sampai Andamkdir ~/.vim/undo
puk
2
+1. Maaf, di Linux berfungsi ... terima kasih telah memberi tahu saya tentang itu!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Untuk pengunjung yang akan datang dengan pertanyaan ini: JANGAN memberi tanda kutip di sekitar nilai undodir! Saya terjebak pada masalah ini untuk sementara waktu - gunakan paht absolut, tanpa tanda kutip di sekitarnya.
naifai

Jawaban:

51

Masukkan ini ke dalam Anda .vimrcuntuk membuat undodirjika tidak ada dan aktifkan pembatalan terus-menerus. Diuji pada Windows dan Linux.

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif
Matthias Braun
sumber
5
Ini mungkin lebih disukai untuk membuat direktori::silent call system('mkdir -p ' . &undodir)
Kyle Strand
1
Saya menggunakan &karena saya setyang undodirbukan letting itu. (Dalam pikiran saya, perbedaan antara letdan setmerupakan salah satu dari banyak, banyak, banyak "fitur" Vimscript yang sangat mencengangkan, tetapi YMMV.)
Kyle Strand
1
Terima kasih Kyle, membuat ide yang bagus .vimjika tidak ada. Sayangnya -pbendera tidak ada di Windows jadi saya mengedit jawaban untuk menelepon mkdirdua kali untuk memastikan kompatibilitas Windows.
Matthias Braun
2
Ah. Alasan utama saya menggunakan -pbendera sebenarnya untuk menghindari kesalahan saat direktori ada. Saya memiliki perintah saya di dalam if has('win32')blok, jadi saya hanya menggunakan mkdirtanpa -pdi Windows.
Kyle Strand
4
Mengapa tidak digunakan mkdir()? Maka ini bisa menjadi:call mkdir(myUndoDir, 'p') :, yang berperilaku seperti mkdir -p.
nelstrom
8

Saya mencoba ini di _gvimrc saya:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

Ini mulai berfungsi seperti yang diiklankan ketika saya menghapus braket try-catch, dengan demikian:

" Persistent undo
set undodir=C:\vim\undodir
set undofile

Saya harus membuat direktori.

Juan Lanus
sumber
if has('persistent_undo')
Arelav
silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav
set undodir=~/.config/nvim/backups
Arelav
1
endif"menambahkan pesan berkomentar untuk menambah panjang pesan
Arelav
3

Saya kira $ HOME tidak berfungsi seperti yang diiklankan.

Di sistem saya, :echo $HOMEmenunjukkan H: \, tetapi : e $HOME/mengatakan:~/ nama file tidak valid.

Anda dapat mencoba dengan jalur absolut untuk melihat apakah itu menyembuhkannya

lihat
sumber
Saya bisa |: echo $ HOME | dan |: e $ HOME / | tanpa masalah, tapi saya mencoba mengubah banyak hal. Tampaknya berhasil pada waktu-waktu tertentu, dan tidak pada orang lain. Secara khusus, ini tidak pernah menyimpan cadangan saat saya mengedit file ~ / .vimrc saya.
duckworthd
Di windows 7 yang saya gunakan $TEMP. Ketika saya melihatnya, set undodir?itu terlihat ~/AppData/Local/Temp. Berkas urung tetap ada dan dimuat sendiri dengan benar. Mungkin $TEMPakan lebih bisa diandalkan?
slawek
1

Ini sekarang bekerja seperti yang diharapkan: file.txtbuka di buffer Vim 7.4 di Windows 7, :setlocal undofilelalu simpan perubahan ke buffer, dan undofile .file.txt.un~dibuat bersamaan karena :set undodir?melaporkan bahwa "undodir =." secara default - yaitu tidak perlu menentukan ini secara manual. Anda juga bisa :set undofiledi modeline.

JosephHarriott
sumber