Nachfolgende neue Zeile aus der Zwischenablage entfernen, um die Ausführung auf dem Terminal zu verhindern?

9

Gibt es eine Möglichkeit, alles, was Sie kopieren, über einen Filter in die Zwischenablage zu kopieren? Idealerweise, um die nachfolgende Newline von etwas zu entfernen, das Sie kopieren, damit sie nicht automatisch im Terminal ausgeführt wird?

So sieht es aus, wenn ich den fraglichen Test kopiere, und manchmal vergesse ich, dass dies eine neue Zeile ist.
Geben Sie hier die Bildbeschreibung ein

Pureferret
quelle
Ich brauche das auch!
Nam G VU
also ist das bis heute noch unmöglich? scheinbar triviale Sache und kein Terminalemulator implementiert dies?
Anzeigename
@DisplayName siehe akzeptierte Antwort
Pureferret

Antworten:

5

Gute moderne Terminals unterstützen das Einfügen in Klammern : Wenn Sie den Einfügebefehl des Terminals verwenden, werden spezielle Escape-Sequenzen um den Inhalt der Zwischenablage gesendet. Wenn Ihre Shell das Einfügen in Klammern unterstützt, wird der Inhalt der Zwischenablage einschließlich aller Steuerzeichen unverändert eingefügt, und insbesondere eine nachfolgende neue Zeile löst die Ausführung des Befehls nicht aus.

Zsh ≥5.1 unterstützt das Einfügen in Klammern und ist standardmäßig aktiviert. Ältere Versionen können unterrichtet werden . Bash ≥4.4 unterstützt klammert einfügen , wenn Sie hinzufügen set enable-bracketed-paste onzu ~/.inputrc.

Wenn Ihr Terminal oder Ihre Shell das Einfügen in Klammern nicht unterstützt, können Sie eine Shell-Funktion definieren, die ohne den nachfolgenden Zeilenumbruch eingefügt wird.

In zsh ruft der folgende Befehl den Inhalt der Zwischenablage abzüglich nachfolgender Zeilenumbrüche ab und ruft ihn zur Bearbeitung auf (auch wenn mehrere Zeilen vorhanden sind):

print -z -- "`xsel -b`"

In Bash können Sie den Inhalt der Zwischenablage abzüglich nachfolgender Zeilenumbrüche in den Verlaufsstapel verschieben. Drücken Sie danach Up, um den Befehl zum Bearbeiten aufzurufen.

history -s -- "`xsel -b`"
Gilles 'SO - hör auf böse zu sein'
quelle
Das ist eine schöne Lösung! Arbeitet für mich in Ubuntu 18.04! Vielen Dank!
Nam G VU
4

Ja, verwenden Sie catdiese Option, um eine Datei einzufügen, tun Sie, was Sie möchten, und führen Sie sie dann aus.

Für diesen Fall:

$ cat > tmp
[paste][Ctrl+D]
$ tr -d '\n' <tmp | xclip # this remove all "new line" characters 
                          #  and copy back to clipboard
RSFalcon7
quelle
Und wie könnte ich es auf GUI-Ebene verwenden, wenn ich einen Befehl vom Browser (wie die Stapelantwort) in meine Shell kopiere ... Tatsächlich habe ich gestern mein Betriebssystem wegen eines solchen Copy-Paste ruiniert :)
Tomasz Kapłoński
2

Dadurch wird \evdie Zwischenablage in Bash 4.0 und höher ohne Zeilenumbrüche eingefügt:

pasteline() {
  local input=$(xsel -b)
  input=${input//$'\n'}
  READLINE_LINE=${READLINE_LINE:0:$READLINE_POINT}$input${READLINE_LINE:$READLINE_POINT}
  READLINE_POINT=$((READLINE_POINT+${#input}))
}

bind -x '"\ev": pasteline'

Ersetzen Sie xsel -bdurch pbpasteund installieren Sie bash 4 in OS X.

Lri
quelle
2

Mir wurde klar, dass wir es in einer Zeile schaffen können, inspiriert von der Antwort von @ RSFalcon7

mit xsel, um in die primäre Auswahl zu kopieren

cat | tr -d '\n' | xsel

[paste], 2 times[Ctrl-D]
wltprgm
quelle