zsh kopieren und einfügen wie Emacs

10

Mir ist aufgefallen, dass zsh viele Dinge hat, die ich in Emacs sehe. Ich kann eine Auswahl mit Strg + Leertaste treffen und eine Region auswählen. Ich kann Kopien wie in Emacs machen, während ich in zsh bleibe. In Emacs kann ich meine System-Zwischenablage verwenden (zuvor war eine zusätzliche Konfiguration erforderlich, dies funktioniert jedoch sofort in Emacs). In zsh kann ich scheinbar nicht mit Cy aus meiner Zwischenablage einfügen, und das Kopieren von zsh in meine System-Cliipboard hat das gleiche Problem. Gibt es einen Weg, dies zu umgehen?

Silverrocker
quelle

Antworten:

11

Zsh's verfügt über eine integrierte Zwischenablage, die nicht mit anderen Anwendungen kommuniziert. Da es sehr skriptfähig ist, können Sie es mit ein paar Zeilen in Ihrem kommunizieren lassen ~/.zshrc. Sie benötigen xclip oder xsel . Ein Proof-of-Concept im vi-Modus finden Sie unter Einfügen aus der Zwischenablage in eine vi-fähige zsh- oder bash-Shell . Hier ist der entsprechende Code für den Emacs-Modus (Sie möchten wahrscheinlich etwas Ähnliches wie andere kill-*Widgets tun ).

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

Hierbei wird die X11-Zwischenablage verwendet (normalerweise mit Ctrl+ C/ Ctrl+ zugegriffen V). Entfernen Sie die -bOption, stattdessen die X11-Primärauswahl zu verwenden (automatisches Kopieren bei Auswahl und Einfügen mit der mittleren Maustaste).

Gilles 'SO - hör auf böse zu sein'
quelle
Wenn Sie vi - Modus verwenden, ersetzen Sie einfach kill-regionmit vi-deleteund yankmit vi-put-afterusw. Ebenso wickeln vi-yankund andere. (Ich habe keinen Weg gefunden, es zentraler zu machen)
Olejorgenb
4

Ich wollte Zshs Schnittpuffer in die X-Zwischenablage integrieren. Ich habe versucht, die oben genannte http://stchaz.free.fr/mouse.zsh, aber ich fand, dass ich es nicht mochte, wenn alle meine Zsh-Operationen die Zwischenablage füllen. Zum Beispiel kopierte ich manchmal etwas in einem Browser und ging dann zu einer Shell, bearbeitete die Befehlszeile und fügte sie ein. Durch häufiges Bearbeiten der Befehlszeile - beispielsweise durch Löschen eines Wortes - wird jedoch der Zsh-Schnittpuffer geändert. Ob gut oder schlecht, X hat nur eine Zwischenablage, keinen Kill-Ring. Wenn also ein Zsh-Bearbeitungsvorgang die Zwischenablage überschreibt, geht das, was ich einfügen wollte, verloren - ich kann es nicht so schnell wie möglich ziehen (Cy My) tun in Zsh oder Emacs.

Stattdessen habe ich neue spezielle Tastenkombinationen erstellt, um über zsh mit der X-Zwischenablage zu interagieren. Es stellt sich heraus, dass "^ Xw" und "^ Xy" sowohl in Emacs als auch in Zsh nicht verwendet werden, sodass ich eine konsistente Schnittstelle erhalten kann, indem ich sie in beiden Anwendungen binde. Auf diese Weise bleiben die normalen Bearbeitungsvorgänge, der Cutbuffer und der Kill Ring in Ruhe. Wenn ich etwas in die Zwischenablage kopieren möchte, setze ich die Region und mache "^ Xw" (oder wenn ich sie bereits beendet habe und die Region inaktiv ist, kann ich einfach "^ Xw" machen, um den Schnittpuffer zu kopieren). Das Einfügen aus der Zwischenablage erfolgt mit "^ Xy".

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip
Metamorph
quelle
1

Vielleicht möchten Sie einen Blick auf http://stchaz.free.fr/mouse.zsh werfen, das neben der Unterstützung der Maus auch versucht, mit der X-Zwischenablage zu interagieren.

Stéphane Chazelas
quelle