Ubuntu 14.04 で vim パッケージをリビルドする

Ubuntu 14.04 で vim をインストールすると python3 インターフェースが無効になっています。python3 インターフェースを有効にするために deb パッケージをリビルドしてみます。vim拡張機能をチェックするには以下のようにバージョンを表示します。

$ vim --version  # vim.gtk を使ってます
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan  2 2014 19:39:59)
適用済パッチ: 1-52
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Huge 版 with GTK2 GUI.  機能の一覧 有効(+)/無効(-)
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
+balloon_eval    +float           +mouse_urxvt     -tag_any_white
+browse          +folding         +mouse_xterm     +tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+cindent         +gettext         -mzscheme        +textobjects
+clientserver    -hangul_input    +netbeans_intg   +title
+clipboard       +iconv           +path_extra      +toolbar
+cmdline_compl   +insert_expand   +perl            +user_commands
+cmdline_hist    +jumplist        +persistent_undo +vertsplit
+cmdline_info    +keymap          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
...

自分で vim のソースをダウンロードしてきてビルドする方法もありますが、なるべくディストリビューションのもの (と同じ設定) を使いたいと思う人もいるでしょう。ここでは deb パッケージをリビルドすることで python3 インターフェースを有効にしてみます。

前準備

まずビルドに必要な依存パッケージをまとめてインストールします。私の環境では以下のパッケージを追加するとビルドできましたが、これはそれぞれの環境によって違うかもしれません。

$ sudo apt-get build-dep vim  # vim のビルドに必要な依存パッケージをインストール
$ sudo apt-get install python3-dev ruby-dev tcl8.5-dev  # vim の拡張機能のビルドに必要な依存パッケージをインストール
$ sudo apt-get install devscripts  # deb パッケージのビルドツールをインストール

次にソースをダウンロードします。

$ mkdir /tmp/vim-build
$ cd /tmp/vim-build/
$ apt-get source vim
$ ls
vim-7.4.052  vim_7.4.052-1ubuntu3.debian.tar.gz  vim_7.4.052-1ubuntu3.dsc  vim_7.4.052.orig.tar.gz
$ cd vim-7.4.052
  • vim の configure オプションを調べる
$ ./configure --help
ビルド

バージョン番号もここで指定したものに置き換えられるようです。ディストリビューション名やメールアドレスなど、適切な内容を changelog に書かないとビルド時にエラーになります。

$ debchange -i
vim (2:7.4.052-1ubuntu4) trusty; urgency=medium
                                                                               
  * enabled python3 interface.
                                                                               
 -- t2y <email>  Sat, 26 Apr 2014 18:43:45 +0900
  • rules ファイルの編集

python3 インターフェースを有効にするための configure オプションを追加します。また vim-nox のテスト中にエラーになったのでここではビルド後にテストを実行しないように編集しています。

$ vim debian/rules
--- orig-vim-7.4.052/debian/rules	2014-04-26 15:42:19.264743944 +0900
+++ vim-7.4.052/debian/rules	2014-04-26 16:42:47.818878711 +0900
@@ -27,11 +27,11 @@
 BUILDER := $(shell echo $${DEBEMAIL:-$${EMAIL:-$$(echo $$LOGNAME@$$(cat /etc/mailname 2> /dev/null))}})
 
 MAKETEST := no
-ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
-  ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
-    MAKETEST := yes
-  endif
-endif
+#ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
+#  ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+#    MAKETEST := yes
+#  endif
+#endif
 
 ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
     NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
@@ -108,7 +108,7 @@
 ALLINTERPFLAGS+=--disable-mzschemeinterp
 ALLINTERPFLAGS+=--enable-perlinterp
 ALLINTERPFLAGS+=--enable-pythoninterp --with-python-config-dir=$(shell python-config --configdir)
-ALLINTERPFLAGS+=--disable-python3interp
+ALLINTERPFLAGS+=--enable-python3interp --with-python3-config-dir=$(shell python3-config --configdir)
 ALLINTERPFLAGS+=--enable-rubyinterp
 ALLINTERPFLAGS+=--enable-tclinterp
  • ビルド
