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

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

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

vimで私が探しているアクションはキーシーケンスを介して取得できます"+p。ただし、この特定のキーシーケンスはviサポートシェルプロンプトでは期待どおりに機能しません。 zshまたはbashシェルプロンプトでviと同様のキーバインディングを維持しながら、キーボードのみを使用して同様の動作を有効にする方法はありますか?

- 編集する -

ユースケース:私はしばしばFirefox間をナビゲートします。5本指プラグイン、端末エミュレータとvim自体 - 使用シモネードウィンドウマネージャには、取り外し可能なカスタムキーが用意されています。 3つのプログラムはすべてviに似たキーバインディングを持っており、非常に効率的です(「指メモリ」用)。したがって、vim構文(または非常に似た構文)を使用してそれらの間にテキストを渡すのが理想的です。

答え1

私が知る限り、Zshは内部レジスタ以外には何もサポートしておらず、bashはレジスタをまったくサポートしていません。通常、シェルはviコマンドをサポートしますが、vimコマンドはサポートしません。

zshでは、以下はコマンドモードでX選択にアクセスするための概念証明です。実際に使用するには、これらの技術について詳しく説明する必要があります。私が使用するプログラムはxselあなたxclipも利用できます。レジスタを使用してあるvimインスタンスから別のvimインスタンスにコピーする方法。私が使用する機能を見つけることができますリングルマニュアル

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 コマンドモードのバインディングを設定します。

答え2

以下は、クリップボードが常に同期されるように元のウィジェットをラップする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

答え3

ZSHプラグインをお勧めします:https://github.com/kutsan/zsh-system-clipboard。到着インストールするそれは働く:

git clone https://github.com/kutsan/zsh-system-clipboard ~/.zsh/plugins/zsh-system-clipboard

次に、ファイルを次の場所にソースとして提供します.zshrc

source "$HOME/.zsh/plugins/zsh-system-clipboard/zsh-system-clipboard.zsh"

このプラグインは以下をサポートします。Tmuxバッファの使用クリップボードが保存されている場所を探します。代替キーバインディングの構成切り取り/貼り付け/コピー機能を提供します。

プラグインがすでに処理している小さな詳細の1つは、システムクリップボードの内容を区別することです。はい、いいえ新しい行(参照交渉)。クリップボード入力のこの小さな確認により、すべての種類のコンテンツを貼り付ける経験がVim / Neovimと同じであることがわかります。

答え4

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

Gilesxselzlegitベースのソリューションは私には適していませんでした。ただし、デフォルトでは(Terminal Normal Modeset clipboard=unnamedplus~/.vimrc)システムクリップボードを使用するようにvimを設定したので、v端末の通常モードで現在のコマンドを入力するだけです。vimその後、yankコマンドを使用してXクリップボードにコピーできます。vim

関連情報