Autokey:Linux 桌面自动化实用程序

作者:Mike Diehl

和你们中的许多人一样,我一直都知道 Linux 上有几种桌面自动化实用程序可用,但直到最近,我才真正使用过。然而,我们的一位读者发邮件建议我看看 Autokey,所以我照做了。(谢谢 Keith) http://code.google.com/p/autokey/ 本质上,Autokey 允许您将常用文本分配给热键;然后,热键可以用作原始文本的快捷方式。例如,我住在阿尔伯克基,正如您可能想象的那样,这很繁琐且经常拼写错误。如果我只需要按 alt-a,岂不是很好吗?首先,这就是 Autokey 可以为我们做的事情,甚至更多。

一旦我们用 Autokey 定义了一段文本,我们就可以通过几种方式访问该文本。我们可以将文本分配给热键,例如 alt-a 或 ctl-alt-z。或者,我们可以使文本从屏幕底部的 Autokey 面板中的菜单中可用。最后,我们可以定义一个可以用来代替文本的缩写。例如,像我这样的 Perl 程序员可能喜欢使用缩写 “sub” 并将其定义为

sub<tab>x {

}<up><up><home><right><right><right><right><delete>

这样,每当我开始定义一个新的子程序时,Autokey 都会填写子程序的基本框架,并将光标移回子程序名称。

正如您所见,我们能够通过使用它们的名称来发送特殊按键。Autokey 有一个很长的特殊按键列表可以发送。我们还可以定义缩写为不区分大小写,或者仅在具有特定名称的窗口上触发。

如果这就是 Autokey 的全部功能,它仍然会是一个有用的工具,但这篇文章就不会很有趣了。幸运的是,还有更多功能;Autokey 内置了一个 Python 解释器和一个 API,允许我们做一些非常有趣的事情。

这是一个快速示例

choices = ["konqueror", "firefox", "chrome"]

retCode, choice = dialog.list_menu(choices)

if retCode == 0:

system.exec_command(choice + " " + clipboard.get_selection())

这个简短的小脚本允许我们高亮显示一个 URL,按下热键,从对话框中选择三个不同的浏览器之一,并使用选择的浏览器打开该 URL。

那么让我们更深入地了解 Autokey 的 Python API。

Autokey 的 keyboard 类提供了 send_keys() 及其一些变体,这提供了一种向窗口管理器发送击键的方法。Autokey 脚本首先计算它想要发送的内容,并使用 send_keys() 方法发送它。当然,诀窍是确定要发送什么,而这正是 Autokey API 其余部分的目的。

mouse 类提供了 click_relative() 和 click_absolute()。这些方法模拟鼠标点击,并允许我们确定要模拟哪个鼠标按钮,以及它应该基于 XY 坐标点击的位置。absolute 变体模拟屏幕上任何位置的鼠标点击。relative 版本模拟当前活动窗口内的点击。

store 类允许我们的 Autokey 脚本持久存储键/值对并在以后访问它们。在这里我们找到了 set_value()、get_value() 和 remove_value()。set_value() 方法接受一个键和一个值。然后,get_value() 方法可以传递一个键值,并将返回适当的值。remove_value() 方法从数据库中删除给定的键/值对。我发现奇怪的是,似乎没有办法知道特定的键/值对是否存在。然后我在一个示例脚本中遇到了 has_key() 方法;它没有在 API 文档中记录。但是,它显然返回一个布尔值,指示给定的键是否存在。

system 类仅提供两个函数,exec_command() 和 create_file()。exec_command() 方法允许 Autokey 脚本运行外部命令,并可以选择捕获命令的输出。唯一的注意事项是,该方法以及 Autokey 本身在命令运行时会阻塞,因此命令需要立即终止。create_file() 方法创建给定的文件并将内容插入其中。奇怪的是,似乎没有相应的 read_file() 方法。

QtClipboard 和 GtkClipboard 类提供对窗口管理器剪贴板的访问。正如您所见,有 Qt 和 Gtk 变体。您必须确保根据您使用的窗口管理器使用适当的版本。这两个版本都导出相同的方法。在这里,重要的是要认识到剪贴板和仅仅选择之间的区别。考虑到这种区别,我们发现 *clipboard 类导出 get_selection()、fill_selection()、get_clipboard() 和 fill_clipboard() 方法。使用这些方法,我们可以获取和替换剪贴板或当前选定文本中的文本。

engine 类提供了允许我们创建新脚本和缩写的方法。实际上,我自己并没有发现这些方法太有趣,所以我不会在这里花太多时间讨论它们。我只是从完整性的角度欣赏它们的存在。

window 类提供了用于管理和操作窗口管理器中窗口的方法。这些方法允许我们移动、调整大小和关闭窗口,以及将它们移动到不同的桌面。我们还可以使用此类中的方法最小化、窗口阴影化和最大化窗口。虽然认识到这些方法可能带来的强大功能,但我没有预见到需要操作特定窗口的需求,因此没有非常彻底地探索此类。可以肯定地说,如果您需要,您可以做很多事情。

我碰巧认为我已经描述了一些非常强大的 Autokey 功能,但接下来才是真正酷的部分。dialog 类,它也有 Qt 和 Gtk 变体,提供了一种非常强大的与用户交互的机制。在这里,我们找到了向用户呈现对话框、密码框、菜单对话框、文件和目录选择器以及颜色选择器的方法。我认为这就是 Autokey 的真正强大之处,因为它使我们能够编写简单的交互式脚本并将它们分配给热键以便于访问。例如,编写一个脚本并不难,该脚本允许我们从浏览器窗口中选择一个 URL,按下热键,并显示我们需要用来访问该站点的用户名和密码。无论我们选择使用哪个浏览器,此密码管理系统都将有效。

多年来,我已经习惯了以特定的方式组织我的窗口,这取决于我在做什么。例如,当我在进行 Web 开发时,我喜欢 Web 浏览器占据屏幕宽度的三分之二和整个高度。然后我喜欢我的控制台填充屏幕的其余部分。使用 Autokey,这种配置以及更复杂的配置,可能只需按一下键即可实现。

作为最后一个例子,我承认我真的很喜欢在 hulu.com 上观看我最喜欢的电视节目,但有一个小小的缺点。每当我想暂停节目时,我都必须使用鼠标,我真的觉得鼠标很让人分心。我有热键,允许我从键盘更改音量。我可以使用键盘在活动窗口和活动桌面之间切换。我使用 vi 编辑器,因为它不需要我使用鼠标。Autokey 将允许我创建一个热键,该热键将模拟鼠标点击我的 hulu 窗口的中心,从而暂停和恢复视频。

我知道这让我听起来很懒,但这就是重点。像 Autokey 这样的工具的全部目的是自动化繁琐的任务。毕竟,这就是技术的用途;这就是为什么我们的电视都有遥控器。

加载 Disqus 评论