2012-07-24

Ubuntu で Ruby や Perl をサポートする Vim をインストールする

Vim で複数のファイルを読み込んでいるときに、別のファイル(バッファ)へと切り替えるために BufExplorer というプラグインを利用していたのだが、ここのところ挙動不審で、起動すると最下行に「ESCAPE」などと赤背景の反転文字で表示されて Enter キーの入力を強制されるようなことが起こるようになっていた。

そこで何か代わりになるものはないかと探していたところ、「Command-T がすばらしい - hate.hate.hateda」という記事を見つけた。Command-T は TextMate の Command-T ショートカットで起動されるファイルブラウザを模倣した  Vim プラグインで、カレントディレクトリ以下のファイルを表示してキーの入力により簡単に絞り込んで目的のファイルを読み込めるようにするものである。このプラグインにはバッファ切り替えを同様のインタフェースで行う機能も付いているので好都合だ。

ただしこのプラグインは動作するのに Ruby のサポートをオンにしてコンパイルした Vim を要求する。ところが Ubuntu (Debian) の vim パッケージで提供されているものはこのサポートがオンになっていない。自分で Vim をコンパイルし直すしかないかな、と思っていると、vim-gnome パッケージが提供している Vim は Ruby サポートをオンにしてコンパイルされていることを偶然知った(Ruby の他にも Perl, Python, Lua, Tcl のサポートがオンになっている)。まず vim-gnome をインストールする。

$ sudo apt-get install vim-gnome

これによりコマンドライン版の vim は vim-gnome が提供するものを指すようになっている。必要なら以下のようにして vim パッケージが提供しているものを指すように戻すことができる。

$ sudo update-alternatives --config vim

また、以下のようにして editor を差し替えておいた方がいいだろう。

$ sudo update-alternatives --config editor

(追記) vim-nox も同様に LL 言語サポートオンの vim を提供する。nox は no X (Window) という意味のようで、何か別のパッケージ用にコンパイルされたものという意味ではない。サーバのように X がインストールされていないなら vim-nox を、デスクトップ版なら vim-gnome または vim-gtk をインストールするのがよいだろう。

2012-07-12

使用側から見た Python の import

以前、「Septième Sens: Pythonのimport」で Python の import について技術的な説明をしたが、それを読んでも import 文をどのように書いたらいいのかはよく分からない。そこで今回は、使用側から見た import 文について少し書いてみようと思う。

まず、私がたびたび陥る錯覚であるが、

import p

としたときに、p (パッケージ = __init__.py を持つディレクトリ) の直下にあるモジュールが全部見えるようになる、と思い込んでしまうということがある。

p/
|- __init__.py
|- a.py
`- b.py

となっていたときに、p.a も p.b も imoprt p さえ実行すれば見えるようになる、と思ってしまうのだ。import するものがモジュール(.py ファイル)なら、そのファイル内で定義されたトップレベルの関数やクラスは自動的に全部見えるようになる。だがパッケージは明示的に __init__.py で書かない限り配下のモジュールを見えるようにはしてくれない。

単純な事実だが、これが身につかないのは __init__.py でご親切に配下のモジュールについてたくさん見えるようにしてくださるパッケージが多いからである。例えば os.path.join() が使いたいと思ったときに、うっかり、

import os

と書いてしまったとしよう。ところがこの import 文の実行で os.path.join() が使えるようになるのだ(これは親切心からだけではなく、os.path として OS 環境別に別なモジュールを読み込むようになっているという事情もある)。

混乱しないようにするためには以下の手順に従えばよい:

  • p/q/r/m.py にある f() を利用したい場合:
  • p.q.r.m.f() として利用したいときには import p.q.r.m を実行する。
  • m.f() として利用したいときには from p.q.r import m を実行する。
  • f() として利用したいときには from p.q.r.m import f を実行する。
  • q.r.m.f() や r.m.f() として利用したいと考えてはいけない(単純な書き方は無い)。