CatCoding

Linux 下快捷切换屏幕

2012-08-09

screenscreen

在办公室工作的时候一般面对两个显示器,大部分时候左边用来看代码,右边用来写程序。双显示屏还是有助于提高工作效率的。有一点困扰我的是如果要切换屏幕一般得用鼠标,这对于
Emacs 党是有些不能忍受的,右手离开键盘总是得停顿一下的感觉。今天找到一个解决办法。

最终找到的是这个号称 Linux 下键盘精灵的一个程序:xdotool,下载下来编译安装。这个东西可以模拟鼠标和键盘的行为:

比如:

xdotool search "Mozilla Firefox" windowactivate --sync key --clearmodifiers ctrl+l 
(快速切换倒 firefox,并 focus 在地址输入栏)

xdotool getmouselocation --shell  (获取当前鼠标位置等信息)
X=880
Y=443
SCREEN=0
WINDOW=16777250

xdotool getactivewindow windowmove 100 100    # Moves to 100,100
xdotool getactivewindow windowmove x 100      # Moves to x,100
xdotool getactivewindow windowmove 100 y      # Moves to 100,y
xdotool getactivewindow windowmove 100 y      # Moves to 100,y
xdotool mousemove --screen 0 100 100          # Moves to screen 0 pos at 100,100

有了上面 windowmove 命令,屏幕的切换就好实现了。写个丑陋的 python 脚本来保存当前的位置,切换到另外一个屏幕,再次调用的时候返回到原来的位置,
保存为 mouse.py。

#!/usr/bin/python
import os
import sys
import commands

data_f = "/tmp/window_data"
now_info = commands.getoutput("xdotool getmouselocation --shell").split('\n')
x = (now_info[1])[2:]
y = (now_info[2])[2:]
screen = (now_info[3])[7:]
window = (now_info[4])[7:]

def do_store():
    data = open(data_f, "w+")
    content = screen+"\n"+x+"\n"+y+"\n"+window
    data.write(content)
    data.close()
    
def do_update():
    if screen == "1":
        new_sc = "0"
    else:
        new_sc = "1"
    cmd = "xdotool mousemove --screen " + new_sc +  " 0 0"
    commands.getoutput(cmd)

if os.path.exists(data_f):
    data = open(data_f, "r+")
    content = data.readlines()
    data.close()
    screen = content[0][0:-1]
    old_x = content[1][0:-1]
    old_y = content[2][0:-1]
    old_window = content[3]
    if old_window != window:
        cmd = "xdotool mousemove -w " + old_window + " " + old_x + " " + old_y
        commands.getoutput(cmd)
        do_store()
    else:
        do_store()
        do_update()
else:
    do_store()
    do_update()

最后,通过 Emacs 下绑定快捷键来调用这个脚本即可实现两个屏幕之间的切换,又可以远离鼠标了。哈哈。

(defun switch-screen()
  (interactive)
  (start-process "mouse.py" nil "bash" "-c" 
                 "/home/yukang/apps/bin/mouse.py"))

(global-set-key (kbd "C-x q") 'switch-screen)

Jekyll 下写点东西快多了。

公号同步更新,欢迎关注👻