選択領域用レジスタを使ってvimからGTKのクリップボードへコピー.2

前回(id:pneumaster:20081202)では,
geditやブラウザで使われるクリップボードvimへペーストするために,
xterm_clipboardという機能が必要なことがわかりました.
この機能はvimコンパイル時に機能ありとされていなければならないものであり,
つまり,vimコンパイルし直す必要があることがわかりました.
そこで,ソースをダウンロードし,
機能のON/OFFするためのファイルであるfeature.hを編集し終わったところで今回の記事です.


Makefileをほとんど変更することなくコンパイルする方法を
id:mattnさんからブックマークコメントでいただきました.
該当箇所は下から二個目の節なので,xterm_clipboardをすぐONにしたい場合はそちらを参照.
未完成ではあるがやったことのメモとして,削除線付きで一応続きも載せて置こうと思います.


Makefileを修正,やっとコンパイル

ここでfeature.hの編集を終わらせて,コンパイルすることにする.
ちなみに,ここまでのfeatureの状態.

+arabic			*
+autocmd		*
-balloon_eval
-browse			*
++builtin_terms		* ALL_BUILTIN_TCAPSをdefineされる状態(いじってない)
+byte_offset		*
+cindent 		*
-clientserver			+ OK. 修正した
-clipboard			+
+cmdline_compl		*
+cmdline_hist		* cmdhistという名前で存在する
+cmdline_info		*
+comments 		*
+cryptv			*
+cscope			*
+cursorshape
+dialog_con		*
+diff			*
+digraphs		*
-dnd
-ebcdic
+emacs_tags		*
+eval			*
+ex_extra		*
+extra_search		*
+farsi			*
+file_in_path		*
+find_in_path		*
+folding		*
-footer
+fork()				+
+gettext		*
-hangul_input		???
+iconv			*
+insert_expand		*
+jumplist		*
+keymap			*
+langmap		*
+libcall		*
+linebreak		*
+lispindent		*
+listcmds		*
+localmap		*
+menu			*
+mksession		*
+modify_fname		*
+mouse				+
-mouseshape
+mouse_dec			+
-mouse_gpm			+
-mouse_jsbterm
+mouse_netterm
+mouse_xterm			+
+multi_byte		*
+multi_lang		*
-mzscheme
-netbeans_intg
-osfiletype		* OK. 定義されない
+path_extra		*
-perl
+postscript		*
+printer		*
+profile		*
-python
+quickfix		*
+reltime		*
+rightleft		*
-ruby
+scrollbind		*
+signs
+smartindent		*
+sniff
+statusline		*
-sun_workshop
+syntax			*
+tag_binary		*
+tag_old_static		*
-tag_any_white		* OK. 定義されない
-tcl
+terminfo			??? そのまま
+termresponse
+textobjects		*
+title			*
-toolbar		* OK.
+user_commands		*
+vertsplit
+virtualedit		*
+visual			*
+visualextra		*
+viminfo		*
+vreplace		*
+wildignore		*
+wildmenu		*
+windows		*
+writebackup			+
-X11				+ ちょっと怪しい.クリップボードと関係あるかも.
-xfontset			???
-xim			* OK. 定義されない
-xsmp
-xterm_clipboard		+
-xterm_save			+ OK . 定義されない

ここまで見てきて,feature.hの編集は終わりにし,コンパイルを試してみる.
まずMakefileを変更.
# vim72/Makefileとvim72/src/Makefileを現在環境のコンパイル,リンク条件に合うように修正.
(省略: 元のMakefileMakefile.orgに残しておいたので,vimdiff Makefile Makefile.orgなどで必要な時に見てみよう.)