$ debuild -us -uc
$ ls ../  # 親ディレクトリにパッケージが作成される

インストール

必要なパッケージをインストールします。私は vim-gtk を使っています。

$ cd ../
$ sudo dpkg -i vim_7.4.052-1ubuntu4_amd64.deb \
               vim-common_7.4.052-1ubuntu4_amd64.deb \
               vim-doc_7.4.052-1ubuntu4_all.deb \
               vim-runtime_7.4.052-1ubuntu4_all.deb \
               vim-tiny_7.4.052-1ubuntu4_amd64.deb \
               vim-gui-common_7.4.052-1ubuntu4_all.deb \
               vim-gtk_7.4.052-1ubuntu4_amd64.deb 

$ dpkg -l | grep vim
ii  vim               2:7.4.052-1ubuntu4     amd64     Vi IMproved - enhanced vi editor
ii  vim-common        2:7.4.052-1ubuntu4     amd64     Vi IMproved - Common files
ii  vim-doc           2:7.4.052-1ubuntu4     all       Vi IMproved - HTML documentation
ii  vim-gtk           2:7.4.052-1ubuntu4     amd64     Vi IMproved - enhanced vi editor - with GTK2 GUI
ii  vim-gui-common    2:7.4.052-1ubuntu4     all       Vi IMproved - Common GUI files
ii  vim-runtime       2:7.4.052-1ubuntu4     all       Vi IMproved - Runtime files
ii  vim-tiny          2:7.4.052-1ubuntu4     amd64     Vi IMproved - enhanced vi editor - compact version

オリジナルの vim --version の出力と比べると python3 インターフェースが有効になっているのが分かります。

$ diff -u orig-vim.gtk-version.txt <(vim --version)
--- orig-vim.gtk-version.txt	2014-04-26 15:48:29.234466537 +0900
+++ /dev/fd/63	2014-04-26 17:12:13.006045318 +0900
@@ -1,7 +1,7 @@
-VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan  2 2014 19:39:59)
+VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 26 2014 16:45:41)
 適用済パッチ: 1-52
 Modified by pkg-vim-maintainers@lists.alioth.debian.org
-Compiled by buildd@
+Compiled by t2y@...
 Huge 版 with GTK2 GUI.  機能の一覧 有効(+)/無効(-)
 +acl             +farsi           +mouse_netterm   +syntax
 +arabic          +file_in_path    +mouse_sgr       +tag_binary
@@ -18,8 +18,8 @@
 +cmdline_info    +keymap          +postscript      +virtualedit
 +comments        +langmap         +printer         +visual
 +conceal         +libcall         +profile         +visualextra
-+cryptv          +linebreak       +python          +viminfo
-+cscope          +lispindent      -python3         +vreplace
++cryptv          +linebreak       +python/dyn      +viminfo
++cscope          +lispindent      +python3/dyn     +vreplace
 +cursorbind      +listcmds        +quickfix        +wildignore
 +cursorshape     +localmap        +reltime         +wildmenu
 +dialog_con_gui  +lua             +rightleft       +windows

python/dyn, python3/dyn に変わってしまいました。vim のドキュメントによると、Windows だと DLL を探すように書いてあります。Linux だと関係ないのかな?これでも Python 拡張が動いたので気にしないことにします。

$ vim
:help python-dynamic
----
9. Dynamic loading                                      python-dynamic         
                                                                               
On MS-Windows the Python library can be loaded dynamically.  The :version      
output then includes +python/dyn.                                              
                                                                               
This means that Vim will search for the Python DLL file only when needed.      
When you don't use the Python interface you don't need it, thus you can use    
Vim without this DLL file.

Mac OS X で vim の Python インタフェースを有効にする

