我的工作站上通常会运行多个应用程序。通常我需要 VIM
,Google Chrome
以及Terminal
一些我并不总是需要的应用程序,例如邮件客户端、IM、VLC 等。
VIM
如果我只需使用一个快捷方式(比如说Ctrl++ )就可以切换到我一直需要的应用程序Shift,那将非常方便。V
如何实现呢?
答案1
这是我使用 irssi 执行此操作的脚本,由于我在 tmux 会话中使用它,因此具有额外的逻辑,但有些部分是适用的。它实际上还包含使其通过 SSH 远程工作并控制新 irssi 消息的 GUI 通知的代码,但为了清晰起见,我尝试将其删除(包括使用说明和参数处理)。我留下了一些调试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(具体如何完成取决于您的窗口管理器)。
只要付出一些努力,这应该可以转化为您的情况。
编辑:具体来说,如果您不使用 tmux 或 GNU Screen,则可以删除完整的attach_irssi
功能。如果您不通过 SSH 或作为 irssi 插件运行它,则可以轻松丢弃逻辑TTY
。非常简洁,这适用于没有 tmux 的 irssi(但未经测试):
#!/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 的脚本)。