X 生产力脚本
Linux 提供了具有高分辨率、多窗口和菜单的图形用户界面 (GUI)。但是对于 GUI,人/计算机交互才是真正的速度瓶颈:只要做某事需要点击鼠标十次不同的点,无论硬件如何,都需要相同的时间。在命令行中,传统的 UNIX 答案是工具箱哲学。您可以使用脚本自动化任何事情,并将小型专用程序与管道连接起来。第三种解决方案结合了这两种方法,既简单又强大,足以满足大多数需求。任何标准的 X 环境,无论窗口管理器或桌面环境如何,都可以变得比通常情况下更快、更灵活。
我们有比手更多的手指,以及 101 个键对应一个鼠标。虽然使用鼠标或平板电脑进行绘图和类似任务更快,但通常我们的手指无论如何都必须放在键盘上。如果一个命令或选择只需要一个用户操作,那么按一个或两个键比点击鼠标按钮要快得多,更不用说 RSI 问题了。此外,当我们触摸鼠标时,它应该立即执行我们需要的操作。
可以使用 xmodmap 重新排列或映射键和鼠标按钮以赋予特定含义(带重音的元音)或 GUI 操作(最大化窗口)。它的受益者之一是左撇子,他们使用它来颠倒鼠标按钮的顺序。将此行添加到 .xinitrc 中,或将引号部分放在 .xmodmaprc 文件中
xmodmap -e "pointer = 3 2 1"
最近,xmodmap 已被用于使鼠标滚轮在 Linux 下正常工作(请参阅“资源”)。它还可以通过将您最常用的操作绑定到最新键盘上提供的那些额外的键,使滚轮工作得更快。例如,IntelliMouse Explorer 的魔术行是
xmodmap -e "pointer = 1 2 3 6 7 4 5"
在谈到键盘时,“修饰键”是指更改其他键的效果或状态的键。标准修饰键是 Shift、Ctrl、Lock、Alt 以及另外五个简称为 modN 的键,其中 N=1,2..5。xmodmap 可以将这些含义分配给任何物理键。最常见的情况可能是交换 Ctrl 和 Caps Lock 键,这在手册页中有所描述。同样,Windows 键的含义可以按以下方式更改为 mod4,假设其键码为 115
xmodmap -e 'keycode 115 = Alt_R Meta_R'
可以对键进行编程以启动应用程序,但这特定于窗口管理器。例如,在 Blackbox 0.65 中,击键通过 bbkeys 实用程序映射到程序。 $HOME/.bbkeysrc 中的如下行
KeyToGrab(F1),WithModifier(None),WithAction(ExecCommand),\ DoThis(xterm -geometry 80x25 -e mutt)
如前所述,任何 shell 脚本都可以赋予窗口以实现与用户的通信,并且任何图形客户端(以及 X 本身)都可以接收来自文本程序的直接输入。第一种情况发生在 shell 脚本需要用户交互时,但这是不可能的;例如,用户宁愿死也不愿打字,或者没有键盘(互联网信息亭)。第二种情况包括需要将一些不可预测的文本从控制台程序传递到 X 客户端而无需手动剪切和粘贴功能的用户。这种情况确实发生在现实生活中:mutt 和 lynx 可能足以满足我们阅读电子邮件和上网的需求,但是如果某些电子邮件或网页说“查看这部电影预告片”,而您想单击一下就在该页面上启动 Mozilla,该怎么办。
至少十年来,使用诸如现已解散的 Xscript 之类的工具,从脚本启动 X 窗口已经成为可能。一种现代解决方案是 Xdialog,一种基于 GTK+ 的小部件生成器。清单 1 中的脚本显示了一个几乎真实的示例;它让用户选择最佳 ISP、要使用的帐户以及记录连接报告的位置。然后,它启动传统的 pppd/chat 脚本(在示例中称为 netconn),并将所有图形化收集的参数传递给它。让我们详细检查 GUI 方面。
清单 1. 互联网连接脚本的 GUI 前端
#! /bin/bash /bin/rm -f /tmp/netsettings echo -n "PROVIDER=" > /tmp/netsettings Xdialog --menubox "ISP selection menu" 20 40 5 \ "ISP_1" "Lowest price in business hours" \ "ISP_2" "More economic on weekends" \ "ISP_3" "Fastest ftp server" 2>> /tmp/netsettings RETVAL=$? # add control code here echo -n "ACCOUNT=" >> /tmp/netsettings Xdialog --inputbox "Enter account name" 10 25 \ "son" 2>> /tmp/netsettings echo -n "LOGFILE=" >> /tmp/netsettings Xdialog -fselect /tmp 20 80 2>> /tmp/netsettings source /tmp/netsettings netconn $PROVIDER $ACCOUNT $LOGFILE
该脚本开始删除旧版本的 netsettings 文件,该文件存储所有用户选择。对于 netconn 脚本所需的每个变量,在 /tmp/netsettings 中写入 bash 语法的赋值行。左侧只是回显,没有换行符(echo -n)。第二部分,即用户选择的实际值,由 Xdialog 捕获。

