zshはemacsのようにコピーアンドペーストします


10

zshにはemacsに表示されるものがたくさんあることに気づきました。Ctrl +スペースで領域を選択して選択できます。zsh内にいる間は、emacsと同じようにコピーを作成できます。emacsでは、システムクリップボードを使用できます(以前はいくつかの追加構成が必要でしたが、これはそのままemacsで動作します)。zshでは、Cyを使用してクリップボードから貼り付けることができず、zshからシステムのクリップボードにコピーする場合も同じ問題があります。これを回避する方法はありますか?

回答:


11

Zshには、他のアプリケーションと通信しないビルトインクリップボードがあります。非常にスクリプト可能なため、の数行で通信することができます~/.zshrcxclipまたはxselが必要です。viモードでの概念実証については、クリップボードからvi対応のzshまたはbashシェルへの貼り付けを参照してください。emacsモードに対応するコードは次のとおりです(おそらく他のkill-*ウィジェットと同じようなことをしたいと思うでしょう)。

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

これはX11クリップボードを使用します(通常はCtrl+ C/ Ctrl+でアクセスされますV)。-b代わりにX11プライマリ選択を使用するオプションを削除します(選択時に自動的にコピーし、マウスの中央ボタンで貼り付けます)。


あなたはviのモードを使用する場合は、単純に置き換えるkill-regionvi-deleteしてyankvi-put-after同様に包むなどvi-yank、など。(私はそれをもっと集中的に行う方法を見つけていません)
olejorgenb

4

ZshのカットバッファーをXクリップボードに統合したいと思っていました。前述のhttp://stchaz.free.fr/mouse.zshを試しましたが、すべてのZsh操作でクリップボードにデータを入力するのが嫌いでした。たとえば、ブラウザで何かをコピーしてから、シェルに移動してコマンドラインを編集し、貼り付けます。しかし、コマンドラインを編集する(たとえば、単語を削除する)と、Zshカットバッファーが変更されることがよくあります。良くも悪くも、Xにはキルリングではなくクリップボードしかないため、Zshの編集操作でクリップボードを上書きすると、貼り付けたかったものが失われます-できる限りヤンクポップ(Cy My)できません。 ZshまたはEmacsで行います。

そのため、代わりに、zshを介してXクリップボードと対話するための新しい特別なキーバインドを作成しています。"^ Xw"と "^ Xy"はEmacsとZshの両方で使用されていないことが判明したので、両方のアプリケーションでそれらをバインドすることにより、一貫したインターフェイスを取得できます。このように、通常の編集操作、カットバッファ、キルリングはそのままにされます。何かをクリップボードにコピーしたい場合は、リージョンを設定して "^ Xw"を実行します(または、既にそれを削除してリージョンが非アクティブの場合は、 "^ Xw"を実行してカットバッファーをコピーできます)。クリップボードからの貼り付けは「^ 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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.