アフィリエイト広告を利用しています

広告

posted by fanblog

2017年02月21日

gnupackで起動するgauche(Scheme)に入力補完機能を追加する

gnupackのcygwinで起動するgaucheに入力補完機能を追加してみました。

gosh_rlwrap00.png



rlwrapをインストールする


まずgnupackのcygwinにrlwrapをインストールします。

cygwinターミナルで
apt-cyg install rlwrap
を実行します。いろいろ表示されますがターミナルが戻るまで待ちます。

ターミナルが戻ったら
which rlwrap
と入力して
/usr/bin/rlwrap
と表示されたらインストール成功です。失敗した時は
which: no rlwrap in ...
と表示されます。


goshの入力補完ファイルを入れるフォルダを作成する


cd
コマンドでホームディレクトリに戻り、
mkdir .rlwrap
を実行して入力補完ファイルを格納するディレクトリを作成します。
cd .rlwrap
で、このディレクトリに移動します。


入力補完ファイルを作成する


以下のSchemeプログラムを先ほど作成した.rlwrapディレクトリに保存します。ファイル名は好きに決めて構いませんがここではget-scheme-completions.scmとします。


;;rlwrapの補完リストを出力する
;;https://fanblogs.jp/iorisprogramming
(define (get-scheme-completions)
(define ht (make-hash-table))
(define (get-keys-from-module module-name)
(hash-table-keys
(module-table
(find-module module-name))))
(define (register module)
(for-each
(lambda (key)
(hash-table-put! ht key #t))
(get-keys-from-module module)))
(register 'scheme)
(register 'null)
(register 'gauche) ;;goshの入力補完
(let ((oport (current-output-port)))
(current-output-port (open-output-file "gosh_completions"))
(for-each
print
(sort
(map symbol->string (hash-table-keys ht))))
(current-output-port oport)))



gnupackのcygwinを開き、.rlwrapに移動したらgaucheを起動します。
(load "get-scheme-completions.scm")
で保存したSchemeプログラムを読み込み
(get-scheme-completions)
で実行します。

.rlwrapディレクトリにgosh_completionsというファイルが作成されます。

goshを終了し、
cat gosh_completions
で確認します。きちんとSchemeのキーワードが書かれていれば成功です。このSchemeプログラムでは1593の補完単語が登録されます。srfiやgaucheの他のライブラリも加えると4000を超える単語が登録されます。必要なら追加してみてください。


パスを通す


無事に入力補完ファイルが作成できたら.rlwrapディレクトリを参照するパスを登録します。

gnupackのインストールディレクトリを開いてsatrtup_config.iniを開きます。[Process Variable]の下にならぶPATH...の下に
###rlwrapの補完機能用ファイルの環境変数
RLWRAP_HOME = %HOME%\.rlwrap
を追加します。


試してみる


いままでの操作が正しくできていれば入力補完機能が使えるようになっています。

gnupackのcygwinターミナルを開き、
rlwrap gosh -i -I "."
でgaucheを起動します。いくつかのSchemeキーワードを打ち込んでTabキーを押してみると入力補完をしてくれるのがわかると思います。

候補が複数ある場合は2回Tabキーを押せば候補を表示してくれます。


改善する


いくつか試してみると入力補完が不完全であることがわかります。これはrlwrapの区切り文字にデフォルトでは「+-=%^」などが含まれているためです。そのためrlwrapのオプションで区切り文字を指定し、余計な区切り文字で補完が妨げられるのを防ぎます。

さらにクォート文字にダブルクォートを指定してScheme式にクォートを使用しても括弧がハイライトされるようにします。

そしてさらにSchemeプログラムをロードする際や、ファイルを開く際のファイル名の補完機能も追加します。

cygwinターミナルを開き
rlwrap -c -q '"' -b "'\"\`(){}[],#@;|" gosh -i -I "."
でgaucheを起動します。


試してみる


入力を試してみます。

入れ子の括弧のなかでクォートを用いてもきちんと括弧がハイライトされます。

指定した文字が区切り文字として機能し、指定していない文字が区切り文字として機能せず、Schemeの入力補完が完全に行われています。(空白は常に区切り文字として認識されるヨ)

ファイル名を指定するときも入力補完してくれます。


goshの起動コマンドを簡略化する


gaucheを起動するたびにいちいち
rlwrap -c -q '"' -b "'\"\`(){}[],#@;|" gosh -i -I "."
を入力するのは面倒なので.bashrcを編集して入力を簡略化します。

homeディレクトリにある.bashrcを開き一番最後に
#rlwrap補完機能追加 #-c:ファイル名も補完 #クォートを"に指定 #-b区切り文字を指定
alias gosh='rlwrap -c -q '\''"'\'' -b "'\''\"\`(){}[],#@;|" gosh -i -I "."'
を追加します。(エスケープ文字がいっぱい)

.bashrcを保存してcygwinを再起動し、
gosh
でgaucheを起動してみます。

試してみると
rlwrap -c -q '"' -b "'\"\`(){}[],#@;|" gosh -i -I "."
で起動したときと同じ動作をするのがわかると思います。

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB DB PRESS plus)

新品価格
¥2,894から
(2017/2/20 16:11時点)



Scheme手習い

新品価格
¥3,024から
(2017/2/20 16:11時点)



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/5966399
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
検索
最新記事
最新コメント
カテゴリーアーカイブ
タグクラウド
<< 2018年05月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
プロフィール
さんの画像

情報系を専攻する学生。 しばらく使わなかったりした知識は忘れていくのでこのブログにまとめてみたり。
プロフィール
×

この広告は30日以上新しい記事の更新がないブログに表示されております。