ย้ายหน้าต่างที่มีอยู่ไปยังแท็บที่มีอยู่


14

บางครั้งฉันต้องการย้ายหน้าต่างไปยังแท็บที่มีอยู่แล้วและฉันสงสัยว่ามีคำสั่ง / แป้นพิมพ์ลัดที่สามารถทำได้ ฉันรู้ว่าฉันสามารถปิดหน้าต่างสลับไปที่แท็บแล้วเปิดในการแยกใหม่ แต่ฉันสงสัยว่ามีวิธีที่สั้นกว่าในการบรรลุเป้าหมายนี้ โปรดทราบว่าฉันต้องการย้ายไปยังแท็บที่มีอยู่ไม่ใช่แท็บใหม่อย่างที่เป็น<C-w>Tอยู่


ไม่สามารถย้ายหน้าต่างข้ามแท็บได้
lcd047

อืมมันแย่มาก ฉันอาจจะสร้างแผนที่หรือคำสั่งบางอย่างซึ่งสามารถทำได้
EvergreenTree

ฉันคิดว่าวิธีที่ดีที่สุดที่คุณสามารถทำได้คือบันทึกการตั้งค่าหน้าต่างทั้งหมดแล้วสร้างใหม่บนแท็บที่มีอยู่
tommcdo

คำตอบ:


10

แม้ว่าจะมีคำสั่งให้ย้ายหน้าต่างที่มีอยู่ไปรอบ ๆ ในหน้าแท็บปัจจุบัน (เช่นส่งผลกระทบต่อเค้าโครงหน้าต่างโดยการหมุนปรับขนาดและย้าย) แต่ไม่มีคำสั่งให้ย้ายหน้าต่างไปยังแท็บอื่น

เนื่องจากหน้าต่างเป็นเพียงพอร์ตวิวพอร์ตในบัฟเฟอร์ที่โหลดคุณต้อง:

  1. จดบันทึกหมายเลขบัฟเฟอร์ที่แสดงในหน้าต่างปัจจุบัน
  2. :close! หน้าต่าง.
  3. เปลี่ยนเป็นหน้าแท็บเป้าหมายที่มีอยู่
  4. :sbuffer หมายเลขบัฟเฟอร์เพื่อเปิดอีกครั้ง

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


ฉันคิดว่านี่เป็นกรณี ฉันอาจสร้างสคริปต์เล็ก ๆ ซึ่งทำสิ่งนั้นได้อย่างแน่นอน
EvergreenTree

2
  1. ไปที่แท็บเป้าหมายที่มีอยู่
  2. แยกตามที่คุณต้องการ
  3. :b ab(แท็บกรอกข้อมูลส่วนที่เหลือ)

abเป็นเพียงตัวอักษรสุ่มแทนที่ด้วยจุดเริ่มต้นของชื่อไฟล์ที่คุณต้องการ :bแท็บเสร็จสมบูรณ์ได้ผลดีมากสำหรับฉันมันมักจะสามารถหาบัฟเฟอร์ที่เหมาะสมตามตัวอักษรเพียงหนึ่งตัวและ 1-2 Tabปุ่มกด

ประโยชน์ของวิธีการนี้กับ Ingo's คือการขาดการสังเกตหรือจดจำสิ่งต่าง ๆ ซึ่งหมายถึงภาระการรับรู้ที่น้อยลง ชื่อไฟล์ที่คุณรู้อยู่แล้ว


2

คำสั่งสองคำสั่งที่กำหนดไว้ด้านล่างจะย้ายบัฟเฟอร์ทั้งหมดจากแท็บขวาไปยังแท็บปัจจุบันแล้วปิดแท็บขวา Mtabspย้ายพวกมันโดยการแยกในแนวนอนและMtabvspแยกในแนวตั้ง คุณต้องย้ายแท็บที่ถูกผสานก่อนที่จะใช้คำสั่ง การใช้งาน+tabm, หรือ-tabm<n>tabm

ติดตั้ง

เพิ่ม vim script ด้านล่างของคุณvimrc:

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

รายละเอียดทางเทคนิค

ฟังก์ชั่น mtab vertรับพารามิเตอร์หนึ่ง มันจะกำหนดว่าแท็บปัจจุบันถูกแยกในแนวนอนหรือแนวตั้ง

ผลลัพธ์ที่ต้องการสามารถทำได้ด้วยขั้นตอนต่อไปนี้:

  1. เราย้ายไปที่แท็บถัดไปชั่วคราว
  2. ใช้ตัวแปรสองตัวเพื่ออ้างอิงหมายเลขแท็บและบัฟเฟอร์
  3. กลับไปที่แท็บปัจจุบัน
  4. เราแบ่งแท็บและเปิดแต่ละบัฟเฟอร์
  5. สุดท้ายเราปิดแท็บขวา

หากแท็บปัจจุบันของเราเป็นที่สุดคำสั่งจะถูกละเว้น


1

หากเป็นไฟล์บัฟเฟอร์ (จะไม่ทำงานสำหรับบัฟเฟอร์ในขั้นต้นฯลฯ ) คุณสามารถ:

  1. :let @f=@%ENTER - ในหน้าต่างต้นฉบับ
    • นี้แทนที่เนื้อหาของการลงทะเบียนปกติที่มีเนื้อหาของการลงทะเบียนพิเศษ%ซึ่งมีชื่อไฟล์ปัจจุบัน
    • หมายเหตุ: ฉันเลือก register fเหมือนในไฟล์แต่คุณสามารถใช้ register อื่น ๆ ที่คุณต้องการ
    • คุณสามารถตรวจสอบว่าการลงทะเบียนมีเส้นทางที่ถูกต้องด้วย: :echo @f
  2. ทางเลือก: Ctrl-WCtrl-Q- เพื่อปิดหน้าต่างเก่า
  3. gt/ gT- นำทางไปยังแท็บเป้าหมาย (และหน้าต่าง);
  4. Ctrl-Ws - แยกแท็บตามที่คุณต้องการเพื่อเปิดหน้าต่างใหม่
  5. :e␣Ctrl-RfENTER
    • ในหน้าต่างที่เพิ่งเปิดใหม่โหลดไฟล์จากเส้นทางที่เก็บไว้ใน register f ;
    • หมายเหตุ: อักขระ here ที่นี่ทำเครื่องหมายช่องว่างปกติ

หมายเหตุสำคัญ:ขั้นตอนสุดท้ายจะทำงานไม่ถูกต้องหากเส้นทางมีช่องว่างหรืออักขระพิเศษ! :-( ในฐานะที่เป็นวิธีแก้ปัญหาคำสั่งต่อไปนี้อีกต่อไปเล็กน้อยควรทำงานสำหรับเส้นทางที่มีช่องว่าง (แม้ว่ามันอาจยังคงล้มเหลวสำหรับอักขระพิเศษอื่น ๆ ):

  • :e␣"Ctrl-Rf"ENTER

(นั่นคือการอ้างอิงผลลัพธ์ของCtrl-R, f )

แรงบันดาลใจจากคำตอบจากlkraavและ Ingo-karkat


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