2010/11/04

Stumpwm で It's All Text!

Firefox の It's All Text! は便利。それを Chrome でも Opera でも使いたい。探せばあるだろうけど、せっかく Common Lisp の Stumpwm を使っているので、 Stumpwm で同等の機能を実装してみた。ブラウザ以外でも C-a で全選択 C-c でコピー C-v でペーストができるものなら何にでも対応する。

(progn
(defvar *emacs-edit-request-window* nil)

(defcommand return-to-emacs-edit-request-window () ()
"戻る"
(let* ((win *emacs-edit-request-window*)
(group (stumpwm::window-group win))
(frame (stumpwm::window-frame win))
(old-frame (stumpwm::tile-group-current-frame group)))
(stumpwm::frame-raise-window group frame win)
(stumpwm::focus-all win)
(unless (eq frame old-frame)
(stumpwm::show-frame-indicator group))))

;; emacs で編集する。
(defun send-fake-key-seq (key-seq)
(loop for key in (stumpwm::parse-key-seq key-seq)
do (stumpwm::send-fake-key (current-window) key))
(xlib:display-finish-output *display*))

(defcommand start-emacs-edit () ()
"start emacs edit"
(setf *emacs-edit-request-window* (current-window))
(send-fake-key-seq "
C-a
C-c"
)
(run-shell-command "emacsclient -e '(progn (switch-to-buffer (generate-new-buffer \"*stumpwm-emacs-edit*\")) (setq buffer-offer-save nil))'")
(stumpwm::run-commands "emacs")
(send-fake-key-seq "
C-y
M-<"
))

(defcommand commit-emacs-edit () ()
"commit emacs edit"
(send-fake-key-seq "
C-x
h
M-w
C-x
k
RET"
)
(return-to-emacs-edit-request-window)
(send-fake-key-seq "
C-a
C-v"
))

(define-key *root-map* (kbd ",") "start-emacs-edit")
(define-key *root-map* (kbd ".") "commit-emacs-edit")
)

単にキーシーケンスを送っているだけなので、Emacs で編集中にタブを切り替えたりフォーカスを移動したりするとちゃんと動かない。

0 件のコメント: