Gaucheとは、日本人ハッカー「川合 史朗」さんが作ったLisp
の一種である、Scheme
の処理系です。
特徴としては、簡単にWebアプリケーションを書けるらしいです。
今回は、この言語を使って、端末に入力されたキーを判別し、入力と同時に処理を行う方法を紹介します。
##Gaucheのインストール
$ sudo port install gauche
##Gaucheの使い方
$ gosh
$ (exit)
##改行を待たずに端末から一文字読み取る
read-single-char.gosh
#!/usr/bin/gosh
(use gauche.termios)
;; http://d.hatena.ne.jp/rui314/20070319/p1
;; 端末を非カノニカルモードに変更して1文字を読む手続き。
;; リターンするまえに端末のモードを元に戻す。
(define (read-single-char port)
(let* ((attr (sys-tcgetattr port))
(lflag (slot-ref attr 'lflag)))
(dynamic-wind
(lambda ()
(slot-set! attr 'lflag (logand lflag (lognot ICANON)))
(sys-tcsetattr port TCSAFLUSH attr))
(lambda ()
(read-char port))
(lambda ()
(slot-set! attr 'lflag lflag)
(sys-tcsetattr port TCSANOW attr)))))
;; プログラムのエントリポイント
(define (main args)
;;(display "Press any key: ")
;; カレント出力ポートは行バッファリングなので、明示的にフラッシュする。
;; 上のdisplayは改行を含んでいないので、フラッシュしなければ何も出力されない。
(flush)
(let1 c (read-single-char (current-input-port))
;; (format #t "\ngot \"~a\" (UCS code 0x~X)\n"
(format #t "\n~a ~X\n"
c (char->ucs c)))
0)
実行方法は以下の通りになります。
$ gosh read-single-char.gosh
ここで、何かのキーを押すと、そのキーのコードを取得してくれます。
##入力キーによって処理を変更する
以下の様なシェルスクリプトを作ります。
mac-key.sh
#!/bin/bash
key=`gosh read-single-char.gosh |col -bx| tr -d ''`
key=`echo $key`
case "$key" in
"A") echo "Enter";;
"1B") echo "Esc";;
"20") echo "Space";;
"9") echo "Tab";;
"7F") echo "Delete";;
*) exit 0;;
esac
ポイントは、col -bx
です。これにより、エスケープシーケンスなどの余分な出力を排除しています。
また、tr -d ''
は、空白削除のために多用されるコマンドです。echo $hoge
も余分な空白を消してくれます。
シェルスクリプトの実行は以下の様な感じです。
$ chmod +x mac-key.sh
$ ./mac-key.sh
例えば、二文字の入力待ちにして、かつ入力完了後に、引数として渡すなら、以下の様な書き方ができます。
for i in `gosh read-single-char.gosh | cut -c1`;for t in `gosh read-single-char.gosh | cut -c1`;do "任意のコマンド" $i$t;done
ポイントは、cut -c1
です。これにより、アルファベット入力だけを出力しています。