2007-06-04
■ REPLでヒストリと補完を使う (rlwrap)
問題
goshのREPLでヒストリと補完を利用したい。
答え
goshはreadlineライクな機能をサポートしておらず、ヒストリや補完が使えず不便です。一行前に戻ろうとしてCtrl-pを押すと、Ctrl-p自体が入力されてしまったりします。そこでおすすめなのがrlwrapというreadlineラッパーです。
rlwrapからgoshを起動すると、bashのようにCtrl-pで1つ前に戻ったり、Ctrl-rでヒストリから検索ができるようになります。Ctrl-aやMeta-bといった行編集機能も利用可能です。ヒストリはファイルに保存されるので、いったんgoshを終了して再起動してもまたヒストリから補完することができます。
補完をするには、~/.rlwrap/gosh_completionsに単語リストを作っておかなければいけません。次のスクリプトは、可能な限り多くのモジュールを読み込んで、そのモジュール群がエクスポートしている変数を出力するプログラムです。このプログラムの出力を~/.rlwrap/gosh_completionsに保存しておいてください。
(require "binary/io") (require "binary/pack") (require "dbi") (require "dbm") (require "dbm/fsdbm") (require "file/filter") (require "file/util") (require "gauche/auxsys") (require "gauche/cgen") (require "gauche/charconv") (require "gauche/collection") (require "gauche/config") (require "gauche/fcntl") (require "gauche/hook") (require "gauche/libutil") (require "gauche/listener") (require "gauche/logger") (require "gauche/mop/propagate") (require "gauche/mop/singleton") (require "gauche/mop/validator") (require "gauche/net") (require "gauche/package") (require "gauche/package/fetch") (require "gauche/package/util") (require "gauche/parameter") (require "gauche/parseopt") (require "gauche/process") (require "gauche/regexp") (require "gauche/selector") (require "gauche/sequence") (require "gauche/serializer") (require "gauche/syslog") (require "gauche/termios") (require "gauche/test") (require "gauche/threads") (require "gauche/time") (require "gauche/uvector") (require "gauche/version") (require "gauche/vport") (require "math/const") (require "math/mt-random") (require "rfc/822") (require "rfc/base64") (require "rfc/cookie") (require "rfc/hmac") (require "rfc/md5") (require "rfc/mime") (require "rfc/quoted-printable") (require "rfc/sha1") (require "rfc/uri") (require "srfi-0") (require "srfi-1") (require "srfi-10") (require "srfi-11") (require "srfi-13") (require "srfi-14") (require "srfi-19") (require "srfi-2") (require "srfi-26") (require "srfi-27") (require "srfi-29") (require "srfi-37") (require "srfi-4") (require "srfi-42") (require "srfi-43") (require "srfi-5") (require "srfi-9") (require "sxml/adaptor") (require "sxml/serializer") (require "sxml/ssax") (require "sxml/sxpath") (require "sxml/tools") (require "sxml/tree-trans") (require "text/csv") (require "text/diff") (require "text/gettext") (require "text/html-lite") (require "text/info") (require "text/parse") (require "text/sql") (require "text/tr") (require "text/tree") (require "util/combinations") (require "util/digest") (require "util/isomorph") (require "util/lcs") (require "util/list") (require "util/match") (require "util/queue") (require "util/rbtree") (require "util/record") (require "util/relation") (require "util/stream") (require "util/toposort") (require "util/trie") (require "www/cgi") (require "www/cgi-test") (use srfi-1) ;; カレントモジュールが継承しているモジュールで定義されている変数と、 ;; その他のモジュールがエクスポートしている変数を出力する。 (define (main args) (define (register lister modules) (for-each (lambda (mod) (for-each (cut hash-table-put! ht <> #t) (lister mod))) modules)) (define ht (make-hash-table)) (register (lambda (mod) (hash-table-keys (module-table mod))) (module-precedence-list (current-module))) (register module-exports (all-modules)) (for-each print (sort (map symbol->string (hash-table-keys ht)))) 0)
次の行を.bashrcに足しておくと便利です。
alias gosh="rlwrap -b '(){}[],#\";| ' gosh"
Schemeの変数名にはハイフンが普通に使われるので、ハイフンが補完の区切りと見なされると不便ですが、デフォルトの単語区切りはハイフンを含んでいて補完に支障があります。ここでは-bオプションでハイフンを除いたセパレータを単語区切りとして明示的に指定することにしました。
参照
トラックバック - http://d.hatena.ne.jp/rui314/20070604/p1
