interactive mode's archives

Perlの補完機能付きインタラクティブモード perlsh

by ginriki | 9 月 28th, 2008 

前回の記事の続き。

今回はperl。

探してみると、やっぱり対話型インターフェイスを作ってる方がいますね。
メソッド名などの補完も行ってくれるものとして、perlshがありました。
perlshは、Term::ReadLine::Gnuライブラリに付属してます。

Term::ReadLine::Gnuのインストールには、cpanを使うと便利です。
普通にyum install perlとかしとけば、cpanコマンドも付いてくるっぽい。

ただ、私のCentOS 5.1だと、cpan経由のライブラリダウンロードURL (urllist)の
設定がされてなかったので、下記リンク先を参考にしてurllistを設定しました。
http://www.drk7.jp/MT/archives/000885.html

そして、Term::ReadLine::Gnuライブラリをインストールするわけなんですが、
事前にreadlineライブラリ等をyumなどを使ってインストールしとかないと、うまくインストールできないらしいです1
私の環境では、すでにインストール済みだったので、特に問題ありませんでした。

Term::ReadLine::Gnuライブラリのインストールからperlshを使うまでの流れは以下、

$ cpan install Term::ReadLine::Gnu
$ perl ~/.cpan/build/Term-ReadLine-Gnu-1.17/eg/perlsh
main[1]$ use utf8
main[2]$ utf8:: [TAB]
utf8::             downgrade          is_utf8            unimport
AUTOLOAD           encode             native_to_unicode  upgrade
decode             import             unicode_to_native  valid
main[2]$ exit   #終了

perlshファイルは、実行パスの通ってるディレクトリに入れておくと起動が楽です。

  1. http://www.hasta-pronto.org/archives/2006/08/20-0408.php参照 []

PythonのインタラクティブモードでTab補完を使う

by ginriki | 9 月 25th, 2008 

昨日の記事の続き

このまま、各言語のインタラクティブモードの補完機能について書いてけば、
しばらくネタに困らないので続けよう。

今回はPythonです。

pythonの場合、引数なしで起動すればインタラクティブモードになりますが、
下記のようにrlcompleterをimportすることで、補完機能が使えます。
ただし、readlineライブラリが必要です。Linuxとかなら、yum install pythonで普通に入るようです。

PYTHON:
  1. $ python
  2. >>> import rlcompleter
  3. >>> rlcompleter.readline.parse_and_bind('tab: complete')
  4. >>> di [TAB]
  5. dict    dir     divmod
  6. >>> di

Windowsの人は、Python Alternative Readlineをインストールするのが楽だと思います。

若干、通常のreadlineと挙動が違うのがアレですが・・・。

参考サイト

Interactive ShellによるPHP対話入力補完

by ginriki | 9 月 24th, 2008 

この前の記事の続き。

rubyには、irbっていうinteractive modeあります。
irb実行中に、 require 'irb/completion' すると、TABでメソッド名等の補完ができるようになって大変便利です。

PHPのinteractive modeでも同じことができないかなと思い、
探してみたところ、PHP5.1 から標準で導入されてることがわかりました1

ただし、--with-readline付きでPHPをコンパイルした場合に限ります。2

yumでインストールしたPHPは、--with-readlineが付いてないので、3
PHP-cliだけソースコードからもう一度コンパイルしてみました。

環境は、CentOS 5.1です。

$ wget http://jp2.php.net/get/php-5.2.6.tar.gz/from/jp.php.net/mirror
$ tar xzvf php-5.2.6.tar.gz
$ cd php-5.2.6/
$ yum install libxml2-devel
$ yum install readline-devel
$ ./configure --prefix=~/local --disable-cgi --with-readline
$ make
$ make install
$ ~/local/bin/php -a
Interactive shell

php > get_class  [TAB]
get_class          get_class_methods  get_class_vars
php > get_class

うむ、便利だ。

  1. 補完機能付きのinteractive modeは、Interactive Shellっていう名称が付いてます。 []
  2. なんで、readlineを動的リンクするだけで使えるようにしてないんだー []
  3. 少なくとも、CentOS 5.1のyumでインストールしたPHPは--with-readlineはついてませんでした。 []

PHPインタラクティブモードの便利な使い方

by ginriki | 9 月 8th, 2008 

ブログに書くネタは結構あるんだけど、整理してから書こうとするとなかなか書けない・・・。

しょうがないんで、ネタは小出しに書くことにしよう。

PHPで何かのライブラリのオブジェクトを使う際、どんなメソッドがあるのかよくわからにことが多々あります。リファレンスを見りゃいいんですが、それが面倒な時は、PHP (CLI)のインタラクティブモードを使うと便利です。

インタラクティブモードの場合、statementが完成するたびに(セミコロンで区切られるたびに)処理が実行されるようです。

PHP:
  1. $ php -a
  2.  
  3. <?php
  4. $methods = get_class_methods(new XMLReader());
  5. print_r($methods);
  6. (
  7. [0] => close
  8. [1] => getAttribute
  9. ...
  10. [24] => expand
  11. )
  12. (Windowsだと Ctrl-Zで終了)
  13.  
  14. $

インタラクティブモードで、よく利用する関数は以下 (全部、リフレクション系関数)、

  • get_class_methods( mixed $class_name )  [クラスのメソッドを配列として返す]
  • get_object_vars ( object $object ) [オブジェクトのプロパティを配列として返す]
  • get_declared_classes(void) [定義済のクラスの名前を配列として返す]
  • get_defined_functions(void) [定義済の関数の名前を配列として返す]
  • get_defined_vars(void) [定義済の変数の名前を配列として返す]
  • get_loaded_extensions(void) [コンパイル/ロードされている全てのモジュールの名前を配列として返す]
  • get_extension_funcs ( string $module_name ) [あるモジュールの関数名を配列として返す]

ブログで紹介した商品

  • Image of デバッガの理論と実装 (ASCII SOFTWARE SCIENCE Language)