Vincular atalho para levantar a janela de um aplicativo específico

1

Eu geralmente tenho vários aplicativos em execução na minha estação de trabalho. Normalmente eu preciso VIM , Google Chrome e Terminal e algumas outras aplicações que nem sempre preciso, por ex. cliente de e-mail, IM, VLC, etc.

Seria muito útil se eu pudesse mudar para aplicativos Eu preciso sempre como VIM com apenas um atalho (digamos, Ctrl + Shift + V ).

Como isso pode ser alcançado?

    
por Nemoden 10.05.2012 / 07:26

3 respostas

2

Este é um script que eu uso para fazer isso com o irssi, com lógica extra, já que o uso dentro de uma sessão do tmux, mas algumas partes são aplicáveis. Na verdade, ele também contém código para fazer com que ele funcione remotamente por SSH e controle a notificação GUI de novas mensagens irssi, mas eu tentei eliminar isso (incluindo instruções de uso e manipulação de argumentos) para maior clareza. Deixo algumas declarações printf de depuração.

#!/bin/sh
# Locally raise/attach/start irssi session.
#
# Designed for use with tmux and irssi.

TMUX="/usr/bin/tmux"
TERMINAL="/usr/bin/urxvtc"
IRSSI="/usr/bin/irssi"

WINDOWNAME="irssi"
SESSIONNAME=${WINDOWNAME}

tty -s && TTY=true || TTY=false
ttyprint()
{
    ${TTY} && printf -- '%s: %s\n' "${0##*/}" "${1}"
}

start_irssi()
{
    ttyprint 'Starting irssi...'
    if ( ${TMUX} new-session -d -s "${SESSIONNAME}" "${IRSSI}" && ${TMUX} rename-window -t "${SESSIONNAME}:0" "${SESSIONNAME}" ); then
        ttyprint ' done.'
        return 0
    else
        ttyprint ' failed.'
        return 1
    fi
}

