AHK 使用 Escape<Chars>Escape 例子

AHK using Escape<Chars>Escape example

如何将 Escape 用作我的 AHK 脚本的一部分。我想发送以下热键组合:

Press and Release Escape key

Type m

Type u

Press and Release Escape key again

打印希腊字母μ

我试图与 Wolfram Mathematica 使用转义字符插入 letters/symbols 的方式保持一致。

感谢任何帮助。

是的,这对 AHK 来说非常可行。
您正在寻找的是 hotstring.

由于在您的热字串中使用了 Esc 键,首先我将展示现代 Hotstring()[= 的用法32=] 函数而不是传统的 ::btw::by the way hotstring 语法。

esc := Chr(0x1B) ;27

Hotstring(":*?B0C:" esc "mu" esc, "{BS 2}μ")
Hotstring(":*?B0C:" esc "alpha" esc, "{BS 5}α")
Hotstring(":*?B0C:" esc "Alpha" esc, "{BS 5}Α")
;...

因此,首先我们将 Esc 键的字符串表示形式存储在名为 esc 的变量中,其中 Chr()(docs).
Esc 的字符代码是 27。你可以查一下,例如官方 Unicode 字符名称列表(在 pdf and txt), or some website which makes filtering easier, such as https://unicodelookup.com/.

中可用

您也可以选择将 Esc 字符保留在其字符串表示中。它会工作得很好,如果你的编辑器足够好,可以正确显示角色,它甚至看起来也很好。
如果这样做,您也可以使用指定热字串的传统方式。
下面两行在功能上是相同的:
Hotstring(":*?B0C:mu", "{BS 2}μ")
:*?B0C:mu::{BS 2}μ
编辑:Stack Overflow 似乎根本不显示 Esc 字符,至少在我这边是这样。但是上面的两行代码应该包含 Esc 字符,如下面的屏幕截图所示。

然后是热字串本身。
我猜你会想要 *?B0C(docs) 作为热字串的选项,但你可以选择任何适合你需要的东西:

  • * 因此触发热字串不需要结尾字符。
  • ? 这样即使在另一个词中也可以触发热字串。
  • B0 所以自动退格没有完成。
    这是必须的,因为例如mu 热字串,AHK 将退格 4 次,因为热字串有四个字符长,但 Esc 键实际上不会产生输入,你只想退格两次
  • C 使热字串区分大小写。

那么{BS 2}(docs1, docs2)表示按退格两次

Be sure to note that you'll need to save your script file an appropriate encoding to not lose the Greek letters.

UTF-8 足以涵盖所有希腊字母。
或者,您可以再次使用 Chr() 指定希腊字母,这样就无需担心编码问题。
例如。 "{BS 5}" Chr(0x3B1) 而不是 "{BS 5}α"


差不多就是这些了。
您可以为每个需要的热字串重复该行。

另外,因为我很无聊,这里有一些更酷的东西你可以用来创建 any Esc 包裹热字串:

ReplacementMap := CSobj()
ReplacementMap["alpha"] := Chr(0x3B1) ;Chr() notation not mandatory
ReplacementMap["Alpha"] := Chr(0x391)
ReplacementMap["mu"] := Chr(0x3BC)
ReplacementMap["Mu"] := Chr(0x39C)
ReplacementMap["dog"] := Chr(0x1F415) ;
ReplacementMap["cat"] := Chr(0x1F408) ;
ReplacementMap["btw"] := "by the way"
;...


for hotstring, replacement in ReplacementMap
    Hotstring(":*?B0CX:" Chr(0x1B) hotstring Chr(0x1B), Func("EscHotstringReplacement").Bind(StrLen(hotstring), replacement))

return

EscHotstringReplacement(BackspaceCount, Replacement)
{
    SendInput, % "{BS " BackspaceCount "}" Replacement
}

CSobj() {
   static base := object("_NewEnum","__NewEnum", "Next","__Next", "__Set","__Setter", "__Get","__Getter", "__Call","__Caller")
   return, object("__sd_obj__", ComObjCreate("Scripting.Dictionary"), "base", base)
}
   __Getter(self, key) {
      return, self.__sd_obj__.item("" key)
   }
   __Setter(self, key, value) {
      self.__sd_obj__.item("" key) := value
      return, false
   }
   __NewEnum(self) {
      return, self
   }
   __Next(self, ByRef key = "", ByRef val = "") {
      static Enum
      if not Enum
         Enum := self.__sd_obj__._NewEnum
      if Not Enum[key], val:=self[key]
         return, Enum:=false
      return, true
   }
   __Caller(self, name) {
      if (name = "count")
         return, self.__sd_obj__.count
   }

我不会彻底记录这个,但基本上CSobj()(docs) for a case sensitive key-value pair object, X hotstring option(docs) to execute and a bound function object(docs)来执行。