Verknüpfung binden, um das Fenster einer bestimmten Anwendung zu öffnen

Verknüpfung binden, um das Fenster einer bestimmten Anwendung zu öffnen

Normalerweise habe ich mehrere Anwendungen auf meiner Workstation laufen. Normalerweisebrauchen VIM, Google Chromeund Terminaleinige andere Anwendungen, die ich nicht immer brauche, z. B. E-Mail-Client, IM, VLC usw.

Es wäre sehr praktisch, wenn ich VIMmit nur einer Tastenkombination (beispielsweise Ctrl+ Shift+ V) zu Anwendungen wechseln könnte, die ich ständig brauche.

Wie kann das erreicht werden?

Antwort1

Dies ist ein Skript, das ich verwende, um dies mit irssi zu tun. Es enthält zusätzliche Logik, da ich es innerhalb einer tmux-Sitzung verwende, aber einige Teile sind anwendbar. Es enthält tatsächlich auch Code, um es remote über SSH funktionieren zu lassen und die GUI-Benachrichtigung über neue irssi-Nachrichten zu steuern, aber ich habe versucht, das der Übersichtlichkeit halber herauszuschneiden (einschließlich Verwendungsanweisungen und Argumentbehandlung). Ich lasse einige Debuganweisungen stehen printf.

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

Kurz gesagt verwendet es xdotool (Paket: xdotoolin Debian), um nach einem Fenster mit dem Titel „irssi“ zu suchen und aktiviert dann dieses Fenster. Es gibt andere Eigenschaften als den Fensternamen, nach denen gesucht werden kann, wenn diese Ihren Anforderungen besser entsprechen.

Ich verwende einen kleinen „Trick“, um das Terminal beim ersten Start „irssi“ zu nennen (siehe Anweisung printfin attach_irssi()).

Die letzte Zeile versucht

  1. Starten Sie eine bestehende Terminalsitzung, und wenn nicht gefunden
  2. eine bestehende tmuxSitzung anhängen, und wenn nicht gefunden
  3. eine Sitzung starten tmuxund dann
  4. hänge es an.

Ich binde dieses Skript an Mod4+ I(wie genau dies geschieht, hängt von Ihrem Fenstermanager ab).

Mit etwas Aufwand sollte es möglich sein, dies auf Ihren Fall umzurechnen.


BEARBEITEN:Insbesondere können Sie die gesamte Funktion entfernen, attach_irssiwenn Sie tmux oder GNU Screen nicht verwenden. Wenn Sie es nicht über SSH oder als irssi-Plugin ausführen, können Sie die TTYLogik einfach weglassen. Sehr komprimiert würde dies für irssi ohne tmux funktionieren (ist aber ungetestet):

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

Antwort2

Wenn Sie gconf-editor noch nicht installiert haben:

sudo apt-get install gconf-editor

Starten Sie es dann als normaler Benutzer (Verknüpfungen sind benutzerspezifische Einstellungen):

gconf-editor

Wir werden einen der Platzhalterbefehle verwenden, um das Gewünschte zu tun. Navigieren Sie also zu:

apps > metacity > keybinding_commands

Wählen Sie es aus command_1und bearbeiten Sie es, um den gewünschten Befehl auszuführen:

/usr/bin/vim

Dann geh zu

apps > metacity > global_keybindings

Suchen command_1und ändern Sie den Wert in den Schlüssel, den Sie verwenden möchten:

<Control><Alt>v

(Ich habe dies in Strg-Alt-V geändert, da Strg-Umschalt-V häufig zum Einfügen verwendet wird, während Strg-V für andere Dinge verwendet wird.)

Antwort3

Basierend auf der Antwort von @Daniel_Andersson ist dies das Skript, das ich an meine Tastaturkürzel gebunden habe, um das Firefox-Fenster zu öffnen (und die Maus darüber zu bewegen, weil ich leicht vergesse, auf welchem ​​Bildschirm es sich vor dem Wechseln befand).

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

Da Firefox immer eine Reihe von Ergebnissen zurückgibt xdotools, muss man eines finden, das ein tatsächliches Fenster ist. Ich habe festgestellt, dass xwininfo(Paket x11-utils) ein nützliches IsViewableFlag zurückgegeben hat, das ich verwende, um das erste sichtbare Fenster zu finden. Das notify-send(Paket libnotify-bin) ist natürlich optional, man könnte auch eine Firefox-Sitzung starten, wenn es inaktiv ist (siehe das Skript von @Daniel_Andersson).

verwandte Informationen