次のように関数定義内で行頭に開き括弧がある場合にその内側から beginning-of-defun で関数の先頭に移動しようとすると、 デフォルトの挙動では (let ...) の開き括弧の位置にカーソルが移動してしまいます。
行頭に開き括弧があったら、それを関数の開始位置として認識しているっぽいです。
(defun foo () (let (bar) ; ここで beginning-of-defun すると let の開き括弧に行く ) )
そこからもう一度 beginning-of-defun すれば (defun ...) の開き括弧に行ってくれるんですが、なんか嫌です。
一発で関数の頭まで行ってほしい。
そこで、beginning-of-defun を実行した後にリストのネストの深さが 0 になるまで backward-up-list を繰り返すようにアドバイスを作りました。
(defun list-depth () (nth 0 (parse-partial-sexp (point-min) (point)))) (defadvice beginning-of-defun (after beginning-of-defun-concerning-list-depth activate) (while (> (list-depth) 0) (backward-up-list))) (ad-activate 'beginning-of-defun)
作ったんですが、describe-function で beginning-of-defun のヘルプを見たら
(setq defun-prompt-regexp nil) (setq open-paren-in-column-0-is-defun-start nil)
だけでいいと分かりました。
なんか open-paren-in-column-0-is-defun-start っていう変数名がそのまんまですね。