vimでPythonコードの折りたたみ

vimPHP開発していた時は、良くvim の 折りたたみ機能を使ってました。

理由としては、割とメソッドを移動したりするのが楽だったり(折りたたみしてる所は yy , dd でヤンクできるから)、メソッド、クラス単位で折りたたみされてるので、俯瞰してそのファイルを眺める事ができるから、不要なメソッドとかを見つけやすかったからです。

折りたたみは最初、開けたり閉じたりするのが面倒だったんですが、気がつけば、小指が za を押すのに慣れてしまいました

といわけで、そろそろPythonのヤツも欲しいなと思ったので、プラグインを探しました。割合古いものですが、見やすいので大分気に入っています。

python_fold - Folding expression for python : vim online

これを ~/.vim/plugin の下に設置すればそれでおkです。

簡単な使い方

たとえば こんなソースがあるとします。

#!/usr/bin/env python
#-*- coding:utf8 -*-

class TestClass(object):
    """ TestClass だよ 
    python_fold.vimの折りたたみの仕方を確認
    """
    _name = None

    def __init__(self, name = None):
        """ クラスの初期化 """
        if name:
            self._name = name

    def hello(self):
        """ 挨拶する 
        名前がセットされていなければ
        helloとだけ表示される
        """
        print 'Hey! My name is ' + self._name if self._name else 'Hello!'


def say_hello(name=None):
    """ TestClassをインスタンス化してhelloする """
    test = TestClass(name)
    test.hello()

if __name__ == '__main__':
    say_hello('hoge') #=> Hey! My name is hoge
    say_hello()       #=> Hello!

これをpython_fold.vimを導入した後だとファイルを開いた直後はこうなります。

#!/usr/bin/env python
#-*- coding:utf8 -*-

  17 lines: class TestClass(object):  TestClass だよ -------------------------------------------------

   4 lines: def say_hello(name=None):  TestClassをインスタンス化してhelloする -------------------------
    
if __name__ == '__main__':
    say_hello('hoge') #=> Hey! My name is hoge
    say_hello()       #=> Hello!

クラスと、関数がfoldされているのが分かると思います。これを開くときは、そのラインにいって、 za を素早く押せば開きます。閉じる時もzaです。TestClassを開くとこんな感じになります。

#!/usr/bin/env python
#-*- coding:utf8 -*-

class TestClass(object):
    """ TestClass だよ 
    python_fold.vimの折りたたみの仕方を確認
    """
    _name = None
    
   4 lines:     def __init__(self, name = None):  クラスの初期化 --------------------------------------------------
        
   6 lines:     def hello(self):  挨拶する ----------------------------------------------------------------------

   4 lines: def say_hello(name=None):  TestClassをインスタンス化してhelloする -------------------------
    
if __name__ == '__main__':
    say_hello('hoge') #=> Hey! My name is hoge
    say_hello()       #=> Hello!

このプラグインが良いなーと思ったのは、クラス宣言、メソッド宣言直後のdocstringの最初の一行を、foldした時に右側に表示してくれる所です。なので一行目のdocstringはなるべく簡潔な説明を書くようにしてます。

なんか上のソースだと折りたたみされている様子が分かりずらいですね。こんな風になります。