ฉันจะทำซ้ำ (เช่น "เลิกทำเลิกทำ") ใน Vim ได้อย่างไร?


697

ในกลุ่มฉันยกเลิกมากเกินไป ฉันจะยกเลิกสิ่งนี้ (นั่นคือทำซ้ำ) ได้อย่างไร


106
เมื่อฉันได้รับการโหวต 2 ครั้งอย่างใกล้ชิดฉันคิดว่าสิ่งนี้เป็นของที่นี่เนื่องจาก vim เป็นบรรณาธิการของโปรแกรมเมอร์
flybywire

28
ฉันเห็นด้วยว่านี่คือการเขียนโปรแกรมที่เกี่ยวข้องและเป็นคำถามจริง
DigitalRoss

41
มีคนอยู่แถวนี้และทำเครื่องหมายคำถาม Vim ทุกข้อว่า "เป็นของ SU" แม้ว่าชุมชนจะตัดสินใจมานานแล้วว่า Vim นั้นเป็นของ SO แต่มันก็เป็นเครื่องมือการเขียนโปรแกรม
Brian Carper

@Brian: คุณมีลิงค์ไปยังเอกสารที่ถึงฉันทามตินี้หรือไม่
php มากเกินไป

12
meta.stackexchange.com/questions/20251/แต่ฉันจำได้ว่าปีนี้กำลังจะมาถึง Vim / Emacs เป็น IDEs นอกจากนี้ภาษาที่ใช้ในไฟล์ปรับแต่งสำหรับทั้งสองนั้นเป็นภาษาสคริปต์ทัวริงที่สมบูรณ์ดังนั้นการกระทำของการตั้งค่า Vim จึงเป็นสิ่งที่ต้องเริ่มต้นด้วยการตั้งโปรแกรมเอง
Brian Carper

คำตอบ:


907

Ctrl+r


2
ฉันแค่อยากจะโยนปลั๊กอิน undoTree ออกมาที่นั่นสุดยอดมากสำหรับเวลาที่คุณไขลานตัวเองด้วยความวุ่นวายของการเลิกทำและการทำซ้ำ
Jake Sellers

3
ถ้าฉันอ่านเกี่ยวกับ vi แล้วนิ้วของฉันก็แค่ทำเอง คำสั่ง vi ไม่ทำงานกับ stackoverflow :-)
ciscogambo

2
หมายเหตุสำหรับผู้ใช้ Mac: Ctrl + r ในเครื่อง Mac จะทำลายวันของคุณเป็นกลุ่ม ไม่ทราบคำสั่งผสมคีย์ที่เหมาะสมในเทอร์มินัล Mac เพื่อเลิกทำ แต่แน่นอนที่สุดไม่ต้องกด Ctrl + r!
tpartee

@tpartee ฉันเพิ่งใช้ Ctrl + r ในกลุ่มภายใต้แอป Terminal ของ macOS - ไม่มีปัญหาที่นี่
Jase

3
@tpartee อาจหมายถึงทำให้Cmd + rสับสนหรือเปล่า? มันทำอะไรแปลก ๆ อย่างแน่นอน; แต่Ctrl + rทำงานได้ดีสำหรับฉัน (Mac + tmux + vim)
dwanderson

133

นอกจากนี้ตรวจสอบ:undolistซึ่งมีหลายเส้นทางผ่านประวัติศาสตร์เลิกทำ สิ่งนี้มีประโยชน์หากคุณพิมพ์บางอย่างโดยไม่ตั้งใจหลังจากเลิกทำมากเกินไป


22
@amindfv: ใช้หมายเลขจาก:undolistและพิมพ์:undo 178(พูด) เพื่อย้อนกลับไปยังขั้นตอนที่ 178
Peter

จะมีวิธีที่จะแสดงว่าสิ่งที่จะได้รับการ undo'ed ใด:undolist?
csharpfolk

