![如何让 Sublime Text 的 Vim 模式和 AutoHotKey 不冲突地工作?](https://linux22.com/image/1522892/%E5%A6%82%E4%BD%95%E8%AE%A9%20Sublime%20Text%20%E7%9A%84%20Vim%20%E6%A8%A1%E5%BC%8F%E5%92%8C%20AutoHotKey%20%E4%B8%8D%E5%86%B2%E7%AA%81%E5%9C%B0%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
Sublime Text 是我见过的最好的文本编辑器,而 AutoHotKey 是我不能没有的脚本程序,尤其是热字符串功能,它允许我创建缩写-扩展对,大大加快了打字速度。这两项人类发明以难以想象的方式提高了我的日常工作效率。最近我一直在学习如何使用 Vim,并且我越来越习惯在 Sublime Text 中启用“复古模式”。
但是,有一个主要问题:Vim 命令可能会干扰 AutoHotKey 的热字符串。假设我有这个热字符串:
::xeno::xenófobo
...这意味着,如果输入“xeno”,它将扩展为“xenófobo”。然而,在 Vim 中,“xeno”会按顺序删除当前行,然后跳转到单词末尾,然后搜索输入字符串的下一个出现位置,然后打开一个新行。这是不想要的。
更糟糕的是,扩展部分本身包含有意义的 Vim 序列:
::eve::Eddie Vedder
...它会跳转到单词末尾,删除当前行,切换到插入模式,插入“e Vedder”。绝对是灾难性的。
但是 AutoHotKey 功能强大,我们可以设置它忽略某些窗口。例如:如果活动窗口" - Sublime Text"
的标题中有字符串,我们可以让它忽略热字符串输入。对于启用 Vim 模式的 Sublime Text,它将在状态栏,不在标题栏!因此 AutoHotKey 无法判断 Sublime Text 的 Vim 当前处于 COMMAND 模式还是 INSERT 模式。
是否可以为 Sublime Text 编写一个非常简单的插件/包,以便它在启用 Vim 时在标题栏上显示“COMMAND 模式”或“INSERT 模式”字样?这可以让 AutoHotKey 知道当前模式并转向主机环。
答案1
我不知道如何在 Sublime 中实现这一点,但有一些想法/观察
PX_WINDOW_CLASS
状态栏不是一个单独的控件,它似乎是整个窗口的一部分,因此直接读取文本值(直接从 AutoHotkey 读取)是不好的。- 您可以将 AutoHotkey 中的轮询与 OCR 结合使用来读取状态栏(使用 GDIP 或类似方法)。这可能只需要很少的处理量即可,但总是需要在模式更改时间和检测到模式更改时间之间有延迟。不太理想。让 OCR 工作也有点棘手(但可行)。
- 您可以编写自己的 sublime 包来读取状态栏文本,并根据这种轮询处理要执行的操作。例如,请参见此处:https://forum.sublimetext.com/t/copy-text-from-the-status-bar/20714/8
- 可能值得考虑其他类型的交互(除了使用 AutoHotkey
#IfWinActive
和设置窗口标题之外)。换句话说,设置窗口标题可能很困难,但直接从 sublime 运行单独的 exe 或 ahk 脚本可能并不那么困难。假设您能够轮询状态文本的正确查找键以确定它是 INSERT 还是 COMMAND,然后执行 shell 命令(exe 或 ahk 脚本) - 这可以为您的热字符串脚本提供启用/禁用各种组合键。有一个 sublime 包可以执行类似这样的操作来设置窗口透明度(运行外部实用程序来修改窗口),所以也许这是你可以研究的东西。 - 此链接显示了如何检测模式变化。也许你可以将其与最后一项结合使用。 https://stackoverflow.com/questions/20514563/change-appearance-in-sublime-text-3-when-switching-mode-in-vintage#39805889
- 您在帖子中没有提到插入模式和命令模式之间的转换方式——我安装了 Sublime 并到处查看,但自己无法弄清楚,但需要考虑的一种可能性是它是否是组合键。如果是这样,您可以检测用于在模式之间切换的击键,并在 AutoHotkey 中单独跟踪正在使用的模式。这种类型的设置可能不太理想,因为它是被跟踪的推断状态(并且它还必须初始化一次才能正常工作)。然而,作为初始实现,可能很容易获得大多数情况下有效的东西,直到您在 Sublime 中运行更强大的东西。