มีวิธีการที่เชื่อถือได้ย้อนกลับไปมาในประวัติไฟล์


15

ฉันต้องการไปยังไฟล์ที่ฉันเพิ่งแก้ไขครั้งล่าสุดและถัดไปเช่นปลั๊กอิน MRU ทำ

:bnextและ:bprevบางครั้งก็ใช้งานได้ แต่ส่วนใหญ่แล้วไม่ใช่แค่ฉันจบลงในไฟล์ที่คลุมเครือบางอย่างฉันจำไม่ได้ว่าการแก้ไขและถูกบังคับให้ถอยกลับไปที่ปลั๊กอิน MRU

มีวิธีแก้ไขหรือไม่

Ctrl-^สลับระหว่างสองไฟล์สุดท้าย เป็นวิธีที่ดีที่สุดในการนำทางมากขึ้น?

ฉันเข้าใจว่ามันอาจเป็นเรื่องยุ่งยาก แต่ฉันเห็นด้วยกับสิ่งใดก็ตามที่สามารถปรับปรุง:bn :bpพฤติกรรมปัจจุบัน บัฟเฟอร์ที่ฉันมักจะเห็นอยู่นอกสถานที่ อาจมีปลั๊กอินที่สามารถติดตามไฟล์ล่าสุดและมี hooks เพื่อให้ฉันสามารถสร้างการแมป

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

บางอย่างเช่นCtrl-O Ctrl-Iคู่ที่เปลี่ยนไฟล์ได้ทันทีโดยไม่ต้องกระโดดไปรอบ ๆ บัฟเฟอร์ปัจจุบัน เรียงลำดับของไลค์uและUใน netrw:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|

โดย "ไฟล์ที่ฉันเพิ่งแก้ไขล่าสุด" คุณหมายถึง "ไฟล์ที่ฉันแก้ไขล่าสุด" หรือไม่? หรือคุณแค่หมายถึงคนสุดท้ายที่คุณเห็นใน Vim?
รวย

2
หากหลังฉันเองก็บดCtrl-O(หรือบางครั้งCtrl-T) จนกว่าฉันจะไปถึงที่นั่น
รวย

ใช่ว่าสิ่งที่ฉันทำเกินไปและCtrl-O Ctrl-Iแต่มันจะกระโดดไปมาระหว่างจุดแก้ไขและทำให้การไหลลื่น ทั้งหมดที่ฉันต้องการย้อนกลับไปมาระหว่างบัฟเฟอร์ในการเข้าถึง ปลั๊กอินแสดงรายการไฟล์ล่าสุดอย่างไร? พวกเขาติดตามพวกเขาภายในหรือไม่
firedev

Ctrl-^สลับระหว่างสองไฟล์สุดท้าย แต่วิธีที่ดีที่สุดในการนำทางคืออะไร?
firedev

โดยการเข้าถึงก็ยังไม่ชัดเจนถ้าคุณหมายถึงลำดับที่พวกเขาเปิดเขียนในหน้าต่างที่มุ่งเน้นหรือมีการเปลี่ยนแปลง Ctrl-O/Iเป็นหน้าต่างเฉพาะ fwiw ในขณะที่ MRU มักจะเป็นสากล หากคุณต้องการคำสั่งซื้อที่เข้าถึงได้เร็ว ๆ นี้ทันทีที่คุณย้อนกลับไปหนึ่งครั้งลำดับของรายการจะเปลี่ยนไป
Matt Boehm

คำตอบ:


7

ฉันเขียนฟังก์ชั่นเล็ก ๆ น้อย ๆ เพื่อกด CTRL-O ซ้ำ ๆ จนกระทั่งตัวบัฟเฟอร์เปลี่ยนไป

คุณสามารถค้นหาได้ที่นี่ ฉันทำแผนที่กับ CTRL-U แต่คุณสามารถแทนที่ CTRL-O ได้ถ้าคุณต้องการ

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

<C-I>คุณอาจจะเขียนอะไรบางอย่างที่คล้ายกันสำหรับ

ปัญหาที่พบ:

  • หากไม่มีบัฟเฟอร์ก่อนหน้านี้มันจะวนลูปอย่างเงียบ ๆ จนกว่าคุณจะกด CTRL-C!

ที่เกี่ยวข้อง:

  • :jumps แสดงรายการที่ตั้งทางประวัติศาสตร์ที่ CTRL-O จะถอยกลับ
  • CTRL-T ที่เป็นค่าเริ่มต้นของ Vim เป็นทางเลือกที่ดีในการ mashing CTRL-O เนื่องจากมีการหยาบมาก: มันจะย้อนกลับผ่านการข้ามแท็กเท่านั้น

