Hatena::Groupcadr

kozima の日記

2011-04-03

emacs から StumpWM の eval を呼ぶ

| 11:28

.stumpwmrc を編集しているときに,とりあえず書いてみたものを評価したいと思うことがあったのでできるようにしました。

文字列を投げつける部分

stumpish を使うとよいようなので shell-command で呼び出してみました。結果は短ければミニバッファに,長ければ *Shell Command Output* バッファに現れるようです。

(defun mylib-stumpwmrc-eval-region (start end)
  (interactive "r")
  (let ((string (buffer-substring-no-properties start end)))
    (shell-command (format "echo %S | stumpish -e eval"
                           (format "(progn %s)" string)))))

(defun mylib-stumpwmrc-eval-last-sexp ()
  (interactive)
  (save-excursion
    (let ((start (progn (backward-sexp 1) (point)))
          (end (progn (forward-sexp 1) (point))))
      (mylib-stumpwmrc-eval-region start end))))

あんまりテストしてないのですが,C-x C-e で直前の式の評価, C-c C-r でリージョンの評価ができるつもり。

モード作った

わざわざ M-x からコマンド名を打ち込むのも手間なので,おざなりながらモードを作りました。

最初はマイナーモードとして作っておいて lisp-mode-hook に引っかければいいと思ったんですが,それだと slime とキーバインディングが衝突しました。slime-mode を呼ぶかどうかをファイル名を見て判断するように修正するとか,slime-mode の後で呼ばれるように順序を調整するという手も考えられますが,それもあんまりきれいな解決方法じゃない気がするし,それよりもメジャーモードにしてしまうのが早いだろうということでメジャーモードに。

(defvar mylib-stumpwmrc-mode-map (make-sparse-keymap))
(define-key mylib-stumpwmrc-mode-map "\C-x\C-e" 'mylib-stumpwmrc-eval-last-sexp)
(define-key mylib-stumpwmrc-mode-map "\C-c\C-r" 'mylib-stumpwmrc-eval-region)

(defun mylib-stumpwmrc-mode ()
  (interactive)
  (let ((lisp-mode-hook nil))
    (lisp-mode))
  (use-local-map mylib-stumpwmrc-mode-map))

(add-to-list 'auto-mode-alist '("\\.stumpwmrc$" . mylib-stumpwmrc-mode))

r_takaishir_takaishi2011/05/02 08:51StumpWMでswankサーバを起動して,slimeで接続すればいいと思うのですが,何か問題があるのでしょうか.もしあるなら教えて頂きたいです.