ต้นไม้เลิกทำของ VIM ใช้อย่างไร


132

คำตอบนี้บอกว่า:

ระบบเลิกทำ / ทำซ้ำของ Vim นั้นเหนือชั้น พิมพ์บางอย่างเลิกทำพิมพ์อย่างอื่นและคุณยังสามารถเรียกคืนสิ่งแรกที่พิมพ์ได้เนื่องจาก Vim ใช้โครงสร้างการเลิกทำแทนที่จะเป็นสแต็ก ในเกือบทุกโปรแกรมประวัติของสิ่งแรกที่คุณพิมพ์จะหายไปในสถานการณ์นี้

นี่เป็นครั้งแรกที่ฉันได้ยินเรื่องนี้ ฉันจะย้อนรอยตามต้นไม้ได้อย่างไร?


1
ผู้ใช้หึง Emacs อาจต้องการที่จะรู้เกี่ยวกับการยกเลิกต้นไม้โหมด
Aaron Miller

คำตอบ:


142

ดูเพิ่มเติม:h undo-redoซึ่งแสดงรายการคำสั่งทั้งหมดและการใช้งาน

มีสองวิธีในการสำรวจต้นไม้เลิกทำ หนึ่งคือการ "ย้อนเวลา" g+และg-จะสำรวจโหนดทั้งหมดในต้นไม้ตามลำดับเวลาหรือย้อนกลับตามลำดับเวลา (ซึ่งอาจทำให้สับสนเล็กน้อยเพราะสามารถข้ามไปมาระหว่างสาขาที่เลิกทำโดยพลการได้ แต่ถ้าคุณทำg-นานพอคุณจะไปถึงที่ที่คุณต้องไปเสมอ ในที่สุด) :earlierและ:laterใช้ตัวบอกเวลาเช่น7mหรือ1h; อีกครั้งสิ่งนี้สามารถข้ามคุณโดยพลการระหว่างสาขาที่เลิกทำ

อีกวิธีหนึ่งคือการข้ามไปยังโหนดเฉพาะในแผนภูมิโดยใช้:undo nตำแหน่งที่nเป็นจำนวนของการกระทำ (การกระทำทั้งหมดเพิ่มเติมข้อความเช่นลบทดแทนจะมีหมายเลขตามลำดับในขณะที่คุณทำพวกเขา.) :undolistคุณสามารถดูจำนวนของการกระทำบนใบของต้นไม้ยกเลิกผ่าน วิธีนี้จะช่วยให้คุณกระโดดข้ามกิ่งไม้ได้อย่างง่ายดาย จากนั้นคุณสามารถใช้uและCtrl-Rเพื่อเลื่อนขึ้นและลงสาขานั้น

มีตัวอย่างที่ดีในความช่วยเหลือเป็นกลุ่ม วิธีที่ดีที่สุดในการค้นหาว่ามันทำงานอย่างไรคือเล่นกับมันสักหน่อย


43
คุณสามารถรวมสาขาได้หรือไม่? (ฉันล้อเล่น)
he_the_great

40
ใจดีของ. Look up: h undojoin
Pod

23
Vim นั้นยอดเยี่ยมมากถึงขนาดใช้วิธีที่เราล้อเล่นว่ามันเจ๋งแค่ไหน!
andyortlieb

4
ฉันไม่รู้ว่าจะใช้การยกเลิกทรีนี้อย่างไร แต่ฉันรู้ว่ามันจะช่วยชีวิตฉันได้สักวัน วันนี้มาถึงแล้ว ขอบคุณ !!
ndvo

1
@ พอดดูเหมือนundojoinไม่มีอะไรเกี่ยวข้องกับกิ่งไม้ ในความเป็นจริงส่วนความช่วยเหลือถัดไปเริ่มต้นด้วยการพูดว่า "ข้างบนเราพูดถึงการเลิกทำ / ทำซ้ำเพียงบรรทัดเดียว แต่ก็สามารถแยกสาขาออกไปได้เช่นกัน" มีวิธีใช้undojoinกับกิ่งไม้ที่ฉันไม่เห็นบ้างไหม?
Kyle Strand

70

ฉันไปงานปาร์ตี้ช้าไปหน่อย แต่ฉันคิดว่าฉันพูดถึงว่าฉันเขียนปลั๊กอินการยกเลิกการสร้างภาพต้นไม้สำหรับ Vim: http://bitbucket.org/sjl/gundo.vim/

โดยส่วนตัวแล้วฉันพบว่าการสร้างกราฟต้นไม้แบบนี้เป็นวิธีเดียวที่ฉันจะเข้าใจได้


