Come posso scorrere i riquadri all'interno di una finestra in tmux come nello schermo?


41

Pensavo che spostare il riquadro di tmux alla finestra fosse la stessa domanda, ma non sembra esserlo.

Venendo dall'uso regolare dello schermo GNU, sto cercando tmux per fare le stesse cose. Una delle cose che faccio regolarmente è aprire un paio di finestre diverse, una con un po 'di codice aperto in vim, e un paio di finestre di terminali aperte per testare il codice, e talvolta una o due finestre per varie altre cose. Ho diviso lo schermo verticalmente e spesso avrò la finestra vim nel riquadro superiore e quindi una delle altre finestre nella bane inferiore.

I comandi principali che utilizzo quindi sono Ctrla, Tabper ruotare tra i riquadri e Ctrla, nper ruotare tra le finestre all'interno di un riquadro. Ad esempio, con vim nel riquadro in alto, passo al riquadro in basso e quindi giro attraverso gli altri terminali, facendo tutto ciò di cui ho bisogno. Lo schermo rimane diviso tutto il tempo.

Il problema è che non riesco a trovare capacità simili a quelle dello schermo Ctrla, nin tmux. Il cambio di finestra sembra non funzionare all'interno di un riquadro, ma salta del tutto. Se lo schermo è diviso, le uniche due opzioni sembrano essere quella di passare a una finestra che non è divisa e quindi dividerla o fare una suddivisione secondaria di un riquadro. Né sono quello che stavo cercando.

Suggerimenti (oltre a rimanere con lo schermo)?


La tua terminologia è un po 'confusa. In tmuxuna finestra può essere suddiviso in più riquadri. Stai cercando di scorrere tra i riquadri di una finestra con un tasto?
Jasonwryan,

Stavo cercando di seguire la nomenclatura degli strumenti, ma ammetto che è confusa. So come cambiare lo stato attivo da un riquadro all'altro. Quello che sto cercando di scoprire è come scorrere ciò che viene visualizzato in un determinato riquadro senza modificare in altro modo il layout.
FooBar,

Quindi per spostare il contenuto da un riquadro all'altro? Stai cercando swap-pane? Se stai cercando di emulare lo schermo Ctrl-a n, allora l'equivalente tmux è Ctrl-b n.
Jasonwryan,

Risposte:


28

tmux e screen hanno modelli diversi, quindi non esiste un equivalente esatto.

In termini di schermo , una divisione ti consente di visualizzare più finestre contemporaneamente. next( C-a n) ruota le finestre attraverso la parte attiva della divisione; questo ti permette di ruotare finestre "nascoste" attraverso la regione attiva della divisione.

In breve , una divisione divide una finestra in uno o più riquadri. Ogni parte di una finestra divisa è un singolo riquadro, i riquadri non vengono mai nascosti (se viene selezionata una finestra (visibile) anche tutti i suoi riquadri) e un riquadro può essere utilizzato solo in una singola divisione di una finestra (un riquadro può non essere in più finestre e non può essere suddiviso in più finestre della stessa finestra). Ci sono comandi al riquadri muoversi in (o tra) finestre, ma non in maniera identica a nextin schermo .


È possibile utilizzare un'associazione come la seguente per disporre un effetto simile:

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

Probabilmente vorrai metterlo nel tuo ~/.tmux.conffile, ma puoi semplicemente digitarlo / incollarlo dopo Prefix :per associarlo all'istanza del server corrente.

Per utilizzare l'associazione, selezionare la "finestra principale", dividerla, creare una finestra "riquadro contenitore" immediatamente dopo la "finestra principale", quindi utilizzare l'associazione per ruotare qualsiasi riquadro nella "finestra principale" tra il gruppo nella " riquadro riquadro ".

