将数据复制到剪贴板时如何删除前导制表符和/或前导空格?

将数据复制到剪贴板时如何删除前导制表符和/或前导空格?

我需要一种方法来从 Notepad++ 复制到剪贴板的数据中删除前导缩进(制表符和空格)。

Notepad++ 文档本身中的数据应该保留这些前导缩进,而复制到剪贴板的数据则不应该。

此行为应仅由 CTRL+C 启动,并且仅当我在 Notepad++ 中时才启动。


当我用鼠标定期标记文本时,Notepad++ 中发生的情况如下:

在此处输入图片描述

当我定期标记文本并复制后,剪贴板中应该显示以下内容:

在此处输入图片描述


笔记:

  1. 这些图像只是为了更好地说明我的需要 - 我的实际代码更长。
  2. 我也问过这个这里
  3. 我问这个问题是因为我无法将缩进的代码块粘贴到 Linux 终端中如果这些代码块包括catheredocuments(与heredocument分隔符的处理有关,说来话长)。

答案1

考虑以下自动热键(AHK)脚本。请参阅AutoHotkey 教程以及有关 AutoHotkey 脚本的更多解释的文档。

安装 AutoHotKey 后,按Ctrl+ Shift+cx在 Notepad++ 中将修剪后的线条复制(或剪切)到剪贴板。

注意:我使用了Ctrl+ Shift,以便您仍然可以使用原始副本并仅使用 正常剪切Ctrl。如果您不喜欢这种行为,只需删除和+即可。+^c::+^v::

请参阅注释(以 开头;)以获取解释。与任何编码一样,最好保留注释,以便稍后返回时更好地理解脚本。

SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.

TrimClipboard()
{
    ; Split each line of the clipboard into an array. 
    ; Note: Ignoring Cr (`r) prevents duplicate rows
    linesArray := StrSplit(clipboard, "`n", "`r")

    newClip := "" ; Initialize output string

    for index, element in linesArray
    {   
        ; For each line: trim it, append it and CrLf to output string
        newClip .= trim(element) . "`r`n" 
    }
    ; Note: There is always an extra newline at this point, regardless 
    ; of if the clipboard ended in a newline.

    ; Assign value back to clipboard, without the trailing CrLf
    clipboard := SubStr(newClip, 1, -2)
}

#IfWinActive ahk_class Notepad++
; On Shift+Ctrl+C, perform copy, wait for new content, and trim clipboard
+^c::
    ; Note: ^{sc02e} is the scancode for c which works regardless of keyboard layout
    Send, ^{sc02e}
    Clipwait
    TrimClipboard()
return

;On Shift+Ctrl+X, perform copy, wait for new content, and trim clipboard
+^x::
    ; Note: ^{sc02d} is the scancode for x which works regardless of keyboard layout
    Send, ^{sc02d}
    Clipwait
    TrimClipboard()
return

; sc02e && sc02d are keyboard scan codes for the keys c and x respectively.
; The scancodes work regardless of the keyboard layout set in Windows

#IfWinActive

答案2

只需使用 Alt + Mouse draggingAlt + Shift + Arrow keys选择列,然后Ctrl+C复制该列。

看这个例子:https://notepad-plus-plus.org/fr/features/column-mode-editing.html

编辑:

我们还可以选择整列,甚至多列,还可以选择一行或多行。

这是一个简单的方法:

  • 在所需选择的开始处单击鼠标左键。

  • 转到所需选择必须停止的位置

  • 将光标移动到第二个也是最后一个位置,使用:

    • 同时按下ALT+SHIFT键和 键left click,选择所需的列和行。

希望这有帮助

答案3

也许我遗漏了什么,但其他所有答案似乎都使​​解决方案过于复杂。如果我理解正确的话,您要做的就是删除前导空格(空格或制表符),然后就可以在 Notepad++ 中使用数据了

在这种情况下,解决方案很简单。在以下位置打开文件Notepad++ >> Search >> Replace... or Ctrl+H

找什么^( *)[ ]|^\t*

用。。。来代替留空

为了找到我们使用的所有前导空格^( *)[ ],以及找到所有前导制表符,我们使用^\t*,因此,为了找到所有前导空格或所有前导制表符,我们使用 或运算符|。确保正则表达式在替换窗口中被选中。

即使文件很大,它也应该很快完成。关闭替换窗口,然后全选 (Ctrl+A) >> 复制 (Ctrl+C)

答案4

我的回答基于史蒂文的回答,我将其标记为正确(但我遇到了一些问题,并且我尝试进行编辑,但我的编辑被拒绝了)。

这是对我来说最有效的代码:

TrimClipboard()
{
    linesArray := StrSplit(clipboard, "`n", "`r")

    newClip := ""

    for index, element in linesArray
    {   
        newClip .= trim(element) . "`r`n" 
    }

    clipboard := SubStr(newClip, 1, -2)
}

#IfWinActive ahk_class Notepad++
^c::
    Send, ^{sc02e}
    Clipwait
    TrimClipboard()
return

^x::
    Send, ^{sc02d}
    Clipwait
    TrimClipboard()
return

与 Steven 原始代码的区别:

  • 我从命令的头部删除了 SendMode Input,因为它由于某种原因破坏了我的脚本。
  • 我从两个组合键中删除了 Shift 键,因为我个人更喜欢大多数时候不用它来工作。
  • 我分别将Send, ^c和替换Send, ^xSend, ^{sc02e}Send, ^{sc02d}。这可以防止希伯来语模式和其他一些非英语语言模式下的文本删除错误。
  • 我删除了评论。

相关内容