图 1. 调用 Xdialog
第一个调用(参见图 1)允许用户选择最佳 ISP。我们还添加了一些解释性文本(ISP 选择菜单)并指定了窗口的高度 (20) 和宽度 (40),以及每个条目的高度 (5)。在图 1 的情况下,在用户按下“确定”按钮后,/tmp/netsettings 将包含这一行
PROVIDER=ISP_1
错误检查可以而且应该通过将每次调用 Xdialog 的退出代码保存在变量(清单 1 中的 RETVAL)中并检查它来了解用户真正做了什么。为了简洁起见,我们省略了这段代码,但请记住,RETVAL 为 1 表示“按下取消”;255 表示用户关闭了框,0 表示实际上做出了选择。
第二个 Xdialog 命令允许用户键入帐户名或接受默认值(图 2)。最后一个命令(图 3)显示一个文件选择窗口,用户可以在其中键入或使用鼠标选择当前日志文件的名称和位置。此时,所有用户选择都在 /tmp/netsettings 中,因此我们只需源该文件并启动连接即可。

图 2. 输入帐户名
Xdialog 提供了更多类型的输入小部件,从单选按钮到范围滑块和日历。其中相当一部分向用户提供反馈。作者使用--msgbox选项,例如,弹出一个窗口,列出 fetchmail 下载了多少消息,按帐户排序。其他可能性包括仪表和进度条、带超时的信息框和文件显示窗口。因此,Xdialog 可以附加到执行 CD 刻录、音频和视频播放、备份等操作的脚本——应有尽有。
如果必须在 X 未运行时使用相同的脚本怎么办?没问题;菜单和框也可以在字符终端中绘制。只需使用面向字符的等效项 dialog 即可。
回到 URL 示例,我们可以使用 xclip 将 URL 传递给浏览器而无需键入,xclip 会捕获最后一次鼠标选择并回显它。我们将其与实用程序 gnome-moz-remote 放在一起,gnome-moz-remote 要么启动 Mozilla 的新实例,要么使用您已运行的 Mozilla 打开给定的 URL。将以下命令放入脚本中
gnome-moz-remote --newwin "'xclip -o'" \ &> /dev/null &
将其命名为 start_browser.sh,并将其绑定到一个宏,以便从必须启用以启动外部客户端的应用程序运行它。在 mutt 中,这样的宏可能是
macro pager \cn "!start_browser.sh\n" 'open URL'
此时,每当我们在 mutt 中看到 URL 时,我们只需用鼠标突出显示它并按下 Ctrl-N。在脚本内部,xclip 回显选定的文本,一切都好像我们手动启动了浏览器,然后在“位置”窗口中键入了该文本一样。
xclip 有几个远房表亲,xclipboard 和 xcutsel,它们管理 X 剪贴板和剪切缓冲区。当需要查看剪贴板内容并在不支持它们的应用程序之间移动选择时,这两个程序非常有用。有关更多信息,请查看相关的手册页。
当我们实际按下或释放键时,我们如何让 X 相信我们正在使用鼠标移动光标并使用其按钮? xbut 程序执行这两项任务。您可以设置一个简单的配置文件,使键像鼠标移动或点击一样工作。
使用 xwit(X Window Interactive Tool,X 窗口交互式工具)甚至可以更进一步,xwit 直接放置 X 指针到屏幕上的绝对位置。除了扭曲指针之外,xwit 还可以移动窗口并将其图标化。要将当前 xterm 图标化、休眠,然后再将其弹出,请使用
xwit -iconify; sleep 2; xwit -pop
此工具对于长时间运行的任务非常方便;将程序名称替换为 sleep 命令,它将图标化窗口,完成工作,并在完成后回到您的面前。
最后,一个灵活的 X 自动化工具是 xte,它是 xautomation 包的一部分。使用xte -h查看它支持的 X 事件列表。此示例转到屏幕左边缘 320 像素处和向下 50 像素处,然后在那里模拟单击按钮 1
xte 'mousemove 320 50' 'mousedown 1' 'mouseup 1'
一个快速有效的环境是,您可以在其中尽快、安全且透明地在您可以访问的每台其他机器上启动任何授权进程(无论是在后台还是交互式、文本或基于 GUI 的)。当然,正确的方法是通过 OpenSSH。但是,即使您使用 RSA 或 DSA 身份验证来确保安全,并避免记住每个主机的密码,您也必须为每个连接键入 SSH 密码短语。幸运的是,一个有价值的 SSH 合作伙伴 ssh-agent 会记住您的 SSH 私钥或多个密钥,并接管执行任何需要私钥的身份验证的工作。实际上,这意味着如果您将 X 作为 ssh-agent 的子进程启动,则稍后启动的每个本地 X 客户端都能够使用 ssh-agent 进行身份验证。
您可以在 .xinitrc 或 .Xsession 中将窗口管理器作为 ssh-agent 的子进程启动;将 ssh-agent 放在窗口管理器之前。如果您有sawfish,将其更改为ssh-agent sawfish,并且在您的 X 会话中运行的所有内容,包括任何 SSH 程序,都将能够使用 ssh-agent。
GNOME 默认启动 ssh-agent。要将其添加到 KDE,请找到您的 KDE 启动脚本并将 ssh-agent 添加到其中,就像您为窗口管理器所做的那样。
ssh-add 命令是实际使代理知道的身份可用的命令。您可以使用以下命令确保 ssh-agent 正在运行并且知道您的身份ssh-add -L.
如果计算机无人看管,则每个路过的人都可以立即访问您可以登录的所有主机,无需任何问题。注销,或使用ssh-add -D从代理中删除您的身份。
我们解释了如何重新映射与额外键对应的数字键码以表示其他事件,但是首先如何了解它们呢?解决方案是诊断工具 xev,它打开一个“事件测试器”窗口,并在原始终端中报告发生在该窗口上的所有事件。在作者的系统上,按下左 Windows 键会返回(请注意键码值和注释)
KeyRelease event, serial 23, synthetic NO, window ↪0x1000001, root 0x46, subw 0x0, time 1108438536, (175,176), root:(627,425), state 0x40, keycode 115 ↪(keysym 0xffeb, Super_L), same_screen YES, XLookupString gives ↪0 characters: ""
最后但并非最不重要的一点是,屏幕截图对于炫耀您的 shell 脚本 GUI 是必要的,不是吗?即使在这种情况下,纯 X 和 ImageMagick 也足够了,无需安装更高级的前端。本文的图像都是使用以下标准命令抓取并转换为 PNG 格式的,所有这些命令都在其手册页中得到了正确记录
xwd -out temp_image -frame xwdtopnm temp_image > fig1.pnm convert fig1.pnm fig1.png
第一个命令将使用光标选择的窗口(包括框架)转储到 temp_image 中,第二个和第三个命令首先将该文件转换为“可移植 anymap”,然后转换为 PNG 格式。不用说,这三个命令可以很容易地插入到 shell 脚本中,该脚本通过 Xdialog 询问要抓取的内容(屏幕还是窗口)以及要将结果保存在哪个文件中。
对于许多用户来说,标准的、功能齐全的桌面环境要么功能太多,这会降低 PC 的速度,要么功能太少,无法满足他们的特定需求。此处描述的工具和技术可以帮助用户极大地提高他们的生产力,并且在 CLI 和鼠标爱好者共享同一台 PC 时也可以成为救命稻草。
资源
Mozilla 远程控制:www.mozilla.org/unix/remote.html
ssh-agent: www.cvrti.utah.edu/~dustman/no-more-pw-ssh, www.arches.uga.edu/~pkeck/ssh, www.linuxgazette.com/issue67/nazario2.html 和 www.linuxgazette.com/issue64/dellomodarme.html
xautomation(包括 xte):hoopajoo.net/projects/xautomation.html
xclip: people.debian.org/~kims/xclip
xclipboard: www.modperldev.com/portfolio/samples/perl/irc/xchat_clipboard.html 和 sandklef.com/software/xbut
xdialog: jan.netcomp.monash.edu.au/SW.html#XScript
xmodmap: www.deadman.org/X/xbuttons.html, koala.ilog.fr/colas/mouse-wheel-scroll, www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html, www.sandklef.com//software/xikbd 和 www.fedu.uec.ac.jp/ZzzThai/xio
Marco Fioretti 是一位硬件系统工程师,对作为 EDA 平台的自由软件以及(作为 RULE 项目的现任负责人)作为高效桌面感兴趣。 Marco 与家人住在意大利罗马。