我有一个新的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
它有效,但是我真的想要上面描述的按键组合。我如何达到这个目标?
首先要修复原始文章中看到的代码,这是非常古老的,并且使用了许多奇怪的方法。列出并修复所有问题:
#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例如,该标签可以放在脚本的底部。