我想要一个 AHK 脚本,它可以重新映射
Control+v
,以便在非 CMD 终端(如 Bash 和 Putty)中按预期发送剪贴板。
每个终端都有不同的粘贴剪贴板的命令,记住当时应该使用哪个命令总是很烦人。而通常的
Control+C
、 Control+V
会导致出现一些奇怪的字符(^[[200~...~
),然后我需要手动删除。
我创建了以下脚本:
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance, Force
SetKeyDelay -1
^v::
sendRaw,% clipboard
return
效果“很好”,但有一些小问题:
当我复制期望紧随其后出现另一个字符的内容时,例如 ` ´ ^ ~,或期望成对出现的字符,例如 " ( [ {,它有一个奇怪的行为,而不是仅仅粘贴我的唯一字符在第一种情况下,我必须粘贴两次才能出现任何内容,然后删除一个重复的字符。在第二种情况下,当应用程序需要关闭时,例如 VScode、Intellij,而不是仅打印我复制的字符,它打印开始和结束字符,然后我必须删除后面的字符。
text mode
解决了几乎所有用例...
最后我不得不使用
#IfWinActive
,因为打印屏幕无法与该实现一起使用......
这就是最终的解决方案:
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance, Force
SetKeyDelay -1
#IfWinActive, ahk_exe mintty.exe
^v::
#IfWinActive, ahk_exe cmd.exe
^v::
#IfWinActive, ahk_exe putty.exe
^v::
send {Text}%clipboard%
return
在 PuTTY 中,插入热键顺序为 Shift+Insert。
我认为如果可以使用 AutoHotKey 拦截 Ctrl+V,并让它发送 Shift+Insert 到 PuTTY 窗口,这应该使 PuTTY 从剪贴板进行粘贴。 (我现在正在亲自尝试验证。)
那些奇怪的字符
^[[200~...~
是Xterm鼠标协议。如果使用鼠标按钮粘贴,您会得到相同的结果。它是一个包含粘贴数据的长转义序列。它要求另一端的程序理解该协议。例如,Vim 就支持它。
PuTTY 并不总是处于此 Xterm 鼠标模式。我发现它以某种方式“意外”进入该模式,并且即使发出正确的转义序列以退出该模式也不会退出该模式。这可能会很麻烦。
我怀疑如果 Vim 处于 Xterm 鼠标模式,无论你如何粘贴,你都会得到那些有趣的字符。也就是说,PuTTY 的粘贴功能就是这样做的,除了关闭 Xterm 鼠标模式之外,可能没有其他办法了。