我想使用AutoHotkey在剪贴板上实现sed like replacement。我已经尝试了几种不同的方法来实现它,虽然我想制作一些可以轻松扩展并且像sed一样功能的东西。理想情况下,它会采取行动并采取与sed相同的命令,并用输出替换当前剪贴板。由于我使用Ditto,我将同时保存原始和输出。
我想到并测试的解决方案是制作一个热串,它可以执行一个特定的sed替换,例如,使用RegExreplace:
; Make text in clipboard "Camel Case" (retaining all spaces):
:*:xcamelsc::
haystack := Clipboard
needle := "\h*([a-zA-Zåäö])([a-zåäö]*)\h*" ; this retains new lines
replacement := "$U1$2 "
result := RegExReplace(haystack, needle, replacement)
Clipboard =
Clipboard := result
ClipWait
sleep 100
send ^v
return
另一个例子是
;replace multiple underscore with one space
:*:xr_sc::
haystack := Clipboard
needle := "[\h]*[\_]+"
replacement := " "
result := RegExReplace(haystack, needle, replacement)
Clipboard =
Clipboard := result
ClipWait
return
这个系统的缺陷是我必须为我希望拥有的每种可能的组合制作~500个热弦组合(例如,一个单独的热串,使所有空间下划线)。我不确定如何轻松扩展它。
另一种方法是使用GUI预览输出,并可以执行更多操作,如clipboard replace中所实现的。为了令人满意,我已经制作了一个热字符串,打开GUI并填写初始替换,以及一个自动执行替换并粘贴输出的热键等。这个系统只要求我指定要替换的东西,但是我宁可有一个类似于上面的系统,它使用变量进行所有可能的替换,以便我可以参考例如/ ^ [\ t] //直接执行替换。
执行此操作的解决方案是在键入时激活热字符串 " xr [一串文字,表示要替换的内容] [一串文字,表示要替换的内容] xx" 即" xx"将单词键入,将其解析为命令,并执行它。 这意味着如果我键入" xr_sxx"," s" part将被解释为两个独立的变量," "将分配针和" s"将在表中查找,然后插入RegExReplace的替换变量。
有谁知道这样做的方法?
答案 0 :(得分:1)
这个系统只要求我指定要替换的东西,但是我 宁可有一个类似于上面使用变量的系统 对于所有可能的替换,以便我可以参考例如/ ^ [\ t] //到 直接进行更换。
有没有人知道这么做的简单方法?
我没有为每个方案指定Hotstring来执行类似的功能,而是使用了Hotkey,Input的方法,以及Associative Array's中存储的值}。
这是一个例子:
data := {"xcamelsc": ["\h*([a-zA-Zåäö])([a-zåäö]*)\h*", "$U1$2 "]
, "xr_sc": ["[\h]*[\_]+", " "]}
f1::
word := ""
key := ""
Loop {
input, key, V L1 M T1, {Space}{Enter}{Tab}
if (errorlevel == "EndKey:Space") {
if (data.HasKey(word)) {
sendInput % "{BackSpace " StrLen(word)+1 "}"
haystack := Clipboard
needle := data[word].1
replacement := data[word].2
result := RegExReplace(haystack, needle, replacement)
Clipboard =
Clipboard := result
ClipWait
sleep 100
send ^v
}
word := ""
Break
}
else {
word .= Format("{1:L}", key)
}
}
return
; Necessary for typing mistakes when using Input
$BackSpace::
word := SubStr(word, 1, -1)
sendInput, {BackSpace}
return
esc::exitapp