ฉันจะวนรอบบานหน้าต่างภายในหน้าต่างใน tmux เหมือนในหน้าจอได้อย่างไร


41

ฉันคิดว่าการย้ายบานหน้าต่าง tmux ไปที่หน้าต่างเป็นคำถามเดียวกัน แต่ดูเหมือนจะไม่เป็นเช่นนั้น

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

คำสั่งหลักจากนั้นผมก็ใช้งานCtrla, Tabการหมุนในหมู่บานหน้าต่างและCtrla, nการหมุนระหว่างหน้าต่างภายในบานหน้าต่าง ตัวอย่างเช่นด้วยเสียงเรียกเข้าในบานหน้าต่างด้านบนฉันสลับไปที่บานหน้าต่างด้านล่างแล้วหมุนผ่านเทอร์มินัลอื่นทำสิ่งที่ฉันต้องการ หน้าจอยังคงแบ่งตลอดเวลา

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

ข้อเสนอแนะ (นอกเหนือจากเพียงแค่ติดกับหน้าจอ)?


คำศัพท์ของคุณสับสนเล็กน้อย ในtmuxหน้าต่างสามารถแบ่งออกเป็นหลายบานหน้าต่าง คุณกำลังพยายามวนสลับระหว่างบานหน้าต่างในหน้าต่างด้วยปุ่มลัดหรือไม่?
jasonwryan

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

ถ้าต้องการย้ายเนื้อหาจากบานหน้าต่างหนึ่งไปอีกบานหนึ่ง คุณกำลังมองหาswap-paneอะไร? หากคุณกำลังมองไปที่หน้าจอเลียนแบบของCtrl-a nแล้วเทียบเท่า tmux Ctrl-b nคือ
jasonwryan

คำตอบ:


28

tmuxและหน้าจอมีรุ่นที่แตกต่างกันดังนั้นจึงไม่มีสิ่งที่เทียบเท่า

ในแง่ของหน้าจอการแบ่งช่วยให้คุณแสดงหลายหน้าต่างในเวลาเดียวกัน next( C-a n) หมุนหน้าต่างผ่านส่วนที่ใช้งานของการแยก; สิ่งนี้จะช่วยให้คุณหมุนหน้าต่าง "ซ่อน" ผ่านพื้นที่ใช้งานของการแยก

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


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

bind-key C-n swap-pane -s :+.top \; rotate-window -Ut :+

คุณอาจต้องการวางสิ่งนี้ลงใน~/.tmux.confไฟล์ของคุณแต่คุณสามารถพิมพ์ / วางมันPrefix :ลงไปแล้วเพื่อผูกมันไว้ในอินสแตนซ์ของเซิร์ฟเวอร์ปัจจุบันของคุณ

หากต้องการใช้การเชื่อมโยงให้เลือก "หน้าต่างหลัก" ของคุณแยกสร้างหน้าต่าง "คอนเทนเนอร์บานหน้าต่าง" ทันทีหลังจาก "หน้าต่างหลัก" จากนั้นใช้การเชื่อมเพื่อหมุนบานหน้าต่างใด ๆ ใน "หน้าต่างหลัก" ในกลุ่มใน " คอนเทนเนอร์บานหน้าต่าง” หน้าต่าง

