Bagaimana pohon pembatalan VIM digunakan?

132

Jawaban ini mengatakan:

Sistem undo / redo Vim tidak terkalahkan. Ketik sesuatu, batalkan, ketikkan sesuatu yang lain, dan Anda masih bisa mendapatkan kembali hal pertama yang Anda ketikkan karena Vim menggunakan pohon undo daripada tumpukan. Di hampir setiap program lain, sejarah hal pertama yang Anda ketikkan hilang dalam keadaan ini.

Ini adalah yang pertama saya dengar. Bagaimana saya bisa mundur di sepanjang pohon?

Nathan Fellman
sumber
1
Pengguna Jealous Emacs mungkin ingin tahu tentang undo-tree-mode .
Aaron Miller

Jawaban:

142

Lihat juga :h undo-redo, yang mencantumkan semua perintah dan penggunaannya.

Ada dua cara untuk melintasi pohon undo. Salah satunya adalah untuk "mundur dalam waktu". g+dan g-akan melintasi semua node di pohon dalam urutan kronologis atau terbalik-kronologis (yang bisa sedikit membingungkan, karena dapat melompat secara sewenang-wenang di antara membatalkan cabang, tetapi jika Anda melakukan g-cukup lama Anda akan selalu mendapatkan di mana Anda harus pergi akhirnya). :earlierdan :laterluangkan waktu deskriptor seperti 7matau 1h; sekali lagi ini dapat melompat Anda secara acak antara membatalkan cabang.

Cara lain adalah dengan melompat ke node tertentu di pohon menggunakan di :undo nmana nsejumlah tindakan. (Semua tindakan, yaitu penambahan teks, penghapusan, penggantian, diberi nomor secara berurutan saat Anda melakukannya.) Anda dapat mencari jumlah tindakan pada daun dari pohon yang dibatalkan melalui :undolist. Ini akan memungkinkan Anda melompat di antara cabang dengan mudah. Anda kemudian dapat menggunakan udan Ctrl-Runtuk bergerak naik dan turun cabang itu.

Ada beberapa contoh yang baik dalam bantuan Vim. Cara terbaik untuk mengetahui cara kerjanya adalah dengan sedikit bermain dengannya.

Brian Carper
sumber
43
Bisakah Anda menggabungkan cabang? (Aku bercanda)
he_the_great
40
Agak dari. Mencari: h undojoin
Pod
23
Vim sangat mengagumkan sehingga bahkan menerapkan cara kami bercanda tentang betapa hebatnya itu!
andyortlieb
4
Saya tidak tahu cara menggunakan undo-tree ini, tetapi saya tahu itu akan menyelamatkan hidup saya suatu hari nanti. Nah, harinya telah tiba. Terima kasih!!
ndvo
1
@Pod Sepertinya undojointidak ada hubungannya dengan cabang; pada kenyataannya, bagian bantuan berikutnya dimulai dengan mengatakan "Di atas kita hanya membahas satu baris undo / redo. Tetapi juga dimungkinkan untuk bercabang." Apakah ada cara untuk menggunakan undojoincabang yang tidak saya lihat?
Kyle Strand
70

Saya agak terlambat ke pesta, tapi saya pikir saya akan menyebutkan bahwa saya menulis plugin visualisasi undo tree untuk Vim: http://bitbucket.org/sjl/gundo.vim/

Secara pribadi saya menemukan bahwa grafik pohon seperti ini adalah satu-satunya cara saya bisa memahaminya.

Steve Losh
sumber
Repositori git yang lebih baru ada di github.com/sjl/gundo.vim . Dengan vim-plug, plugin dapat diinstal dengan Plug 'sjl/gundo.vim'dan kemudian nnoremap <F5> :GundoToggle<CR>(mengganti <F5>dengan urutan tombol apa pun yang ingin Anda ikat)
ewen-lbh
16

Jika Anda menggunakan vim, Anda dapat menavigasi melalui pohon undo menggunakan:

  • u: (undo) kembali ke pohon undo
  • Ctrl+R: (redo) bergerak maju di pohon undo

Cara lain untuk membawa dokumen kembali atau maju dalam waktu:

  • :earlier 15m: mundur dalam waktu 15 menit
  • :later 15m: bergerak maju dalam waktu 15 menit
Wadih M.
sumber
2
Jawaban ini hanya menjelaskan cara bergerak maju dan mundur pada satu cabang. Tidak bagaimana berpindah antar cabang.
Jonathan Hartley
Ini akan bergerak melintasi semua cabang menyortir semua poin berdasarkan urutan waktu. Lihat jawaban @BrianCarper.
Holloway
@ Jonathan Hartley, jika Anda menggunakan earlierdan latertidak bergerak melintasi cabang. Saya berharap kebanyakan orang tidak terlalu peduli atau mengingat berbagai cabang yang mereka buat. Tetapi hanya ingin kembali ke masa lalu. Jika Anda ingin membuat cabang dan memberi nama mereka mungkin gitatau sistem kontrol versi adalah pilihan yang lebih baik.
alpha_989
@ alpha_989 Komentar Anda tentang kontrol versi tidak masuk akal. Kontrol versi adalah untuk status file yang bernama pada disk. Kita sedang berbicara tentang pohon Unduhan Vim, yang hanya struktur data dalam memori. Mereka berdua menggunakan kata 'cabang', tetapi itu tidak berarti hal yang sama.
Jonathan Hartley
Terima kasih kepada semua orang yang menunjukkan sebelumnya / nanti DO bergerak melintasi cabang!
Jonathan Hartley
9

Saya sadar pertanyaan ini telah dijawab, tetapi saya pikir saya akan menambahkan contoh.

Buat file baru dan ketik:

this is a line

undolakan menampilkan pohon undo. Pada titik ini Anda belum membatalkan apa pun

:undol

number changes  when               saved
     1       1  14:50:36

sekarang tekan ESC dan ubah jalur ke:

this is a old line

beralih ke mode normal dan tekan u (batalkan), ini harus menghapus "lama". Jika Anda memeriksa undol, pada titik ini Anda masih memiliki hanya satu cabang.

sekarang modifikasi baris sehingga dikatakan:

this is a new line

Sekarang :undolmenunjukkan:

number changes  when               saved
     2       2  87 seconds ago
     3       2  3 seconds ago

Anda dapat beralih ke cabang pertama dengan mengetik

:u 2

ini akan memindahkan Anda ke ujung cabang yang terkait dengan angka 2. Anda dapat bergerak di sepanjang cabang ini dengan g+dan g-. Pada titik g+ini tidak akan melakukan apa-apa (Anda berada di daun). Jika Anda menekan g-"old" akan dihapus (Anda melintasi pohon undo pertama). Itu adalah jika Anda menghapus "old" dengan g-dan tekan g+lagi, "old" akan diulang.

Jika Anda mengetik

:u 3

Anda akan melompat ke daun cabang undo kedua dan akan berbunyi:

this is a new line
Alexander
sumber
3

Selain menggunakan gundo.vim saya suka menyebutkan g+dang-

vbd
sumber
3

Paket undotree ditulis dalam vimscript murni sehingga tidak ada persyaratan.

Dan tambahkan ini ke vimrc Anda sebelum terlambat:

  set nobackup
  set noswapfile
  set nowritebackup
  set undolevels=10000         " use many levels of undo
  set history=10000    " After nocompatible

  if has('persistent_undo')
    set undodir=$HOME/.vim/undo
    set undofile 
  endif 

masukkan deskripsi gambar di sini

Tinmarino
sumber