如何使用AutoHotkey删除当前行?

时间:2017-09-25 19:38:36

标签: autohotkey

使用AutoHotkey脚本我想设置键盘命令Ctrl+D以删除任何活动Windows应用程序中的当前行。

如何?

4 个答案:

答案 0 :(得分:1)

^d::Send {Home}{ShiftDown}{End}{Right}{ShiftUp}{Del}

可能无法在所有边缘情况下工作,但在记事本中传递了一些非常基本测试。 =〜)

答案 1 :(得分:1)

HaveSpacesuit的答案有效,但在使用它一段时间后,我意识到它会删除活动线,有时会重新定位下面一行的间距。

这让我重新考虑他的解决方案。我尝试从后面走到前面,而不是从线的前面走到后面。这解决了重新定位的问题。

SendInput {End}
SendInput +{Home}
SendInput ^+{Left}
SendInput {Delete}

但仍有一个小问题。如果光标在空行上,上面有更多空行,则删除所有空行。

我不知道要替换没有这种行为的^+{Left}的关键组合,所以我必须编写更全面的解决方案。

^d:: DeleteCurrentLine()

DeleteCurrentLine() {
   SendInput {End}
   SendInput +{Home}
   If get_SelectedText() = "" {
      ; On an empty line.
      SendInput {Delete}
   } Else {
      SendInput ^+{Left}
      SendInput {Delete}
   }
}

get_SelectedText() {

    ; See if selection can be captured without using the clipboard.
    WinActive("A")
    ControlGetFocus ctrl
    ControlGet selectedText, Selected,, %ctrl%

    ;If not, use the clipboard as a fallback.
    If (selectedText = "") {
        originalClipboard := ClipboardAll ; Store current clipboard.
        Clipboard := ""
        SendInput ^c
        ClipWait .2
        selectedText := ClipBoard
        ClipBoard := originalClipboard
    }

    Return selectedText
}

据我所知,这不会产生意外行为。

但是,如果您正在使用剪贴板管理器,请务必小心,因为此脚本会根据需要使用剪贴板作为获取所选文本的中介。这将影响剪贴板管理器历史记录。

答案 2 :(得分:0)

如果您遇到需要针对不同程序执行不同行为的问题,您可以“复制”^ d命令以执行特定程序:

   } else {
       Debug.assert(x.kind === "B");
       return "C";
   }

这样,您的^ d命令在Excel和Gmail中的工作方式会有所不同。

答案 3 :(得分:0)

我有一种简单的方法来解决重新定位问题。不使用剪贴板。

重新定位问题是由于需要处理2个单独的案例。

  1. 如果一行中有现有文本, 我们要全部选中它们,然后删除文本(退格键1) 和退格键一次删除空行(退格键2)

  2. 如果它是空白行, 我们要删除空行(退格键1)

为满足以上两种情况,我引入了一个虚拟字符。 这样可以确保两个案件的行为相同。 因此,执行两次退格键,每次都会导致相同的转换。

简单

; enable delete line shortcut
^d::
    Send {Home}
    Send {Shift Down}{End}{Shift Up}
    Send d
    Send {Backspace 2}
    Send {down}
return 

这种方法的缺点, 撤消操作时,将出现虚拟字符“ d”。这是一个不错的权衡,因为我不经常撤消删除行。