こんにちはchibaです。 ネタ切れなのでいきなりLISPネタなのですが、letでつつまれた式を編集している際に、後で束縛したい変数を追加したくなることって良くありますよね。
(let ((str "foo bar baz")) .... (setq len (length str)))
という風に書いていて、後でlenが欲しくなるような
つまり
(let ((str "foo bar baz") (len 0)) .... (setq len (length str)))
こういう風に前に戻って(len 0)を追加したいわけですね。
思い立ったが吉日なのでそういうelispを書いてみることにしました。
(progn (defun edit-let-bind () (interactive) (let ((foundp nil)) (save-excursion (catch 'loop (while (not (c-at-toplevel-p)) (backward-up-list) (down-list) (let ((thing (thing-at-point 'symbol))) (cond ((or (string= "let" thing) (string= "do" thing)) (down-list) (setq foundp t) (throw 'loop nil)) ('T (backward-up-list)))))) (when foundp (recursive-edit))))) ;; keybind (define-key global-map [(control meta shift ?c)] 'edit-let-bind))
非常に適当な作りですが、letや、doの束縛部を編集するために、再帰編集モードに入り、束縛部分にカーソルを飛し、編集が終わったら、再帰編集モードから抜ける、という風にしてみました。
再帰編集モードから抜けるのが、C-M-cだったので、C-M-sh-cで、束縛部の編集へ。
一応それなりに便利に使えますが、どなたかもっとちゃんとした、elispの流儀に則ったものを作成して頂けると嬉しいです!
■