Yukang's Page

Linux下快捷切换屏幕

2012-08-09

screen

在办公室工作的时候一般面对两个显示器,大部分时候左边用来看代码,右边用来写程序。双显示屏还是有助于提高工作效率的。有一点困扰我的是如果要切换屏幕一般得用鼠标,这对于
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下写点东西快多了。

使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章