日常LISP (3) 常用シェルをCLISPに その2 — #:g1

Posted 2010-12-29 02:41:00 GMT

シェルをCLISPにしてみる実験の経過報告。
- まだ全部をCLISPにする、というのは辛い
- パイプの問題をどうするか
- プログラミングが簡単にできるので、部分的には、既存のシェルより楽になるところもある
- やっぱりEmacsのシェルモードから入力すると楽
- 履歴機能をもう少し充実させたい
といったところです。
改善点は、
- 括弧/ダブルクォートの対を簡単に入力できるようにした
- ユーティリティ関数を定義している
というところです。
括弧の入力支援については、
.inputrcに

"\eL": "()\C-b"
"\e\"": "\"\"\C-b"
というようなものを追加しました。
m-"とで、""が入力され、m-sh-Lで()が入力されます。括弧の方はちょっとイレギュラーですが、"("が遠いのでこういう風にしてみました。
また、Emacsのシェルモードで使うのに便利なように、
;; Emacs
(define-key shell-mode-map [(meta ?c)]
  (defun insert-\#\[\] ()
    (interactive)
    (insert "#[]")
    (backward-char)))
こんなのも定義してみました。
ユーティリティ関数については、
;; swank起動
(defun swank (&key (lisp :sbcl))
  (case lisp
    (otherwise #[/lisp/swank-sbcl-1.0.38])))

;; capistranoでデプロイ (defun cap-staging (name) (prog1 (run-program "/home/foo/bin/cap-staging" ;; 既存のシェルスクリプト :arguments (list (string-downcase name))) (princ #\Bell) (run-program "mpg123" :ARGUMENTS '("/home/foo/sounds/eudora-sound.mp3")) (run-program "firefox" :ARGUMENTS (list (case name (:project-foo "/var/tmp/deployfinish.html") (otherwise "http://unicodesnowmanforyou.com/"))))))

;; ssh (defun foo () #[ssh foo])

;; IE6マシンに接続 (defun ie6 () #[xvncviewer 192.168.1.6])

という非常にどうでも良いものばかりをずらずら定義していますが、割と便利です。
関数を定義するとファイルに書き出されるようにするともっと便利かもしれません。対話環境については、Interlispの環境がヒントになる気がしたのでちょっと真似してみたいと思っています。

comments powered by Disqus