koturnの日記

普通の人です.ブログ上のコードはコピペ自由です.

Cygwinでclipboard機能を有効にしたVimをビルドする

はじめに

昔のCygwinVimではクリップボードが利用できず,Cygwinで用意されているクリップボードデバイス /dev/clipboard に対し,読み書きを行うことや, getclipputclip コマンドを利用することで,クリップボードとのやりとりを行っていた.

kanaさんのkana/vim-fakeclipというプラグインは,Cygwinや他の環境で +clipboard でないVimであっても,外部コマンドなどを用いることによって,クリップボードを何とか利用しようというものであり,かつてのCygwinVimユーザーは,よくこのプラグインを利用していたことだろう.

しかし,Vim 7.3.836以降,k_takataさんにより,CygwinVimでもクリップボード機能が利用できるようになった. 最近では,Cygwinにデフォルトで付属しているVimであっても,クリップボード機能を有効にしてビルドされており,利用することができる. だが,僕がCygwinVimを自前ビルドしたとき, +clipboard となっているのに,クリップボードが利用できなかった. この記事では,そのときにハマったことと,どう解決したかについて述べる.

長い前書きになったが,内容としては「こうやっただけ」というしょうもないものである. 結論を先に言うと, configure--enable-gui=no--without-x を指定しただけである.

CygwinVimをビルドする

最近では,VimソースコードGitHubで管理されているようになっているので,GitHubからソースを落としてくる.

$ git clone https://github.com/vim/vim.git

リポジトリのルートディレクトリに configure が用意されているので,多くのソフトウェアと同じく,

$ ./configure
$ make
$ make install

の順で実行するとよい.

configure については,適当に情報を収集し,以下のようにオプションを追加し,ビルドした.

$ ./configure \
  --prefix=/usr/local/ \
  --enable-fail-if-missing \
  --enable-gui=yes \
  --enable-multibyte=yes \
  --enable-perlinterp=yes \
  --enable-pythoninterp=yes \
  --enable-rubyinterp=yes \
  --enable-tclinterp=yes \
  --enable-luainterp=yes \
  --enable-cscope=yes \
  --enable-gpm \
  --enable-cscope \
  --enable-fontset \
  --with-features=huge \
  --with-x \
  --with-compiledby=koturn && \
  make -j5 && \
  make install

しかし,この設定では +clipboard となったが,クリップボードが利用できなかった. そのときに,ざっと調べたときに見た情報から, --with-x--enable-gui=yes が余計なのではないかと思った. そこで,--with-x の代わりに --without-x を, --enable-gui=yes の代わりに --enable-gui=no を指定して,再度 configure を行いビルドした(1度 configure を行った場合, rm src/auto/config.cache をしておく必要がある).

$ ./configure \
  --prefix=/usr/local/ \
  --enable-fail-if-missing \
  --enable-gui=no \
  --enable-multibyte=yes \
  --enable-perlinterp=yes \
  --enable-pythoninterp=yes \
  --enable-rubyinterp=yes \
  --enable-tclinterp=yes \
  --enable-luainterp=yes \
  --enable-cscope=yes \
  --enable-gpm \
  --enable-cscope \
  --enable-fontset \
  --with-features=huge \
  --without-x \
  --with-compiledby=koturn && \
  make -j5 && \
  make install

これで自前ビルドのCygwinVimであっても,クリップボード機能が利用可能となった. 明示的に --without-x--enable-gui=no を指定しなかった場合でも,クリップボードが有効にならなかったので,ちゃんと指定しなくてはならない.

余談

CFLAGSLDFLAGS に,自分なりの最適化オプションを追加してもビルドできるか?ということが気になったので,

$ ./configure \
  --prefix=/usr/local/ \
  --enable-fail-if-missing \
  --enable-gui=no \
  --enable-multibyte=yes \
  --enable-perlinterp=yes \
  --enable-pythoninterp=yes \
  --enable-rubyinterp=yes \
  --enable-tclinterp=yes \
  --enable-luainterp=yes \
  --enable-cscope=yes \
  --enable-gpm \
  --enable-cscope \
  --enable-fontset \
  --with-features=huge \
  --without-x \
  --with-compiledby=koturn \
  CFLAGS='-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -DNDEBUG' \
  LDFLAGS='-flto' && \
  make -j5 && \
  make install

としてビルドしてみた. しかし,-flto が何かの悪さをしているらしく,出来上がったバイナリを実行すると,Vimが立ち上がった瞬間にエラーが出た. -flto を外すと,エラー無く,無事に実行できた.

まとめ

CygwinVimconfigure--enable-gui=no --without-x を指定しないと,クリップボードが有効にならない.

参考