Mac OS X 10.6.6 (Snow Leopard) に標準でインストールされている vimPython インタフェースが有効になっていません。有効にするには、macports から vimコンパイルオプションをセットしてインストールする方法があります。一度やったはずなのに、その方法を全く思い出せません(> <)、次に来る買い替え時期か、OS を再インストールするときのために備忘録としてまとめておきます。

Python インタフェースが有効かどうかはバージョン情報を表示すると分かります。"-python" は無効になっていることを表します。

$ /usr/bin/vim --version | grep python
+printer -profile -python +quickfix +reltime -rightleft -ruby +scrollbind 

macports から Python インタフェースを有効にするためのコンパイルオプションを調べます。

$ sudo port variants vim
vim has the variants:
...
   python: Compatibility variant, requires +python25
     * requires python25
   python25: Enable Python scripting
     * conflicts with python26 python27 python31
   python26: Enable Python scripting
     * conflicts with python25 python27 python31
   python27: Enable Python scripting
     * conflicts with python25 python26 python31
   python31: Enable Python scripting
     * conflicts with python25 python26 python27
...

お好みの Python バージョンが指定できるようです。ここでは Python 2.7 でコンパイルすることにします。

$ sudo port clean vim
(# macports から vim をインストール済みなら先にアンインストールします)
($ sudo port uninstall vim)
$ sudo port install vim +python27

macports からインストールすると、/opt/local/bin に vim コマンドがインストールされます。

$ /opt/local/bin/vim --version | grep python
+path_extra -perl +persistent_undo +postscript +printer -profile +python 
-python3 +quickfix +reltime -rightleft -ruby +scrollbind +signs +smartindent 
Linking: /usr/bin/gcc-4.2   -L/opt/local/lib -arch x86_64 -o vim
             -lm  -lncurses -liconv -framework Cocoa
             -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config
             -lpython2.7 -framework CoreFoundation -u _PyMac_Error 
             /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python     

"+python" に変わり、Python インタフェースが有効になりました。

リファレンス:

vim のキーバインドをダイヤモンドカーソルに変更する

wikipedia:ダイヤモンドカーソル って何?何なのよー



歴史的背景も、この話題が出た経緯も、どういう空気なのかも全く分かりませんが、つまりは vim でダイヤモンドカーソルのキーバインドに変更するのはどうやるの?って言っているのですよね。

以下のように .vimrc に定義することで簡単にキーバインドを変更できます *1。nmap がノーマルモードでのキーバインドimap が挿入モードのキーバインドです *2 。ダイヤモンドカーソルへキーバインドを変更すること自体はあまり意味がないのですが、例えば、コマンドモードで任意のコマンドをショートカットキーで実行させたいときにとっても便利です。

$ vi ~/.vimrc
" keybind settings
nmap <C-S> <LEFT>
imap <C-S> <LEFT>
nmap <C-E> <UP>
imap <C-E> <UP>
nmap <C-D> <RIGHT>
imap <C-D> <RIGHT>
nmap <C-X> <Down>
imap <C-X> <Down>

Fedora13 の環境で試してみたのですが Ctrl-S のキーバインドの変更が意図したように動作しません。Ctrl-S と Ctrl-Q はフロー制御文字としてターミナルで特別な扱いになっているのでその設定変更が必要です *3 。この辺はターミナルかプラットフォームのデフォルト設定によって異なるのかもしれません。

$ rpm -q vim-common gnome-terminal
vim-common-7.3.055-1.fc13.i686
gnome-terminal-2.30.1-1.fc13.i686
$ stty -ixon -ixoff

これでダイヤモンドカーソルを堪能できました。

最近、見つけたのですが Vim-users.jp が素晴らしいです。Vim Hacks Project に目を通すと vim を使う楽しさがもっと広がると思います。

*1:vimをカスタマイズして、使い慣れたキーバインドを設定する - builder by ZDNet Japan

*2:map は全てのモードで有効になるとあったのですが、私の環境では動作しませんでした

*3:Vim - General - vim | ctrl-s mapping does not work