読者です 読者をやめる 読者になる 読者になる

backward-up-listをいろんなモードで使えるようにする

emacs

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\\)\\>"みたくすれば、pythonrubyでも
使えなくはないのではないかと思います。

おわりに

C-M-?のバインドは Lisp系に大量に予約されていますが、それを
うまくラップしてやれば他の言語でもうまく使えるんじゃないかと
思います。Lisp系の言語を書き始めると難なく押せるようになる
ので、他の言語でも活用していけたらいいなぁと思っています。