绑定快捷方式以调出特定应用程序的窗口

绑定快捷方式以调出特定应用程序的窗口

我的工作站上通常会运行多个应用程序。通常我需要 VIMGoogle 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(xdotoolDebian 中的软件包:)搜索标题为“irssi”的窗口,然后激活该窗口。除了窗口名称之外,还有其他属性可以搜索,如果这些属性更适合您的需求。

我使用了一个小“技巧”​​,在终端首次启动时将其命名为“irssi”(参见printf中的声明attach_irssi())。

最后一行试图

  1. 启动现有的终端会话,如果没有找到
  2. 附加现有tmux会话,如果没有找到
  3. 开始一个tmux会话然后
  4. 将其附加。

我将此脚本绑定到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 的脚本)。

相关内容