Uma maneira geralmente preferida seria usar tmux
, screen
ou algo semelhante. Se isto não é uma opção - você quer múltiplas janelas de terminal, etc., você poderia fazer isso de uma maneira mais complexa.
Isso parece feio e pode ser resolvido melhor, mas como ponto de partida. Isso é baseado no bash usando wmctrl
para posicionar as janelas do terminal.
1.
Posicionar janelas do terminal.
Eu uso um rápido mash-up (script feio) para redimensionar e posicionar janelas de terminal usando wmctrl
. Eu tenho isso em uma função chamada c
, que leva um ou opcionalmente dois argumentos. Isso pode ser hackeado para atender às suas necessidades.
c()
{
local -i tbar_height=23 # To take title bar into account.
local win r="-ir"
local -i w h w2 h2 y2
# Argument 2 is Window ID, x or none.
if [[ "$2" =~ ^0x[0-9a-f]+$ ]]; then
win="$2"
elif [[ "$2" == "x" ]]; then
win="$(xprop -root \
-f _NET_ACTIVE_WINDOW \
0x "\t\#!/bin/bash
# Source positioning script.
. "$HOME/scripts/bash/_mypos_wmctrl"
# Position window according to argument 1.
c "$1"
# Act according to argument 2.
case "$2" in
"host1") ssh -t user@host1 "cd www; bash";;
"host2") ssh -t user@host2 "cd mail; bash";;
"host3") ssh -t user@host3 "cd dev; bash";;
"host4") ssh -t user@host4;;
esac
# Add this if one want to keep terminal window open after exit from ssh
/bin/bash
" _NET_ACTIVE_WINDOW | \
cut -f2)"
else
win=":ACTIVE:"
r="-r"
fi
# Get monitor size (fear this easily can bug – should be done better).
read -d ', ' w h <<< \
$( awk 'NR == 1 { print $8, $10; exit }' <(xrandr) )
((w2 = w / 2)) # Monitor width / 2
((h2 = h / 2 - tbar_height)) # Monitor height / 2 - title bar
((y2 = h / 2)) # Monitor height / 2 - title bar
case "$1" in # g, x, y, w, h
"nw") wmctrl $r "$win" -e "0, 0, 0, $w2, $h2";;
"ne") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h2";;
"se") wmctrl $r "$win" -e "0, $w2, $y2, $w2, $h2";;
"sw") wmctrl $r "$win" -e "0, 0, $y2, $w2, $h2";;
"n") wmctrl $r "$win" -e "0, 0, 0, $w, $h2";;
"e") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h";;
"s") wmctrl $r "$win" -e "0, 0, $y2, $w, $h2";;
"w") wmctrl $r "$win" -e "0, 0, 0, $w2, $h";;
"mh") wmctrl $r "$win" -e "0, -1, -1, -1, $h";;
"mw") wmctrl $r "$win" -e "0, -1, -1, $w, -1";;
esac
}
Para posicionar a janela noroeste, diga c nw
, norte-leste c ne
etc. Argumentos mh
e mw
são altura máxima e largura máxima, respectivamente. O ID da janela pode ser passado como argumento dois ou "x"
para o script ler a partir de xprop
- else use :ACTIVE:
.
2.
Script para inicializar bash session em novas janelas de terminal, solicitar posicionamento e iniciar ssh (ou qualquer outro).
Aqui pode-se sintonizar para receber o host como argumento, etc.
#!/bin/bash
terminal=some-terminal-emulator
$terminal -e '/path/to/script2 "nw" "host1"'
sleep 1
$terminal -e '/path/to/script2 "ne" "host2"'
sleep 1
$terminal -e '/path/to/script2 "se" "host3"'
sleep 1
$terminal -e '/path/to/script2 "sw" "host4"'
sleep 1
3.
script do iniciador.
O repouso é necessário para que wmctrl
obtenha o ID da janela e aja de acordo com ele. Você pode querer olhar para xtoolwait
ou similar.
c()
{
local -i tbar_height=23 # To take title bar into account.
local win r="-ir"
local -i w h w2 h2 y2
# Argument 2 is Window ID, x or none.
if [[ "$2" =~ ^0x[0-9a-f]+$ ]]; then
win="$2"
elif [[ "$2" == "x" ]]; then
win="$(xprop -root \
-f _NET_ACTIVE_WINDOW \
0x "\t\#!/bin/bash
# Source positioning script.
. "$HOME/scripts/bash/_mypos_wmctrl"
# Position window according to argument 1.
c "$1"
# Act according to argument 2.
case "$2" in
"host1") ssh -t user@host1 "cd www; bash";;
"host2") ssh -t user@host2 "cd mail; bash";;
"host3") ssh -t user@host3 "cd dev; bash";;
"host4") ssh -t user@host4;;
esac
# Add this if one want to keep terminal window open after exit from ssh
/bin/bash
" _NET_ACTIVE_WINDOW | \
cut -f2)"
else
win=":ACTIVE:"
r="-r"
fi
# Get monitor size (fear this easily can bug – should be done better).
read -d ', ' w h <<< \
$( awk 'NR == 1 { print $8, $10; exit }' <(xrandr) )
((w2 = w / 2)) # Monitor width / 2
((h2 = h / 2 - tbar_height)) # Monitor height / 2 - title bar
((y2 = h / 2)) # Monitor height / 2 - title bar
case "$1" in # g, x, y, w, h
"nw") wmctrl $r "$win" -e "0, 0, 0, $w2, $h2";;
"ne") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h2";;
"se") wmctrl $r "$win" -e "0, $w2, $y2, $w2, $h2";;
"sw") wmctrl $r "$win" -e "0, 0, $y2, $w2, $h2";;
"n") wmctrl $r "$win" -e "0, 0, 0, $w, $h2";;
"e") wmctrl $r "$win" -e "0, $w2, 0, $w2, $h";;
"s") wmctrl $r "$win" -e "0, 0, $y2, $w, $h2";;
"w") wmctrl $r "$win" -e "0, 0, 0, $w2, $h";;
"mh") wmctrl $r "$win" -e "0, -1, -1, -1, $h";;
"mw") wmctrl $r "$win" -e "0, -1, -1, $w, -1";;
esac
}
Teve um script uma vez, perdido e esquecido, que também salvou o ID da janela no arquivo tmp, que poderia ser chamado para mover todos os terminais para outra área de trabalho, aumentar o foco, embaralhar, etc.
Usando wmctrl
, ele deve ser utilizável com a maioria dos emuladores (e outros aplicativos, se necessário).
Como agora é ---^
, (as amostras de script são fornecidas), é bastante feio, mas talvez você possa usar algumas delas como base.