2017年02月21日
gnupackで起動するgauche(Scheme)に入力補完機能を追加する
gnupackのcygwinで起動するgaucheに入力補完機能を追加してみました。
まずgnupackのcygwinにrlwrapをインストールします。
cygwinターミナルで
ターミナルが戻ったら
以下のSchemeプログラムを先ほど作成した.rlwrapディレクトリに保存します。ファイル名は好きに決めて構いませんがここではget-scheme-completions.scmとします。
gnupackのcygwinを開き、.rlwrapに移動したらgaucheを起動します。
.rlwrapディレクトリにgosh_completionsというファイルが作成されます。
goshを終了し、
無事に入力補完ファイルが作成できたら.rlwrapディレクトリを参照するパスを登録します。
gnupackのインストールディレクトリを開いてsatrtup_config.iniを開きます。[Process Variable]の下にならぶPATH...の下に
いままでの操作が正しくできていれば入力補完機能が使えるようになっています。
gnupackのcygwinターミナルを開き、
候補が複数ある場合は2回Tabキーを押せば候補を表示してくれます。
いくつか試してみると入力補完が不完全であることがわかります。これはrlwrapの区切り文字にデフォルトでは「+-=%^」などが含まれているためです。そのためrlwrapのオプションで区切り文字を指定し、余計な区切り文字で補完が妨げられるのを防ぎます。
さらにクォート文字にダブルクォートを指定してScheme式にクォートを使用しても括弧がハイライトされるようにします。
そしてさらにSchemeプログラムをロードする際や、ファイルを開く際のファイル名の補完機能も追加します。
cygwinターミナルを開き
入力を試してみます。
入れ子の括弧のなかでクォートを用いてもきちんと括弧がハイライトされます。
指定した文字が区切り文字として機能し、指定していない文字が区切り文字として機能せず、Schemeの入力補完が完全に行われています。(空白は常に区切り文字として認識されるヨ)
ファイル名を指定するときも入力補完してくれます。
gaucheを起動するたびにいちいち
homeディレクトリにある.bashrcを開き一番最後に
.bashrcを保存してcygwinを再起動し、
試してみると
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
(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) 新品価格 |
新品価格 |
【このカテゴリーの最新記事】
-
no image
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/5966399
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック