キーボードを使用して、システムクリップボード(またはテキストの選択)から「viなど」のシェルプロンプトとして貼り付けることができるようにしたいです。私は通常zshを使用し、時にはbashを使用します。どちらの場合も、bindkey -v
viと同様の動作(/)でシェルを設定しました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 -a
vi コマンドモードのバインディングを設定します。
答え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
はめ込む。
Gilesxsel
とzle
gitベースのソリューションは私には適していませんでした。ただし、デフォルトでは(Terminal Normal Modeset clipboard=unnamedplus
で~/.vimrc
)システムクリップボードを使用するようにvimを設定したので、v端末の通常モードで現在のコマンドを入力するだけです。vim
その後、yankコマンドを使用してXクリップボードにコピーできます。vim
。