IPythonの設定

~/.ipython/ipy_user.conf.py に

This is a more flexible and safe way to configure ipython than *rc files
(ipythonrc, ipythonrc-pysh etc.)

とあるので,このファイルを編集することにする.設定の意味はipythonrcの方に書かれているのでそれを参考に.また方針として ip_user_conf.py だけで完結させることにする.(=日本語の問題を解決するために iplib.py を直接編集しない)


設定したのは

  • 終了時に確認を取らない
  • プロンプトは'>>> ' (ただし -cl で起動する場合と違って色付き)
  • C-lでclear-screen
  • u','.jo 等で補完が出るように(この場合join)
  • 日本語関連の不具合を直す
  • virtualenvとの連携(元ネタ)

などなど.

#!/usr/bin/python
# -*- coding: utf-8 -*-

""" User configuration file for IPython"""

import IPython.ipapi, IPython.iplib
ip = IPython.ipapi.get()

import os
import sys
import site


def main():
    o = ip.options
    # see ~/.ipython/ipythonrc
    o.system_verbose = 0
    o.confirm_exit = 0
    o.banner = 0
    o.prompt_in1 = r'>>> '
    o.prompt_in2 = r'.\D: '
    o.prompt_out = r''
    # remove all input/output separators
    o.nosep = 1
    # M-*を削除.iとoだけで十分かも
    _binds = []
    for b in o.readline_parse_and_bind:
        if not b.startswith('"\\M-'):
            _binds.append(b)
    o.readline_parse_and_bind = _binds
    o.readline_parse_and_bind.append(r'"\C-l": clear-screen')
    # alias
    o.autoexec.append('__IPYTHON__.magic_ed = __IPYTHON__.magic_edit')
    # greedy complete (ex: ','.j<TAB> -> ','.join)
    import ipy_greedycompleter
    for m in ('os', 'sys', 'math'):
        ip.ex("import %s" % m)
    IPython.iplib.InteractiveShell.runsource = _runsource

    # virtualenv (from http://www.ianlewis.org/jp/ipython-virtualenv)
    if 'VIRTUAL_ENV' in os.environ:
        virtual_env = os.path.join(os.environ.get('VIRTUAL_ENV'),
                                   'lib',
                                   'python%d.%d' % sys.version_info[:2],
                                   'site-packages')
        site.addsitedir(virtual_env)
        print 'VIRTUAL_ENV ->', virtual_env
        del virtual_env


def _runsource(self, source, filename='<input>', symbol='single'):
    # source=source.encode(self.stdin_encoding)
    if source[:1] in [u' ', u'\t']:
        source = u'if 1:\n%s' % source
    try:
        code = self.compile(source,filename,symbol)
    except (OverflowError, SyntaxError, ValueError, TypeError):
        self.showsyntaxerror(filename)
        return None
    if code is None:
        return True
    self.code_to_run = code
    if self.runcode(code) == 0:
        return False
    else:
        return None

main()

*1:'0' とか

*2:u'あ' が u'\xe3\x81\x82' と1byte文字*3として認識される.このためか print u'あ' で文字化け