ฉันได้หลีกเลี่ยงแท็บส่วนใหญ่เนื่องจากปัญหานี้ แต่ตอนนี้ฉันมีฟังก์ชั่นที่มีพฤติกรรมการทำซ้ำแท็บที่ฉันต้องการ ฉันได้ทำการทดสอบแล้ว แต่ยังไม่ได้เริ่มใช้มันอย่างจริงจัง อาจมีข้อเสียเปรียบที่ซ่อนอยู่ในลำดับงาน
ปัญหาอย่างหนึ่งของฟังก์ชั่นคือมันไม่ได้ทำซ้ำบางสถานะจากคู่บัฟเฟอร์หน้าต่างก่อนหน้า (เช่นว่า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