わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

対応するカッコにジャンプ

Emacsで,ワンストロークで次の操作ができるよう,Lispを書きました.

  • F5キーを押すと,対応するカッコにジャンプ(開きカッコ・閉じカッコ,日本語にも対応)
  • Ctrlを押しながらF5を押すと,対応するカッコまでをコピー

コードはGistからどうぞ.
いつどこからかは思い出せませんが,match-parenという関数を入手し,init.elに書いていました.探してみると,http://flex.ee.uec.ac.jp/texi/faq-jp/faq-jp_130.htmlにあるコードと,大部分が同じです.「"\\s\("」は手元では「"[([{]"」,「"\\s\)"」は「"[])}]"」になっていました.
まずはそこの正規表現を書き換えて,「」など,思いつく限りの日本語文字でも対応するようにしました.ついでに,オリジナルと区別するため,関数名をmatch-paren-japaneseとしました.キーはF5です.
これで喜んでいたのですが,何度か,変な文字が挿入され,そのたびファイル保存時に,文字コードの問い合わせが発生しました.カッコのないところでその関数を実行すると,F5の文字そのものが挿入されるのが,原因でした.
F5の文字を打ち込みたい,というニーズはありませんので,「(self-insert-command (or arg 1))」を「(message "match-paren-japanese ignored")」に変更し,これで不具合が解消しました.
次は,その関数を利用して,対応するカッコまでをコピーできるようにしました.名前はmatch-paren-kill-ring-saveです.
思いつく操作を並べ,苦労せずできあがりました.なのですが,最初にうまく動いたバージョンでは,ミニバッファに「Mark set」とだけ表示されます.有害無益ですので,代わりに「何文字コピーしましたよ」というメッセージを出すようにしました.ここの記述に,コーディング時間としては全体の半分をかけたように思います.
なお,エラー処理を極力避けたので,次のように,ややトリッキーな振る舞いをします.前二者は,これはこれで使い分けができそうなので,あえて対処していません.

  • 開きカッコがカーソルがあるときに,この関数を実行すると,開きカッコ・閉じカッコもコピーされます.
  • 閉じカッコにカーソルがあるときに,この関数を実行すると,開きカッコ・閉じカッコはコピーされません.
  • カーソルの文字がカッコでないときに,この関数を実行すると,カーソルの1文字だけがコピーされます.

GNUPACKのGNU Emacs 24.2.1 (2012-09-02),UbuntuGNU Emacs 23.4.1 (2012-09-23)で,動作確認をしました.