backward-up-listをいろんなモードで使えるようにする
C-M-uに割当たっている backward-up-listというコマンドがあります。
Lispで一つ上の S式に移動するというコマンドなんですが、このコマンドは
C言語などでも一つ上のブロックに移動するという意味で使えなくは
ないというコマンドです。使えなくもないというのは、エラーが返ることが
あるからです。
もともと Lisp系の言語を想定したコマンドであるので、括弧の
対応が取れていない場所などから使用するとエラーが返ります。
C言語などでは文字列の中などで実行するとそうなってしまう
ことが多いように感じます。
そのエラーさえなくせばいろんなモードで便利に使えるはず
だと思って、コードを書いてみました。
コード
(defvar my/backward-up-list-regexp "[{\"(\[]") (make-variable-buffer-local 'my/backward-up-list-regexp) (defun my/backward-up-list (arg) (interactive "p") (unless (ignore-errors (backward-up-list arg) t) (re-search-backward my/backward-up-list-regexp nil t))) (global-set-key (kbd "C-M-u") 'my/backward-up-list)
まず通常の backward-up-listを試し、失敗すれば指定しておいた
正規表現に従い移動するというものです。my/backward-up-list-regexpが
buffer-local化されているので、そのモードの hookで
"\\<\\(def\\|class\\)\\>"みたくすれば、pythonや rubyでも
使えなくはないのではないかと思います。