Vim: เลื่อนเคอร์เซอร์ไปที่ตำแหน่งสุดท้าย


252

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

นี่เป็นการสาธิตเล็กน้อย:

line |1| <- cursor position
line 2
line 3
line 4

และสมมติว่าฉันทำ2jนี่คือวิธีตอนนี้:

line 1
line 2
line |3| <- cursor position
line 4

ตอนนี้ฉันต้องการกดบางสิ่ง ( 2kอย่างชัดเจน) เพื่อเลื่อนกลับไปที่ตำแหน่งแรกและอาจเป็นตำแหน่งก่อนหน้า

คำตอบ:


410

วิธีที่เร็วที่สุดคือการตี:

''

(สองอะพอสโทรฟี) หรือ:

``

(สอง backticks) โปรดทราบว่าความแตกต่างคือ backtick ไปที่ตำแหน่งเดียวกันบนบรรทัดในขณะที่เครื่องหมายอัญประกาศเดี่ยวไปที่จุดเริ่มต้นของบรรทัด บนแป้นพิมพ์ของสหราชอาณาจักรอะพอสโทรฟีสามารถเข้าถึงได้มากขึ้นดังนั้นฉันมักจะใช้มัน :help mark-motionsมีโหลดของเครื่องหมายที่มีประโยชน์เช่นนี้มีให้ดู

สำหรับการเคลื่อนไหวอื่น ๆ (ไม่ใช่2jฉันคิดว่า) มีการข้ามรายการที่ให้คุณนำทางกลับไปกลับมาระหว่างการเคลื่อนไหวจำนวนมาก CtrlOและCtrlIทำการนำทางนี้ แต่ดู:help jump-motionsข้อมูลเพิ่มเติม


3
อันที่จริงไม่มีสิ่งใดที่เหมือนที่ฉันคาดหวัง แต่ฉันเดาว่าไม่มีอะไรอีกแล้ว
Idan K

1
@Idan K - `` (backtick สองครั้ง) ไม่ได้ให้สิ่งที่คุณต้องการอย่างแน่นอน (ยกเว้นสำหรับ "ประวัติ" ด้าน)
ด่าน

3
@ ด่าน: ถ้าฉันลองในตัวอย่างด้านบนแล้วฉันเห็นพฤติกรรมนี้: ฉันยืนอยู่บนบรรทัดที่ 1 จากนั้นกดjสองครั้งในแถว (ตอนนี้ฉันอยู่ในบรรทัดที่ 3) จากนั้นกดสอง backtick มาถึงฉันบรรทัดที่ 1 และฉันคาดหวัง เพื่อย้ายไปยังบรรทัด 2
Idan K

2
ฉันคิดว่าคุณต้องย้าย (2j หรือบางอย่าง) จากนั้นแก้ไข (หรือดำเนินการใด ๆ เพื่อแก้ไขข้อความ) จากนั้นใช้ '' เพื่อเลื่อนกลับไปยังตำแหน่งก่อนหน้า นั่นไม่ใช่เหตุผลที่จะใช้ "2j" ไม่ทำอะไรเลยและกลับไปที่ตำแหน่งก่อนหน้านี้
Asenar

8
@IdanK jumplist ได้รับการอัพเดตเท่านั้น (เช่นตำแหน่งเคอร์เซอร์ก่อนหน้านี้จะถูกบันทึกไว้) เมื่อคุณใช้คำสั่ง "jump" ซึ่งเป็น (ฉันคิดว่า) คำสั่งการเคลื่อนไหวใด ๆ นอกเหนือจากi j k lการเคลื่อนไหว (รายการที่สมบูรณ์จากเอกสารช่วยเหลือคือ"'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file) ดังนั้นไม่สิ่งนี้จะไม่ "เลิกทำ" 2jหรือคล้ายกัน แต่จะใช้ได้เกือบทุกอย่าง มันสมเหตุสมผลแล้วเพราะ2jet al. มี inversions ธรรมดา ( 2kฯลฯ ) อยู่แล้วในขณะที่ผู้อื่นไม่มี
Kyle Strand

61

คุณสามารถใช้g;และg,เพื่อเลื่อนไปข้างหน้าและไปข้างหน้าในรายการตำแหน่งแก้ไขก่อนหน้าของคุณ

บนแป้นพิมพ์ที่ไม่ใช่ US

ในรูปแบบแป้นพิมพ์ภาษาสวิสและเยอรมันของฉันการพิมพ์;ต้องใช้Shiftคีย์อย่างไม่สะดวก ดังนั้นฉันกำหนดg-เป็นนามแฝงที่สะดวกกว่าสำหรับg;ใน$MYVIMRC:

" Map g- as an alias for g;
nnoremap g- g;

ในขณะที่ฉันชอบสิ่งนี้มากมันจะข้ามไปมาระหว่างการเปลี่ยนแปลงในไฟล์เดียว หากคุณแก้ไข buffer 1 แล้วบัฟเฟอร์ที่แก้ไข 2 มันจะไม่กระโดดกลับไปยังบัฟเฟอร์ 1.
thouliha

39

ทำไมไม่มีใครคิดว่าปัญหากับคำตอบของ DrAl ? ''หรือ``จะไม่แก้ปัญหาเดิมของโพสต์นี้! คำสั่งทั้งสองนี้จะไม่ทำงานสำหรับการเคลื่อนไหวของเคอร์เซอร์2jอย่างน้อยสำหรับฉัน มันจะทำให้มือใหม่รู้สึกสับสนมากขึ้น

พฤติกรรมของ ''หรือ``และCtrlIหรือCtrlOจะขึ้นอยู่กับรายการกระโดด จะไม่บันทึกการเปลี่ยนแปลงตำแหน่งในรายการกระโดดเพื่อให้คำสั่งเหล่านี้จะไม่ทำงาน2j2j

''หรือ``สลับระหว่างตำแหน่งสุดท้ายและตำแหน่งปัจจุบัน CtrlIและCtrlOทำงานผ่านประวัติรายการข้าม

g;และg,เลื่อนผ่านตำแหน่งแก้ไขซึ่งใช้บ่อยมาก


1
ขอบคุณที่ชี้นำสิ่งนี้! ฉันสงสัยว่าจะใช้งานอะไรได้บ้างในกรณีเช่น2jนี้

33

ได้จากความช่วยเหลือ (: ช่วยกระโดด):

: ju [mps] พิมพ์รายการข้าม (ไม่ใช่คำสั่ง motion) {ไม่อยู่ใน Vi} {ไม่สามารถใช้งานได้หากไม่มี | + jumplist | ลักษณะเฉพาะ}

                          *jumplist*

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

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