Kopiere / füge eine Textauswahl zwischen tmux und der Zwischenablage ein

15

Ich verwende die neueste Version von tmux (aus dem Git-Repository) und xclip (0.12) und möchte in der Lage sein, mit Emacs-ähnlichen Tastaturbefehlen den Text in der Zwischenablage zu verschieben, Auswahlen copy-mode( M-w) in die Zwischenablage zu kopieren und Einfügen ( C-y) von / in den Kopierpuffer in die Zwischenablage.

Bisher habe ich in der Lage gewesen Text einfügen mit C-y, und bewegen sich in copy-modemit Emacs-wie Tastaturbindungen, aber ich bin noch nicht Text kopieren von einem tmux Puffer (zB in copy-mode)

Ich habe diesen Thread zum Kopieren des gesamten Puffers in die Zwischenablage (und umgekehrt) gefunden, aber er scheint bei mir nicht zu funktionieren.

Außerdem wurde tmux-usersmir in der Mail-Liste mitgeteilt, dass die neuesten Versionen von tmux (nur im Git-Repo) einen aufgerufenen Befehl enthalten copy-pipe. Die Manpage sagt folgendes zu diesem Befehl:

Ein Befehl in akzeptiert ein Argument, copy-pipe, das die Auswahl kopiert und an einen Befehl weiterleitet. Das folgende Beispiel bindet 'C-q', um die Auswahl in / tmp sowie den Einfügepuffer zu kopieren:

       bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out"

Es sieht so aus, als ob copy-pipees teilweise verwendet werden soll, um die Auswahl an einen anderen Befehl weiterzuleiten. Es scheint auch einige Tippfehler in dieser Beschreibung und im Befehl zu geben (was ist das temacs-copy?)

Auf jeden Fall möchte ich Folgendes tun:

Kopieren:

  1. Aktivieren Sie den Kopiermodus
  2. Verschieben Sie in dem Text Ich möchte Emacs Navigationsbefehle zum Kopieren verwendet (dh C-f, C-b, M-f, M-b, C-a, C-eetc. , um den Cursor zu bewegen). Kein Präfix für irgendetwas davon.
  3. Kopieren Sie den ausgewählten Text in die Zwischenablage mit: M-w(auch ohne Präfix )

Einfügen:

  1. Ich möchte in der Lage sein, Text in das Terminal einzufügen C-y( ohne ihn eingeben zu müssen copy-mode) (auch ohne Präfix )

Ich habe folgendes zum Kopieren ohne Glück versucht:

bind-key -n M-w run "tmux save-buffer - | xclip -i -selection clipboard" 

Das Einfügen funktioniert jedoch hervorragend:

bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Das seltsame ist, dass ich weiß, dass der " xclip -i -selection clipboard" Teil des Kopierbefehls gut funktioniert, da ich Dinge in die Zwischenablage in der Befehlszeile kopieren kann , zB:

echo "Hello world. How are you?" | xclip -i -selection clipboard

Wie kann ich bei alledem eine Auswahl aus dem Kopiermodus in die Zwischenablage kopieren?

Amelio Vazquez-Reina
quelle

Antworten:

19

Verwenden Sie die folgenden tmux.confmit copy-pipein den neuen Versionen von tmux (1.8+):

set -g mouse on
# To copy:
bind-key -n -t emacs-copy M-w copy-pipe "xclip -i -sel p -f | xclip -i -sel c "

