如何在将数据复制到剪贴板时去除前导标签和/或前导空格?


13

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

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

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


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

在此输入图像描述

这是我定期标记文本并复制后应该在剪贴板中的内容:

在此输入图像描述


笔记:

  1. 这些图片只是为了更好地说明我的需求 - 我的实际代码更长。
  2. 我也在这里问过这件事。
  3. 我问这个是因为我不能将缩进的代码块粘贴到Linux终端中,如果这些代码块包含catheredocuments(与处理heredocument分隔符有关,这是一个很长的故事)。

你要复制多少行和字符?IE是否可以删除前导空格,复制,然后撤消更改?
FCTW 2017年

如果文件或其中的某些行没有前导标签怎么办?你为什么总想这样做?
phuclv 2017年

1
你为什么需要这个?是什么让领先的空白烦人?
mrjink

在壳?这应该不是问题。如果它进入vim,请考虑:set paste
mrjink

在shell中,而不是在Vim中。这是一个问题,因为当您使用catheredocs 粘贴代码时- 确实如此
John Doea

Answers:


7

请考虑以下AutoHotKey(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

评论不适用于扩展讨论; 这个对话已经转移到了聊天中
Journeyman Geek

史蒂文我会给予另外50分的赏金,但出于某种原因,我不能。我注意到在使用希伯来语进行复制时,实际上会删除内容,然后我必须执行ctrl+z以检索已删除的内容。这有点问题。我理解可以使用以下代码?if !LangID := EN { return }。在脚本的开头添加它会带来错误并使用类似的版本包装脚本加上else { return }在关闭后没有错误但是没有工作。
John Doea

1
您不能将函数定义TrimClipboard(){ ... }放在if语句中。将if语句放在函数内部或命令周围Send, ... TrimClipboard()
史蒂文

嗨亲爱的史蒂文。在我的尝试中,它没有用。这是语言中的错误吗?我长的详细位置:autohotkey.com/boards/...
JohnDoea

:我刚刚发表在同样的讨论的解决方案有autohotkey.com/boards/...
JohnDoea

3

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

请参阅此示例:https//notepad-plus-plus.org/fr/features/column-mode-editing.html

编辑:

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

这是一个简单的方法:

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

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

  • 将光标移动到第二个和最终位置,使用:

    • 点击ALT+ SHIFT键和a left click,同时选择所需的列和行。

希望这有帮助


1
我在之前的回复中添加了更多细节,希望对此有所帮助。
Yacine

1
这只适用于所有行具有相同的前导制表符或空格
phuclv 2017年

1
其实,是的,问题是,该线具有相同的格式
亚辛

1

这是一个使用Java的便携式解决方案

当然,第一步是安装Java

接下来,将以下内容粘贴到Trimmer.java用户目录中指定的文件中(C:\ Users \ your_name)

import java.awt.*;
import java.awt.datatransfer.*;

public class Trimmer{
    public static void main(String... lines) throws Exception{
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
        String str = (String)clip.getContents(null).getTransferData(DataFlavor.stringFlavor);
        lines = str.split("\n");
        str = "";
        for(String line: lines) str += line.trim() + '\n';
        StringSelection selection = new StringSelection(str.substring(0,str.length()-1));
        clip.setContents(selection,selection);
    }
}

然后,打开命令提示符并键入

javac Trimmer.java

您现在应该在同一文件夹中有一个Trimmer.class文件。您现在可以删除Trimmer.java文件。


此时,我们有一个程序将删除剪贴板中每一行的所有前导和尾随空格,但我们仍然需要一种方便的方法来运行它。让我们为它做一个热键!

首先,创建命令提示符的快捷方式(右键单击C:\ Windows \ System32 \ cmd.exe)

然后,右键单击此快捷方式并选择“属性”。在这个窗口中我们需要做一些事情。在“快捷方式”选项卡中,应该有一个“目标”选项,类似于

%windir%\system32\cmd.exe

改变它说

%windir%\system32\cmd.exe /C "java Trimmer"

这将导致命令提示符只是运行我们的程序并在我们使用此快捷方式时退出。

接下来,单击“快捷键”框,然后按您想要的热键来触发文本替换。我建议使用Ctrl+ Shift+ C以方便使用!

最后,将“运行”选项更改为“最小化”,因为我们不希望每次使用快捷方式时窗口都闪烁到屏幕上。


毕竟,您应该能够使用以下工作流程:

  1. 使用复制文本 CtrlC
  2. 使用Ctrl+ Shift+ 修剪文本C
  3. 使用粘贴修剪文本 CtrlV

嗨莱恩。我正在寻找一种方法来单独使用CTRL + C,只要我在Notepad ++中...还有,当我启动Windows时有没有办法启动这个脚本?
John Doea

0

也许我错过了一些东西,但所有其他答案似乎使解决方案复杂化。如果我理解正确你要做的就是删除前导空格(空格或制表符),并在Notepad ++中提供数据

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

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

替换为留空

为了找到我们使用的所有领先空间^( *)[ ]并找到所有前导标签,我们使用^\t*,以便找到我们使用或运算符的所有前导空格或所有前导标签|。确保在替换窗口中选择了正则表达式

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


实际上不,我想把它们保存在文件中。我只需要剪贴板版本没有它们。
John Doea,2017年

@Benia是的,我明白了。我不会在复制数据后保存文件,因为它不需要。我建议它的原因是因为我个人使用Notepad ++并且改变它的复制工作方式对我来说比使用正则表达式复制而不是保存文件更令人恼火。因为它只是在这个我不想要主角的情况下,在90%的其他情况下我会。
JordanGS

0

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

这是最适合我的代码:

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, ^cSend, ^x使用Send, ^{sc02e},并Send, ^{sc02d}分别。这可以防止希伯来语模式和其他一些非英语语言模式中的文本删除错误。
  • 我删除了评论。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.