2
@csharpfolk ใช้ปลั๊กอิน undotree ( github.com/mbbill/undotree )

54

การใช้งาน/:earlier :laterหากต้องการทำซ้ำทุกสิ่งที่คุณต้องทำ

later 9999999d

(สมมติว่าคุณแก้ไขไฟล์ที่มากที่สุด 9999999 วันที่ผ่านมาก่อน) หรือหากคุณจำความแตกต่างระหว่างการยกเลิกสถานะปัจจุบันและต้องการหนึ่งใช้Nh, NmหรือNsเป็นชั่วโมงนาทีและวินาทีตามลำดับ + :later N<CR><=> Ng+และ:later Nfสำหรับการเขียนไฟล์


1
:laterใช้งานได้สำหรับฉันในvi(ไม่ใช่ vim - ค้นหาคำว่า "vi" บน google แต่ผลลัพธ์ทั้งหมดสำหรับ "vim") ขอบคุณ!
Luc

@Luc เกือบทุกที่ที่คุณมีviคำสั่งมันเป็น symlink ไปยังกลุ่มปฏิบัติการหรือสำเนาของมัน ไม่สมบูรณ์ทุกที่แม้ว่า
ZyX

@ZYX ฉันหวังว่าเป็นจริง ฉันใช้ vi หลังจากทุบตีvim: command not foundเท่านั้น สิ่งต่อไปที่ฉันทำคือalias vim=viเพราะฉันพิมพ์มันโดยอัตโนมัติ แต่มันเป็น vi เก่าแบบธรรมดาอย่างไรก็ตาม นอกจากนี้การทำซ้ำ (ctrl + r) ก็จะทำงานได้อย่างถูกต้องหาก vi เป็นชื่อแทนสำหรับกลุ่ม
Luc

2
9999999d คือ 27395 ปีที่แล้ว ฉันคิดว่าคุณสมบัติการเลิกทำนั้นไม่ได้นำมาใช้ใน vi ก่อนหน้า คุณอาจต้องการบันทึกความพยายามในการพิมพ์อย่างละเอียดและใช้ตัวเลขที่สมเหตุสมผล ประมาณ 9999d correspongs ถึง 27 ปี 999d ถึง 2.7 ปี ฉันเดาว่าในกรณีส่วนใหญ่ก็เพียงพอแล้ว ...
ChristophK

45

เอกสารที่เป็นกลุ่ม

<Undo>      or                  *undo* *<Undo>* *u*
u           Undo [count] changes.  {Vi: only one level}

                            *:u* *:un* *:undo*
:u[ndo]         Undo one change.  {Vi: only one level}

                            *CTRL-R*
CTRL-R          Redo [count] changes which were undone.  {Vi: redraw screen}

                            *:red* *:redo* *redo*
:red[o]         Redo one change which was undone.  {Vi: no redo}

                            *U*
U           Undo all latest changes on one line.  {Vi: while not
            moved off of it}

30

ในโหมดคำสั่งใช้Uปุ่มเพื่อเลิกทำและCtrl+ rเพื่อทำซ้ำ มีลักษณะที่http://www.vim.org/htmldoc/undo.html


วิธีการเกี่ยวกับในโหมดแทรก?
Shen

1
@YuFengShen พลังของเสียงเรียกเข้าอยู่ในโหมดคำสั่ง เราไม่ต้องการทำซ้ำในโหมดแทรก
Tomas Hrubovcak

ลิงก์เสีย (มีประสิทธิภาพ)
Peter Mortensen

14

ก่อนอื่นกดEscปุ่มเพื่อออกจากโหมดแก้ไข

จากนั้น

สำหรับการเลิกทำให้ใช้uปุ่มหลาย ๆ ครั้งที่คุณต้องการเลิกทำ

สำหรับการทำซ้ำให้ใช้ปุ่มCtrl+r


11

โปรดดูที่"ยกเลิก" และ "ทำซ้ำ" ส่วนหนึ่งของเอกสารที่เป็นกลุ่ม

