Wie kann man nur an die Zwischenablage anhängen (aber aktuelle Daten nicht überschreiben)?

7

Ich habe eine ziemlich große Datei, ich muss den gesamten Inhalt irgendwo kopieren, aber wenn ich die Seite nach unten scrolle, werden alle von mir ausgewählten Daten nicht ausgewählt. Ich könnte einfach Block für Block kopieren und einfügen, aber ich würde es viel einfacher finden, da es viele Daten gibt, nur den Inhalt an das Ende der aktuellen Zwischenablagedaten anhängen zu können. Ist das möglich?

Auf diese Weise kann ich eine Tastenkombination verwenden, mit der ich diese in die Zwischenablage kopieren kann:

I am some nice new text.

Wenn das schon da ist:

I am the old text.

Und lassen Sie es beim Einfügen so aussehen:

I am the old text.
I am some nice new text.

Es gibt also 3 Dinge, die ich wirklich gerne hätte (ich hätte 3 separate Tastaturkürzel, um dies zu tun):

  1. Hängen Sie die Daten an das Ende der Zwischenablage an und lassen Sie sie RETURNdavor einfügen (wie im obigen Beispiel gezeigt).

  2. Hängen Sie die Daten an das Ende der Zwischenablage an, lassen Sie RETURNsie jedoch so, dass sie nicht davor stehen, damit sie zunächst in derselben Zeile fortgesetzt werden.

  3. Haben Sie dies alles, aber damit die Daten am Anfang der Zwischenablage vor allen Daten stehen, die aktuell dort sind.

Ich verwende Ubuntu GNOME 16.04 mit GNOME 3.20.


quelle
Würde es Ihnen etwas ausmachen, zwei Verknüpfungen zu verwenden (STRG + C zum Kopieren in die Standard-Zwischenablage und eine zusätzliche zum Anhängen des aktuellen Hauptinhalts der Zwischenablage an einen zweiten internen Puffer)? Sie müssten dann eine andere Verknüpfung verwenden, um diesen Puffer einzufügen, und eine andere, um ihn zu löschen.
Byte Commander
@ByteCommander: Könnte nicht alles zusammen in einem Skript oder so etwas automatisiert werden? Oder verstehe ich vielleicht nicht ganz, was du meinst?
Kleines Update: Ich habe einen Appindicator erstellt, der das Anhängen an die Zwischenablage ermöglicht. Dies ist möglicherweise für Benutzer vorzuziehen, die GUI-Tools mögen. Siehe: askubuntu.com/a/882821/295286
Sergiy Kolodyazhnyy

Antworten:

9

Es ist einfach, aber Sie müssen xselzuerst das Tool installieren :

sudo apt-get install xsel

TL; DR: Hier sind die Befehle, die Sie wahrscheinlich am Ende für Ihre Verknüpfungen verwenden möchten. Ich verwende die Versionen mit printfüberall für Einheitlichkeit und einfachere Anpassung, auch wenn eine einfachere Variante genug gewesen wäre:

  • Hängen Sie die Auswahl direkt an das Ende der Zwischenablage an:

    bash -c 'printf "%b%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • Fügen Sie die Auswahl nach einem Zeilenumbruch an das Ende der Zwischenablage an:

    bash -c 'printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • Fügen Sie die Auswahl direkt an den Anfang der Zwischenablage an:

    bash -c 'printf "%b%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    
  • Fügen Sie die Auswahl nach einem Zeilenumbruch an den Anfang der Zwischenablage an:

    bash -c 'printf "%b\n%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    

Sie alle enthalten das Zurücksetzen des Primärpuffers nach dem Anhängen an die Zwischenablage, um zu verhindern, dass derselbe Inhalt doppelt angehängt wird. Wenn Sie das nicht möchten, entfernen Sie das ; xsel -cam Ende jedes Befehls.


Lange Erklärung:

Sie müssen wissen, dass X 3 Puffer enthält, die primäre Auswahl, die sekundäre Auswahl und die Zwischenablage .

Sie kennen die Zwischenablage von Ctrl+ C, Ctrl+ Vusw. Es ist der Puffer, den Sie normalerweise zum Kopieren und Einfügen von Inhalten verwenden.

Die primäre Auswahl ist jedoch der Puffer, der immer automatisch den von Ihnen ausgewählten Text enthält, unabhängig davon, in welchem ​​Fenster er sich befindet und ohne zusätzliche Benutzerinteraktion.
Wir haben nur ein Problem: Der Puffer wird aktualisiert, sobald Sie ein Textschnipsel auswählen. Er wird jedoch nicht gelöscht, wenn Sie auf eine andere Stelle klicken, um die Auswahl abzubrechen. Es enthält weiterhin den Inhalt Ihrer letzten Auswahl.

Die sekundäre Auswahl wird nur von wenigen Programmen verwendet und ist für uns hier nicht interessant.