นี่คือวิธีที่คุณอาจสร้างการตั้งค่า:

  • เลือกหน้าต่างเพื่อใช้เป็น "หน้าต่างหลัก" ของคุณ เริ่มต้น (เช่น) เป็นกลุ่มที่อยู่ในนั้น

  • แยก "หน้าต่างหลัก" ของคุณออกเป็นสองบานหน้าต่าง

    เช่นPrefix "( :split-window)

    คุณสามารถใช้บานหน้าต่างนี้เป็นหน้าต่างทดสอบของคุณ (หรือตัวแสดงบันทึกหรืออะไรก็ได้)

  • สร้างหน้าต่างใหม่ (“ บานหน้าต่างคอนเทนเนอร์”) ทันทีหลังจากหน้าต่างหลักของคุณ

    เช่นPrefix c( :new-window)

    มันเป็นสิ่งสำคัญที่ไม่มีหน้าต่างอื่นที่ได้รับระหว่างดัชนีของ "หน้าต่างหลัก" และหน้าต่าง "คอนเทนเนอร์บานหน้าต่าง" ( +ในหน้าต่างตัวระบุที่ใช้ในคำสั่งที่ถูกผูกไว้หมายถึง "หน้าต่างที่มีหมายเลขถัดไปที่สูงกว่า")

  • แยกหน้าต่างนี้เป็นบานหน้าต่างจำนวนมาก หากต้องการหมุนสามบานให้แยกหน้าต่างนี้ออกเป็นสองบาน (บานหน้าต่างที่สามคือบานหน้าต่างใน "หน้าต่างหลัก")

    บางทีคุณอาจต้องการเชลล์สำหรับคอมไพล์และเชลล์สำหรับรันอินเตอร์เฟสฐานข้อมูล วางแต่ละรายการในบานหน้าต่างแยกต่างหากในหน้าต่าง "คอนเทนเนอร์บานหน้าต่าง"

  • สลับกลับไปที่ "หน้าต่างหลัก" ของคุณ เลือกบานหน้าต่างที่คุณต้องการ“ หมุนออก”

    คุณสามารถใช้Prefix Up/ Down/ Left/ Rightเพื่อเลื่อนไปมาระหว่างบานหน้าต่าง

  • เรียกใช้การเชื่อมโยงเพื่อสลับบานหน้าต่างปัจจุบันกับบานหน้าต่างแรกในหน้าต่าง“ บานหน้าต่างคอนเทนเนอร์” และ (“ เบื้องหลัง”) หมุนบานหน้าต่างภายในหน้าต่าง“ บานหน้าต่างคอนเทนเนอร์” (เพื่อให้ครั้งต่อไปที่คุณเรียกใช้การรวมคำสั่งแรก สลับกับบานหน้าต่าง "ถัดไป" ในลำดับ)

    Prefix Control- n(การเชื่อมโยงใช้ Cn แต่คุณสามารถเปลี่ยนสิ่งนี้เป็นสิ่งที่คุณต้องการ)

  • หากต้องการเลื่อนย้อนกลับผ่านบานหน้าต่างคุณสามารถใช้ด้านล่าง:

การเชื่อมโยงคีย์ Cp swap-pane -s: +. bottom \; หมุนหน้าต่าง -Dt: +

ขอขอบคุณ! คำอธิบายที่ยอดเยี่ยมและการเชื่อมโยงที่คุณแนะนำดูเหมือนจะทำซ้ำฟังก์ชันการทำงานที่ฉันค้นหาอย่างน้อย
FooBar

ขอโทษนะ, ขนาดเต็มหนึ่งแผ่นอาจจะเป็นอย่างไรแล้วสลับกลับไปที่ข้อตกลงก่อนหน้า
MageProspero

1
@JamesAndino: tmux 1.8 มีresize-pane -Z(โดยค่าเริ่มต้นถูกผูกไว้กับคำนำหน้า + z) ที่ "ซูม" บานหน้าต่างชั่วคราวให้เป็นขนาดเต็มของหน้าต่าง สำหรับเวอร์ชั่นก่อนหน้า 1.8 ไม่มีวิธีการติดตั้งในตัว อื่น ๆ มีวิธีการแก้ปัญหาสคริปต์ที่สร้างขึ้นจากคำสั่งในตัวอื่น ๆ (เช่นบางคำตอบของคำถาม SU “ การเพิ่มประสิทธิภาพ” บานหน้าต่างใน tmux )
Chris Johnsen

ty, รวบรวมและโหลด
MageProspero

3
ฉันเชื่อว่าC-b oบานหน้าต่างรอบ
Sam Selikoff

39

ผมเชื่อว่าสิ่งที่คุณกำลังมองหาCtrlb+ ( , , , ) สิ่งเหล่านี้จะช่วยให้คุณย้ายระหว่างบานหน้าต่าง