コンパイルできた.
make installする前にvim72/src/vimを実行して確認.
気づいた変更(問題)点:

  • エラーメッセージなどが英語になってる
  • ハイライトされてない
  • 必要無いと思われるfeatureがONになっている(mouse_gpm, xfontset, xsmp_interact(現在環境ではxsmpという名前)
  • その逆も(gettext, sniff)

英語になっている件に関しては,保留.


ハイライトに関しては,ディレクトリ構造がおかしかった.
/usr/share/vim/vim72(もしくは/usr/share/vim/current)を
/usr/local/share/vim と読んでしまっている.
これは,/usr/local/share/vim72pという名前をつくることにして,
シンボリックリンクでcurrentを向かせることにしよう.
主に,src/Makefileの904行目DATADIRの定義から967行目くらいのSYNSUBLOCまでを確認.


再度コンパイル
make installする前に./vimでハイライトを確認.
あれ?
VIMDIRはデフォルト通り/vimなのだが,
今回は,シンタックスファイルは/usr/share/vim/vim72p/syntaxに(期待通り)インストールされるが,
syntaxファイルは/usr/share/vim/syntaxで読まれる.
VIMDIR = /vim/currentにしてしまうと
make install時にcurrent以下にインストールされてしまう.
でも,syntaxファイルやhelpファイルの参照はcurrent経由で行いたい.
# それと,viとvimの挙動が違う...
# 多分,前に書いた記事のようにコマンド名で挙動を変えてはいるだろうけど,
# :versionの結果がそもそも違う.
# これはviは,前のvimを使っていて,vimの時は今回のvimを使っているってことか.


シンタックスディレクトリを直すために,
DATADIR = /usr/share (これは/usrから変更)
VIMDIR = /vim (変更してない)
VIMRTDIR = /vim$(VIMMAJOR)$(VIMMINOR)p (自分用versionとしてpを付加)
VIMRTLOC = $(DATADIR)$(VIMDIR)$(VIMRTDIR) (変更してない)
の状態で
VIMRUNTIME = $(VIMRTLOC)/current
にしたらシンタックスファイルディレクトリは/usr/share/vim/vim72p/current/syntaxになった.
VIMRUNTIME = /usr/share/vim/currentになればよいはずだから
VIMRUNTIME = $(DATADIR)$(VIMDIR)/currentとかVIMRUNTIME = $(VIMRTLOC)/../current
にすればよいのかな.
デフォルトはあんまり変更したくないからにしようか.


できた.xterm_clipboardもちゃんと動く.
このvimから"+yして,geditでC-vするとコピー&ペーストされる!


現versionのディレクトリにインストールされないように,
一応シンボリックリンクcurrentをrmしてからmake install.
他に/usr/bin/vimなどを調整した.


今更だが,今回のvimの:versionを確認.

VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Dec  1 2008 21:49:19)
Compiled by XXX@XXX
Huge version without GUI.  Features included (+) or not (-):
+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent -clientserver +clipboard
+cmdline_compl +cmdline_hist +cmdline_info +comments +cryptv +cscope +cursorshape +dialog_con +diff +digraphenu +mksession +modify_fname +mouse -mouseshape +mouse_dec +mouse_gpm
-mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +multi_byte +multi_lang -mzscheme -netbeans_intg
-osfiletype +path_extra -perl +postscript +printer +profile -python +quickfix +reltime +rightleft -ruby
+scrollbind +signs +smartindent -sniff +statusline -sun_workshop +syntax +tag_binary +rm_clipboard -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
 f-b for $VIMRUNTIME: "/usr/share/vim/vim72p/../current"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H     -g -O2 -fno-strict-aliasing -fstack-protector -fstack-protect
or-all -Wall -Wmissing-prototypes -fmessage-length=0 -pipe
Linking: gcc   -L/usr/local/lib -o vim    -lXt -lm -lncurses -lgpm

f-b for $VIMRUNTIMEが"/usr/share/vim/vim72p/../current"になっています.
見た目が良くないですね...もう一度確認してみます.
あと,システムデフォルトなvimrcファイルが/etc/vimrcではなく,
$VIM/vimrcになってしまっているのでこれも直しましょう.
ちなみにコンパイル後のvimで:echo $VIMとすると,/usr/share/vim/vim72p/../currentと表示される.


あまりデフォルトを変えたくないと言ったけれど,
VIMLOC = /etc
VIMRUNTIME = $(VIMLOC)/current
と変えることにする.
コンパイル後,:version.

   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/etc"
 f-b for $VIMRUNTIME: "/etc/current"

fall-back for $VIMはOK.システムvimrcの位置が変わってない.
f-b for $VIMRUNTIMEはそれに応じて変化.
この所為で./vim起動時に

E484: Can't open file /etc/current/syntax/syntax.vim
Press ENTER or type command to continue

こんなことになる.
ほんとは次のようにしたいのだが.

   system vimrc file: "/etc/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/etc"
 f-b for $VIMRUNTIME: "/usr/share/vim/current"


ああ,VIMRTLOCとVIMRCLOCを取り違えていた.

