1

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

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

Как это может быть достигнуто?

3 ответа3

2

Это скрипт, который я использую для этого с 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 (package: 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
0

Основываясь на ответе @ 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 (пакет x11-utils) вернул полезный флаг IsViewable , который я использую, чтобы найти первое видимое окно. Notify notify-send (пакет libnotify-bin), конечно, не обязателен, можно также запустить сеанс firefox, если он неактивен (см. Скрипт @ Daniel_Andersson).

0

Если у вас еще не установлен gconf-редактор:

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 используется для других целей).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .