AHK 和 US-INT 键盘:为什么不再吞咽"dead"键?



我通常使用美国国际键盘布局。该布局具有多个键;死的";变音符号的键-例如,按^是一个死键;在按下下一个键之前,它似乎什么都不做;如果该键的扬抑符是允许的变音符号,它会将其替换为标记的键-也就是说,如果我按^,然后按a,我会得到â-但如果我按了一个不允许使用的变音字符的键,我会获得扬抑符后面跟着字母,例如,^后面跟着hh给我^h

我写了一个AHK脚本,为世界语添加了变音符号(见下文(。它曾经工作过";透明地";并且与上述行为相匹配。然而,最近,这种行为似乎发生了变化:它不再"燕子;变音符号,并在插入所需字符之前插入退格。

换句话说,如果我键入";听起来像英语"ch"的世界语字符是"ch";然后键入^然后键入c;是";使用ĉ,在下一次击键时,无论是什么,都会表现为我按下了^然后是那个键。

为什么?我该怎么解决这个问题?

#Hotstring ? C * 
; Esperanto diacriticalized characters
::^c::ĉ
::^C::Ĉ
::^g::ĝ
::^G::Ĝ
::^h::ĥ
::^H::Ĥ
::^j::ĵ
::^J::Ĵ
::^s::ŝ
::^S::Ŝ
::~u::ŭ
::~U::Ŭ

不知道我是否错过了一些简单的字符串,但如果不尝试做一些更进一步的欺骗,我就无法真正实现它。

我认为InputHook(docs(实现可以很好地工作
不过,这可能有些过头/愚蠢,因为它基本上只是为热字符串创建一个自定义实现。但好吧,至少它有效。

key_map := { "c": "ĉ"
, "g": "ĝ"
, "h": "ĥ"
, "j": "ĵ"
, "s": "ŝ"
, "u": "ŭ" }
ih := InputHook("V")
ih.OnChar := Func("OnChar")
ih.Start()
OnChar(_, char)
{
if (StrLen(char) != 2 || SubStr(char, 1, 1) != "^" || !(key := diacriticalize(SubStr(char, 2))))
return
fObj := Func("SendReplacement").Bind(key)
SetTimer, % fObj, -0
}
diacriticalize(key)
{
global key_map
if key is upper
return Format("{:U}", key_map[key])
else
return key_map[key]
}
SendReplacement(key)
{
SendInput, % "{BS 2}" key
}

那么发生了什么?

首先,定义了密钥替换的映射
^添加任何额外的死键组合都可以。

输入挂钩仅使用V(docs(选项创建
这使得它在处理输入时不会消耗输入。

然后,使用.OnChar(docs(,我们定义了一个函数,该函数在每次输入接收到新字符时运行
函数总是只接收一个字符,除非使用死键,否则它将接收例如^c
这就是为什么我们检查输入长度是否为2,以及为什么我们使用SubStr()(docs(^c转换为仅c
SubStr(char, 1, 1) != "^"还确保按下的死键是^,而不是例如¨。否则CCD_ 12将产生CCD_。

然后在用户定义的函数diacriticalize()中,我们从key_map返回相应的变音符号化密钥(如果可能的话(。如果输入键是大写的,则返回变音符化的大写键
如果key_map中没有匹配的密钥,则不返回任何内容。这使得|| !(key := ...)部分在输入键无效的情况下也会返回。

然后,定时器(docs(的欺骗只是为了在另一个线程中执行OnChar()函数之外的替换,以避免发送命令过早运行的问题
基本上周期-0只是意味着立即运行一次
计时器将要执行的函数定义为一个函数对象,该函数对象与.Bind()(docs(绑定了一个参数(键(。

好吧,我不确定为什么它是这样工作的,但我可以通过关闭自动退格并手动添加我自己的退格来让它工作。修订后的AHK脚本如下:

#Hotstring ? C * B0
; Acts only as a supplement to a keyboard that (a) does not
; have these characters defined _and_ uses ^ and ~ as "dead"
; keys to apply accents.
::^c::{bs 2}ĉ
::^C::{bs 2}Ĉ
::^g::{bs 2}ĝ
::^G::{bs 2}Ĝ
::^h::{bs 2}ĥ
::^H::{bs 2}Ĥ
::^j::{bs 2}ĵ
::^J::{bs 2}Ĵ
::^s::{bs 2}ŝ
::^S::{bs 2}Ŝ
::~u::{bs 2}ŭ
::~U::{bs 2}Ŭ
::^::^
::~::~

#Hotstring指令中的B0关闭自动退步。在原始脚本中该选项有效的情况下,键入^c将得到^cĉ,因此通过在其前面插入两个退格({bs 2}(,我在插入ĉ之前去掉了多余的^c

最后两行将插入符号和波浪号替换为它们本身,虽然没有明显的解释需要它们的原因,但它们确保了行为与标准的死键用法一致,因此,如果我键入^空格c

最新更新