VIM'in geri alma ağacı nasıl kullanılır?


132

Bu cevap şöyle diyor:

Vim'in geri alma / yineleme sistemi rakipsizdir. Bir şey yazın, geri alın, başka bir şey yazın ve yazdığınız ilk şeyi yine de geri alabilirsiniz çünkü Vim yığın yerine geri alma ağacı kullanır. Hemen hemen her diğer programda, yazdığınız ilk şeyin geçmişi bu durumda kaybolur.

Bunu ilk duyduğum şey bu. Ağaç boyunca nasıl geriye gidebilirim?


1
Kıskanç Emacs kullanıcıları geri alma ağacı modu hakkında bilgi almak isteyebilir .
Aaron Miller

Yanıtlar:


142

Ayrıca :h undo-redo, tüm komutları ve kullanımlarını listeleyen bkz .

Geri alma ağacını geçmenin iki yolu vardır. Biri "zamanda geriye" gitmektir. g+ve g-ağaçtaki tüm düğümleri kronolojik veya ters kronolojik sırayla geçecektir (bu biraz kafa karıştırıcı olabilir, çünkü geri alma dalları arasında keyfi bir şekilde atlayabilir, ancak g-yeterince uzun yaparsanız her zaman gitmeniz gereken yere varırsınız Sonuçta). :earlierve veya :latergibi bir zaman tanımlayıcı alın ; yine bu, dallar arasında gelişigüzel şekilde sıçrayabilir.7m1h

Diğer yol, bir eylemin :undo nnerede nolduğunu kullanarak ağaçtaki belirli düğümlere atlamaktır. (Tüm eylemler, yani metin eklemeler, silmeler, değiştirmeler, siz bunları yaptıkça sırayla numaralandırılır.) Geri alma ağacının yapraklarındaki eylemlerin sayısına, aracılığıyla bakabilirsiniz :undolist. Bu, dallar arasında kolayca atlamanıza izin verecektir. Daha sonra kullanabilir uve Ctrl-Ryukarı hareket ve o dalda aşağı etmek.

Vim yardımında bazı iyi örnekler var. Bunun nasıl çalıştığını anlamanın en iyi yolu onunla biraz oynamaktır.


43
Dalları birleştirebilir misin? (Şaka yapıyorum)
he_the_great

40
Bir çeşit. Yukarı bak: h undojoin
Bölme

23
Vim o kadar harika ki, ne kadar harika olduğu konusunda şaka yaptığımız yolları bile uyguluyor!
andyortlieb

4
Bu geri alma ağacını nasıl kullanacağımı bilmiyordum ama bir gün hayatımı kurtaracağını biliyordum. Eh, gün geldi. Teşekkürler!!
ndvo

1
@Pod Dallarla undojoinilgisi yok gibi görünüyor ; Aslında, bir sonraki yardım bölümü, "Yukarıda yalnızca bir satır geri alma / yineleme konusunu tartıştık. Ancak dallara ayrılmak da mümkündür" diyerek başlıyor. undojoinHenüz görmediğim dalları kullanmanın bir yolu var mı ?
Kyle Strand

70

Partiye biraz geç kaldım, ancak Vim için bir geri alma ağacı görselleştirme eklentisi yazdığımı söylemeyi düşündüm: http://bitbucket.org/sjl/gundo.vim/

Şahsen ben ağacın grafiğini bu şekilde çizmenin onu anlamlandırabilmemin tek yolu olduğunu buldum.


Github.com/sjl/gundo.vim adresinde daha güncel bir git deposu bulunmaktadır . Vim-plug ile eklenti Plug 'sjl/gundo.vim've ardından nnoremap <F5> :GundoToggle<CR>( <F5>bağlamak istediğiniz tuş dizisiyle değiştirilerek )
kurulabilir


16

Vim kullanıyorsanız, geri alma ağacında şunları kullanarak gezinebilirsiniz:

  • u: (geri al) geri alma ağacına geri git
  • Ctrl+R: (yinele) geri alma ağacında ileri git

Belgeyi zamanda geri veya ileri götürmenin diğer yolları:

  • :earlier 15m: 15 dakika içinde geri git
  • :later 15m: 15 dakika içinde öne geç

2
Bu cevap sadece bir dalda nasıl ileri ve geri hareket edileceğini açıklar. Dallar arasında nasıl hareket edileceği değil.
Jonathan Hartley

Bu, tüm noktaları zaman sırasına göre sıralayarak tüm dallarda hareket edecektir. @ BrianCarper'ın cevabına bakın.
Holloway

@JonathanHartley, kullanıyorsanız earlierve laterdallar arasında hareket etmiyorsa. Çoğu insanın yarattıkları çeşitli dalları gerçekten umursamadığını veya hatırlamadığını bekliyorum. Ama sadece zamanda geriye gitmek istiyorum. Dallar oluşturmak ve adlandırmak istiyorsanız belki gitveya bir sürüm kontrol sistemi daha iyi bir seçenektir.
alpha_989

@ alpha_989 Sürüm kontrolü hakkındaki yorumlarınız bir anlam ifade etmiyor. Sürüm kontrolü, diskteki adlandırılmış dosyaların durumu içindir. Sadece bellekteki veri yapıları olan Vim'in geri alma ağacından bahsediyoruz. İkisi de 'dal' kelimesini kullanıyor, ancak bu aynı anlama gelmiyor.
Jonathan Hartley

Daha önce / sonra işaret eden herkes sayesinde şubeler arasında GEÇERLİ OLUN!
Jonathan Hartley

9

Bu sorunun yanıtlandığının farkındayım, ancak bir örnek eklemeyi düşündüm.

Yeni bir dosya oluşturun ve şunu yazın:

this is a line

undolgeri alma ağacını gösterecektir. Bu noktada hiçbir şeyi geri almadın

:undol

number changes  when               saved
     1       1  14:50:36

şimdi ESC'ye basın ve satırı şu şekilde değiştirin:

this is a old line

normal moda geçin ve u (geri al) tuşuna basın, bu "eski" yi kaldırmalıdır. Kontrol ederseniz undol, bu noktada hala tek bir şubeniz var.

şimdi satırı şunu söyleyecek şekilde değiştirin:

this is a new line

Şimdi :undolgösterir:

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

Yazarak ilk şubeye geçebilirsiniz

:u 2

bu sizi 2 numara ile ilişkili dalın sonuna götürür. Bu dalda g+ve ile hareket edebilirsiniz g-. Bu noktada g+hiçbir şey yapmayacaksınız (yapraktasınız). Eğer g-“eski” ye basarsanız kaldırılacaktır (ilk geri alma ağacını geçiyorsanız) Yani “eski” yi ile kaldırıp tekrar g-basarsanız g+, “eski” yeniden yapılacaktır.

Eğer yazarsan

:u 3

İkinci geri alma dalının yaprağına atlayacaksınız ve şunu okuyacak:

this is a new line


3

Gundo.vim kullanmanın yanı sıra bahsetmeyi seviyorum g+veg-


3

Unotree paketi saf vimscript ile yazılmıştır, bu yüzden gereksinim yoktur.

Ve bunu çok geç olmadan vimrc'nize ekleyin:

  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 

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.