ฉันมักจะทำการเปลี่ยนแปลงที่ตรงกลางของไฟล์ขนาดใหญ่ใช้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,