Es ist dieses nervige Verhalten, das ich hier und da gelegentlich erlebt habe: Wenn Sie Text mit der Maus in der Konsole auswählen (dh kopieren), einfügen und feststellen, dass am Ende jeder Zeile zusätzliche Leerzeichen stehen. Das ist,
line 1
line 2
anstatt
line 1
line 2
Also nicht nur ein Leerzeichen am Ende jeder Zeile.
Ich konnte das Problem nicht zuverlässig reproduzieren und fand keine Antwort. Ich glaube, mit etwas Software manifestiert es sich erst nach einer Weile.
Aber ich habe gerade bemerkt, dass es im vim
ersten tmux
Fall gut funktioniert , wenn ich dieselbe Datei erst direkt von der Konsole aus und dann von dort aus öffne . Und nicht in letzterem. Betrachtet man TERM=xterm-256color
in der Konsole, und TERM=screen-256color
in tmux
, meine Vermutung ist , dass es mit Terminal zu tun hat , nicht richtig zu tun, oder nicht - Anwendungen ermöglicht es richtig zu machen. Eine vage Vermutung, nehme ich an. Die erste Frage lautet also: "Was genau verursacht es?"
Und der andere ist: "Wie gehe ich vor?" Der schlimmste Fall ist, wenn sich die Datei remote befindet. Ich habe es in gedit
letzter Zeit lokal kopiert und geöffnet . Jetzt habe ich angeblich die Möglichkeit, es in einer neuen Konsole zu öffnen (da ich hauptsächlich in tmux
Sitzungen arbeite ) und von dort zu kopieren. Könnte dies einfacher gemacht werden?
Wenn ich laufen vim
aus tmux
mit TERM=xterm-256color vim
, verhält es sich seltsam an . Als würde man keinen Hintergrund zeichnen, wo es keinen Text gibt. Und es scheint mir nicht in Ordnung zu sein, eine TERM
Variable zu ändern (was die Software glauben lässt, dass es sich um ein anderes Terminal handelt).
Wenn ich lokale Dateien bearbeite, mache ich das normalerweise :!gedit %
.
So copying from that is an option if you don't have an X11 connection.
Nicht mitscreen
ähnlichen Terminalemulatoren, AFAICT (TERM=screen*
). Aproposxsel
, guter Punkt, ich denke jetzt darüber nach, einenvim
Befehl zu erstellen , der einen Shell-Befehl ausgibt, der lokal ausgegeben werden soll, wie:XSelCommand %
->ssh server cat path/to/file | xsel
. Das scheint besser zu sein, als entfernte Dateisysteme zu mounten oder Dateien lokal zu kopieren.command! XSelCommand echo 'ssh ' . system('hostname')[:-2] . ' ' . shellescape('sh -c ''cat "$1"'' -- ' . shellescape(expand('%'))) . ' | xsel'
oder wie diesem:command! -range=% RXSelCommand echo 'ssh ' . system('hostname')[:-2] . ' ' . shellescape('sh -c ''cat "$1" | sed -n "<line1>,<line2>p"'' -- ' . shellescape(expand('%'))) . ' | xsel'
kann man den Inhalt von Dateien kopieren, nicht das, was ausgegeben wurde. Die einfachere Option wäre jedoch, die Datei lokalvim
über ssh zu öffnen und zu tun:%!xsel
. Oder noch:r!ssh HOST CMD
einmal:%!xsel
.xsel
stoßen: 1):%!xsel
funktioniert nicht, funktioniertvim
aber:%!xsel -i
, angeblich weilvim
Weiterleitungenstdout
sowiestdin
; Eine weitere Option ist:w !xsel
: 2) Das Kopieren von Dateien über 4000 Byte funktioniert nicht beim Einfügen inchrome
'stextarea
, funktioniert aber fürgedit
; Der Tab hängt ungefähr 10 Sekunden lang, aber danach wird nichts mehr eingefügt. Weißt du zufällig, was für eine magische Zahl das ist?gedit
nachchrome
mit der mittleren Maustaste.xsel
/ mittlere Maustaste aufxsel -b
/ Strg + V zu ändern , wobei ein etwas anderer Auswahlmechanismus verwendet wird, der möglicherweise anders fehlerhaft ist.Das sind eigentlich mehrere Fragen, und keine der Antworten überfliegt die interessanten Teile:
Die meisten Terminals (wie xterm) speichern die Daten, die Sie auf dem Bildschirm auswählen können. Dahinter befindet sich kein versteckter Teil, der dem Terminal mitteilt, dass die Anwendung einen Hintergrund ausfüllen soll.
Anwendungen aktualisieren den Bildschirm durch den Cursor zu bewegen, das Schreiben von Text (die tatsächlichen Räume umfassen kann - oder Laschen , die das Endgerät rendert als Räume) und Teile des Bildschirms zu löschen.
Das Löschen ist ein besonderes Problem (beim Auswählen / Einfügen), da viele Terminals (z. B. xterm) den gelöschten Bereich des Bildschirms mit der aktuellen Farbe füllen ( die Funktion zum Löschen der hinteren Farbe (bce) in der Terminalbeschreibung). Gleichzeitig werden in gelöschten Bereichen keine Zeichen mehr an diesen Positionen des Bildschirms gespeichert. Mit Terminals, die die Bildschirmdarstellung verwenden, können Sie alles außer dem gelöschten Bereich auswählen. (Als Sonderfall könnte Ihr Terminal Bereiche gelöscht haben, die von Text umgeben sind, und so tun, als wären sie Leerzeichen für die Auswahl).
All dies ist ein Ärgernis, und vor langer Zeit bot xterm eine Funktion zum Ignorieren der nachgestellten Leerzeichen. Die meisten anderen Terminals bieten dies nicht an. Und da dies eine Option ist, kann sie möglicherweise nicht aktiviert werden, wenn Sie xterm ausgeführt haben. Die meisten Terminalentwickler, die die Funktionen von xterm kopieren, kopieren die Optionen nicht.
Zu tmux gehen: Die bce-Funktion wird nicht unterstützt. Die Entwickler entschieden sich dagegen. Normale Anwendungen, die unter tmux ausgeführt werden, erzeugen also nachgestellte Leerzeichen. Wenn Sie die Terminalbeschreibung überschreiben, wird tmux verwirrt, da nicht bekannt ist, dass vim wirklich davon ausgeht, dass der Hintergrund mit der aktuellen Farbe gelöscht wird . Sie bekommen nur die Löschung. Keine Farbe.
Auf der anderen Seite haben die Entwickler des GNU-Bildschirms vor einiger Zeit beschlossen, die Funktion zu unterstützen. Es ist optional ...
Weiterführende Literatur:
highlightSelection
(xterm Handbuch)trimSelection
(xterm Handbuch)highlightSelection
)quelle
Terminals which use the on-screen representation
Was sind andere Arten von Terminals? Sind sie in Ihrer Antwort enthalten?As a special case, your terminal could have erased regions surrounded by text, which it will pretend are spaces for selection
Hier meinst du wahrscheinlich "als gelöscht markiert". Und was für Regionen sind das? Leerzeichen in der Mitte der Linie? Leere Zeilen, umgeben von Text? Dies sind wahrscheinlich die am wenigsten klaren.In vielen modernen Terminalanwendungen gibt es Einstellungen wie "Nachgestellte Leerzeichen kürzen" in den Maus- / Kopieroptionen. Diese sind für Konsole (KDE) & Yakuake vorhanden.
quelle
Das Kopieren und Einfügen von einem Terminalbildschirm wird niemals vollständig zuverlässig sein, da es sich um die Bildschirmausgabe anstelle des Originalquellmaterials handelt. Wenn einige Anwendungen auf ungewöhnliche Weise Text an das Terminal zurückgeben und das Terminal nicht in der Lage ist, den ursprünglichen Text zu erraten, können Sie oder das Terminal wahrscheinlich nicht viel dagegen tun.
Viele Informationen über den Originaltext gehen möglicherweise verloren, wenn er auf einem Terminal gerendert wird: Zum Beispiel, ob ein Leerraum durch eine Registerkarte oder eine Reihe von Leerzeichen erzeugt wurde oder ob zwei Textzeilen ursprünglich eine lange waren Zeile, die umbrochen wurde oder zwei separate Zeilen.
Das Terminal versucht sein Bestes, damit Sie den Originaltext kopieren und einfügen können, der auf dem Terminal wiedergegeben wurde, kann es jedoch nicht immer wissen.
Versuchen Sie als Experiment Folgendes:
less
diese Option , um eine Datei anzuzeigen, die sehr lange Zeilen enthält, die sich über mehrere Terminalzeilen erstrecken.less
Wählen Sie die gesamte logische Zeile aus, die mehrere physische Zeilen umfasst. Wenn Sie sie an einer anderen Stelle einfügen, wird sie als eine lange Zeile beibehalten.less
die physische Leitung des Bildschirms Zeile für Zeile neu gestrichen wurde und das Terminal nicht mehr wissen kann, dass die physischen Leitungen miteinander verbunden waren.YMMV bei diesem Experiment, weil Ihr Terminal (oder Ihre Version von
less
) möglicherweise mehr oder weniger clever ist als meins.Je dümmer die Software ist, die die Ausgabe erstellt hat, desto besser sind im Allgemeinen Ihre Chancen, genau das Originalmaterial kopieren und einfügen zu können.
cat
Zum einen ist es so dumm wie es nur geht. (Sie verstehen natürlich, dass "dumm" ein Kompliment ist!)Wenn Sie am Ende einer Zeile darunter ein zusätzliches Leerzeichen erhalten
tmux
, liegt dies wahrscheinlich daran,tmux
dass dieses Zeichen tatsächlich wiedergegeben wird. Denken Sie daran, dasstmux
dies eine eigene Terminalemulation durchführt und dann neue Terminalsequenzen erneut ausgibt, um sie auf dem zugrunde liegenden Terminal zu rendern. Vielleicht spiegelt es dieses Leerzeichen wider, weil es glaubt, dass es in einigen Fällen notwendig sein könnte, ein anderes Zeichen zu überschreiben, von dem es glaubt, dass es dort ist. Was auch immer der Grund sein mag, das Terminal hat wahrscheinlich keine Möglichkeit zu wissen, dass das Leerzeichen nicht wirklich Teil des ursprünglichen Inhalts ist.quelle
cat
eine Datei und die Ausgabe von zu kopierencat
. Zumindest in meinem speziellen Fall funktioniert es. Danke :) Aber wenn es eine lange Datei ist ... Nun, ich habe darüber nachgedacht, das Remote-Dateisystem (sshfs
) zu mounten , dann kann ich eine Dateigedit
zum Beispiel so bearbeiten, als wäre es eine lokale.xsel -bi < filename
sicher alle daraus kopieren ... Verwenden Sie aktuelle Version von xsel , obwohlUnter Verwendung von Fedora 17 Linux und des Konsolenterminalfensters öffne ich vim mit dem syntastischen vim-Add-On. Ich konnte diesen Fehler konsistent reproduzieren. Ich habe diese drei Python-Zeilen in vim eingefügt:
Dann wähle ich diese Linien visuell aus und füge sie hier ein:
Beachten Sie, wie in der zweiten Zeile Tonnen von Leerzeichen kopiert werden. Das wird sicher nervig.
Die Zeilen 1 und 3 werden wie erwartet kopiert, aber die zweite Zeile kopiert Leerzeichen bis zur äußersten rechten Stelle des Terminalfensters.
Umgehungslösung:
Bewegen Sie die markierte Linie (den Vim-Cursor) von den zu kopierenden Linien weg, bevor Sie sie mit der Maus auswählen. Dann erscheinen die zusätzlichen Leerzeichen nicht in dieser einen Zeile.
Ich vermute, es sind die Syntax- und Farbhervorhebungs-Add-Ons, die diese Probleme verursachen.
quelle
Ich habe auch
xterm-256color
die nachgestellten Leerzeichen beim Kopieren zwischen Terminals verwendet und mochte sie immer nicht, zum Beispiel beim Kopieren einer ganzen Datei zwischen zwei Remote-Servern. Am einfachsten finde ich es, die gesamte Datei zu kopieren und dann im Ziellauf auszuführen:Dadurch werden alle nachfolgenden Leerzeichen aus der gesamten Datei entfernt. Es ist schnell und einfach.
quelle
xterm-256color
scheint jetzt richtig zu funktionieren (Vollfarben und keine Probleme beim Zeichnen im Hintergrund) und verfügt über die BCE-Funktion (Back Color Erase). Sie können es in tmux aktivieren, indem Sie dies in Folgendes einfügen~/.tmux.conf
:set -g default-terminal "xterm-256color"
quelle