Humanity

Edit the world by your favorite way

Vim のレジスタに :terminal のシェル上からアクセスする

Vim その2 Advent Calendar 2018 の記事です。

Advent Calendar 4日目で mattn さんが紹介してくれていた Tapi について、 ちょうど Tapi を使ったプラグインを作っていたので紹介したいと思います。 実際にこんな事ができるという例としてもシンプルで分かりやすいと思います。

概要

github.com

tapi-reg.vimVimレジスタと端末の標準入力/出力を繋げるものです。 :terminal で動かしているシェル上に Vimレジスタの内容を出力したり、 逆にシェル上から Vimレジスタの内容を書き換えたりできます。

セットアップ

動作には jq コマンドが必要です。 インストールはほぼ全ての OS でパッケージが用意されています

jq コマンドをインストールしたら

source <this repo>/macros/vimreg.sh

を .bashrc に書いてください。 vimreg というコマンドが使えるようになります。

どんなことができるのか

以下は README をほぼそのまま英訳したものです。 詳しくは README を見て下さい。

:terminalVim:terminal から Vimレジスタの内容を書き換える

Vim:terminal のバッファから vimreg コマンド経由で Vimレジスタの内容を書き換えることができます。

$ echo 'send this text to vim register!' | vimreg

これで無名レジスタsend this text to vim register! の内容がセットされます。

もちろんレジスタ名を指定する事もできます。

$ echo 'send this text to register a!' | vimreg a

vimreg は標準入力から文字列を取得するため、もちろんこのようにもできます。

$ vimreg
This
is
sent
to
vim
register.
^D
$

:terminalVimVimレジスタの内容を標準出力に出力する

vimreg--get (-g) オプションをサポートしています。 これは Vimレジスタの内容を標準出力に出力するものです。 もしレジスタ名が指定されなかったら、無名レジスタの内容が出力されます。

$ vimreg -g
Hello this is vim unnamed register content.
$ vimreg -g a
this is "a" register content.

また Vim レジスタの一覧とその内容を出力する事もできます (:registers の出力と同じ)。

$ vimreg -l
--- Registers ---
""   --- Registers ---^J""   ^J^J"0       if a:args[1] ==# '--list'^J^J"1   ^J^J"2       if a:args[1] =~# '\v^(-l|--list)$'^J^J"3     local reg='"'^J^J"4     set +x^J^J"5     set -x^J^J"6     set -x^J^J"7  
"0   --- Registers ---^J""   ^J^J"0       if a:args[1] ==# '--list'^J^J"1   ^J^J"2       if a:args[1] =~# '\v^(-l|--list)$'^J^J"3     local reg='"'^J^J"4     set +x^J^J"5     set -x^J^J"6     set -x^J^J"7  
"1   ^J
"2       if a:args[1] =~# '\v^(-l|--list)$'^J
"3     local reg='"'^J
"4     set +x^J
"5     set -x^J
"6     set -x^J
"7       content=^J
"8       printf '\e]51;["call","Tapi_reg",["set",%s,%s]]\x07' \^J        "$(to_json_string "$reg")" "$(to_json_string "$content")"^J
"9   $(to_json_string "$3")
"a   degure
"s   "
"-   $list || 
".   --list
":   call system('clip.exe', execute('registers'))
"%   macros/vimreg.sh
"#   plugin/tapi_reg.vim
"/   --list

疑似クリップボードサポート (Windows Subsystem Linux (以下 WSL) のみ)

もちろん vimreg では has('clipboard') == 1 の場合にクリップボードの内容も扱えます (つまりシェル上から Vim 経由でクリップボードの取得・設定もできます)。 しかしWSL では has('clipboard') == 0 にもかかわらずクリップボードを扱えるようになっています。

$ vimreg +
Send
this
text
to
clipboard
^D
$