2
ฉันขอโทษ แต่ฉันไม่ชัดเจน ฉันหาวิธีย้ายจากพาเนลไปที่พาเนล ใน tmux Ctrl b + o ฟังก์ชั่นเกี่ยวกับเช่นเดียวกับ Ctrl a + Tab ในหน้าจอ สิ่งที่ฉันกำลังมองหาคือฟังก์ชั่นที่เทียบเท่ากับ Ctrl ของหน้าจอ + n
FooBar

@FooBar วิธีการเกี่ยวกับCtrl-b+{หรือCtrl-b+}? นั่นเป็นเรื่องที่ใกล้ที่สุดเท่าที่ฉันจะสามารถหาฟังก์ชั่นนั้นได้ บานหน้าต่างไม่ได้ทำเช่นเดียวกันใน tmux เนื่องจากจัดการในหน้าจอ
sparticvs

^b↑ฉันมักจะมีปัญหาในการมุ่งเน้นไปที่บานหน้าต่างไฮไลท์ไว้ว่าฉันมีสองบานหน้าต่างผมมักจะกด ฉันจะเน้นบานหน้าต่างที่ไฮไลต์อย่างนั้นได้อย่างไรโดยที่เชลล์อื่นจะถูกดักจับโดยเชลล์ไม่ใช่ tmux
ThorSummoner

6

ใช้bind -rเพื่อให้คุณสามารถกดปุ่มprefixครั้งเดียวแล้วปุ่มอื่น ๆ ในลำดับเพื่อค้นหาบานหน้าต่างของคุณ repeat-timeหมดเวลาสามารถตั้งค่าโดย ตรวจสอบman tmux

bind -r Tab select-pane -t :.+

หากคุณต้องการhjkl,

bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R

2

นี่คือความเชื่อเล็ก ๆ ที่ช่วยให้คุณย้ายไปที่บานหน้าต่าง anohter หรือหน้าต่างโดยใช้ทางลัด ALT หรือลูกศร SHIFT + ไม่จำเป็นต้องใช้คำนำหน้าคีย์สะดวกสบาย

## NAVIGATION: ############################

# Switch panes 
# Usage: "ALT+arrow keys" (without prefix key)
# from https://gist.github.com/spicycode
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Switch windows 
# usage: "SHIFT+arrow" (without prefix key)
bind -n S-Left  previous-window
bind -n S-Right next-window

หากคุณขี้เกียจมากกว่าฉันคุณอาจจะสนใจรหัสต่อไปนี้ที่อนุญาตการนำทางบานหน้าต่างด้วยเมาส์ (การใช้งาน: คีย์นำหน้า + m เพื่อเปิด, M เพื่อปิด)

## MOUSE CONTROL: #########################
set -g mode-mouse off
set -g mouse-resize-pane off
set -g mouse-select-pane off
set -g mouse-select-window off

# Toggle mouse on 
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'

# Toggle mouse off
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

config นี้ควรใช้งานได้อย่างแน่นอนสำหรับ tmux 1.6 ถึง 1.9


2

คำตอบนี้ให้สองบานหน้าต่างโดยที่บานหน้าต่างทั้งสองเก็บชุดหน้าต่างเดียวกันไว้ แต่บานหน้าต่างแต่ละบานสามารถสลับระหว่างหน้าต่างได้อย่างอิสระ

วิธี tmux คือใช้สามเซสชัน:

  • เซสชั่นด้านนอกสำหรับบานหน้าต่าง ,
  • เซสชันภายในสำหรับหน้าต่าง (คุณสามารถแนบกับสิ่งนี้ได้จากบานหน้าต่างเดียว)
  • มุมมองรองสู่เซสชันภายใน (สำหรับบานหน้าต่างอื่น)

ใช่นี่คือปรัชญา UNIX ที่บ้าไปแล้ว มาเริ่มกันเลย:

# Create a session to hold the multiple windows
$ tmux new-session -s inner

    <Ctrl-b> c   to create a few windows, run some things

    <Ctrl-b> d   to detach, but leave it running

