【问题标题】:How do I delete the current line using AutoHotkey?如何使用 AutoHotkey 删除当前行?
【发布时间】:2020-05-23 14:08:35
【问题描述】:

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

怎么做?

【问题讨论】:

    标签: autohotkey


    【解决方案1】:
    ^d::Send {Home}{ShiftDown}{End}{Right}{ShiftUp}{Del}
    

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

    【讨论】:

    • 谢谢!如果该行有任何文字,您的答案将非常有用。我更新了问题以删除“文本”,因为即使该行为空,我也希望它能够工作。我知道在这种情况下只需按一下 Delete 键就可以了,但要尽量保持肌肉记忆不变。 :-D
    • 我对答案做了一些调整。没什么太花哨的,但它应该适用于空行和文件的最后一行。
    • 在 Word、SciTE4AutoHotkey 和 VisualStudio Code 中工作。每个处理键命令的方式都略有不同,但每个的行为都相同。再次感谢!
    【解决方案2】:

    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::SendInput {End} {ShiftDown}{Home 2}{Left}{ShiftUp}{Delete}{Right} 解决了重新定位问题,只删除了一个空行
    【解决方案3】:

    如果您遇到需要为不同程序提供不同行为的问题,您可以为特定程序“复制”您的 ^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 中的工作方式将有所不同。

    【讨论】:

      【解决方案4】:

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

      重新定位问题是由于需要处理 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”。不错的权衡,因为我不经常撤消删除行。

      【讨论】:

        猜你喜欢
        • 2019-12-17
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 2010-12-27
        • 2012-03-29
        • 1970-01-01
        • 2014-04-09
        • 2017-12-04
        相关资源
        最近更新 更多