Pythonを快適に編集できるようvimを設定する

vim


今日はさっくり小ネタ。

最近私はPythonを勉強中なのですが、「このての軽量言語はさっと書いてさっと実行できなきゃだめ」という信念のもと、編集にはvimを使っています。

とはいえ、Pythonは実はかなり「エディタを選ぶ」言語です。インデントによってブロックを表現するので、インデントがきちんと表示されないと困りますし、タブとスペースが入り交じってしまわないようなエディタの補助も欲しいところです。

というわけで、今日は、そんなPythonをすっきり快適に編集できるような vim の設定をご紹介します。

いきなり結論

私は以下のような記述を ~/.vimrc に追記しました。

autocmd FileType python setl autoindent
autocmd FileType python setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
autocmd FileType python setl tabstop=8 expandtab shiftwidth=4 softtabstop=4

これの元ネタは Python オフィシャルWebサイト( http://www.python.org/ ) のWiki中にある Vi Improoved (Vim) のページに書いてあったものです。

ですが、以下に挙げたような、私の好み等の問題で、さっくり修正してあります。

  • シンタックスの色付けは以前設定した ので、それをいじらず残した
  • コメントにエディタの都合の設定を書くのはなんとなく嫌。 (文字コードの指定は気にならないんですけどね。)
  • pythonでは言語仕様でタブ幅は8と決まっている*1ので、tabstopを4にしてしまうのは問題(タブが混じった「けしからん」ソースを読むときに表示がズレてしまう)
    • とはいえ、インデントを4文字幅、というのは維持したい
  • 以前突っ込まれた set / setlocal の使い分けは気にしておく。
  • ファイルの種類に応じた設定をするなら "autocmd FileType" のほうが素直な気がする。
  • omni-completion は……とりあえず要らないかな。

設定の意味をざっと解説しておきましょう。"autocmd FileType python" は、Pythonのファイルを開いた時に、それに続くコマンドを実行させるための記述で、この例ではすべてsetlでバッファローカルの変数に値を設定します。

autoindentは、Enterキーを押したときに、次行のインデントが揃うように自動的にスペースを挿入させるための設定で、smartindentは、ifなど、特定のキーワードで始まる行の末尾でEnterを押した際には、次行を1段下げてautoindentさせるための設定です。cinwordsで、smartindentがどのキーワードに反応するかを指定しています。

最後の行はタブ関連で、tabstop=8でタブ文字は8文字幅として扱いつつも、expandtab, shiftwidth, softtabstop の設定によって、TABキーを押しても、タブ文字の代わりに4文字のスペースが挿入されるようにしています。

今回は、すべての設定をPythonスクリプト編集時に限定して適用させましたが、大抵の設定は大抵の言語でも有用だと思いますので、autocmdを噛まさず常時適用させておくのもありかもしれませんね。とはいえ、タブ幅設定やcinwordsの設定は言語ごとに変えたいでしょうから、そのへんの設定は autocmd に入れておくことをお勧めします。


……いざエントリを書いてみたら全然「小ネタ」と言えない分量になる罠。

(2010-06-23: 注釈を追記)

*1:仕様はこちら http://docs.python.org/reference/lexical_analysis.html#indentation とはいえ、Python3ではそもそも「けしからん」ソースはエラーではねる仕様になったようなので、タブ幅の違いで問題が起こるシーンは少なくなるはずです