# To paste:
bind-key -n C-y run "xclip -o | tmux load-buffer - ; tmux paste-buffer"
  1. prefix+[ in den Kopiermodus
  2. Inhalt mit der Maus auswählen (gedrückt halten)
  3. M-w um diesen Teil in die Zwischenablage zu kopieren
  4. C-yFügen C-vSie es in tmux ein, um es in andere reguläre Anwendungen wie den Webbrowser einzufügen .
Josh
quelle
Diese Antwort verdient mehr Gegenstimmen, sie ist die beste für Linux-basierte Setups.
Louis Kottmann
In tmux 2.0 es ist run-shellstattrun
roign
@LouisKottmann: warum nur Linux-basiert?
Schaiba
Ich kann andere Systeme nicht kommentieren, aber ich glaube, dass Mac normalerweise bpaste anstelle von xclip verwendet
Louis Kottmann
In tmux 2.8 musste ich sie in ändern bind -Tcopy-mode M-w send-keys -X copy-pipe "xclip -i -sel p -f | xclip -i -sel c ". bind-key -n C-y run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer" gemäß diesem Commit, vorgeschlagen von starfry
azzamsa
5

Bitte beachten Sie, dass sich mit Tmux 2.4 (seit diesem Commit ) die Bindungssyntax geändert hat. Ich umschreibe diesen Github-Kommentar, um die Änderung kurz zusammenzufassen:

  1. ersetzen -tmit-T
  2. ersetzen vi-<name>mit<name>-mode-vi
  3. Stellen Sie dem Befehl Folgendes voran send-keys -X

Ich hatte:

bind-key -n -t vi-copy Enter copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -t vi-copy MouseDragEnd1Pane copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

was ich ändern musste:

bind-key -n -T copy-mode-vi Enter send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'
bind-key -n -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe 'xclip -i -sel p -f | xclip -i -sel c'

Aus dem Changelog :

Die Schlüsseltabellen haben wesentliche Änderungen erfahren. Modusschlüsseltabellen sind nicht mehr von den Hauptschlüsseltabellen getrennt. Alle Modustastentabellen wurden entfernt, zusammen mit dem Flag -t zum Binden und Aufheben der Bindung.

Die Tabellen "emacs-edit", "vi-edit", "emacs-choose" und "vi-choose" wurden durch feste Tastenzuordnungen in der Eingabeaufforderung und im Auswahlmodus ersetzt. Die Optionen für die Modustasten und die Statustasten bleiben erhalten.

Die Tabellen emacs-copy und vi-copy wurden durch die Tabellen copy-mode und copy-mode-vi ersetzt. Befehle werden mit den Flags -X und -N an Sendeschlüssel gesendet. Also folgendes:

bind -temacs-copy C-Up scroll-up
bind -temacs-copy -R5 WheelUpPane scroll-up

Wird:

bind -Tcopy-mode C-Up send -X scroll-up
bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up

Durch diese Änderungen können der vollständige Befehlsparser (einschließlich Befehlssequenzen) und der Befehlssatz verwendet werden. Beispielsweise wird jetzt die normale Eingabeaufforderung mit Bearbeitung und Verlauf zum Suchen, Springen usw. anstelle einer benutzerdefinierten Eingabeaufforderung verwendet. Die Standard-Cr-Bindung lautet jetzt:

bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward-incremental '%%'"

Es gibt auch einige neue Befehle, die mit send -X verfügbar sind, z. B. copy-pipe-and-cancel.

starfry
quelle
2

Das -temacs-copyist kein Tippfehler. Der führende Strich bedeutet, dass dies eine Option für den bind-keysBefehl ist (zusammen mit einem Argument für die Option). Es ist äquivalent zu -t emacs-copy, wenn Sie das besser mögen.

Der Kopiermodus verwendet einen anderen Satz von Bindungen und Befehlen 1 als der „normale Modus“. Der copy-pipeBefehl ist nur in den alternativen "Modus" -Bindungstabellen verfügbar. Wenn dies der Fall mode-keysist emacs, verwendet der emacs-copyKopiermodus die Tabelle, sodass Sie Mw copy-pipein dieser Tabelle binden müssen .

bind-key -temacs-copy M-w copy-pipe "xclip -i -selection clipboard"

Achten Sie darauf, dass Sie zu viele "No Prefix" -Bindungen erstellen. Sie erschweren die Eingabe dieser gebundenen Schlüssel in ein Programm, das in tmux ausgeführt wird (z. B. wenn Sie Cy in eine tty-mode-Instanz von Emacs eingeben möchten, die in tmux ausgeführt wird ). Sie können immer (Präfix) einen Schlüssel binden, der dies tut send-keys C-y, aber das könnte die Eingabe umständlicher machen, wenn Sie ihn oft genug benötigen.


1 Es sind nur Bewegungs- und Bearbeitungsbefehle verfügbar. Mit Ausnahme von nehmen copy-pipediese Befehle keine Argumente an (dies bedeutet, dass in der Manpage "Ein Befehl akzeptiert ein Argument" steht; das "Ein" ist wahrscheinlich ein Tippfehler oder ein Bearbeitungsfehler).

Chris Johnsen
quelle
2

Während andere Antworten hilfreich sein können, gehe ich wie folgt vor:

  • Umschalt + Markieren Sie den Text mit dem Cursor.
  • Strg + Umschalt + C, um den Text in die Zwischenablage zu kopieren.
Rishabh Agrahari
quelle
Dies ist eine faire Antwort, aber die Probleme beginnen, wenn Sie zwei oder mehr horizontal angeordnete Fenster haben.
Cjauvin
Ich verstehe, lass es mich wissen, wenn du etwas Nützliches dafür findest.
Rishabh Agrahari