Wie entferne ich führende Tabulatoren und / oder Leerzeichen, wenn ich Daten in die Zwischenablage kopiere?

13

Ich brauche eine Möglichkeit, führende Einrückungen (Tabulatoren und Leerzeichen) von Daten zu entfernen, die aus Notepad ++ in die Zwischenablage kopiert wurden.

Die Daten im Notepad ++ - Dokument selbst sollten weiterhin diese führenden Einrückungen aufweisen, und die in die Zwischenablage kopierten Daten sollten dies nicht tun.

Dieses Verhalten sollte nur durch STRG + C und nur dann ausgelöst werden, wenn ich mich in Notepad ++ befinde.


Folgendes passiert in Notepad ++, wenn ich den Text regelmäßig mit der Maus markiere:

Bildbeschreibung hier eingeben

Das sollte sich in der Zwischenablage befinden, nachdem ich den Text regelmäßig markiert und kopiert habe:

Bildbeschreibung hier eingeben


Anmerkungen:

  1. Die Bilder sollen nur meine Bedürfnisse besser veranschaulichen - meine tatsächlichen Codes sind länger.
  2. Ich fragte auch darüber hier .
  3. Ich frage dies, weil ich eingerückte Codeblöcke nicht in das Linux-Terminal einfügen kann, wenn diese Codeblöcke catHeredokumente enthalten (hat mit der Verarbeitung von Heredokument-Begrenzern zu tun, eine lange Geschichte).
JohnDoea
quelle
Wie viele Zeilen und Zeichen möchten Sie kopieren? IE wäre es machbar, die führenden Leerzeichen zu entfernen, zu kopieren und dann die Änderungen rückgängig zu machen?
FCTW
Was ist, wenn die Datei oder einige Zeilen keine führende Registerkarte haben? warum willst du es immer tun
Phuclv
1
Warum brauchst du das? Was macht das führende Whitespace nervig?
Mrjink
In der Schale? Das sollte kein Problem sein. Wenn es in vim ist, betrachten Sie :set paste.
Mrjink
In der Schale, nicht in Vim. Es ist ein Problem, denn wenn Sie Codes mit catheredocs einfügen - ist es .
JohnDoea

Antworten:

7

Betrachten Sie das folgende AutoHotKey (AHK) -Skript . Weitere Erläuterungen zu AutoHotkey-Skripten finden Sie im AutoHotkey-Tutorial und in der Dokumentation.

Drücken Sie nach der Installation von AutoHotKey Ctrl+ Shift+ coder xin Notepad ++, um die abgeschnittenen Zeilen in die Zwischenablage zu kopieren (oder auszuschneiden ).

Hinweis: Ich habe Ctrl+ verwendet, Shiftdamit Sie immer noch die Originalkopie verwenden und normal nur mit schneiden können Ctrl. Wenn Ihnen dieses Verhalten nicht gefällt, entfernen Sie es einfach +in beiden +^c::und +^v::.

;Eine Erklärung finden Sie in den Kommentaren (beginnend mit ). Wie bei jeder Codierung sollten Sie die Kommentare berücksichtigen, um das Skript besser zu verstehen, wenn Sie später darauf zurückkommen.

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
Steven
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Geselle Geek
Steven Ich würde weitere 50 Punkte geben, aber aus irgendeinem Grund kann ich nicht. Mir ist aufgefallen, dass beim Kopieren auf Hebräisch tatsächlich Inhalte ctrl+zgelöscht werden und ich dann die gelöschten Inhalte wiederherstellen muss. Das ist etwas problematisch. Ich verstehe, dass so etwas wie der folgende Code verwendet werden könnte? if !LangID := EN { return }. Das Hinzufügen zu Beginn des Skripts verursachte einen Fehler, und das Umbrechen des Skripts mit einer ähnlichen Version plus einem else { return }Fehler nach dem Schließen funktionierte nicht.
JohnDoea
1
Sie können keine Funktionsdefinition TrimClipboard(){ ... }in eine ifAnweisung einfügen. Fügen Sie die ifAnweisung in die Funktion oder um die Befehle einSend, ... TrimClipboard()
Steven
Hallo lieber Steven. Bei meinen Versuchen hat es nicht funktioniert. Ist das ein Fehler in der Sprache? Ich ausführlich hier: autohotkey.com/boards/…
JohnDoea
Ich habe gerade eine Lösung in derselben Diskussion veröffentlicht: autohotkey.com/boards/…
JohnDoea
3

Verwenden Sie einfach Alt + Mouse dragging oder Alt + Shift + Arrow keys, um die Spalte auszuwählen und dann Ctrl+C, um die Spalte zu kopieren.

Siehe dieses Beispiel: https://notepad-plus-plus.org/fr/features/column-mode-editing.html

Bearbeiten:

Wir können auch die gesamte Spalte oder sogar mehr als eine Spalte auswählen. Wir können auch eine oder mehrere Zeilen auswählen.

Hier ist eine einfache Möglichkeit, dies zu tun:

  • Linke Maustaste am Anfang der gewünschten Auswahl.

  • Gehen Sie zu der Stelle, an der die gewünschte Auswahl enden muss

  • Bewegen Sie den Cursor an die zweite und letzte Stelle mit:

    • Drücken Sie die Tasten ALT+ SHIFTund left clickgleichzeitig a, um die gewünschten Spalten und Zeilen auszuwählen.

Ich hoffe das hilft

Yacine
quelle
1
Ich füge meiner vorherigen Antwort einige weitere Details hinzu und hoffe, dass dies hilft.
Yacine
1
Dies funktioniert nur, wenn alle Zeilen die gleichen führenden Tabulatoren oder Leerzeichen haben
phuclv
1
Eigentlich ja, und die Frage war, dass die Zeilen dasselbe Format haben
Yacine
1

