Это скрипт, который я использую для этого с 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()
).
Последняя строка пытается
- Поднять существующую терминальную сессию, и если не найден
- присоединить существующий сеанс
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