ฉันจะใช้เครื่องหมายเพื่อข้ามไปยังตำแหน่งที่ตั้งในไฟล์ที่ฉันเพิ่งเปิด แต่ไม่เปลี่ยนแปลงได้อย่างไร


11

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


":h motion

" ไปยังตำแหน่งเคอร์เซอร์เมื่อออกจากบัฟเฟอร์ปัจจุบันครั้งล่าสุด เริ่มต้นที่ตัวอักษรตัวแรกของบรรทัดแรก ดู | last-position-jump | สำหรับวิธีใช้สิ่งนี้สำหรับไฟล์ที่เปิดแต่ละไฟล์ มีการจดจำตำแหน่งเพียงหนึ่งตำแหน่งต่อบัฟเฟอร์ไม่ใช่หนึ่งตำแหน่งสำหรับแต่ละหน้าต่าง ตราบใดที่บัฟเฟอร์สามารถมองเห็นได้ในหน้าต่างตำแหน่งจะไม่เปลี่ยนแปลง {ไม่ใช่ใน Vi}

อย่างไรก็ตามถ้าฉัน

  • ปิดหน้าต่างทั้งหมดที่แสดงบัฟเฟอร์ (แต่บัฟเฟอร์นั้นยังคงอยู่ในรายการบัฟเฟอร์) หรือ:
  • ฆ่าอินสแตนซ์ทั้งหมดของบัฟเฟอร์

ดูเหมือนว่าเครื่องหมายจะไม่อัปเดตฉันจะใช้เครื่องหมายเพื่อข้ามไปยังตำแหน่งของตำแหน่งเคอร์เซอร์สุดท้ายในบัฟเฟอร์ / ไฟล์ได้อย่างไร


2
ฉันคิดว่าคุณกำลังมองหาCtrl+oและCtrl+i... :h jump-motionsสำหรับข้อมูลเพิ่มเติม
Sundeep

@Spasic นั่นไม่ใช่ข้อเสนอแนะที่ไม่ดี แต่เมื่อคุณกระโดดสักสองสามครั้งตำแหน่งจะหายไปในรายการกระโดดขนาดใหญ่ ด้วยการกำหนดขอบเขตเครื่องหมายไปที่บัฟเฟอร์คุณจะมีรายการเครื่องหมาย / ตำแหน่งที่เล็กกว่าเพื่อจัดการ
the_velour_fog

หากคุณยังไม่ได้อ่านฉันคิดว่าเคล็ดลับนี้น่าสนใจ บางทีคุณอาจจะต้องปรับแต่งของคุณviminfo
statox

@statox ขอบคุณ ฉันเห็นว่าและเคล็ดลับในการเป็นกลุ่มช่วย ฉันคิดว่าวิธีแก้ปัญหาเหล่านี้ทำให้เกิดการกระโดดโดยอัตโนมัติ"เมื่อคุณเปิดไฟล์ ฉันต้องการข้ามไปยังตำแหน่งเคอร์เซอร์ล่าสุดด้วยตนเองเท่านั้น นอกจากนี้ฉันไม่สามารถเข้าใจได้ว่าเมื่อใดที่"เครื่องหมายนั้นได้รับการตั้งค่าและอัปเดตดังนั้นสำหรับฉัน"เครื่องหมายนั้นใช้ไม่ได้
the_velour_fog

คำตอบ:


6

นี่คือทางออกคลาสสิก: ใช้

`H

เพื่อข้ามไปยังไฟล์ HTML สุดท้ายเป็นต้น ...

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

2
ขอบคุณดูเหมือนว่ามันจะมีประโยชน์จริงๆ ฉันโหลดมันเข้าไปใน vimrc ของฉันเพื่อลองดู ฉันเปลี่ยนเป็น autocmd WinLeaveเป็นอย่างที่ฉันสังเกตเห็นBufLeaveว่าดูเหมือนจะไม่ทำงานเมื่อคุณปิดการแยกและบัฟเฟอร์ยังคงเปิดอยู่ที่อื่น ฉันรู้ว่ามันเป็นกรณีเล็ก ๆ น้อย ๆ แต่WinLeaveดูเหมือนว่าจะทำงานในสถานการณ์ประเภท "ปิดไฟล์" ที่กว้างขึ้น แต่ฉันยังคงทดสอบ ...
the_velour_fog

3

ฉันเขียนคำสั่ง vimscript ซึ่งดูเหมือนว่าจะใช้งานได้

autocmd BufLeave * :normal ml

คำอธิบาย

  • BufLeave คำสั่งอัตโนมัติ: นี่ดูเหมือนจะทริกเกอร์เมื่อคุณ
    • ย้ายไปที่หน้าต่างอื่น
    • เมื่อคุณปิดหน้าต่างสุดท้ายที่แสดงบัฟเฟอร์
    • เมื่อคุณปิดบัฟเฟอร์ด้วยตัวเอง bd
  • :normal- ดูเหมือนว่าโดยค่าเริ่มต้นcommandส่วนหนึ่งของ autocmd คือคำสั่ง ex เพื่อบอกให้ vim รันคำสั่งโหมดปกติคุณต้องเพิ่ม:normal
  • ml- ตั้งเครื่องหมายl(ช่วยในการจำ: ครั้งสุดท้าย )

การใช้

เพื่อเรียกคืนตำแหน่งเคอร์เซอร์จากครั้งล่าสุดที่คุณอยู่ในบัฟเฟอร์เพียงกดปุ่ม

'l

หรือ

`l

0

หากคุณต้องการเคอร์เซอร์ของคุณเพื่อเรียกคืนตำแหน่งสุดท้ายที่viminfoรู้จักคุณสามารถใช้

autocmd BufReadPost * call setpos(".", getpos("'\""))

คำตอบของ romainl มีประโยชน์กับฉันเป็นอย่างยิ่งและฉันใช้มันมาอย่างมากมาย (ตั้งแต่ฉันเป็นนักพัฒนาเว็บ):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

สิ่งสุดท้ายที่อาจเป็นประโยชน์คือตัวเลือก:help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.