การส่งคำสั่งไปยังเซสชัน tmux พาเรนต์จากกลุ่ม


5

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

มีสคริปต์ที่มีอยู่ที่ทำเช่นนี้? ถ้าไม่จะเป็นวิธีที่ดีที่สุดสำหรับการสร้างสคริปต์นี้อะไร

คำตอบ:


11

คุณอาจใช้เป็นกลุ่มได้ :! คำสั่งให้เรียกใช้ tmux send-keys เพื่อส่ง Control-R ไปที่บานหน้าต่างอื่นของคุณ ตั้งแต่ send-keys สามารถส่งการกดแป้นไปที่บานหน้าต่างใด ๆ (ไม่ใช่แค่ที่ใช้งานอยู่) คุณไม่จำเป็นต้องสลับบานหน้าต่างที่ใช้งานอยู่

นี่คือการทำแผนที่เป็นกลุ่ม (คุณสามารถใส่ไว้ในของคุณ .vimrc หรือเพียงวางลงใน : แจ้งให้ลอง):

:map <Leader>rl :w<Bar>execute 'silent !tmux send-keys -t bottom C-r'<Bar>redraw!<C-M>

แผนที่นี้ \rl ลำดับสำคัญ ( <Leader> ค่าเริ่มต้นเป็น \แต่สามารถกำหนดเองได้) ตามลำดับของคำสั่ง Vim (คั่นด้วย <Bar>; ดู :help map_bar ):

  1. เขียนบัฟเฟอร์ปัจจุบันไปยังไฟล์
  2. เรียกใช้ tmux คำสั่งเพื่อส่ง Control-R ไปที่ด้านล่าง บานหน้าต่าง
    เราใช้ execute ที่นี่เพื่อที่คำสั่ง Vim ถัดไป ( redraw ) ไม่ได้เป็นส่วนหนึ่งของ :! คำสั่งเชลล์
    เราใช้ silent คำสั่งคำนำหน้าเพื่อหลีกเลี่ยงการพรอมต์“ กด ENTER เพื่อดำเนินการต่อ”
    คุณสามารถละเว้น slient ถ้าคุณต้องการให้พรอมต์หรือต้องการดูผลลัพธ์ของ :! คำสั่ง (เช่น tmux คำสั่งไม่ทำงานและคุณต้องการดูว่ามันมีข้อความแสดงข้อผิดพลาด)
  3. วาดหน้าจออีกครั้ง
    โดยปกติจะเกิดขึ้นหลังจากพรอมต์“ กด ENTER” แต่เราจะระงับ silent.

ฉันไม่มี แมวป่าชนิดหนึ่ง อยู่ในมือ แต่ดูเหมือนว่า Control-R จะเป็นคีย์รีโหลดตามการค้นหาของฉันสำหรับ“ ลินซ์โหลด” “ โหลดไฟล์และรีเฟรชจอแสดงผล” ของคู่มือผู้ใช้)

นอกเหนือจาก bottomมีวิธีอื่นในการระบุบานหน้าต่างเป้าหมาย (ค้นหา "บานหน้าต่างเป้าหมาย" ใน tmux หน้าคน ):

  • .+1, .-1: ถัดไปบานหน้าต่างก่อนหน้าในหน้าต่างนี้
  • top, bottom, left, rightและการรวมกันของ top / bottom กับ left / right
    (นั่นคือ bottom-left )
  • %42 ( tmux 1.5+): % หมายเลขบานหน้าต่างที่ถูกแก้ไขจากตัวแปรสภาพแวดล้อม TMUX_PANE ของบานหน้าต่างเป้าหมาย

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

    # before running Lynx (anytime really, but "before" is usually scriptable)
    echo "$TMUX_PANE" > /tmp/my-lynx-pane
    
    # in the Vim :! command in the mapping:
    tmux send-keys -t "$(cat /tmp/my-lynx-pane)" C-r
    

@ chris-johnsen ขอบคุณ .. มันใช้งานได้ดี คุณจะสามารถอธิบายความแตกต่างระหว่าง Cntrl-r และ Cntrl-M ในคำสั่งด้านบนได้ไหม Cntrl-r แสดงถึง "Enter" ในเชลล์หรือไม่ในขณะที่ Cntrl-M นั้นคล้ายคลึงกับการกด "Enter" ใน exmode หรือไม่? พวกเขาทั้งสองเทียบเท่ากับการมี "E" "N" "T" "E" "R" ตัวอักษรแต่ละตัวสะกดออกมาใน exmode หรือ vimrc?
alpha_989

2

คุณควรเริ่มต้นด้วยปลั๊กอิน tslime.vim ซึ่งโต้ตอบกับเซสชั่น tmux ที่เลือกด้วยตนเองและส่งบัฟเฟอร์ไป คุณจะเขียนปลั๊กอินที่เกือบเหมือนกัน อย่างไรก็ตามแทนที่จะส่งบัฟเฟอร์คุณจะออกคำสั่ง (อ้างอิง man 1 tmux)

tslime.vim @ vimscripts

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