gauche+rlwrapで関数補完を行う

.bashrcに以下を追加

export RLWRAP_HOME=~/.rlwrap
function gosh(){ if [ $# -ge 1 ] && [ $1 == '-e' ]; then echo "$2">$$.scm;shift 2;`which gosh` $$.scm "$@";rm $$.scm; else rlwrap -b '(){}[],#\";| ' `which gosh` "$@";fi }

補完リスト作成

$ gosh -e '(for-each print (sort (map symbol->string (let loop ((mod (all-modules))) (if (null? mod) () (append (hash-table-keys (module-table (car mod))) (loop (cdr mod))))))))' > .rlwrap/gosh_completions

これでコマンドラインでgoshを立ち上げた際に関数補完を行う。

ロードしていないモジュールとか考えるともう少し色々しなきゃいけないんだろうが困ったときにまたやるということで。
環境がスキルよりもオーバースペックだ(笑

以下は備忘録

userモジュール以下が束縛している変数一覧を得る

(for-each print (sort (map symbol->string (let loop ((mod (module-precedence-list (current-module)))) (if (null? mod) () (append (hash-table-keys (module-table (car mod))) (loop (cdr mod))))))))

ロードされているモジュールのエクスポートしているリストを得る

(for-each print (sort (map symbol->string (append-map module-exports (all-modules)))))

と、おもったら見事にはまった

(Gauche release 0.7.3から、`.gaucherc'はgoshがスクリプトモードで起動された時は読まれなくなりました。)

残念、今度ライブラリを全部ロードして作り直すか

$ cat .gaucherc 
(use srfi-1)
(use srfi-27)(random-source-randomize! default-random-source)
(read-eval-print-loop #f #f (lambda results (map (cut print "=>" <>) results)) (lambda () (display "\n>>") (flush)))
(display "\nbye...\n")
(exit)
$ gosh -e '(for-each print (sort (map symbol->string (map module-name (all-modules)))))'
gauche
gauche.gf
gauche.internal
gauche.object
gauche.vm.debugger
null
scheme
srfi-10
srfi-17
srfi-2
srfi-6
srfi-8
user
$ gosh

>>(for-each print (sort (map symbol->string (map module-name (all-modules)))))
gauche
gauche.collection
gauche.defvalues
gauche.gf
gauche.interactive
gauche.internal
gauche.object
gauche.procedure
gauche.sequence
gauche.uvector
gauche.vm.debugger
math.mt-random
null
scheme
srfi-1
srfi-10
srfi-17
srfi-2
srfi-26
srfi-27
srfi-4
srfi-6
srfi-8
user
util.queue
=>#<undef>

>>