試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Debian/UbuntuのPythonシェル(pythonコマンド)でTab補完を用いる

PythonシェルのGUI環境である

  • IDLE
  • IPython

といったものの中でTabキーを押すと、コマンド行シェルのように入力途中の文字列について候補が1つだけの部分が補完され、複数ある部分は再びTabキーを押すことで候補一覧を表示することができる。
Python(python(-[バージョン])コマンド)自体を端末から起動したときにも、以前Mandrivaを用いていたときには同様にTabキーで補完,候補一覧表示を行うことができるようになっていたのだが、Ubuntu(10.10時点)のPythonではTab文字がそのまま出るだけとなっていた。

端末から起動するPythonシェルの中でTab補完を用いるための処理と補完の操作

端末から起動するPythonシェルの中でTab補完を用いるためには

  • rlcompleter
  • readline

の2つのモジュールをimport処理してTabキーを用いるための処理を呼び出すとTab補完ができるようになる。ただ、readlineのモジュールはGNU/Linuxでは基本的に存在するが、他の環境では使えないことがあるかもしれない。

>>> import rlcompleter
>>> import readline
>>> readline.parse_and_bind ('tab: complete')

これで

>>> re[Tabを2回押す]

入力途中でTabキーを押すと

>>> re
readline   reduce(    reload(    repr(      return     reversed(
>>> re

と候補一覧が出て、候補が1つのところでTabキーを押すと

>>> read[Tabを押す]

>>> readline

のようになる。候補が多いと

>>> readline.[Tabを押す]

下のようにページ分けされて表示される(数が非常に多い場合は表示前に確認が出る)、SPACEでページ送りができる。

readline.__class__(
readline.__delattr__(
readline.__dict__
readline.__doc__
readline.__file__
(中略)
readline.add_history(
readline.clear_history(
readline.get_begidx(
--More--

この例では2ページで終わりとなった。

readline.get_completer(
readline.get_completer_delims(
readline.get_completion_type(
readline.get_current_history_length(
readline.get_endidx(
(中略)
readline.set_pre_input_hook(
readline.set_startup_hook(
readline.write_history_file(
>>> readline.

自動的にTab補完が有効になるようにする

Pythonシェルを起動したときに先ほどの3つの処理を自動的に実行するようにできれば自動的にTab補完が使えるようになる。

環境変数PYTHONSTARTUPの利用

環境変数PYTHONSTARTUPの場所にあるスクリプトPythonシェルの起動時に自動実行されるため

とすることでTab補完を自動的に有効にできる。
[任意]ファイル名: ~/bin/python-tabcomp.py

import rlcompleter
import readline
readline.parse_and_bind ('tab: complete')

コマンド行シェルから起動する際には下のようなエイリアスの登録が便利。スクリプトの配置場所は実際の場所に合わせる。
bash,zsh向け:
[一部]ファイル名: ~/.bashrc, ${ZDOTDIR}/.zshrc

alias python='PYTHONSTARTUP=~/bin/python-tabcomp.py python'

tcsh向け:
[一部]ファイル名: ~/.tcshrc

alias python "env PYTHONSTARTUP=${HOME}/bin/python-tabcomp.py python"

複数のバージョンのPythonがある場合はコマンド名の部分をバージョンごとの名前(「python2.6」や「python3.1」など)に置き換える。

sitecustomize.pyの編集

Debian/Ubuntu/etc/python[バージョン]/sitecustomize.pyも自動的に実行される仕組みになっているため、このファイルを管理者権限で編集して上の${HOME}/bin/python-tabcomp.pyとして貼り付けた内容を追記するとTab補完を自動的に有効にできる。
複数のバージョンのPythonがある場合はバージョンごとの各ディレクトリにあるsitecustomize.pyに対して追記処理を行う。