Привязать сочетание клавиш для открытия окна определенного приложения

Привязать сочетание клавиш для открытия окна определенного приложения

Обычно на моей рабочей станции запущено несколько приложений. Обычно януждаться VIMGoogle Chromeи Terminalнекоторые другие приложения, которые мне не всегда нужны, например, почтовый клиент, IM, VLC и т. д .

Было бы очень удобно, если бы я мог переключаться на приложения, которые мне всегда нужны, VIMс помощью всего лишь одной комбинации клавиш (скажем, Ctrl+ Shift+ V).

Как этого можно достичь?

решение1

Это скрипт, который я использую для этого с irssi, с дополнительной логикой, поскольку я использую его в сеансе tmux, но некоторые части применимы. На самом деле он также содержит код, позволяющий работать удаленно через SSH и управлять уведомлениями GUI о новых сообщениях irssi, но я попытался убрать это (включая инструкции по использованию и обработку аргументов) для ясности. Я оставляю несколько отладочных 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

Короче говоря, он использует xdotool (пакет: xdotoolв Debian) для поиска окна с заголовком "irssi", а затем активирует это окно. Есть и другие свойства, кроме имени окна, которые можно искать, если они лучше соответствуют вашим потребностям.

Я использую небольшую «хитрость», чтобы назвать терминал «irssi» при его первом запуске (см. инструкцию printfв attach_irssi()).

Последняя строка пытается

  1. Поднять существующую терминальную сессию, и если она не найдена
  2. прикрепить существующую tmuxсессию, и если не найдено
  3. начать tmuxсеанс, а затем
  4. прикрепите его.

Я привязываю этот скрипт к Mod4+ I(как именно это сделать, зависит от вашего оконного менеджера).

Приложив некоторые усилия, это можно будет применить в вашем случае.


РЕДАКТИРОВАТЬ:В частности, вы можете вырезать всю attach_irssiфункцию, если вы не используете tmux или GNU Screen. Если вы не запускаете его через SSH или как плагин irssi, вы можете легко выбросить логику TTY. Очень сжато, это будет работать для irssi без tmux (но это не проверено):

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

решение2

Если у вас еще не установлен gconf-editor:

sudo apt-get install gconf-editor

Затем запустите его как обычный пользователь (ярлыки настраиваются индивидуально для каждого пользователя):

gconf-editor

Мы собираемся использовать одну из команд-заполнителей, чтобы сделать то, что вам нужно, поэтому перейдите к:

apps > metacity > keybinding_commands

Выберите command_1и отредактируйте его, чтобы запустить выбранную вами команду:

/usr/bin/vim

Тогда иди к

apps > metacity > global_keybindings

Найдите command_1и измените значение на ключ, который вы хотите использовать:

<Control><Alt>v

(Я изменил это на Control-alt-v, поскольку control-shift-v часто используется для вставки, тогда как control-v используется для других целей).

решение3

Судя по ответу @Daniel_Andersson, это скрипт, который я привязал к своим сочетаниям клавиш, чтобы вызывать окно Firefox (и наводить на него указатель мыши, потому что я легко забываю, на каком экране оно было до переключения).

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

Поскольку Firefox всегда возвращает несколько результатов в xdotools, нужно найти тот, который является фактическим окном. Я обнаружил, что xwininfo(package x11-utils) возвращает полезный IsViewableфлаг, который я использую для поиска первого видимого окна. notify-send(package libnotify-bin) конечно необязателен, можно также запустить сеанс Firefox, если он неактивен (см. скрипт @Daniel_Andersson).

Связанный контент