ฉันจะข้ามไปยังตำแหน่งของการแก้ไขล่าสุดได้อย่างไร


68

ฉันมักจะทำการเปลี่ยนแปลงที่ตรงกลางของไฟล์ขนาดใหญ่ใช้ggเพื่อข้ามไปด้านบนเพื่อตรวจสอบบางสิ่งบางอย่างและจากนั้นฉันก็ลืมที่จะกำหนดเครื่องหมายที่ฉันแก้ไข มีวิธีในตัวเพื่อข้ามไปยังตำแหน่งของบรรทัดที่เปลี่ยนแปลงล่าสุดหรือไม่?

คำตอบ:


84

`.คำสั่งจะนำคุณไปเปลี่ยนแปลงล่าสุดของคุณ

`ไปเครื่องหมายและ.เป็น "พิเศษ" เครื่องหมายซึ่งถูกตั้งค่าโดยอัตโนมัติไปยังตำแหน่งที่เปลี่ยนแปลงล่าสุดที่ถูกสร้างขึ้น ดู:help `.ข้อมูลเพิ่มเติมได้ที่

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

อีกเครื่องหมายที่มีประโยชน์คือ`^; นี่คือตำแหน่งที่เคอร์เซอร์เป็นครั้งสุดท้ายเมื่อหยุดโหมดแทรก :help `^ดู

ดู:help mark-motionsข้อมูลทั่วไปเพิ่มเติมเกี่ยวกับการใช้เครื่องหมาย (รวมถึงเครื่องหมาย "พิเศษ" อื่น ๆ ที่ตั้งค่าโดยอัตโนมัติ)


7
นอกจากนี้คุณยังสามารถใช้g;และg,เพื่อย้ายระหว่างตำแหน่งในรายการเปลี่ยนแปลง ดู:h g;และ:h g,
Peter Rincker

3
คุณสามารถใช้'(apostrophe) แทน`(backtick)
Sparhawk

21

นี่คือวิธีการอื่นที่เหมาะกับสถานการณ์ที่คุณกำหนดและจะข้ามไปยังตำแหน่งที่คุณเคยไปก่อนหน้านี้ทันทีgg(ไม่ใช่ไปยังบรรทัดที่เปลี่ยนแปลงล่าสุด)

ใช้ CtrlO

เมื่อคุณกดggตำแหน่งเคอร์เซอร์เก่าของคุณจะถูกผลักไปยังรายการกระโดด จาก:help jumplist:

การข้ามถูกจดจำในรายการข้าม ด้วย คำสั่งCTRL-OและCTRL-Iคุณสามารถไปที่ตำแหน่งเคอร์เซอร์ก่อนที่จะกระโดดข้ามและกลับมาอีกครั้ง ดังนั้นคุณสามารถเลื่อนรายการขึ้นและลง มีรายการข้ามแยกต่างหากสำหรับแต่ละหน้าต่าง จำนวนรายการสูงสุดได้รับการแก้ไขที่ 100

[ ... ]

หากคุณใช้คำสั่ง jump หมายเลขบรรทัดปัจจุบันจะถูกแทรกที่ส่วนท้ายของรายการข้าม หากบรรทัดเดียวกันมีอยู่ในรายการข้ามแล้วจะถูกลบออก ผลลัพธ์คือเมื่อทำซ้ำCTRL-Oคุณจะกลับสู่ตำแหน่งเดิมเพียงครั้งเดียว

สิ่งนี้ต้องการให้คุณใช้ Vim (ไม่ใช่ vi) พร้อม+jumplistฟีเจอร์ หาก:echo has('jumplist')พิมพ์1คุณสามารถใช้สิ่งนี้ได้


19

ในการเพิ่มคำตอบของ dnetserr และความคิดเห็นของ Peter Rincker Vim จะรักษารายการการเปลี่ยนแปลงและมีคำสั่งบางอย่างที่เกี่ยวข้องกับสิ่งนี้

:changes

จะแสดงรายการการเปลี่ยนแปลงแสดงให้คุณเห็นว่าพวกเขาอยู่ที่ไหนและพวกเขาอยู่ที่ไหน ตัวอย่างเช่น:

change line  col text
    2     8   17 #include <stdio.h>
    1     3    0 #include "stm32f407.auto.h"
>

บรรทัดที่มีการ>แสดงว่าอยู่ในสแต็กการเปลี่ยนแปลงที่คุณเป็นเช่นรายการข้าม ( :jumps) หรือแท็กสแต็ก ( :tags) เช่นเดียวกับรายการข้ามและสแต็กแท็กคุณสามารถข้ามรายการนี้

ในโหมดปกติการเคลื่อนไหวจะg;ต้องไปยังตำแหน่งการเปลี่ยนแปลงก่อนหน้าและg,ไปที่ตำแหน่งถัดไป คุณยังสามารถพิมพ์จำนวนการเปลี่ยนแปลงก่อนหน้าg;หรือg,เพื่อไปที่การเปลี่ยนแปลงนั้นจากรายการ ด้านบน2g;จะพาฉันไปที่จุดเปลี่ยนที่เกี่ยวข้องกับ stdio.h

เมื่ออยู่ตรงกลางสแต็คตัวเลขจาก:changesการอัพเดตจะแสดงระยะทางสัมพัทธ์ ตัวอย่างเช่น:

change line  col text
    1     8   17 #include <stdio.h>
>   0     3    0 #include "stm32f407.auto.h"
    1    10    4 other

นี่แสดงให้เห็นว่าฉันสามารถย้อนกลับหนึ่ง ( 1g;หรือเพียงg;) หรือส่งต่อหนึ่ง ( 1g,หรือเพียงg,)

นี่เป็นสิ่งที่ดีถ้าการเปลี่ยนแปลงที่คุณต้องการจะเกิดขึ้นจริงเกิดขึ้นเมื่อไม่กี่แก้ไขที่ผ่านมา

ข้อเสียของสิ่งนี้คือมันไม่ปรากฏว่าทำหน้าที่เหมือนการเคลื่อนไหวปกติ ตัวอย่างเช่นคุณไม่สามารถdg;ลบจากเคอร์เซอร์ไปยังตำแหน่งการเปลี่ยนแปลงก่อนหน้าได้ในขณะที่d'.และd'^ทำงานเป็นภาพเคลื่อนไหว


15

g; จะไปที่บรรทัดที่แก้ไขก่อนหน้า


3
คุณยังสามารถใช้ g, (คอมมา) เพื่อไปยังตำแหน่งการแก้ไขที่ใหม่กว่า
James

5

เนื่องจากคำสั่ง undo ใน Vi จะทำหน้าที่เป็น re-do เมื่อคำสั่งสุดท้ายเลิกทำฉันจึงใช้uuเป็นวิธีในการกลับไปยังที่ที่ฉันแก้ไขล่าสุด

หากคุณใช้ Vim พร้อมnocompatibleชุด (ตามที่คนส่วนใหญ่ทำ) คุณต้องการใช้uตามด้วยCTRL+Rเพื่อยกเลิก & ทำซ้ำ มิฉะนั้นuuจะทำงานเช่นเดียวกับใน Vi


มันจะถ้า:set nocompatibleไม่ได้ใช้
muru

2
My vim(with nocompatible) ทำสอง undos ด้วยuuแต่ฉันใช้uและCTRL+rมีผลเหมือนกัน
Shahbaz

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