ฉันจะใช้ jumplist เพื่อข้ามหนึ่งครั้งต่อไฟล์ได้อย่างไร


6

เมื่อไปที่ Vim ฉันมักจะพบว่าตัวเองกระโดดไปที่ไฟล์กระโดดไปรอบ ๆ ไฟล์นั้นจากนั้นก็ไปยังไฟล์อื่นเป็นต้น ในที่สุดฉันต้องการกลับไปที่ไฟล์ต้นฉบับ การใช้<CTRL-O>ทำงานได้ แต่ต้องการกดมากกว่าที่ฉันต้องการ

ฉันรู้ว่าฉันสามารถตั้งเครื่องหมายล่วงหน้า แต่ฉันต้องการวิธีแก้ปัญหาที่ไม่ต้องใช้ความคิดล่วงหน้า

ฉันกำลังมองหาวิธีที่จะย้อนกลับไปที่ jumplist โดยหยุดหนึ่งครั้งต่อไฟล์


ฉันต้องการสิ่งนี้เพราะเมื่อเนื้อหาของหน้าต่างเปลี่ยนไปโดยไม่ตั้งใจและฉันจำไม่ได้ว่าบัฟเฟอร์ตัวไหนที่ฉันเคยมีก่อนหน้านี้เพียงแค่ว่าฉันต้องการให้มันอยู่ที่นั่น
Brady Trainor

คำตอบ:


6

ปลั๊กอิน EnhancedJumpsของฉันมีการแมปตัวแปรของ<C-o>/ <C-i>เพื่อ จำกัด การข้ามไปยังปัจจุบันหรือบัฟเฟอร์ที่แตกต่างกัน

<Leader><CTRL-O>, <Leader><CTRL-I> ไปที่ [นับ] ตำแหน่งเคอร์เซอร์ที่เก่ากว่า / ใหม่กว่าในบัฟเฟอร์อื่น การข้ามภายในบัฟเฟอร์ปัจจุบันจะไม่ถูกนำมาพิจารณา มีประโยชน์สำหรับการเรียกคืนบัฟเฟอร์ที่เคยเยี่ยมชมก่อนหน้านี้โดยไม่ต้องผ่านตำแหน่งท้องถิ่นทั้งหมด โดยไม่คำนึงถึงทิศทางการกระโดดตำแหน่งการกระโดดครั้งสุดท้ายในบัฟเฟอร์จะถูกใช้เมื่อมีการข้ามหลายครั้งในบัฟเฟอร์


สมบูรณ์แบบนั่นคือสิ่งที่ฉันกำลังมองหา ขอบคุณ
Paul Carey

1

ฉันมีปัญหาเดียวกันอย่างแน่นอนและพบว่าปลั๊กอิน EnhancedJump ค่อนข้างใหญ่และต้องการการพึ่งพาที่มากขึ้น ฉันเขียนฟังก์ชันเล็ก ๆ ที่คำนวณจำนวน<C-O>/ <C-I>จำเป็นเพื่อข้ามไปยังบัฟเฟอร์ที่แตกต่างจากบัฟเฟอร์ปัจจุบัน จัมพลิสต์ยังคงสะอาดทำแผนที่ให้<leader><C-O>/<C-I>เหมาะกับความต้องการของฉันในวิธีที่น้อยที่สุด

  • <leader><C-O> ข้ามไปที่การกระโดดครั้งสุดท้ายของบัฟเฟอร์ก่อนหน้าใน jumplist
  • <leader><C-I> ทำสิ่งเดียวกันและย้ายไปยังบัฟเฟอร์ถัดไปใน jumplist
function! JumpToNextBufferInJumplist(dir) " 1=forward, -1=backward
    let jl = getjumplist() | let jumplist = jl[0] | let curjump = jl[1]
    let jumpcmdstr = a:dir > 0 ? '<C-O>' : '<C-I>'
    let jumpcmdchr = a:dir > 0 ? '^O' : '^I'    " <C-I> or <C-O>
    let searchrange = a:dir > 0 ? range(curjump+1,len(jumplist))
                              \ : range(curjump-1,0,-1)
    for i in searchrange
        if jumplist[i]["bufnr"] != bufnr('%')
            let n = (i - curjump) * a:dir
            echo "Executing ".jumpcmdstr." ".n." times."
            execute "silent normal! ".n.jumpcmdchr
            break
        endif
    endfor
endfunction
nnoremap <leader><C-O> :call JumpToNextBufferInJumplist(-1)<CR>
nnoremap <leader><C-I> :call JumpToNextBufferInJumplist( 1)<CR>

อย่าลืมแทนที่^Oและ^Iในบรรทัดที่ 4 โดยอักขระ CTRL + o และ CTRL + i จริงด้วย CTRL + v ฉันไม่รู้ว่าทำไมยกเว้นสตริง"<C-O>"และ"<C-I>"ไม่ทำงานเมื่อnormal!สั่งงานคำสั่ง


0

ฉันไม่แน่ใจว่าฉันทำให้คุณถูกต้อง คุณต้องการข้ามไปมาระหว่างไฟล์ / บัฟเฟอร์ไม่ใช่ตำแหน่งใน jumplist (ซึ่งอาจมีหลายตำแหน่งในไฟล์เดียวกัน)

จากนั้นคุณสามารถตรวจสอบคำสั่งที่เกี่ยวข้องกับบัฟเฟอร์ เช่น

:ls        "list all buffers, Number, name
:b[N]      "switch to buffer N
:b <tab>   "after tab, buffer name auto-completion 

และมีปลั๊กอินมากมายที่ช่วยให้เราสามารถเปลี่ยนบัฟเฟอร์ได้อย่างง่ายดาย


0

วัตถุประสงค์ของ jumplist ไม่ได้ช่วยให้คุณกระโดดจากบัฟเฟอร์ไปยังบัฟเฟอร์: มันบันทึกการเคลื่อนไหวกระโดดทั้งหมดที่คุณทำ เนื่องจากการใช้ vim ทั่วไปรวมถึงการกระโดดจำนวนมากภายในและข้ามบัฟเฟอร์มันจะเป็นความผิดพลาดที่จะใช้มันเพื่อนำทางระหว่างบัฟเฟอร์

ยกเว้นว่าคุณไม่เคยใช้การเคลื่อนไหวกระโดดนั่นคือ แต่นั่นจะเป็นความผิดพลาดที่ใหญ่กว่าเดิม

Vim มีรายการบัฟเฟอร์ซึ่งตามชื่อหมายถึงเป็นรายการบัฟเฟอร์ทั้งหมดของคุณและมาพร้อมกับคำสั่งการนำทางมากมายของมันเอง น่าเสียดายที่รายการนี้เป็น "คงที่": คุณสามารถนำทางไปยังบัฟเฟอร์ก่อนหน้าในรายการ แต่ไม่ไปยังบัฟเฟอร์ที่เข้าถึงก่อนหน้านี้ เป็นกลุ่มไม่ได้เก็บรายการดังกล่าว

ฉันนำทางบัฟเฟอร์ด้วยชื่อ แต่มันอาจจะเป็นไปได้ที่จะเขียนฟังก์ชั่นที่ฟิลเตอร์ jumplist และนำทางไปยังบัฟเฟอร์ที่แตกต่างกันครั้งแรก ฉันไม่สามารถทำได้บนโทรศัพท์นี้ในตอนนี้ แต่ฉันไม่คิดว่ามันจะยากเกินไป

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