# Create a session to hold multiple panes (the view)
$ tmux new-session -s outer

    <Ctrl-b> "   to split

# Open the inner session in the current (bottom) pane
$ unset TMUX ; tmux attach -t inner

ตอนนี้คุณสามารถสลับไปที่บานหน้าต่างด้านบนแล้วเปิด Vim ได้ตามปกติ เพื่อวงจรผ่านหน้าต่างในเซสชั่นภายใน (บานหน้าต่างด้านล่าง) ที่คุณจะต้องใช้และCtrl-b Ctrl-b np

นอกเหนือ: นั่นเป็นเรื่องเล็กน้อย แต่คุณสามารถเปลี่ยนคำนำหน้าของเซสชันภายนอกได้เสมอเช่นเป็นCtrl-aเช่นนี้

<Ctrl-b> :set-option prefix C-a

จากนั้นมันจะเป็นCtrl-b nและpวนรอบหน้าต่างด้านในและCtrl-a oเพื่อหมุนบานหน้าต่างด้านนอก

ตกลงตอนนี้แทนที่จะเปิดเป็นกลุ่มในบานหน้าต่างด้านบนให้เชื่อมต่ออีกครั้งกับเซสชันภายในของคุณ ออกเป็นกลุ่มและเวลานี้ใช้new-sessionคำสั่ง (โดยเฉพาะอย่างยิ่งกับ-tไม่-s):

$ tmux new-session -t inner

Voila! ตอนนี้คุณสามารถวนรอบหน้าต่างในบานหน้าต่างด้านบนและด้านล่าง

เหตุผลที่เราต้องใช้new-session -tครั้งที่สองก็คือถ้าเราต้องทำattach -tอีกครั้งจากนั้นบานหน้าต่างด้านบนและด้านล่างจะถูกซิงโครไนซ์แสดงหน้าต่างเดียวกันเสมอซึ่งไม่ใช่สิ่งที่คุณต้องการ เพื่อให้บานหน้าต่างนี้เลื่อนผ่าน windows โดยอิสระจากบานหน้าต่างอื่นเราสร้างเซสชัน "มุมมอง" ใหม่ แต่เชื่อมต่อส่วนหลังของหน้าต่างโดยตรงกับเซสชันที่มีอยู่ที่เก็บหน้าต่างไว้ ซึ่งเรียกอีกอย่างว่า " เซสชันที่จัดกลุ่ม " (โดยวิธีการลิงค์นั้นยังแนะนำให้ใช้[un]link-windowเพื่อย้ายหน้าต่างระหว่างเซสชัน)

แน่นอนว่าสำหรับความสมมาตรคุณสามารถทำงานtmux new-session -t innerในบานหน้าต่างด้านล่างแทนattachได้ ในกรณีนั้นคุณจะใช้งานอินสแตนซ์ของ tmux 4 อินสแตนซ์ (บวกอีกหนึ่งกระบวนการ tmux สำหรับเซิร์ฟเวอร์)!


0

ใส่รหัสต่อไปนี้ในของคุณ.tmux.conf:

# cycle prev/next pane
bind -n S-right select-pane -t :.+
bind -n S-left select-pane -t :.-

โหลดการกำหนดค่าใหม่จากนั้นคุณสามารถกด (โดยไม่ต้องใช้คีย์นำหน้า) Shift+ เพื่อหมุนบานหน้าต่างในทิศทางตามเข็มนาฬิกาและShift+ เพื่อหมุนในทิศทางที่ตรงกันข้าม

ทดสอบใน Tmux 2.8


ในกรณีที่คุณไม่ต้องการแก้ไขการกำหนดค่าprefix+ oคือการเชื่อมโยงคีย์เริ่มต้นสำหรับวงจรตามเข็มนาฬิกา บางครั้งฉันพบการเชื่อมโยงคีย์นี้จากนั้นฉันได้รับคำสั่งtmux list-keysและใช้สำหรับการเชื่อมโยงคีย์ของฉันเอง:

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