綁定快捷方式升起特定應用程式的窗口

綁定快捷方式升起特定應用程式的窗口

我的工作站上通常會運行多個應用程式。通常我需要 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(具體如何完成取決於您的視窗管理器)。

經過一些努力,這應該可以轉換為您的情況。


編輯:attach_irssi具體來說,如果您不使用 tmux 或 GNU Screen,則可以刪除完整的功能。如果您不透過 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 的腳本)。

相關內容