Ecco come è possibile creare l'installazione:

  • Scegli una finestra da utilizzare come "finestra principale". Inizia (es.) Vim in esso.

  • Dividi la tua "finestra principale" in due riquadri.

    Ad esempio Prefix "( :split-window)

    È possibile utilizzare questo riquadro come finestra di test (o visualizzatore di registri o altro).

  • Crea una nuova finestra (il "contenitore riquadro") immediatamente dopo la finestra principale.

    Ad esempio Prefix c( :new-window)

    È importante che nessun'altra finestra si frapponga tra gli indici della "finestra principale" e la finestra "riquadro contenitore" ( +negli identificatori di finestra utilizzati nei comandi associati si intende "la finestra con il numero più alto successivo").

  • Dividi questa finestra in più riquadri. Per ruotare attraverso tre riquadri, dividere questa finestra in due riquadri (il terzo riquadro è quello nella "finestra principale").

    Forse hai bisogno di una shell per git e di una shell per eseguire un'interfaccia di database. Metti ciascuno in un riquadro separato in questa finestra "contenitore riquadro".

  • Torna alla tua "finestra principale". Selezionare il riquadro che si desidera "ruotare fuori".

    È possibile utilizzare Prefix Up/ Down/ Left/ Rightper spostarsi tra i riquadri.

  • Richiamare l'associazione per scambiare il riquadro corrente con il primo riquadro nella finestra "riquadro contenitore" e ("dietro le quinte") ruotare i riquadri all'interno della finestra "contenitore riquadro" (in modo che alla successiva esecuzione dell'associazione, il primo comando scambia con il riquadro "successivo" nella sequenza).

    Prefix Control- n(l'associazione usa Cn, ma potresti cambiarla come preferisci).

  • Per scorrere indietro tra i riquadri, è possibile utilizzare quanto segue:

bind-key Cp swap-pane -s: +. bottom \; rotate-window -Dt: +

Grazie! Una grande spiegazione e l'associazione suggerita sembrano almeno replicare la funzionalità che stavo cercando.
FooBar

Mi scusi, come è possibile
ingrandire

1
@JamesAndino: tmux 1.8 ha resize-pane -Z(per impostazione predefinita, associato a Prefisso + z) che "ingrandisce" temporaneamente un riquadro in modo che sia a dimensione intera della finestra. Per la versione precedente alla 1.8 non c'era un modo integrato per farlo; altri hanno creato soluzioni basate su script da altri comandi integrati (ad esempio alcune delle risposte alla domanda SU "Massimizzare" un riquadro in tmux ).
Chris Johnsen,

ty, compilato e caricato
MageProspero il

3
Credo C-b ocicli di riquadri.
Sam Selikoff,

39

Credo che quello che stai cercando è Ctrlb+ ( , , , ). Questi ti permetteranno di spostarti tra i riquadri.


2
Mi dispiace, ma non ero molto chiaro. Ho capito come passare da un pannello all'altro. In tmux Ctrl b + o funziona più o meno come Ctrl a + Tab nella schermata. Quello che sto cercando è la funzionalità equivalente come Ctrl a + n dello schermo.
FooBar,

@FooBar che ne dici di Ctrl-b+{o Ctrl-b+}? Questo è il più vicino possibile a quella funzionalità. I riquadri non vengono eseguiti allo stesso modo in tmux in quanto vengono gestiti sullo schermo.
sparticvs

Spesso ho problemi a focalizzare il riquadro evidenziato, ad esempio ho due riquadri, premo spesso ^b↑. Come posso effettivamente focalizzare il riquadro evidenziato in modo tale che un altro verrà catturato dalla shell, non da tmux?
ThorSummoner,

6

utilizzare bind -r, quindi è possibile premere prefixuna volta, quindi altri tasti in una sequenza per individuare il riquadro. Il timeout potrebbe essere regolato da repeat-time. Dai un'occhiataman tmux

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

Se preferisci 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

Ecco una piccola conf che ti permette di spostarti su altri riquadri o finestre usando le scorciatoie ALT o MAIUSC + freccia. Non è necessario utilizzare il prefisso chiave è comodo.

## 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

Se sei più pigro di me, potresti essere interessato anche dal seguente codice che consente la navigazione dei riquadri con il mouse. (utilizzo: prefisso chiave + m per accendere, M per spegnerlo)

## 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'

questa configurazione dovrebbe funzionare in modo sicuro per tmux da 1.6 a 1.9.


2

Questa risposta fornisce due riquadri, in cui entrambi i riquadri contengono lo stesso set di finestre, ma ogni riquadro può passare da una finestra all'altra indipendentemente.

L'approccio tmux consiste nell'utilizzare tre sessioni:

  • una sessione esterna per i riquadri ,
  • una sessione interna per windows (puoi collegarti a questo da un riquadro),
  • una vista secondaria sulla sessione interna (per l'altro riquadro).

Sì, questa è la filosofia di UNIX impazzita. Iniziamo:

# 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

Ora puoi passare al riquadro superiore e aprire Vim come al solito. Per scorrere le finestre nella sessione interna (riquadro inferiore) dovrai usare Ctrl-b Ctrl-b ne p.

A parte: è un po 'ingombrante ma puoi sempre cambiare il prefisso della sessione esterna, ad esempio Ctrl-a, in questo modo:

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

Quindi sarebbe solo Ctrl-b ne pfar scorrere le finestre interne e Ctrl-a ofar scorrere i pannelli esterni.

OK ora, invece di aprire Vim nel riquadro superiore, connettiamoci di nuovo alla sessione interna. Esci da vim e questa volta usa un new-sessioncomando (in particolare con -tnot -s):

$ tmux new-session -t inner

Ecco! Ora puoi scorrere le finestre sui pannelli superiore e inferiore.

La ragione per cui dobbiamo usare new-session -tla seconda volta è che se dovessimo semplicemente fare di attach -tnuovo, i pannelli superiore e inferiore sarebbero sincronizzati, mostrando sempre la stessa finestra, che non è quello che vuoi. Per consentire a questo riquadro di spostarsi tra le finestre indipendentemente dall'altro riquadro, creiamo una nuova sessione di "visualizzazione" ma colleghiamo il suo back-end direttamente alla sessione esistente che contiene le finestre. Questo è anche noto come " sessioni raggruppate ". (A proposito, quel link suggerisce anche l'uso [un]link-windowper spostare le finestre tra le sessioni.)

Naturalmente per la simmetria, avresti potuto correre anche tmux new-session -t innernel riquadro inferiore, anziché attach. In tal caso si eseguiranno 4 istanze di tmux (più un altro processo tmux per il server)!


0

Inserisci il seguente codice nel tuo .tmux.conf:

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

Ricarica la configurazione, quindi puoi premere (direttamente senza tasto prefisso) Shift+ per scorrere i riquadri in senso orario e Shift+ per scorrere in senso inverso.

Testato in Tmux 2.8.


Nel caso in cui non si desideri modificare la configurazione, prefix+ oè l'associazione chiave predefinita per il ciclo in senso orario. Occasionalmente ho trovato questa chiave vincolante, quindi ottengo il comando tmux list-keyse lo utilizzo per i miei collegamenti chiave:

bind-key    -T prefix       o                 select-pane -t :.+
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.