AutoHotKey 脚本的内容感知

Content awareness of AutoHotKey script

AutoHotKey 有内容识别功能吗?我需要在我的应用程序中替换一些 selected 文本。想象一下以下 CSHTML:

@
{
    ViewBag.Title = "Welcome";
}

<p>Welcome to this page</p>

我创建了一个非常简单的脚本,即(selected 文本):

  1. 清除剪贴板
  2. 发送CTRL+C
  3. 发送@normalize("
  4. 发送CTRL+V
  5. 发送")

也就是说,如果我select Welcome to this page,它将被替换为@normalize("Welcome to this page")。那部分工作得很好。

但是,如果我想用相同的内容替换 "Welcome",我将不得不 select 引号,这大大降低了这个自动化脚本的速度,因为我不能简单地双击单词并 select 它。现在我必须按住鼠标,然后在屏幕上拖动鼠标,直到它到达最后一个结束引号。

相反,我需要我的 AutoHotKey 脚本来执行如下操作:

Send CTRL + C;
var caret = currentCaretTextPosition; //made up
IF caret+1 IS "
    Send Delete
IF caret-1 IS "
    Send Backspace
Send @normalize("
Send CTRL+V
Send ")

如果说得通。基本上将 "Welcome" 转换为:

  1. ""
  2. @normalize("
  3. @normalize("欢迎光临
  4. @normalize("Welcome")

这是非常基本的内容感知内容,因为它会检查插入符号周围的字符,然后对其进行操作。

AutoHotKey 脚本(由 CTRL+ALT+SHIFT+X 触发):

^!+x::
clipboard:=""
While clipboard
Sleep 10
While !clipboard
{
    Send ^c
    Sleep 100
}
Sleep 20
Send @normalize("
Sleep 20
Send ^v
Sleep 20
Send ")
return

我做了一个不太可靠的修复,但不幸的是它需要我使用另一个我不喜欢的键绑定:

^!+z::
clipboard:=""
While clipboard
Sleep 10
While !clipboard
{
    Send ^x
    Sleep 100
}
Sleep 20
Send {Right}
Sleep 5
Send {BackSpace}
Sleep 5
Send {BackSpace}
Send @normalize("
Sleep 20
Send ^v
Sleep 20
Send ")
return

它可以满足我上面的要求,但不是很防弹。

此解决方案将检查是否有周围的引号并相应地进行。如果右边没有任何内容(例如文件末尾),它可能会失败。如果最初没有选择任何内容,它确实会停止。它不会检查所选内容是否已包含引号。

^!+x::
clipboard := ""
Send , ^x
ClipWait , 1
If ErrorLevel
    Return
sNormalize := clipboard
clipboard := ""
Send , {right}+{left 2}^c
ClipWait , 1
Send , % ( clipboard = """""" ? "{del}" : "{left}{right}" )
clipboard := "@normalize""" . sNormalize . """)"
Send , ^v
Return

题外话但我想我会提到它

如果您有很多这样的代码片段,可以选择 Lintalist,它是在 AutoHotkey 中开发的,因此您可以使用自己的脚本和插件对其进行扩展。上面的脚本可以替换为以下代码片段 - 这里它使用编辑器中的选定文本,但您也可以使用剪贴板:

@
{
    ViewBag.Title = "[[selected]]";
}

<p>[[selected]]</p>

您可以按应用程序 and/or 语言将片段分组到捆绑包中,分配热键并搜索它们。

您可以在此处了解有关 Lintalist 的更多信息https://lintalist.github.io/ - available plugins here https://lintalist.github.io/#InteractiveBundleText