เพิ่มเติมขึ้นไปวันที่เก็บคอมไพล์อยู่ที่github.com/sjl/gundo.vim ด้วย vim-plug สามารถติดตั้งปลั๊กอินได้Plug 'sjl/gundo.vim'แล้วnnoremap <F5> :GundoToggle<CR>(แทนที่<F5>ด้วยลำดับคีย์ที่คุณต้องการผูก)
ewen-lbh


16

หากคุณใช้กลุ่มคุณสามารถเลื่อนดูโครงสร้างการเลิกทำโดยใช้:

  • u: (เลิกทำ) ย้ายกลับไปที่โครงสร้างเลิกทำ
  • Ctrl+R: (ทำซ้ำ) ไปข้างหน้าในโครงสร้างเลิกทำ

วิธีอื่น ๆ ในการนำเอกสารกลับหรือส่งต่อในเวลา:

  • :earlier 15m: ย้อนเวลากลับไป 15 นาที
  • :later 15m: เลื่อนไปข้างหน้าในเวลา 15 นาที

2
คำตอบนี้จะอธิบายวิธีการเคลื่อนที่ไปข้างหน้าและข้างหลังในสาขาเดียวเท่านั้น ไม่ใช่วิธีการย้ายระหว่างสาขา
Jonathan Hartley

สิ่งนี้จะย้ายไปทั่วทุกสาขาโดยเรียงลำดับคะแนนทั้งหมดตามลำดับเวลา ดูคำตอบของ @BrianCarper
Holloway

@JonathanHartley หากคุณกำลังใช้earlierและlaterไม่ได้ย้ายข้ามสาขา ฉันคาดหวังว่าคนส่วนใหญ่จะไม่ค่อยสนใจหรือจดจำสาขาต่างๆที่พวกเขาสร้างขึ้น แต่แค่อยากย้อนเวลากลับไป. หากคุณต้องการสร้างสาขาและตั้งชื่อgitหรือระบบควบคุมเวอร์ชันเป็นตัวเลือกที่ดีกว่า
alpha_989

@ alpha_989 ความคิดเห็นของคุณเกี่ยวกับการควบคุมเวอร์ชันไม่สมเหตุสมผล การควบคุมเวอร์ชันมีไว้สำหรับสถานะของไฟล์ที่ตั้งชื่อบนดิสก์ เรากำลังพูดถึงโครงสร้างการเลิกทำของ Vim ซึ่งเป็นเพียงโครงสร้างข้อมูลในหน่วยความจำ ทั้งคู่ใช้คำว่า 'branch' แต่ไม่ได้หมายถึงสิ่งเดียวกัน
Jonathan Hartley

ขอบคุณทุกคนที่ชี้ให้เห็นก่อนหน้านี้ / ต่อมาย้ายข้ามสาขา!
Jonathan Hartley

9

ฉันทราบว่าคำถามนี้ได้รับคำตอบแล้ว แต่ฉันคิดว่าจะเพิ่มตัวอย่าง

สร้างไฟล์ใหม่และพิมพ์:

this is a line

undolจะแสดงต้นไม้เลิกทำ ณ จุดนี้คุณยังไม่ได้ยกเลิกอะไรเลย

:undol

number changes  when               saved
     1       1  14:50:36

ตอนนี้กด ESC และแก้ไขบรรทัดเป็น:

this is a old line

เปลี่ยนเป็นโหมดปกติแล้วกด u (เลิกทำ) สิ่งนี้ควรลบ "เก่า" หากคุณตรวจสอบundolณ จุดนี้คุณยังมีเพียงสาขาเดียว

ตอนนี้แก้ไขบรรทัดเพื่อให้กล่าวว่า:

this is a new line

ตอนนี้:undolแสดง:

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

คุณสามารถเปลี่ยนไปใช้สาขาแรกได้โดยพิมพ์

:u 2

นี้จะย้ายคุณไปยังจุดสิ้นสุดของสาขาที่เกี่ยวข้องกับหมายเลข 2 คุณสามารถย้ายไปตามสาขานี้ด้วยและg+ g-ณ จุดนี้g+จะไม่ทำอะไรเลย (คุณอยู่ที่ใบไม้) หากคุณกดg-"old" จะถูกลบออก (คุณกำลังข้ามต้นไม้เลิกทำอันแรก) นั่นคือถ้าคุณลบ "เก่า" ด้วยg-แล้วกดg+อีกครั้ง "เก่า" จะถูกทำใหม่

ถ้าคุณพิมพ์

:u 3

คุณจะข้ามไปที่ใบไม้ของสาขาเลิกทำที่สองและมันจะอ่าน:

this is a new line



3

แพคเกจundotreeเขียนด้วย vimscript บริสุทธิ์ดังนั้นจึงไม่มีข้อกำหนด

และเพิ่มสิ่งนี้ลงใน vimrc ของคุณก่อนที่มันจะสายเกินไป:

  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 

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.