ดูเหมือนว่ากลุ่มจะเสนอประวัติไฟล์ MRU เพียงระดับเดียวเท่านั้นซึ่งจะปรากฏใน CTRL- ^ อย่างไรก็ตามฉันสังเกตว่าเมื่อใช้:kwbdเพื่อปิดบัฟเฟอร์สองสามอัน, Vim นั้นถอยกลับไปยังบัฟเฟอร์ก่อนหน้าตามลำดับย้อนหลังที่คาดไว้ บางทีกลุ่มมีรายการ MRU ซึ่งไม่ได้แชร์กับเราหรืออาจเลือกบัฟเฟอร์ที่จะถอยกลับไปอิงตามประวัติตำแหน่ง CTRL-O ( :jumps)
joeytwiddle

1
หรือมิฉะนั้นautocmd InsertLeave * normal mZจะจำได้ว่าไฟล์ที่แก้ไขล่าสุดในเครื่องหมายโลกZ g'Zคุณจะได้รับกลับไปด้วย // ฉันมีnmap <C-y> g'Zแต่ฉันยังคงมีแนวโน้มที่จะใช้ Ctrl-U บ่อยขึ้น
joeytwiddle

6

คุณสามารถใช้:lsเพื่อแสดงบัฟเฟอร์ทั้งหมด ตัวอย่างเช่น:

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

หากต้องการกลับไปที่บัฟเฟอร์ext.markdownให้ใช้:e +NbufโดยNเป็นหมายเลขบัฟเฟอร์จากคอลัมน์แรก ตัวอย่างเช่น:e +2buf.

คุณสามารถสร้างฟังก์ชั่นง่าย ๆ สำหรับประสบการณ์การโต้ตอบที่มากขึ้น:

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

หลังจากใช้งาน:ChooseBufหรือ<Leader>bคุณเพียงพิมพ์หมายเลขบัฟเฟอร์ที่คุณต้องการแก้ไข

นี้ไม่ได้ค่อนข้าง "ที่ใช้มากที่สุดเมื่อเร็ว ๆ นี้" เนื่องจากคำสั่งคือ "ส่วนใหญ่เพิ่งเปิด" (นี่อาจจะเป็นเหตุผลที่:bnext/ :bprevจะไม่ได้ทำงานตามที่คุณคาด)


4

<C-6>คือสิ่งที่คุณต้องการซึ่งจะนำคุณกลับไปยังบัฟเฟอร์ก่อนหน้านี้ที่คุณเปิดไว้ก่อนหน้าบัฟเฟอร์ปัจจุบัน นอกจากนี้ยังมี:bprev& :bnextที่คุณสามารถใช้สำหรับสิ่งเดียวกัน


<C-6>ไม่เลว แต่ฉันไม่สามารถใช้มันเพื่อข้ามบัฟเฟอร์สองอันกลับมาได้ bprevและbnextไม่ได้อยู่ในลำดับของการกระโดด
Praxeolitic

ใช่ฉันไม่คิดว่าจะมีวิธีที่ดีในการเจาะลึกเข้าไปในประวัติศาสตร์ คุณต้องใช้ปลั๊กอิน MRU บางตัวแม้ CtrlP จะมีหนึ่งอันก็ต้องมีปลั๊กอินอื่น ๆ
Dhruva Sagar

2
หมายเหตุ: มันไม่ได้ก็<C-6> <C-^>ในขณะที่เทอร์มินัลเทอร์มินัลจำนวนมากไม่มีความแตกต่างสำหรับบางคน (รวมถึงที่มาพร้อมกับ OS X) นั้นมี สำหรับกรณีหลังShiftจำเป็นต้องใช้คีย์ (สมมติว่ามีรูปแบบ Qwerty)
tommcdo

@ tommcdo น่าสนใจฉันอยู่บน osx แต่ใช้ iterm แทน terminal.app มันใช้งานได้เหมือนกันสำหรับฉัน ต้องการปุ่ม Shift บนมันจะเป็นคนเกียจคร้าน
Dhruva Sagar

ลองคิดดูสิมันอาจเป็นไปได้ว่าระบบปฏิบัติการของฉันกำลังหยิบกุญแจที่ผูกไว้และไม่เผยแพร่ไปยัง Vim ระบบปฏิบัติการของฉันต้องหยุดทำงาน!
tommcdo

2

คุณสามารถใช้:oldfilesเพื่อรับรายการไฟล์ที่คุณแก้ไข

รายการจะมีหมายเลขที่เกี่ยวข้องกับชื่อไฟล์ เลือกไฟล์บันทึกหมายเลข (พูด 14) แล้วเปิดด้วย:edit #<14

นอกจากนี้คุณยังสามารถเรียกใช้คำสั่งอื่น ๆ ในไฟล์นั้นหรือส่งหลายไฟล์ไปยังคำสั่งได้ในครั้งเดียว เพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่


1
คำตอบอื่น ๆในการเชื่อมโยงสอนให้ฉัน:bro[wse] ol[dfiles][!]
สตีฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.