コピーして貼り付けるためにviモードbashバッファを設定するには?

コピーして貼り付けるためにviモードbashバッファを設定するには?

全体的に: プール(コピー)と貼り付けにどのバッファを使用するようにvi-mode bashを設定する方法を知っている人はいますか?

長いバージョン: 私がこのライブラリを使用しているプログラムset editing-mode vi(例:bash)は、viに似たキーバインディングを使用します。これに関係なく、システムクリップボードを使用してインポートと貼り付けを使用するようにvimとtmuxを設定しました。.inputrcreadlineBashでも同じことをしたいです。。私は主にtmuxを介してbashを使用しているので不要に見えますが、それでも(tmuxプレフィックスを使用して)同様のものではなく、pクリップボードからコピー(通常モードで)を使用できる場合は良いでしょう。C-a Pただし、これを行うためにbashを設定する方法、またはbashがドラッグアンドペーストするためにデフォルトで使用するバッファに関する情報を見つけることはできません。 vimで実行してもその項目は表示されないため、:registersvimが表示するレジスタではないようです。

答え1

いくつかの研究では、bashはそのためにデフォルトのシステムバッファではなく内部変数を使用しているようです。 bash と readline のマニュアル項目では「kill loop」と呼ばれ、その実装を読むことができます。GitHubから、そして他の場所。おそらく、システムクリップボードを使用するためにこのメカニズムをハイジャックすることは可能かもしれませんが、今は理解するのが複雑すぎるようです。

bind代わりに、bashのマニュアルページ(search bind \[)に記載されているbash組み込みコマンドを使用して、以下の簡単な回避策を選択しました。私のユースケースはかなりうまく扱いますが、vimタスクを使用して高度なシャットダウンとプルを扱うことはありません。私の解決策で問題が見つかった場合は、bashスクリプトの作成に慣れていないので、教えてください。

~/.bashrcから:

# Macros to enable yanking, killing and putting to and from the system clipboard in vi-mode. Only supports yanking and killing the whole line.
paste_from_clipboard () {
  local shift=$1

  local head=${READLINE_LINE:0:READLINE_POINT+shift}
  local tail=${READLINE_LINE:READLINE_POINT+shift}

  local paste=$(xclip -out -selection clipboard)
  local paste_len=${#paste}

  READLINE_LINE=${head}${paste}${tail}
  # Place caret before last char of paste (as in vi)
  let READLINE_POINT+=$paste_len+$shift-1
}

yank_line_to_clipboard () {
  echo $READLINE_LINE | xclip -in -selection clipboard
}

kill_line_to_clipboard () {
  yank_line_to_clipboard
  READLINE_LINE=""
}

bind -m vi-command -x '"P": paste_from_clipboard 0'
bind -m vi-command -x '"p": paste_from_clipboard 1'
bind -m vi-command -x '"yy": yank_line_to_clipboard'
bind -m vi-command -x '"dd": kill_line_to_clipboard'

編集1: 2回連続キーを押すバインディング「yy」と「dd」は、keyseq-timeoutreadline設定の影響を受けます。デフォルト値は500ミリ秒です。これは、最初の文字から500ミリ秒以内に2番目の文字を入力する必要があることを意味します。したがって、はるかに低い値に設定するとkeyseq-timeout問題が発生する可能性があります。

編集2: vimの動作をより正確にシミュレートするために貼り付けを更新しました。

関連情報