ทำซ้ำบัฟเฟอร์ลงในแท็บใหม่แทนที่จะย้าย


10

ฉันมักจะต้องการเพิ่มบัฟเฟอร์ในหน้าแท็บชั่วคราวแล้วกลับไปที่การกำหนดค่าบัฟเฟอร์เก่าที่ฉันดู ขั้นตอนการทำงานปัจจุบันของฉันสำหรับการทำบางสิ่งบางอย่างเช่นนี้เป็นทั้งการปิดบัฟเฟอร์อื่น ๆ ที่ใช้<c-w>oหรือจะย้าย buffer <c-w>Tฉันกำลังมองหาที่ไปที่แท็บของตัวเอง ปัญหาเกี่ยวกับแนวทางที่สองคือมันลบบัฟเฟอร์ออกจากหน้าแท็บเดิม

ผมเติมสามไฟล์a.txt, b.txtและc.txtด้วยa, bและcตามลำดับ

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

เมื่อฉันเปิดไฟล์ทั้งสามนี้ในหน้าแท็บเดียวฉันจะได้สิ่งต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นฉันสามารถย้ายa.txtไปที่แท็บด้วยตัวเอง อย่างไรก็ตามเมื่อฉันทำa.txtถูกลบออกจากหน้าแท็บเดิม (ดังนั้นนี่จะเป็นหลัง<c-w>Tgt)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการความสามารถในการเลือกในเวลาที่ฉันจะกด<c-w>Tเพื่อรักษาเนื้อหาของบัฟเฟอร์เดิมสร้างหน้าแท็บใหม่ที่มีเฉพาะบัฟเฟอร์ที่มุ่งเน้นในขณะนี้แล้วมุ่งเน้นหน้าแท็บใหม่ที่ฉันเพิ่ง สร้าง กล่าวอีกนัยหนึ่งคำสั่งเหมือนกันเกือบทุกอย่าง<c-w>Tยกเว้นว่าหน้าแท็บดั้งเดิมนั้นได้รับการเก็บรักษาไว้และขณะนี้a.txtอยู่ในหน้าแท็บสองหน้า

มีวิธีทำเช่นนี้หรือไม่?

คำตอบ:


13

ฉันไม่แน่ใจ แต่คุณสามารถลอง:tab split(หรือรุ่นที่สั้นกว่า:tab sp)

:splitคำสั่งควรซ้ำวิวพอร์ตการแสดงa.txtในขณะที่การ:tabปรับปรุงควรย้ายวิวพอร์ตนี้ลงในหน้าแท็บทุ่มเท


หากคุณต้องการเปลี่ยนพฤติกรรมของC-w Tคุณสามารถทำการแมปใหม่ดังนี้:

nnoremap <C-w>T :tab split<CR>

:tabมากกว่าปกติทุกครั้งที่คุณได้พบกับคำสั่งที่แยกหน้าต่างและคุณจะค่อนข้างจะสร้างหน้าแท็บใหม่แทนคุณสามารถคำนำหน้ามันด้วย

ตัวอย่างเช่นสามารถใช้เพื่ออ่านบัฟเฟอร์วิธีใช้ในหน้าแท็บใหม่:

:tab help {your_topic}

โดยค่าเริ่มต้นหน้าแท็บใหม่จะปรากฏขึ้นหลังจากหน้าปัจจุบัน แต่ถ้าคุณต้องการให้มันปรากฏขึ้นที่อื่นคุณสามารถนำหน้า:tabด้วยการนับ

ตัวอย่างเช่นหากต้องการทำสำเนาวิวพอร์ตปัจจุบันในหน้าแท็บหลังอันที่ 3 คุณสามารถพิมพ์:

:3tab split

และเพื่อให้ปรากฏเป็นรายการแรก:

:0tab split

สำหรับข้อมูลเพิ่มเติมคุณสามารถอ่าน:h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

ฉันได้หลีกเลี่ยงแท็บส่วนใหญ่เนื่องจากปัญหานี้ แต่ตอนนี้ฉันมีฟังก์ชั่นที่มีพฤติกรรมการทำซ้ำแท็บที่ฉันต้องการ ฉันได้ทำการทดสอบแล้ว แต่ยังไม่ได้เริ่มใช้มันอย่างจริงจัง อาจมีข้อเสียเปรียบที่ซ่อนอยู่ในลำดับงาน

ปัญหาอย่างหนึ่งของฟังก์ชั่นคือมันไม่ได้ทำซ้ำบางสถานะจากคู่บัฟเฟอร์หน้าต่างก่อนหน้า (เช่นว่าset numberเปิดหรือไม่) การเก็งกำไรเล็กน้อยc-w Tอาจไม่มีปัญหานี้เพราะไม่มีการทำซ้ำและหน้าต่างอาจถูกซ่อมแซมใหม่

Vim มีรายการที่ใช้ 1 รายการสำหรับสิ่งต่างๆเช่นบัฟเฟอร์แท็บและหน้าต่าง เท่าที่ฉันสามารถบอกได้พวกมันเป็นแบบ 1 เพราะ0กุญแจถูกใช้เพื่อย้ายไปยังจุดเริ่มต้นของบรรทัดและเนื่องจากการส่งผ่านศูนย์เนื่องจากอาร์กิวเมนต์ตัวเลขนั้นเป็นไปไม่ได้

เราใส่ใจเกี่ยวกับสามรายการสำหรับเลียนแบบฟังก์ชันการทำงานนี้:

  • รายการส่วนกลางของหน้าแท็บ
  • รายการหน้าต่าง [ต่อหน้าแท็บ]
  • รายการส่วนกลางของบัฟเฟอร์

เราบันทึกค่าทั้งหมดนี้แล้วสร้างแท็บใหม่ผ่าน "tabnew" แท็บใหม่จะถูกสร้างขึ้นทางด้านขวาเสมอดังนั้นดัชนีใด ๆ ที่อยู่ด้านล่างแท็บที่เราtabnewไม่สามารถใช้งานได้ (วิธีที่แข็งแกร่งกว่าในการทำเช่นนี้อาจจะดีกว่า)

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

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

(จุดโวหารไม่กี่: การแปลงตัวเลขชัดเจน0+ตัวแปรทั่วโลกและการยืนยันมีความตั้งใจทั้งหมด)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.