ฉันมักจะทำการเปลี่ยนแปลงที่ตรงกลางของไฟล์ขนาดใหญ่ใช้ggเพื่อข้ามไปด้านบนเพื่อตรวจสอบบางสิ่งบางอย่างและจากนั้นฉันก็ลืมที่จะกำหนดเครื่องหมายที่ฉันแก้ไข มีวิธีในตัวเพื่อข้ามไปยังตำแหน่งของบรรทัดที่เปลี่ยนแปลงล่าสุดหรือไม่?
ฉันมักจะทำการเปลี่ยนแปลงที่ตรงกลางของไฟล์ขนาดใหญ่ใช้ggเพื่อข้ามไปด้านบนเพื่อตรวจสอบบางสิ่งบางอย่างและจากนั้นฉันก็ลืมที่จะกำหนดเครื่องหมายที่ฉันแก้ไข มีวิธีในตัวเพื่อข้ามไปยังตำแหน่งของบรรทัดที่เปลี่ยนแปลงล่าสุดหรือไม่?
คำตอบ:
`.คำสั่งจะนำคุณไปเปลี่ยนแปลงล่าสุดของคุณ
`ไปเครื่องหมายและ.เป็น "พิเศษ" เครื่องหมายซึ่งถูกตั้งค่าโดยอัตโนมัติไปยังตำแหน่งที่เปลี่ยนแปลงล่าสุดที่ถูกสร้างขึ้น ดู:help `.ข้อมูลเพิ่มเติมได้ที่
นอกจากนี้ยังมี``สิ่งที่จะนำคุณกลับไปยังตำแหน่งที่เคอร์เซอร์อยู่ก่อนที่คุณจะกระโดดครั้งสุดท้าย ดู: ช่วย``สำหรับข้อมูลเพิ่มเติม
อีกเครื่องหมายที่มีประโยชน์คือ`^; นี่คือตำแหน่งที่เคอร์เซอร์เป็นครั้งสุดท้ายเมื่อหยุดโหมดแทรก :help `^ดู
ดู:help mark-motionsข้อมูลทั่วไปเพิ่มเติมเกี่ยวกับการใช้เครื่องหมาย (รวมถึงเครื่องหมาย "พิเศษ" อื่น ๆ ที่ตั้งค่าโดยอัตโนมัติ)
'(apostrophe) แทน`(backtick)
นี่คือวิธีการอื่นที่เหมาะกับสถานการณ์ที่คุณกำหนดและจะข้ามไปยังตำแหน่งที่คุณเคยไปก่อนหน้านี้ทันทีgg(ไม่ใช่ไปยังบรรทัดที่เปลี่ยนแปลงล่าสุด)
เมื่อคุณกดggตำแหน่งเคอร์เซอร์เก่าของคุณจะถูกผลักไปยังรายการกระโดด จาก:help jumplist:
การข้ามถูกจดจำในรายการข้าม ด้วย คำสั่ง
CTRL-OและCTRL-Iคุณสามารถไปที่ตำแหน่งเคอร์เซอร์ก่อนที่จะกระโดดข้ามและกลับมาอีกครั้ง ดังนั้นคุณสามารถเลื่อนรายการขึ้นและลง มีรายการข้ามแยกต่างหากสำหรับแต่ละหน้าต่าง จำนวนรายการสูงสุดได้รับการแก้ไขที่ 100[ ... ]
หากคุณใช้คำสั่ง jump หมายเลขบรรทัดปัจจุบันจะถูกแทรกที่ส่วนท้ายของรายการข้าม หากบรรทัดเดียวกันมีอยู่ในรายการข้ามแล้วจะถูกลบออก ผลลัพธ์คือเมื่อทำซ้ำ
CTRL-Oคุณจะกลับสู่ตำแหน่งเดิมเพียงครั้งเดียว
สิ่งนี้ต้องการให้คุณใช้ Vim (ไม่ใช่ vi) พร้อม+jumplistฟีเจอร์ หาก:echo has('jumplist')พิมพ์1คุณสามารถใช้สิ่งนี้ได้
ในการเพิ่มคำตอบของ 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'^ทำงานเป็นภาพเคลื่อนไหว
g; จะไปที่บรรทัดที่แก้ไขก่อนหน้า
เนื่องจากคำสั่ง undo ใน Vi จะทำหน้าที่เป็น re-do เมื่อคำสั่งสุดท้ายเลิกทำฉันจึงใช้uuเป็นวิธีในการกลับไปยังที่ที่ฉันแก้ไขล่าสุด
หากคุณใช้ Vim พร้อมnocompatibleชุด (ตามที่คนส่วนใหญ่ทำ) คุณต้องการใช้uตามด้วยCTRL+Rเพื่อยกเลิก & ทำซ้ำ มิฉะนั้นuuจะทำงานเช่นเดียวกับใน Vi
:set nocompatibleไม่ได้ใช้
vim(with nocompatible) ทำสอง undos ด้วยuuแต่ฉันใช้uและCTRL+rมีผลเหมือนกัน
g;และg,เพื่อย้ายระหว่างตำแหน่งในรายการเปลี่ยนแปลง ดู:h g;และ:h g,