2017-11-30-快捷键切换应用程序

Table of Contents

开始使用电脑时总是使用鼠标点点点来切换应用程序。后来我发现 Atl+Tab 可以很大的提升效率。最后我发现如果把常用应用程序绑到固定的快捷键上可以 省去更多的时间,还可以把每个程序都全屏。

在windows上有 AutoHotkey 。 Mac上我之前使用过 karabiner 。今天写一 写Linux下的 wmctrl 。* wmctrl来控制窗口

1 安装

ubuntu 16.04和Debain中可以直接使用apt来安装:

    sudo apt-get install wmctrl

2 简单使用

对于wmctrl来说,它可以“看到”当前打开的所有窗口(window)。可以这样查看 一下当前所有的window:

wmctrl -xlG

最简单的使用方法就是在打开对应的应用程序后,直接使用下面的命令来激活:

    wmctrl -a emacs
    wmctrl -a firefox
    wmctrl -a terminal

这个是根据名字来的。我最开始的时候就直接使用的这种方法。一般Gnome,KDE 和xfce中都有设置快捷键的地方。找到对应的地方添加快捷键绑定到该脚本中即 可。

3 结合虚拟桌面使用

当我使用虚拟桌面时,上述设置就不太满虽我需求了。我一般每个桌面做的事 情不同,可以桌面1是在本机,桌面2可能都在远程。所以我的需求就变成了: 快捷键只能切换本桌面的窗口,不能切到其它桌面的窗口。

已经有人提过这样的 问题 了。

最后我搞了一个这样的脚本:

#!/bin/bash
# only switch to the application on current screen

SCREEN_W=$(xwininfo -root | sed -n 's/^  Width: \(.*\)$/\1/p')
SCREEN_H=$(xwininfo -root | sed -n 's/^  Height: \(.*\)$/\1/p')

CURRENT_DESKTOP=`wmctrl -d|grep '*'|awk '{print $1}'`


if [ $# != 1 ];then
    echo "usage pwmctrl emacs.Emacs"
    exit 1
fi 

NAME=$1

wmctrl -xlG | awk -v W="$SCREEN_W" -v H="$SCREEN_H" -v NAME="$NAME" -v CURRENT_DESKTOP="$CURRENT_DESKTOP" '$7==NAME && $3>=0 && $3<W && $4>=0 && $4<H && $2==CURRENT_DESKTOP {print $1}' | while read WINS; do wmctrl -ia "$WINS"; done 

exit 0

要理解上面脚本,先得搞清楚 wmctrl -xlg 输出的每行的内容:

0x0120013a  0 0    0    1600 900  emacs.Emacs           pengpengxp-thinkpad emacs@pengpengxp-thinkpad

我理解如下:

0x0120013a 0 0 0 1600 900 emacs.Emacs pengpengxp-thinkpad emacs@pengpengxp-thinkpad
唯一标识id 虚拟桌面号 N/A N/A 宽度 长度 WM_CLASS,可以匹分应用程序 窗口的title

可以使用 wmctrl -d 找到当前桌面号(带星号的一行)。

上面的脚本就是输入一个WM_CLASS,然后找到窗口的最大长度和宽度以及当前 桌面号。通过awk判断是当前桌面,且宽度和长度都没有超过当前屏幕时,才 切换窗口。

把上述脚本放到 /yourpath/pwmctrl 目录后,选择合适的按键绑到这些内 容就可以了:

/yourpath/pwmctrl emacs.Emacs
/yourpath/pwmctrl lilyterm.Lilyterm
/yourpath/pwmctrl Telegram.TelegramDesktop
/yourpath/pwmctrl google-chrome.Google-chrome
/yourpath/pwmctrl Opera.Opera
/yourpath/pwmctrl Navigator.Firefox-esr

这样就只在当前桌面切换啦。

Author: Peng Xie

Created: 2018-10-01 Mon 21:36