Das heißt, wir können das Verhalten von Ctrl+ Cmit diesem Befehl nachahmen, der die primäre Auswahl (zuletzt hervorgehobener Text) in die Zwischenablage kopiert:

xsel | xsel -ib

xselOhne Argumente wird der Inhalt der primären Auswahl in STDOUT gedruckt. xsel -abschreibt ( -i) die Daten von STDIN in die Zwischenablage ( -b).


Um Daten direkt an den aktuellen Inhalt der Zwischenablage anzuhängen (ohne Zeilenumbruch dazwischen), anstatt sie zu ersetzen, verwenden wir -astattdessen die Option -i. Dieser Befehl hängt das zuletzt ausgewählte Textausschnitt an den aktuellen Inhalt der Zwischenablage an:

xsel | xsel -ab

Wenn Sie wirklich einen zusätzlichen Zeilenumbruch oder eine andere Formatierung wünschen, können wir die Daten durch printfoder ein anderes Tool leiten, mit dem Sie sie verarbeiten möchten. Hier ist ein Beispiel, das sowohl die letzte Auswahl als auch den aktuellen Inhalt der Zwischenablage liest und sie mithilfe einer neuen Zeile zusammenfügt:

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib

xsel -bGibt den aktuellen Inhalt der Zwischenablage zurück. Die Formatierungszeichenfolge, printfdie %bals Platzhalter für die Argumente verwendet wird, \nstellt einen Zeilenumbruch dar. Weitere Informationen erhalten Sie printfdurch Eingabe man printf.

Durch Umschalten der beiden Argumente am Ende der Zeichenfolge können Sie ihre Reihenfolge umkehren und anstelle des Endes an den Anfang anhängen.


Wenn Sie vermeiden möchten, dass dieselben Daten versehentlich zweimal an die Zwischenablage angehängt werden (Sie müssen sie erneut auswählen, wenn Sie sie zweimal anhängen möchten!), Können Sie den primären Auswahlpuffer manuell löschen, nachdem der Befehl folgendermaßen ausgeführt wurde:

xsel -c

Führen Sie dies einfach nach dem grundlegenden Befehl zum Anhängen der Zwischenablage folgendermaßen aus:

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c

Wenn Sie dies alles wissen, können Sie Befehle für Ihre Tastaturkürzel schreiben, die genau das tun, was Sie wollen. Denken Sie jedoch daran, dass unsere Einzeiler alle Bash-Funktionen wie Piping stark nutzen. Sie müssen sie daher mit Bash ausführen:

bash -c 'COMMAND'

Im Abschnitt TL; DR oben in der Antwort finden Sie eine Befehlsliste, die zum Erstellen von Verknüpfungen geeignet ist.

Byte Commander
quelle
1
Beeindruckend! Das ist eine lange Antwort! : D
Die ursprüngliche Version hatte einen Fehler in allen printfBefehlen. Es fehlten einige Anführungszeichen, die dazu führten, dass alle Leerzeichen in den kopierten Daten ersetzt wurden. Es ist jetzt behoben.
Byte Commander
5

Der X-Server verfügt über mehrere Zwischenablagen. Die mit Ctrl+ Cwird als Zwischenablage bezeichnet. Diejenige, in der Sie etwas hervorheben, wird als primär bezeichnet. xclipermöglicht das Einfügen der Ausgabe von beiden. Zum Beispiel habe ich einen Teil Ihrer Frage kopiert, aber einen anderen Text im Terminal hervorgehoben:

Geben Sie hier die Bildbeschreibung ein

Sie können diese Idee auch in einem Skript verwenden, das mit einer Tastenkombination verbunden ist. Tatsächlich habe ich ein Skript geschrieben, das als Github-Gist veröffentlicht wird

Die Grundidee besteht darin, es an die Tastenkombination zu binden. Markieren Sie, was angehängt werden soll, und drücken Sie die Verknüpfung. Zum Beispiel habe ich meine an Ctrl+ Alt+ gebunden V. Genauer Befehl istpython /path/to/file.py

Anwendungsbeispiel:

  1. Markieren Sie das I have a rather large fileTeil aus Ihrem Beitrag und kopieren Sie es mit Ctrl+C
  2. Markieren Sie zum Beispiel etwas anderes That is so that I can have a keyboard shortcut
  3. Drücken Sie Ihre Verknüpfung (meine war Ctrl+ Alt+ V)
  4. Lassen Sie die angehängte Zwischenablage irgendwo mit Ctrl+ los V. Die resultierende Ausgabe ist:I have a rather large fileThat is so that I can have a keyboard shortcut

