入力乗っ取り+疑似バックグラウンド実行

よい子は真似しちゃダメ

;;; キーボードの入力を乗っ取る
;;; とりあえず乗っ取ってみたかっただけなので、入力されたキーを
;;; そのまま buffer に insert
;;; C-g か RET で終了
(defun read-input ()
  (popup-string "*** キーボード入力 横取り中 ***" (point))
  (let (c)
    (handler-case
        (while (setq c (read-char *keyboard*))
          (case c
            ((#\C-g #\RET)
             (unread-char c *keyboard*) (quit))
            (t
             (insert (format nil "~A" c))
             (refresh-screen))
            )
          (continue-popup))
      (quit ()
        (ed::erase-popup) ;ac-mode が必要
        :done))))
=> read-input

;;; これを評価するとキーボードからの入力が乗っ取られる
;;; "hello world[RET]" と打ってみた
(read-input)
hello world
=> :done

;;; 疑似バックグランド実行でも同じように動く
(start-timer 0 'read-input t)
=> t
hello world