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