Skriptquelle

 import gi
    gi.require_version('Notify', '0.7')
    from gi.repository import Notify
    import subprocess
    import os
    import sys

    # This script is meant to be bound to keyboard shortcut

    def send_notification(title, text):
        Notify.init(sys.argv[0])
        n = Notify.Notification.new(title, text)
        n.show()


    def run_cmd(cmdlist):
        # function for running 
        try:
            stdout = subprocess.check_output(cmdlist)
        except subprocess.CalledProcessError:
              send_notification(sys.argv[0],"Clipboard error")
              sys.exit(1)
        else:
            if stdout:
                return  stdout



    # get contents of both clipboards
    clip = run_cmd("xclip -o -sel clip".split())
    primary = run_cmd("xclip -o -sel primary".split())

    # write to temp file contents
    # of both clipboards appended
    temp_file = "/tmp/append.clip"
    f = open(temp_file, "w")
    f.write( clip + primary  )
    f.close()

    # Read the new contents into clipboard
    run_cmd(("xclip -sel clip " + temp_file).split())

    # clean up
    os.remove(temp_file)

Anmerkungen:

  • xclip muss über installiert werden sudo apt-get install xclip
  • Ich habe einen Zwischenablage-Manager-Indikator für Ubuntu mit Unity- Desktop geschrieben, der reguläre Ausdrücke ( sedund den Python- reStil) verwenden kann, um eine wiederholte Zeichenfolge an die Zwischenablage anzuhängen. Wenn Sie beispielsweise häufig dieselbe Zeichenfolge immer wieder anhängen müssen, können Sie den folgenden Python- reRegex verwenden:

Geben Sie hier die Bildbeschreibung ein

Sergiy Kolodyazhnyy
quelle
1
"Lassen Sie die angehängte Zwischenablage irgendwo mit Strg + C los."? Sollte das nicht Strg + V sein ?
1
@ParanoidPanda ja, das war ein epischer Tippfehler;)
Sergiy Kolodyazhnyy
@ParanoidPanda Ich habe meine Antwort so bearbeitet, dass sie ein paar neue Informationen enthält. Ich habe einen Indikator erstellt, der Regex zum Bearbeiten der Zwischenablage verwendet. Wenn Sie also dieselbe Zeichenfolge immer wieder anhängen möchten, können Sie diesen verwenden.
Sergiy Kolodyazhnyy
2

Hier ist eine weitere sehr einfache Methode, die ein kurzes Bash-Skript verwendet. Stellen Sie zunächst sicher, dass Sie xclip installiert haben. Erstellen Sie dann Ihr Bash-Skript wie folgt:

#!bin/bash
p=$(xclip -selection primary -o)
c=$(xclip -selection clipboard -o)
new=$'\n'
echo "$c$new$p" | xclip -selection clip

Nennen wir diese Datei apndpc.sh und legen sie in einem Ordner ab, z. B. ~ / myscripts. Binden Sie nun einen benutzerdefinierten Schlüssel daran. Führen Sie dies über Systemeinstellungen >> Tastatur aus und klicken Sie auf die Registerkarte Verknüpfungen. Klicken Sie auf Benutzerdefinierte Verknüpfungen und dann auf + Zeichen, um die gewünschte Tastenkombination hinzuzufügen. In das Befehlsfeld geben Sie:

bash -c 'bash ~ / myscripts / apndclp.sh'

Definieren Sie dann Ihre Tastenkombination. Ich benutze ALT + 3, um die Aktion auszulösen.

Das ist es. Sie sind bereit für Ihren groß angelegten Kopiervorgang. Verwenden Sie die normale Strg + C-Taste (oder klicken Sie mit der rechten Maustaste und wählen Sie Kopieren), um den ersten Textabschnitt zu kopieren. Wählen Sie den nächsten Block aus (wählen Sie nur NICHT kopieren) und drücken Sie dann die Tastenkombination (ATL + 3). Dadurch wird der ausgewählte Text an die Zwischenablage angehängt. Mach so weiter, bis du fertig bist. Dann wie gewohnt einfügen, dh. STRG + v (oder mit der rechten Maustaste klicken und Einfügen auswählen), um den endgültig gesammelten Text zu speichern.

Wenn Sie die Zeichenfolgenmanipulation im obigen Skript nicht mögen, verwenden Sie stattdessen dieses Skript:

#!bin/bash
# this is another version of clipboard append tool
# here we use a temporary file to append highlighted text to the clipboard
# the temporary file is deleted at the end of the operation

tmpfile="file111000111"
xclip -selection clipboard -o  > $tmpfile   # first dump the current clipboard to the tmpfile
printf '\n' >> $tmpfile                     # then add new line
xclip -selection primary -o >> $tmpfile     # and finally add the highlighted text
cat $tmpfile | xclip -selection clip        # now read the file back into the clipboard
rm $tmpfile             # and remove the tempfile
elmclose
quelle
0

Ich benutze einen Zwischenablage-Manager namens clipit.

Wann immer ich dann die letzten Dinge auf der Tastatur sehen möchte, mache ich das auf der Konsole:

strings ~/.local/share/clipit/history

Der Verlauf der Zwischenablage wird getrennt durch gedruckt \n.

dfer
quelle