2018-08-07

tobijibu

VirtualBoxのゲストとホスト間でvimのクリップボードを共有 その2

以前、 VirtualBoxのゲストとホスト間でvimのクリップボードを共有 という記事を書きました。 それからしばらく使っていたのですが、少し使いづらい部分が出てきました。 我慢して使い続ける他無いと思っていたのですが、別の方法が見つかったのでその方法を記載します。

今回はlemonadeというツールを使う方法です。


環境
Host : Windows7 Virtualbox + Vagrant
Guest : CentOS 7.5

lemonadeはGoで作成されたツールで、ホストとゲストにそれぞれインストールします。 今回は、ホストのWindowsと、Virtualbox + Vagrantに構築したCentOSにインストールします。


Windows(ホスト)の設定

Goをインストール

まずGoをインストールします。 こちらから環境に合ったインストーラをダウンロードしてインストーラの指示に従ってインストールします。

今回はgo1.10.3.windows-amd64.msiを使っています。

PATHを設定

PATHGOPATHを設定します。 私の場合、ホスト側ではbashを使っていますので、~/.bashrcに以下を追記しました。 利用しているシェルに合わせて指定してください。

export PATH="$PATH":/c/Go/bin/
export GOPATH=/c/msys64/home/tobijibu/.go/

GOPATHはどこでも構いませんが、~/.goを指定している人が多いと聞きます。 次に説明するgo get等で取得したパッケージはこのディレクトリ以下に格納されます。

lemonadeの実行ファイルを生成

githubからlemonadeのソースを取得して実行ファイルを生成します。

-ldflags="-H windowsgui"は、 実行時にコンソールウィンドウを生成せずバックグラウンドで実行するために指定します。

$ go get -u -ldflags="-H windowsgui" github.com/pocke/lemonade

実行ファイルのショートカットを作成

lemonadeはサーバとしての機能と、コマンドとしての機能の2つの使い方があります。 ホスト側ではサーバとして使いたいのでserverオプションを渡しましょう。

実行ファイルのショートカットを作成して、リンク先のlemonade.exe以降に、 server --allow="127.0.0.1,::1"を設定します。

C:\msys64\home\tobijibu\.go\bin\lemonade.exe server --allow="127.0.0.1,::1"

serverと一緒に--allowというオプションを渡しています。 これはホストのlemonadeにアクセスするゲストのIPです。今回はVagrantを使ったローカル環境間で使うので上記を指定しています。

これでホスト側の設定は完了です。 ショートカットをクリックしても何も表示されませんが、 タスクマネージャーを見るとlemonade.exeが動いているのがわかります。


今回は-ldflags="-H windowsgui"オプションを指定するためにソースから実行ファイルを生成しましたが、 以下のリンクから実行ファイルを直接ダウンロードすることもできます。

Version 1.1.1

この場合、Goをインストールしなくても使うことができますが、 -ldflags="-H windowsgui"が指定されていないので、 ショートカットから同じように実行するとコマンドプロンプトが表示されたままになります。

コマンドプロンプトを表示させたままにせずにlemonadeを使う方法の一つは、 コマンドラインで以下のコマンドを実行して、そのプロンプトを閉じるという方法です。 そうするとバックグラウンドで実行させておくことができます。

$ lemonade.exe server --allow="127.0.0.1,::1" &
[1] 7096
$ exit

CentOS(ゲスト)の設定

Goをインストール

ゲストにもGoをインストールします。

# cd /usr/local
# sudo wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
# sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

PATHを設定

ホストと同様にPATHGOPATHを設定します。 ゲストではfishを使っているので以下を追記しました。

~/.config/fish/config.fish
set -x PATH $PATH /usr/local/go/bin
set -x GOPATH ~/.go

bash(~/.bashrc)やzsh(~/.zshrc)の場合は以下です。

export PATH=$PATH:/usr/local/go/bin
export GOPATH=~/.go

lemonadeの実行ファイルを生成

githubからlemonadeのソースを取得してインストールします。

$ go get -d github.com/pocke/lemonade
$ cd $GOPATH/src/github.com/pocke/lemonade/
$ make install

実行ファイルへのパスを通します。

~/.config/fish/config.fish
set -x PATH $PATH ~/.go/bin
~/.bashrc or ~/.zshrc
export PATH=$PATH:~/.go/bin

確認

これでホストとゲスト両方にlemonadeをインストールできたので確認してみます。

$ echo "ゲスト→ホスト。" | lemonade --host="10.0.2.2" copy

--host="10.0.2.2"にはVagrantから見たホストのIPを指定してください。 vagrant sshでゲストにログインした際に表示されるIPです。

$ vagrant ssh
Last login: Fri Aug  3 14:20:09 2018 from 10.0.2.2 <-- このIP
vagrant@localhost ~>

ホスト側のエディタやブラウザ等で"ゲスト→ホスト。"を貼り付けることができれば通信できています。 次にホスト側でコピーした内容をゲストのコンソールに貼り付けてみましょう。 これでコピーした内容が表示されれば正常に動作しています。

$ lemonade --host="10.0.2.2" paste
ホスト→ゲスト。

設定ファイルを作成

コピペするたびに--hostを指定するのは面倒です。 lemonadeではtoml形式の設定ファイルを使ってデフォルト値を指定することができます。 以下は設定例です。

~/.config/lemonade.toml
host = '10.0.2.2'
trans-loopback = true
trans-localfile = true
line-ending = 'crlf'

Vimとtmux

Vimやtmuxでコピペする設定です。

Vim

プラグインをインストールするだけです。 私はPlugを利用しているので以下の指定*になりますが、 プラグインマネージャに合わせて指定してください。

Plug 'thinca/vim-fakeclip', {'branch': 'add-lemonade-support'}

コピペする度に、毎回"+y"+pを打つのは億劫なので、以下のようにマッピングしました。

map ,y <Plug>(fakeclip-y)
map ,p <Plug>(fakeclip-p)
* Plugでインストールする際にブランチを指定するとエラーが発生してしまいました。 なので、手動でブランチをadd-lemonade-supportに切り替えて対処しました。

tmux

tmuxのコピーモードでも使えるように、~/.tmux.confに設定を追記します。

tmux2.4未満と2.4以降では設定が異なりますので注意してください。 以下はtmux2.4以降(確認したのは2.7)での設定です。

if-shell '[[ -x ~/.go/bin/lemonade ]]' \
  'bind ] run-shell "~/.go/bin/lemonade paste | tmux load-buffer -" \; paste-buffer ; \
   bind -T copy-mode-vi y send -X copy-pipe-and-cancel "~/.go/bin/lemonade copy"'

これでスムーズにコピペすることが出来るようになりました。

Macでも同じように設定して試してみたところ、ゲスト→ホストのコピーはできたのですが、ホスト→ゲストでは日本語のコピペがうまくできませんでした。 ただ改めて考えてみると、Macの場合iTermを使っていればそのままコピペできるので、そもそもlemonadeは要らなかったです。


lemonadeは数年前からあったようですが、情報があまり無いので知りませんでした。 使ってみるととても便利なので、何故あまり話題にならないのか不思議です。 もしかしたらMacで使う必要が無いというのが大きいのかもしれません。Windows⇆Linuxでは快適なのでこのまま使っていこうと思います。

参考サイト

ssh 越しにクリップボード共有したり URL 開いたりする lemonade の便利設定
https://thinca.hatenablog.com/entry/introduce-lemonade

Lemonade
https://github.com/pocke/lemonade

リモートのPCのブラウザやクリップボードを操作するツール Lemonade を作った
http://pocke.hatenablog.com/entry/2015/07/04/235118