### VIMRTLOC    common root of the runtime Vim files (this version)
### VIMRCLOC    compiled-in location for global [g]vimrc files (all versions) 

多分システムデフォルトのvimrcはVIMRCLOCの方だな.なるほど,"VIMRC"LOCationか.
現在のVIMRCは次のようになっている.

VIMLOC          = /etc
VIMRCLOC        = $(VIMLOC)

ん?いや,違うな?
VIMRCLOCがそうだとすると,VIMLOCを/etcに変更したあとに$VIM/vimrcではなくて,
/etc/vimrcになっていなければならないはずだよな.

追記

src/INSTALLに次のように書いてあったのに,気づかなかった.

Unix: PUTTING vimrc IN /etc

Some Linux distributions prefer to put the global vimrc file in /etc, and the
Vim runtime files in /usr.  This can be done with:
	./configure --prefix=/usr
	make VIMRCLOC=/etc VIMRUNTIMEDIR=/usr/share/vim MAKE="make -e"


わからなくなってきたから,まず,f-b for $VIMRUNTIMEの方をなんとかしよう.
これはVIMRUNTIMEを変更すればよいはずだから,
$VIMRUNTIMEをまた変更して,
VIMRUNTIME = $(DATADIR)$(VIMDIR)/current
にした.
コンパイル.今度は

   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/etc"
 f-b for $VIMRUNTIME: "/usr/share/vim/current"

vimになった.
これでf-b for $VIMRUNTIMEはOK.
ハイライトやヘルプファイルもちゃんとパスが通っている.


後はシステムvimrcだけだ.
src内でgrep vimrcすると,feature.hで/etc/vimrcの文字列が見つかる.
前は弄らなかったけど,これっぽいなあ.
アンコメントしてコンパイル
できた.
しかも,viとvimのコマンド結果がどちらも今回インストールしたものになっている.
パスに関してはこれで全部解決しただろう.


ここで問題点の整理.再掲.

気づいた変更(問題)点:

  • エラーメッセージなどが英語になってる
  • ハイライトされてない
  • 必要無いと思われるfeatureがONになっている(mouse_gpm, xfontset, xsmp_interact(現在環境ではxsmpという名前)
  • その逆も(gettext, sniff)

ハイライトの問題は今解決したので,featureのON/OFFに関して修正しようか?
あ,ここでもうひとつ追加で問題点.
:Explorerが使えない.

**error** (netrw) netrw can't run -- your vim is missing fnameescape()

と出て,C-zを使ってvimを強制終了する他なくなる.
言語のトラブルだろうか.これって英語表示になってしまっていることと関係があるだろうか.


ここまでの

コマンドラインからコンパイルオプションを指定

# ここまで書いたところで,ブックマークコメントに気づきました.


ブックマークコメントid:mattnさんから--with-features=hugeでconfigureするといいとのコメントをいただいたので試してみました.


# NOTE: This is incomplete, look in Makefile for more info.
# こんなことも書いてはありましたが.
INSTALLを見ると,configure時のオプションなどが少し詳細に書いてあるので,
最終的に次のようにしました.
# 他のfeatureが以前と同じではありませんが,enable/disableですぐスイッチできるので,これでおk

$ ./configure --with-features=huge --enable-gui=no --prefix=/usr --enable-acl --disable-gpm
$ make VIMRCLOC=/etc VIMRUNTIMEDIR=/usr/share/vim/current CFLAGS="-O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -g -Wall -pipe -fno-strict-aliasing -fstack-protector-all" MAKE="make -e"


zshだと--enableまでタイプした後に補完機能で列挙されるので便利.
zshでなければsrc/auto/configureを見てオプションを確認する.
自分でMakefileを編集していく方法だと,なぜかFileExplorer(:Explorer)が使えなかったりとトラブルがあったのですが,
この方法の方が遥かに簡単でした.id:mattnさん,ありがとうございました.


ちなみに,この記事はvimで書きためておいたメモを:%y +してはてなにペーストしてます.
便利ですね.

メモ
  • --with-features=hugeだけではguiを使うようになってしまう.
  • MakefileのCONF_OPT_GUI = --disable-guiをアンコメントしてもwith GUIとしてコンパイルされる.何故.

残る問題点(保留)

  • if_sniffがONにならない.
  • --enable-aclしてもenableにされない.sys/acl.hが無いとか言われる.でも/usr/include/sys/acl.hはある.今のところ実害は確認できない.