Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Autohotkey 如何使用自动热键删除当前行?_Autohotkey - Fatal编程技术网

Autohotkey 如何使用自动热键删除当前行?

Autohotkey 如何使用自动热键删除当前行?,autohotkey,Autohotkey,使用自动热键脚本,我想设置键盘命令Ctrl+d,以删除任何活动Windows应用程序中的当前行 怎么做 可能不适用于所有边缘情况,但通过了记事本中的一些非常基本的测试。=~) HaveSpacesuit的答案是有效的,但在使用了一段时间后,我意识到它删除了激活的行,有时会重新定位下面行的间距 这让我重新思考他的解决方案。我没有从队伍的前面走到后面,而是试着从后面走到前面。这就解决了重新定位的问题 SendInput {End} SendInput +{Home} SendInput ^+{Lef

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

怎么做


可能不适用于所有边缘情况,但通过了记事本中的一些非常基本的测试。=~)

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
}
据我所知,这不会产生意外的行为


但是,如果使用剪贴板管理器,请小心,因为此脚本使用剪贴板(如有必要)作为获取选定文本的中介。这将影响剪贴板管理器的历史记录。

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

SetTitleMatchMode, 2 ; Makes the #IfWinActive name searching flexible
^d::Send {Home}{ShiftDown}{End}{Right}{ShiftUp}{Del} ; Generic response to ^d.

#IfWinActive, Gmail ; Gmail specific response
  ^d::Send {Home}{ShiftDown}{End}{Right}{ShiftUp}{Del} ; adapt this line for gmail
#IfWinActive ; End of Gmail's specific response to ^d

#IfWinActive, Excel ; Excel specific response.
  ^d::Send {Home}{ShiftDown}{End}{Right}{ShiftUp}{Del} ; adapt this line for Excel
#IfWinActive ; End of Excel's specific response to ^d

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

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

重新定位问题是因为需要处理两个单独的案例

  • 如果一行中有现有文本, 我们希望全部选中它们,并删除文本(退格1) 并再次退格以删除空行(退格2)

  • 如果是一个空行, 我们要删除空行(退格1)

  • 为了满足上述两种情况,我引入了一个虚拟角色。 这将确保两种情况的作用方式相同。 因此,退格2次,每次都会导致相同的转换

    简单地说

    ; enable delete line shortcut
    ^d::
        Send {Home}
        Send {Shift Down}{End}{Shift Up}
        Send d
        Send {Backspace 2}
        Send {down}
    return 
    
    这种方法的缺点是,
    撤消时将显示虚拟字符“d”。这是一个不错的折衷方案,因为我不经常撤消删除行

    谢谢!如果线上有任何文字,你的答案很有效。我更新了这个问题,删除了“of text”,因为我希望它能工作,即使行是空的。我知道,在这种情况下,只需按一下Delete键就可以了,但要保持肌肉记忆不变-我对答案做了一些调整。没什么特别的,但它应该适用于空行和文件的最后一行。适用于Word、SciTE4AutoHotkey和VisualStudio代码。这些handle-key命令中的每一个都有一点不同,但在每一个中的行为都是相同的。再次感谢!美好的希望这对将来的人有用。很棒的工作。不幸的是,我不能使用它,因为我经常删除行,这会使我的剪贴板太乱/也许有一种方法可以避免弄乱剪贴板。我只是在玩你的解决方案。它相当聪明。你不喜欢吗?好奇你对
    ^d::SendInput{End}{ShiftDown}{Home 2}{Left}{ShiftUp}{Delete}{Right}
    的看法解决了重新定位问题,只删除了一个空行
    ; enable delete line shortcut
    ^d::
        Send {Home}
        Send {Shift Down}{End}{Shift Up}
        Send d
        Send {Backspace 2}
        Send {down}
    return