4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

マイナー言語Advent Calendar 2013

Day 5

Gauche - 端末に入力されたキーごとに処理を行う方法

Last updated at Posted at 2013-12-05

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です。これにより、アルファベット入力だけを出力しています。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?