: red [o] (ทำซ้ำการเปลี่ยนแปลงอย่างใดอย่างหนึ่งซึ่งเลิกทำแล้ว) และ {count} Ctrl+r (ทำซ้ำการเปลี่ยนแปลง {เลิก} ที่เลิกทำแล้ว) ถือว่าใช้ได้

นอกจากนี้: ก่อนหน้า {นับ} ​​(ไปที่สถานะข้อความเก่า {นับ} ​​ครั้ง) สามารถใช้แทนการเลิกทำและทำซ้ำได้เสมอ


5

CTRL+r

"r" เป็นตัวพิมพ์เล็ก


9
ที่จริงแล้วมันไม่สำคัญหรอก - คอนโซลแบบดั้งเดิมไม่มีความแตกต่างระหว่าง^rและ^R, และกลุ่มที่ติดตามดังนี้
ephemient

@ephemient: เห็นด้วย ใน MS-DOS คุณไม่สามารถพิมพ์ตัวพิมพ์เล็กได้^X(ซึ่งXอาจเป็นตัวอักษรใดก็ได้)
nyuszika7h

ใน Vim นั้น Ctrl-shift-R (ctrl พร้อมตัวพิมพ์ใหญ่ R) เป็นโหมดแทนที่
พอลส

5

ใช้ VsVim สำหรับ Visual Studio หรือไม่

ฉันเจอสิ่งนี้เมื่อทดลองกับ VsVim ซึ่งให้การเชื่อมคำสั่ง Vim ใน Visual StudioStudio

ฉันรู้เกี่ยวกับ Ctrlr Vim แล้ว แต่การเชื่อมโยงนี้ไม่ทำงานใน VsVim (อย่างน้อยก็ไม่ได้อยู่ในการตั้งค่าของฉัน)

สิ่งที่ไม่ทำงาน :redแต่เป็นคำสั่ง นี่เป็นเรื่องยุ่งยากมากกว่าด้านบนเล็กน้อย แต่ก็ยังดีเมื่อคุณต้องการ


ลดลงเนื่องจากคำถามมีการถามเป็นพิเศษเกี่ยวกับ vim ไม่ใช่ Visual Studio
John Von Neumann

3
@JohnVonNeumann นี่ จะเกี่ยวข้องกับการที่เป็นกลุ่มหรือที่ผูกเป็นกลุ่มน้อยเพียงในบริบทของการเทียบกับ นั่นคือสิ่งที่ทำให้ฉันมีคำถามนี้หลังจากทั้งหมด การลงโทษใครบางคนสำหรับการเพิ่มข้อมูลอีกเล็กน้อยดูเหมือนจะไม่รุนแรงและไม่ถูกเรียกร้องเพราะคุณคิดไม่ถึงแม้ว่ามันอาจจะขยายเกินขอบเขตของ OP เล็กน้อยก็ตาม
Kjartan

2

ในทางปฏิบัติการพูดนั้นใช้:undolistยากและ Vim's :earlierและ:laterการติดตามเวลาของการเปลี่ยนแปลงนั้นสามารถใช้งานได้เฉพาะสำหรับการแก้ไขแบบธัญพืช

ระบุว่าฉันหันไปใช้ปลั๊กอินที่รวมคุณสมบัติเหล่านี้เพื่อให้ต้นไม้ที่มองเห็นได้ของการเลิกทำแบบเรียกดูได้เรียกว่า "Gundo"

เห็นได้ชัดว่านี่เป็นสิ่งที่จะใช้เฉพาะเมื่อคุณต้องการการแก้ไขแบบละเอียดหรือคุณไม่แน่ใจเกี่ยวกับสถานะที่แน่นอนของเอกสารที่คุณต้องการกลับไปใช้ ดู: Gundo สร้างกราฟของ Vim undo tree อย่างมีสไตล์

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