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. Geralmente eu precisar 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 que eu preciso sempre VIM com apenas um atalho (digamos Ctrl + Mudança + V ).

Como isso pode ser alcançado?

Nemoden
fonte
1
Qual ambiente de desktop (se houver) você está usando e qual versão? por exemplo, o Gnome 2.x, o Gnome 3.x, o KDE 3.x, o KDE 4.x, o XFCE etc.
Paul
Gnome 2.30.0 ..
Nemoden

Respostas:

2

Este é um script que eu uso para fazer isso com o irssi, com lógica extra já que eu 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 fazê-lo funcionar remotamente por SSH e controlar 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 alguns depurativos printf afirmações.

#!/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 -- '\033]0;%s\007' ${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, usa xdotool (pacote: xdotool no Debian) para procurar uma janela com o título "irssi" e depois ativar essa janela. Existem outras propriedades que o nome da janela que você pode procurar, se elas se adequarem melhor às suas necessidades.

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

A última linha tenta

  1. Levante uma sessão de terminal existente e, se não for encontrado
  2. anexar um existente tmux sessão, e se não for encontrado
  3. começar um tmux sessão e depois
  4. anexá-lo.

Eu vinculo este script a Mod4 + Eu (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.


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

#!/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
Daniel Andersson
fonte
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ê quer, então navegue para:

apps > metacity > keybinding_commands

Escolher command_1 e edite-o para lançar o comando escolhido:

/usr/bin/vim

Então vá para

apps > metacity > global_keybindings

Encontrar 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).

Paul
fonte
1
Ele quer "mudar para" a sessão aberta do programa, não iniciar uma nova.
Daniel Andersson
0

Com base na resposta de @ Daniel_Andersson, este é o script que eu vinculei aos meus atalhos de teclado para levantar a janela do Firefox (e passar o mouse sobre ele, porque eu facilmente esqueço em qual tela estava antes de mudar).

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

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

Joce
fonte