Atalho Fluxbox para abrir um xterm ou alternar para um já existente

1

É possível usar o fluxbox para configurar uma tecla de atalho para dizer winkey + r que abre um terminal (digamos xterm ou qualquer outro) com estas propriedades:

  1. Se já existe um terminal em que o diretório de trabalho é = ~ e não está executando um comando no momento (ou seja, no prompt), mostre-o.
  2. Ou se não criar um novo terminal
por Michael Mrozek 03.02.2011 / 08:30

2 respostas

3

Veja como eu faria:

  1. 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
  2. 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
  3. 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.

    
por 03.02.2011 / 08:48
2

fluxbox pode corresponder janelas baseadas em determinados padrões por conta própria. Com pelo menos fluxbox-1.1.1 isso é possível:

  Mod4 r :If {Some Matches (title=.*bash) (class=XTerm)} {NextWindow (xterm)} {Exec xterm}

(traduz em: on press windows-key + r: check, if there is a xterm with its title ending in 'bash'. if there is, go to that window; if not, open a new one . Com uma versão de ponta (git) você pode até mesmo ir para o Windows em um espaço de trabalho diferente.

A única coisa que você precisa fazer é modificar o título (ou qualquer outra propriedade da janela carregando o bash) dependendo do que você faz. Se você olhar para o prompt você tem que definir uma propriedade, se você iniciar um comando, você tem que tirar essa propriedade. fluxbox não é capaz de olhar dentro dos aplicativos, só conhece as janelas.

    
por 04.02.2011 / 08:54