NeoVimのclipboardオプション
NeoVimで.config/nvim/init.vimに
set clipboard+=unnamedplus
とオプション設定しておくと、
yy
とかでコピーするとOSのクリップボードにも追加され、
他のメモ帳とかでCtrl-VとするとNeoVimでコピーしたものがペーストできます。
逆に、メモ帳とかでCtrl-Cとして
NeoVim上でp
とすればメモ帳でコピーしたものがNeoVimでペーストできます。
これはコピーとかする際にxsel
やpbcopy
と言ったクリップボードを操作するコマンドを使って
います。
NeoVimをインストールしたディレクトリ内のclipboard.vimを見ると何が使われてるかわかります。 MacでHomebrewでインストールしているなら
/usr/local/share/nvim/runtime/autoload/provider/clipboard.vim
これを見ると
g:clipboard
が設定されていたらそれに従う- Macで
pbpaste
があればpbcopy
/pbpaste
を使う - 環境変数
WAYLAND_DISPLAY
が設定されていてwl-copy
/wl-paste
があればそれを使う - 環境変数
DISPLAY
が設定されていてxclip
があればそれを使う - 環境変数
DISPLAY
が設定されていてxsel
があればそれを使う lemonade
コマンドが使えればそれを使うdoitclient
コマンドが使えればそれを使うwin32yank.exe
コマンドが使えればそれを使う- 環境変数
TMUX
が設定されていればtmux
を使う
と言った感じ。
lemonade
/doitclient
はsshでリモートサーバーでNeoVimを開いているとき、
手元のマシンのクリップボードとつなげるためのツールです。
dotclient
はWindows用。
lemonade
はバーチャルマシン内で動かしているLinuxなどと共有するのを想定して作られているようです。
この辺の用意されてるものを見るのも興味深いですが、
最初にあるようにg:clipboard
という変数を自分で設定することが出来ます。
NeoVimで:help clipboard
とかしてみるとヘルプを見れますが、その中にtmuxを使う例として
let g:clipboard = {
\ 'name': 'myClipboard',
\ 'copy': {
\ '+': 'tmux load-buffer -',
\ '*': 'tmux load-buffer -',
\ },
\ 'paste': {
\ '+': 'tmux save-buffer -',
\ '*': 'tmux save-buffer -',
\ }
とあります。これでコピー時とペースト時に実行するコマンドを指定出来ます。
+
とか*
とかはレジスタ名でclipboard+=unnamedplus
としてるのでこの場合は+
の方を使ってますが
これらのコマンドは標準入力を受け取ってそれを何らかのものへ入力するもの(copy
)と
何かを標準出力するもの(paste
)です。
paste
の方に
\ '+': 'echo foo',
とか指定すると何をコピーしてもfoo
しか貼り付けられなくなります。
copy
の方は
\ '+': 'touch /tmp/copied',
とかするとコピーと同時に/tmp/copiedというファイルが出来ます。 この際はコピー自体は行われるのでファイルが作られる以外はそのままです。
というわけで、もしNeoVimとtmuxのクリップボードを共有したい場合、
LinuxなどMac/Windows以外でかつDISPLAY
/WAYLAND_DISPLAY
が設定されてない状態でかつ
llemonade
やdotclient
といったツールをインストールしてない場合には
clipboard
オプションを設定するだけで使えうようになります。
MacなどでOSのクリップボードではなくtmuxの方を使いたい場合には
g:clipboard
を指定します。
GNU screenのクリップボードとの共有
GNU screenのクリップボードはtmuxのように直接コマンドから操作できませんが、
bufferfile
を通してクリイプボードの内容を操作することは出来ます。
bufferfile
は何も指定してなければ/tmp/screen-exchangeになります。
もしくは
bufferfile "$HOME/screen-exchange"
とかして設定します。
コマンドラインから
$ screen -X writebuf
とするとbufferfile
にクリップボードの内容が書き込まれ、
逆に
$ screen -X readbuf
とするとbufferfile
に書かれた内容がクリップボードに読み込まれます。
これを使ってファイルの内容をxsel
とかpbcopy
とか使ってOSのクリップボードに入れてやればOK。
一つのコマンドでやるのは大変ですがmulti_clipboard
を使えば一発で出来ます。
これを使って
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
のようにすればGNU screenとNeoVimのクリップボードが共有できます。
ただし、screenの仕様上(かmulti_clipboard
のせい)最後の改行を削除するようになってるので
NeoVimでライン単位でコピー(yy
など)したあと、ペースとしても
ラインペーストにならずにその場所から挿入されてしまう状態になります。
というわけで、このままだとちょっと実用性にかけますが、 GNU screeに限らず、NeoVimでコピー、ペーストするときに何かしらのコマンドを実行できる、というのは 面白いな、と思ったのでメモしておきました。
Vimの場合
Vimの方でもclipboard
オプションはありますが、
まず、
$ vim --version|grep clipboard
+clipboard +jumplist +persistent_undo +vartabs
+eval -mouse_gpm +syntax -xterm_clipboard
として+clipboard
が含まれてる必要があります。
もし-clipboard
となっているとするとclipboardが有効になっていないので
コンパイル時に
以下のいずれかのオプションを使ってconfigureしてコンパイルする必要があります。
--with-features=normal
--enable-gui
--with-x
xorg - Compiling vim with xterm_clipboard support - Super User
ただ、g:clipboard
という変数はなくてこれを設定しても何も変わらないので
上に書いたような事はできません。
また、Yankroundなど、コピペの動作をいじるようなプラグインを入れている場合 コピー/ペースト自体がまともに動かなくなる可能性があります。
NeoVimではYankroundを有効にしたままclipboard設定が出来ましたが Vim(8.1, Mac)ではコピーが出来なくなりました。
まとめ
現状、ターミナルでの操作時に(Neo)VimのクリップボードとGNU screenのクリップボードとさらに OSのクリップボードそれぞれで分けて使うことでマルチクリップボード的な役割もしているので 逆に共有する必要はないかな、という使い方をしていますが、 ちょっと気になっているものだったので調べてみました。
NeoVimではコマンド以外にもlambda式も設定できるようです。 (何に使ってる人がいるのだろう…?)
なんでも設定できる感じなので何か面白いことも出来るかもしれません。