クリップボードからvi対応のzshまたはbashシェルに貼り付ける


15

キーボードを使用して、システムクリップボード(またはテキスト選択)から「viに似た」シェルプロンプトに貼り付けることができます。私は通常zshを使用し、時にはbashを使用します。どちらの場合も、viのような動作(bindkey -v/ set -o vi)でシェルをセットアップしています。

vimでは、私が探している動作はキーシーケンスで利用可能です"+p。ただし、この特定のキーシーケンスは、vi対応のシェルプロンプトでは期待どおりに機能しません。zshまたはbashシェルプロンプトでviのようなキーバインドを維持しながら、キーボードのみを使用してこれまたは同様の動作を有効にする方法はありますか?

-編集-

使用例:私は、Pentadactylアドオン、ターミナルエミュレーター、vimを使用して、Firefoxの間を頻繁に移動します。Xmonadウィンドウマネージャーとカスタムキーを使用して移動します。3つのプログラムはすべてviに似たキーバインドを備えており(「フィンガーメモリ」の場合)非常に効率的であるため、vim構文(または非常に類似した構文)のみを使用してプログラム間でテキストを通信することが理想的です。

回答:


9

Zshは内部レジスターのみをサポートし、bashは私の知る限りレジスターをまったくサポートしていません。概して、シェルはvimコマンドではなくviコマンドをサポートします。

zshでは、コマンドモードからX選択にアクセスするための概念実証があります。実際に使用するには、これらの手法について詳しく説明します。私はxselプログラムを使用していますが、xclip代わりに使用できます。レジスタを使用して、あるvimインスタンスから別のvimインスタンスにコピーする方法を参照してください。zleマニュアルで使用した機能が見つかります

vi-append-x-selection () { RBUFFER=$(xsel -o -p </dev/null)$RBUFFER; }
zle -N vi-append-x-selection
bindkey -a '^X' vi-append-x-selection
vi-yank-x-selection () { print -rn -- $CUTBUFFER | xsel -i -p; }
zle -N vi-yank-x-selection
bindkey -a '^Y' vi-yank-x-selection

この関数vi-append-x-selectionは、カーソルの後に現在のX選択を挿入します(pまたはに類似P)。この関数vi-yank-x-selectionは、最後に削除またはヤンクされたテキストをX選択にコピーします。zle -N関数をzleウィジェット(つまり、エディションコマンド)として宣言します。bindkey -aviコマンドモードのバインディングを設定します。


これは、インストール後に完全に働いたxsel(私は「^ P」の代わりに「^ X」、の元の動作を上書きする「^ P」をの選んだ)と私の.zshrcにわずかな変更でご提案し、コードをコピーする
Dalker

4

クリップボードが常に同期されるように、元のウィジェットをラップするzsh(viモード)のソリューションを次に示します。

xclipお好みのクリップボードツールに交換してください。

function x11-clip-wrap-widgets() {
    # NB: Assume we are the first wrapper and that we only wrap native widgets
    # See zsh-autosuggestions.zsh for a more generic and more robust wrapper
    local copy_or_paste=$1
    shift

    for widget in $@; do
        # Ugh, zsh doesn't have closures
        if [[ $copy_or_paste == "copy" ]]; then
            eval "
            function _x11-clip-wrapped-$widget() {
                zle .$widget
                xclip -in -selection clipboard <<<\$CUTBUFFER
            }
            "
        else
            eval "
            function _x11-clip-wrapped-$widget() {
                CUTBUFFER=\$(xclip -out -selection clipboard)
                zle .$widget
            }
            "
        fi

        zle -N $widget _x11-clip-wrapped-$widget
    done
}


local copy_widgets=(
    vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line
)
local paste_widgets=(
    vi-put-{before,after}
)

# NB: can atm. only wrap native widgets
x11-clip-wrap-widgets copy $copy_widgets
x11-clip-wrap-widgets paste  $paste_widgets

これはの魅力のように機能しxterm-termiteます。
ロタレティ

3

X Windowでは選択とクリップボードは異なるものであり、IMHOの「デスクトップ環境」は、問題をさらに暗くする傾向があります。

シフト挿入はあなたに適していますか?ベアXアプリケーションでは、そのようなバインディングが行われたときに選択を貼り付けることにバインドされています。


選択とクリップボードが異なることは、ここでは実際には関係ありません。一方で機能するソリューションは、もう一方に簡単に適応できます。デスクトップ環境は変化しません。彼らの広がりは、選択からクリップボードへの力のバランスのシフトを伴いました。
ジル 'SO-悪であるのをやめる'

私の環境ではshift-insertが機能しますが、別のシステムで使用する場合に知っておくと良いでしょう。私はヤンクのために近い実際のVimのキーバインドに何かを探しているが、および/または端子間にペーストし、自分自身や他のプログラムをVIMよ
Dalker

1

このソリューションoh-my-zshは、vi-mode プラグインをインストールして有効にした場合に機能します。

ジルxselzleベースのソリューションは私のために動作しませんでした。ただし、デフォルトでシステムクリップボードを使用するようにvimを構成しているため(set clipboard=unnamedplusin ~/.vimrc)、vターミナルの通常モードで入力して現在のコマンドを開きvimvimyankコマンドを使用してXクリップボードにコピーできます。


これはZSHとどのように関連していますか?:termNeovimとVimの新しいバージョンで利用可能な組み込みについて話していますか?
ドロンBehar

@DoronBehar zshでviモードを有効にしている場合v、通常モードで入力して、ターミナルプロンプトではなく、vim内で現在入力されているコマンドを編集できます。
-joelostblom

あなたは:termあなたが答えでNeovimとVimの機能について話しているという事実に言及するべきです、さもなければそれは全く明確ではありません。
ドロンベアール

@DoronBehar私は話していません:term。しかし、私が言及している機能が実際に提供されていることを発見しましたoh-my-zsh。それに応じて答えを更新しました。
joelostblom
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.