attach_irssi()
{
    if ${TTY}; then
        ttyprint 'Attaching irssi...'
        if printf -- '3]0;%s
#!/bin/sh
TERMINAL="/usr/bin/urxvtc"
IRSSI="/usr/bin/irssi"
WINDOWNAME="irssi"
SESSIONNAME=${WINDOWNAME}

start_irssi()
{
    ${TERMINAL} -title "${WINDOWNAME}" -e "${IRSSI}"
}

raise_irssi()
{
    if WID=$(xdotool search --limit 1 --name "^${WINDOWNAME}$"); then
        xdotool windowactivate "${WID}"
        return 0
    else
        return 1
    fi
}

! raise_irssi && start_irssi
7' ${WINDOWNAME} && ${TMUX} attach-session -t "${SESSIONNAME}"; then ttyprint ' done.' return 0 else ttyprint ' failed.' return 1 fi elif ${TERMINAL} -title "${WINDOWNAME}" -e ${TMUX} attach-session -t "${SESSIONNAME}"; then return 0 else return 1 fi } raise_irssi() { ttyprint 'Searching for available session...' if WID=$(xdotool search --limit 1 --name "^${WINDOWNAME}$"); then ttyprint ' found, activating.' xdotool windowactivate "${WID}" return 0 else ttyprint ' not found.' return 1 fi } ! raise_irssi && ! attach_irssi && start_irssi && attach_irssi
Em suma, ele usa o xdotool (pacote: xdotool no Debian) para procurar uma janela com o título "irssi" e depois ativa a janela. Há outras propriedades que o nome da janela que você pode procurar se elas se adequarem melhor às suas necessidades.

Estou usando um pequeno "truque" para nomear o terminal "irssi" quando ele é iniciado pela primeira vez (veja a declaração printf em attach_irssi() ).

A última linha tenta

  1. Levantar uma sessão de terminal existente e, se não for encontrada
  2. anexe uma sessão tmux existente e, se não for encontrada
  3. inicie uma sessão tmux e, em seguida,
  4. anexe-o.

Eu vinculo este script a Mod4 + I (exatamente como isso é feito depende do seu gerenciador de janelas).

Com algum esforço, isso deve ser possível para converter para o seu caso.

EDIT: Especificamente, você pode remover a função attach_irssi completa se não usar o tmux ou o GNU Screen. Se você não executá-lo através do SSH ou como um plugin irssi, você pode facilmente jogar fora a lógica TTY . Muito condensado, isso funcionaria para irssi sem tmux (mas não foi testado):

#!/bin/sh
# Locally raise/attach/start irssi session.
#
# Designed for use with tmux and irssi.

TMUX="/usr/bin/tmux"
TERMINAL="/usr/bin/urxvtc"
IRSSI="/usr/bin/irssi"

WINDOWNAME="irssi"
SESSIONNAME=${WINDOWNAME}

tty -s && TTY=true || TTY=false
ttyprint()
{
    ${TTY} && printf -- '%s: %s\n' "${0##*/}" "${1}"
}

start_irssi()
{
    ttyprint 'Starting irssi...'
    if ( ${TMUX} new-session -d -s "${SESSIONNAME}" "${IRSSI}" && ${TMUX} rename-window -t "${SESSIONNAME}:0" "${SESSIONNAME}" ); then
        ttyprint ' done.'
        return 0
    else
        ttyprint ' failed.'
        return 1
    fi
}

attach_irssi()
{
    if ${TTY}; then
        ttyprint 'Attaching irssi...'
        if printf -- '3]0;%s
#!/bin/sh
TERMINAL="/usr/bin/urxvtc"
IRSSI="/usr/bin/irssi"
WINDOWNAME="irssi"
SESSIONNAME=${WINDOWNAME}

start_irssi()
{
    ${TERMINAL} -title "${WINDOWNAME}" -e "${IRSSI}"
}

raise_irssi()
{
    if WID=$(xdotool search --limit 1 --name "^${WINDOWNAME}$"); then
        xdotool windowactivate "${WID}"
        return 0
    else
        return 1
    fi
}

! raise_irssi && start_irssi
7' ${WINDOWNAME} && ${TMUX} attach-session -t "${SESSIONNAME}"; then ttyprint ' done.' return 0 else ttyprint ' failed.' return 1 fi elif ${TERMINAL} -title "${WINDOWNAME}" -e ${TMUX} attach-session -t "${SESSIONNAME}"; then return 0 else return 1 fi } raise_irssi() { ttyprint 'Searching for available session...' if WID=$(xdotool search --limit 1 --name "^${WINDOWNAME}$"); then ttyprint ' found, activating.' xdotool windowactivate "${WID}" return 0 else ttyprint ' not found.' return 1 fi } ! raise_irssi && ! attach_irssi && start_irssi && attach_irssi
    
por 10.05.2012 / 10:53
0

Se você ainda não tem o gconf-editor instalado:

sudo apt-get install gconf-editor

Em seguida, inicie-o como um usuário normal (os atalhos são uma configuração por usuário):

gconf-editor

Vamos usar um dos comandos de espaço reservado para fazer o que você deseja, então navegue para:

apps > metacity > keybinding_commands

Escolha command_1 e edite-o para iniciar o comando escolhido:

/usr/bin/vim

Depois vá para

apps > metacity > global_keybindings

Encontre command_1 e altere o valor para a chave que você deseja usar:

<Control><Alt>v

(eu mudei isso para Control-alt-v como controle-shift-v é frequentemente usado para colar onde o controle-v é usado para outras coisas).

    
por 11.05.2012 / 03:21
0

Com base na resposta do @ Daniel_Andersson, este é o script que eu vinculei aos atalhos do meu teclado para abrir a janela do Firefox (e passar o mouse por cima, porque esquecerei facilmente a tela antes de trocar).

#!/bin/bash
if WIDS=$(xdotool search --name 'Firefox$'); then
  for WID in $WIDS
  do
    if $(xwininfo -id $WID | grep -q IsViewable) 
    then
        xdotool windowactivate "${WID}" mousemove --window "${WID}" 50 50 
        break
    fi
  done
else
    notify-send "Firefox not running" 
fi

Como o Firefox sempre retorna vários resultados em xdotools , é preciso encontrar um que seja uma janela real. Descobri que xwininfo (package x11-utils ) retornou um útil IsViewable flag, que utilizo para encontrar a primeira janela visível. O notify-send (package libnotify-bin ) é obviamente opcional, também é possível iniciar uma sessão do firefox se estiver inativa (veja o script do @ Daniel_Andersson).

    
por 12.01.2018 / 16:17