微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AHK和US-INT键盘:为什么“死”键不再被吞?

如何解决AHK和US-INT键盘:为什么“死”键不再被吞?

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

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

换句话说,如果我输入“听起来像英语'ch'的世界语字符是”,然后输入^然后c,它替换 "is" 后面的空格带有 ĉ,在下一次击键时,无论是什么,就像我按下了 ^ 然后那个键一样。

为什么?以及如何解决这个问题?

#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) != "^" 还确保按下的死键是 ^,而不是例如 ¨。否则 ¨c 会产生 ĉ

然后在用户定义的函数 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}Ŭ
::^::^
::~::~

B0 指令中的 #Hotstring 关闭自动退格。如果该选项在原始脚本中生效,输入 ^c 将导致 ^cĉ,因此在它之前插入两个退格符 ({bs 2}) ,我在插入 ^c 之前去掉了无关的 ĉ

最后两行,用自己替换插入符号和波浪号,没有明显的解释,因为需要它们的原因,但它们确保行为与标准死键用法一致,所以如果我输入 ^spacec 我得到预期的 ^c 而不是意外的 ĉ

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。