Veja como eu faria:
- faça o seu shell definir o título para "bash" quando estiver no prompt, e o nome do comando quando ele executar um comando, ou qualquer coisa para que você possa diferenciá-los
- crie um script que chame
wmctrl
para listar janelas abertas e:- se
wmctrl
encontrar uma janela com um título "bash", aumente - mais, inicie um
xterm
- se
- use
xbindkeys
para chamar esse script quando você pressionar o atalho
fazendo seu shell definir o título da janela quando você executa um comando
Aqui está uma versão simplificada de como eu faço isso no bash. Eu não verifiquei o código duas vezes, mas ele funciona na minha máquina.
# set the title when we run a command
setcommandhook()
{
if $has_debug_trap
then
trap 'command=$BASH_COMMAND; eval settitle "\"${title}\""; trap - DEBUG' DEBUG
fi
}
# set the xterm title
settitle()
{
printf "3]0;$*#!/bin/bash
#
# bashprompt
#
# if there is an xterm open at a bash prompt, raise/focus that window
# if there isn't start a new xterm
#
# requires that your xterm window title has "bash" at the end
# when there is no command running and doesn't have "bash" at the end
# when a command is running
#
# see <http://unix.stackexchange.com/questions/6842> for more details
#
# Mikel Ward <[email protected]>
# change this to whatever is unique about your window title
# (i.e. a string that appears in the title when the shell is at a prompt
# but does not appear when running a command)
prompttitle="bash$"
terminalprog="xterm"
if ! type wmctrl >/dev/null 2>&1; then
echo "wmctrl can't be found, please install it" 1>&2
exit 1
fi
if ! output="$(wmctrl -l)"; then
echo "Error running wmctrl -l" 1>&2
exit 1
fi
while IFS=$'\n' read -r line; do
if [[ $line =~ $prompttitle ]]; then
id=${line%% *}
break
fi
done <<EOF
$output
EOF
if test -n "$id"; then
wmctrl -i -a "$id"
else
"$terminalprog"&
fi
7"
}
promptstring='$(hostname):$(pwd)$ '
title='$(hostname) "${command:-$0}"'
# prompt and window title
if test -n "${title}"
then
PROMPT_COMMAND='command=; eval settitle "\"${title}\""'
if $has_debug_trap
then
PROMPT_COMMAND="$PROMPT_COMMAND; setcommandhook"
fi
fi
if test -n "${promptstring}"
then
PS1='$(eval echo -n "\"${promptstring}\"")'
fi
Fazê-lo em zsh
é mais fácil, porque ele tem o gancho preexec
.
Você pode ver minhas configurações de shell para obter mais detalhes, por exemplo a função getcommand
que lida com comandos como fg
de uma maneira mais agradável.
aumentando o xterm que tem um prompt bash iniciando um novo
Escreva um script que use wmctrl -l
para listar janelas, procurando uma com bash
no título. Se um for encontrado, execute wmctrl -i -a <id returned by wmctrl -l>
para aumentá-lo, caso contrário, basta chamar xterm
.
Aqui está um script que faz isso:
"/usr/local/bin/bashprompt"
Mod4 + r
Ou faça o download do meu repositório de scripts .
executando o script quando você pressiona Win + R
Assumindo que seu script é chamado de /usr/local/bin/bashprompt
, crie um arquivo ~/.xbindkeysrc
contendo:
# set the title when we run a command
setcommandhook()
{
if $has_debug_trap
then
trap 'command=$BASH_COMMAND; eval settitle "\"${title}\""; trap - DEBUG' DEBUG
fi
}
# set the xterm title
settitle()
{
printf "3]0;$*#!/bin/bash
#
# bashprompt
#
# if there is an xterm open at a bash prompt, raise/focus that window
# if there isn't start a new xterm
#
# requires that your xterm window title has "bash" at the end
# when there is no command running and doesn't have "bash" at the end
# when a command is running
#
# see <http://unix.stackexchange.com/questions/6842> for more details
#
# Mikel Ward <[email protected]>
# change this to whatever is unique about your window title
# (i.e. a string that appears in the title when the shell is at a prompt
# but does not appear when running a command)
prompttitle="bash$"
terminalprog="xterm"
if ! type wmctrl >/dev/null 2>&1; then
echo "wmctrl can't be found, please install it" 1>&2
exit 1
fi
if ! output="$(wmctrl -l)"; then
echo "Error running wmctrl -l" 1>&2
exit 1
fi
while IFS=$'\n' read -r line; do
if [[ $line =~ $prompttitle ]]; then
id=${line%% *}
break
fi
done <<EOF
$output
EOF
if test -n "$id"; then
wmctrl -i -a "$id"
else
"$terminalprog"&
fi
7"
}
promptstring='$(hostname):$(pwd)$ '
title='$(hostname) "${command:-$0}"'
# prompt and window title
if test -n "${title}"
then
PROMPT_COMMAND='command=; eval settitle "\"${title}\""'
if $has_debug_trap
then
PROMPT_COMMAND="$PROMPT_COMMAND; setcommandhook"
fi
fi
if test -n "${promptstring}"
then
PS1='$(eval echo -n "\"${promptstring}\"")'
fi
execute xbindkeys
. Adicione ao seu arquivo .Xclients
ou similar para que ele seja iniciado automaticamente.