Hier ist eine portable Lösung mit Java

Der erste Schritt ist natürlich die Installation von Java

Trimmer.javaFügen Sie als Nächstes Folgendes in eine Datei mit dem Namen in Ihrem Benutzerverzeichnis ein (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);
    }
}

Öffnen Sie dann eine Eingabeaufforderung und geben Sie Folgendes ein

javac Trimmer.java

Sie sollten jetzt eine Trimmer.class-Datei in demselben Ordner haben. Sie können die Datei Trimmer.java jetzt löschen.


Zum jetzigen Zeitpunkt haben wir ein Programm, das alle führenden und nachfolgenden Leerzeichen aus jeder Zeile in der Zwischenablage entfernt, aber wir brauchen noch eine Möglichkeit, es bequem auszuführen. Machen wir einen Hotkey dafür!

Erstellen Sie zunächst eine Verknüpfung zur Eingabeaufforderung (klicken Sie mit der rechten Maustaste auf C: \ Windows \ System32 \ cmd.exe).

Klicken Sie dann mit der rechten Maustaste auf diese Verknüpfung und wählen Sie "Eigenschaften". In diesem Fenster müssen wir einige Dinge tun. Auf der Registerkarte "Verknüpfung" sollte sich eine Option "Ziel" befinden, die so etwas wie sagt

%windir%\system32\cmd.exe

Ändern Sie es, um zu sagen

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

Dies führt dazu, dass die Eingabeaufforderung einfach unser Programm ausführt und beendet, wenn wir diese Verknüpfung verwenden.

Klicken Sie anschließend auf das Feld "Tastenkürzel" und drücken Sie den Hotkey, der die Textersetzung auslösen soll. Ich empfehle Ctrl+ Shift+ Cfür die Benutzerfreundlichkeit!

Ändern Sie abschließend die Option "Ausführen" in "Minimiert", da nicht jedes Mal ein Fenster auf dem Bildschirm angezeigt werden soll, wenn Sie die Verknüpfung verwenden.


Nach alledem sollten Sie in der Lage sein, den folgenden Workflow zu verwenden:

  1. Kopieren Sie den Text mit CtrlC
  2. Beschneiden Sie den Text mit Ctrl+ Shift+C
  3. Fügen Sie den zugeschnittenen Text mit ein CtrlV
Ryan Hilbert
quelle
Hallo Ryan. Ich suche nach einer Möglichkeit, alles mit STRG + C alleine zu machen, solange ich in Notepad ++ bin. Gibt es auch eine Möglichkeit, dieses Skript zu starten, wenn ich Windows starte?
JohnDoea
0

Vielleicht fehlt mir etwas, aber alle anderen Antworten scheinen die Lösung zu komplizieren. Wenn ich richtig verstanden habe, ist alles, was Sie tun möchten, führende Leerzeichen (Leerzeichen oder Tabulatoren) zu entfernen und Sie haben die Daten in Notepad ++ verfügbar

In diesem Fall ist die Lösung einfach. Öffnen Sie Ihre Datei inNotepad++ >> Search >> Replace... or Ctrl+H

Finden Sie was :^( *)[ ]|^\t*

Ersetzen durch : leer lassen

Um alle von uns verwendeten führenden Leerzeichen ^( *)[ ]und alle führenden Tabulatoren zu finden, verwenden wir ^\t*, um alle führenden Leerzeichen oder alle von uns verwendeten führenden Tabulatoren mit dem Operator oder zu finden |. Stellen Sie sicher, dass im Ersetzungsfenster die Option Regulärer Ausdruck ausgewählt ist.

Es sollte ziemlich schnell beendet werden, auch wenn es sich um eine große Datei handelt. Schließen Sie das Ersetzen-Fenster und wählen Sie Alle aus (Strg + A) >> Kopieren (Strg + C)

JordanGS
quelle
Eigentlich nein, ich möchte sie in der Akte behalten. Ich brauche nur die Zwischenablage-Version, um sie nicht zu haben.
JohnDoea
@Benia Ja, das habe ich verstanden. Ich würde die Datei nach dem Kopieren der Daten einfach nicht speichern, da sie nicht benötigt wird. Der Grund, warum ich es vorgeschlagen habe, ist, dass ich Notepad ++ sehr häufig verwende und es für mich ärgerlicher wäre, die Funktionsweise des Kopiervorgangs zu ändern, als die Datei mit einem regulären Ausdruck zu kopieren und nicht zu speichern. Da es nur in diesem einen Fall ist, in dem ich keine Hauptfiguren haben möchte, würde ich es in 90% aller anderen Fälle tun.
JordanGS
0

Meine Antwort basiert auf der Antwort von Steven, die ich als korrekt markiert habe (ich hatte jedoch einige Probleme damit und habe versucht, sie zu bearbeiten, obwohl meine Bearbeitung abgelehnt wurde).

Dies ist der Code, der für mich am besten funktioniert hat:

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

Unterschiede zum Originalcode von Steven:

  • Ich habe SendMode Input aus dem Kopf des Befehls entfernt, weil es aus irgendeinem Grund mein Skript kaputt gemacht hat.
  • Ich habe die Umschalttaste aus beiden Tastenkombinationen entfernt, weil ich persönlich die meiste Zeit lieber ohne sie arbeite.
  • Ich ersetzte Send, ^cund Send, ^xmit Send, ^{sc02e}undSend, ^{sc02d} sind. Dies verhindert einen Fehler beim Löschen von Texten im hebräischen Modus und in einigen anderen nicht englischen Sprachmodi.
  • Ich habe die Kommentare entfernt.
JohnDoea
quelle