使用AutoHotkey在剪贴板

时间:2016-05-07 17:03:59

标签: regex replace sed clipboard autohotkey

我想使用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的替换变量。

有谁知道这样做的方法?

1 个答案:

答案 0 :(得分:1)

  

这个系统只要求我指定要替换的东西,但是我   宁可有一个类似于上面使用变量的系统   对于所有可能的替换,以便我可以参考例如/ ^ [\ t] //到   直接进行更换。

     

有没有人知道这么做的简单方法?

我没有为每个方案指定Hotstring来执行类似的功能,而是使用了HotkeyInput的方法,以及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