如何实现类似MacOS(EN Intl)的德国变音符行为?

问题描述 投票:1回答:1

我有一个新的Windows 10笔记本电脑,而我长时间运行MBP。在MacO上,我使用US Intl kezmap,我非常喜欢写德语变音符号的快捷方式。

在MacOS上,我使用{RAlt} + {u},后跟{a},{o},{u}或{s}来编写相应的德语Umlaut。要写大写变音符号,我必须按{Shift} + {a},{o}或{u}。

我尝试编写AHK脚本来重现此行为,但是很遗憾,我没有成功。

我当前创建的是这个。

;Umlaut
#Persistent

    RAlt & a::
        GetKeyState, state, Shift
        if state = U
        SendInput {ASC 0228}            ;RAlt+a = lower case a-umlaut
        else Send, {ASC 0196}           ;RAlt+Shift+a = UPPER CASE A-umlaut
    return

    RAlt & o:: 
        GetKeyState, state, Shift
        if state = U
        SendInput {ASC 0246}            ;RAlt+o = lower case o-umlaut
        else Send, {ASC 0214}           ;RAlt+Shift+o = UPPER CASE O-umlaut
    return

    RAlt & u:: 
        GetKeyState, state, Shift
        if state = U
        SendInput {ASC 0252}            ;RAlt+u = lower case u-umlaut
        else Send, {ASC 0220}           ;RAlt+Shift+u = UPPER CASE U-umlaut
    return

    RAlt & s:: Send, {ASC 0223}     ;RAlt+s = RAlt+s, Eszett
    return

它有效,但是我真的想要上面描述的按键组合。我如何达到这个目标?

autohotkey keymapping
1个回答
1
投票

首先要修复原始文章中看到的代码,这是非常古老的,并且使用了许多奇怪的方法。列出并修复所有问题:

#Persistent对我们无能为力。这里没用。

#Persistent类型的热键标签应使用修饰符,并看起来像RAlt & key::>!key::修饰符表示右alt。

旧版>!的使用>!应该由GetKeyState功能代替。虽然,实际上根本不需要。移位热键修饰符command应该仅按如下方式使用:

GetKeyState()

我也放弃了GetKeyState()的使用,因为我认为没有理由使用它们。我猜想这将使脚本文件更灵活,可以使用更原始的编码进行保存,但是[]

所以这是您帖子中正确执行的代码。


现在执行您实际要执行的操作:按+进入变音键入模式

我可以想到的最简单的方法就是使用>!a::SendInput, ä >!+a::SendInput, Ä >!o::SendInput, ö >!+o::SendInput, Ö >!u::SendInput, ü >!+u::SendInput, Ü >!s::SendInput, ß 创建上下文相关的热键。通常,由于其缺点(如文档中所述),我不建议在AHK v1中使用ASC codes,但是对于像这样的小脚本,它会更好。这使它变得更加容易和整洁。

因此,首先创建一个RAlt + u热键,它将某些变量的状态设置为#If

#If

如您所见,不幸的是,由于每次都是#If,所以我们不得不摆脱那些甜美干净的单线热键,并以RAlt + u结束代码执行。当然,可以使用一些更高级的AHK来压缩它,但是我将使其保持简单。而且里面的小true行要使初始>!u::UmlautTypingMode := true Then we can create context sensitive hotkeys by always first checking the value of that variable: >!u::UmlautTypingMode := true #If, UmlautTypingMode ;start context sensitive hotkeys (if the variable value evaluates to true) a:: SendInput, ä UmlautTypingMode := false return +a:: SendInput, Ä UmlautTypingMode := false return o:: SendInput, ö UmlautTypingMode := false return +o:: SendInput, Ö UmlautTypingMode := false return <!u::return u:: SendInput, ü UmlautTypingMode := false return +u:: SendInput, Ü UmlautTypingMode := false return s:: SendInput, ß UmlautTypingMode := false return #If ;end context sensitive hotkeys 按不产生false


所以应该这样。至少对我来说效果很好。不过,我现在才意识到,在“ {RAlt} + {u}后接{a},{o},{u}或{s}”

可能意味着您将继续输入只要按住RAlt键就不会发声。如果是这种情况,则代码需要进行一些调整。现在,您按并释放 return进入变音键入模式

最后,作为a bonus

,这是压缩为单一代码的代码。我知道,这很愚蠢,我无法抗拒,我喜欢做这些哈哈。
<!u::return

此外,不知道这是否适用于不同的键盘布局。至少对我有用。


编辑:

请求超时是评论。使用RAlt + u非常方便。因此,我们将ü热键更改为此:
RAlt + u

计时器周期内的负数表示它在2000ms后仅运行一次

现在我们当然还必须创建标签>!u::UmlautTypingMode := true #If, UmlautTypingMode a:: +a:: o:: +o:: u:: +u:: s::SendInput, % ((A_ThisHotkey = "s"), UmlautTypingMode := false) ? "ß" : ("¨" ((A_ThisHotkey ~= "\+") ? Format("{:U}", SubStr(A_ThisHotkey, 0)) : SubStr(A_ThisHotkey, 0))) >!u::return #If (它不是内置的东西,我们可以在此处使用任何名称) )。

timer

例如,该标签可以放在脚本的底部。

© www.soinside.com 2019 - 2024. All rights reserved.