如何避免特殊字母的 AHK 脚本干扰 Emacs 的重复命令?

How to avoid AHK script for special letter to interfer with Emacs' repeating command?

我在将我的一些 AutoHotKey (AHK) 脚本与 Emacs 结合使用时遇到问题。给我带来问题的 AHK 脚本用于插入挪威语特殊字母 æ、ø、å、Æ、Ø、Å。这些脚本的格式在这里以字母 æ:

的 AHK 脚本为例
:c?*:,e:: ;  write the letter "æ" in text editor
send, {ALTDOWN}{Numpad1}{Numpad4}{Numpad5}{ALTUP}
return

..其中 {ALTDOWN}{ALTUP} 是 AHK 的命令,分别用于按下和释放 ALT 键。在此脚本中,AHK 实际上将 ASCII 数字 145 发送到文本编辑器以表示字母 æ。因此,当我在任何文本编辑器(Emacs 除外)中键入 ,e 时,结果都是字母 æ

然而,当在文本编辑器 Emacs 中使用时,此脚本不起作用。它似乎干扰了 Emacs 的重复命令,ALT-(n),其中 n 是您要重复命令的次数。例如,命令 ALT 50 , 将重复 , 50 次。

所以,如果我在我的 Emacs 编辑器中写 ,e 没有任何反应,但是如果我输入 , e_e 之后的空格 _ 会重复 145 次!同样,如果我写 , et 使字母组合 æt,我得到字母 t 重复 145 次。不完全是我想要的:)

如何更改我的 AHK 以便我仍然可以写特殊字母,但不干扰 Emacs 的重复命令?

首先,我很确定您可以在 Emac 本身中禁用重复命令。

我在 charmap.exe 中找不到 æ(替代 145)。相反,我将使用 æ (alt 0230).

您可以尝试的事情:使用

代替send, {ALTDOWN}{Numpad 0}{Numpad2}{Numpad3}{Numpad0}{ALTUP}
  • send, {ASC 0230}
  • send, æ(是的,这几乎适用于所有情况)
  • SendUnicodeChar(0x00E6)(00E6也可以在charmap中找到)

对于后者,您将需要此功能:

; SOURCE for the following: http://www.autohotkey.com/board/topic/16404-inserting-unicode-special-characters/
SendUnicodeChar(charCode)
{
    VarSetCapacity(ki, 28 * 2, 0)
    EncodeInteger(&ki + 0, 1)
    EncodeInteger(&ki + 6, charCode)
    EncodeInteger(&ki + 8, 4)
    EncodeInteger(&ki +28, 1)
    EncodeInteger(&ki +34, charCode)
    EncodeInteger(&ki +36, 4|2)

    DllCall("SendInput", "UInt", 2, "UInt", &ki, "Int", 28)
}

EncodeInteger(ref, val)
{
    DllCall("ntdll\RtlFillMemoryUlong", "Uint", ref, "Uint", 4, "Uint", val)
}

另一个想法:为什么不在 Emac 中禁用 Alt

#ifWinActive, Emacs
Alt::return
#ifWinActive