対応する括弧を自動挿入する

.emacs がゴチャゴチャしてるので, パッケージにできそうなのは, してみることにして作成.
対応する括弧を自動挿入.
最初は, brackets.el というものを使ってたけど, それの不満な点を改造したのが .emacs 内にあって,
けっこうな量になっているから, まとめてみた.
まだ, .emacs内では, コメントアウトして残しているけど, パッケージにしとけば, 保守の点で違うかな?違うといいな.

設定例

text-mode への設定例を示します.
このパッケージは, 関数を提供してるだけなので, キーを割当てる必要があります.
# 最新版では, まとめてキーを割り当てる関数を用意しています. 詳しくは, トラックバック先のエントリを見て下さい.

(add-hook
 'text-mode-hook
 '(lambda()
    (define-key text-mode-map "{" 'insert-braces)
    (define-key text-mode-map "(" 'insert-parens)
    (define-key text-mode-map "\'" 'insert-single-quotation)
    (define-key text-mode-map "\"" 'insert-double-quotation)
    (define-key text-mode-map "[" 'insert-brackets)))

他のモードへは, text-mode-hook, text-mode-map を別のモードのそれに置き換えれば大丈夫なはずです.
(*追記*)
書くの忘れてましたが, このパッケージの関数を使用するには, 使用前に以下のように require して読み込んでおく必要があります.

(require 'parenthesis)

関数

  • insert-braces
  • insert-brackets
  • insert-parens
  • insert-single-quotation
  • insert-double-quotation
  • insert-angle

上記のものは, それぞれ, {}, [], (), '', "", <> です.

  • insert-grave-and-quotation

これは, `' のスタイルを提供します.

  • insert-braces2
  • insert-brackets2
  • insert-parens2
  • insert-single-quotation2
  • insert-double-quotation2
  • insert-angle2

これは, ダブルクオーテーションならば,
" " のように, 開始の「"」 の後に1つ空白を, 終了の「"」の前に1つ空白を置いた形式のものを挿入します.

ふるまい

前置引数を与えた場合と, マークがアクティブなときとで, 動作が変わります.
正の値を前置引数として与えた場合, 例えば, C-4 insert-paren としたならば, (((()))) のように挿入されます.
負の値を前置引数として与えた場合, 例えば, C- - C-4 insert-paren としたならば, (((( のように挿入されます.
前置引数として 0 を与えた場合, ( のように開始のものだけ挿入されます.
マークがアクティブならば, その範囲を囲うように括弧を挿入します.
例えば, 「test」という単語をポイントとマークとで囲っていたならば, insert-paren の場合, 「(test)」のように挿入されます.

コメント


brackets.el を参考に作成しました.
また, 昔のエントリで似たようなものを書いたときに頂いた plus さん作成の関数やコメントが参考になっています.
ありがとうございます.


似たような関数で, Emacs には, insert-pair というものが存在しますが,
いまいち振る舞いがよくわからない(よく調べてない)ので, 今回は使用しませんでした.
# 引数に指定するのが, 文字列(string)ではなく, 文字(char)というのも, 使用しなかった理由にあったりします. あまり好きになれなくて.


内部で, dotimes を使用していますが, Emacs 22 以上ならば, subr.el にマクロとして定義されています.
emacs 21 ならば, cl-macs.el に定義されています.


このパッケージについて何か問題があれば, 遠慮なくコメント, メールして頂けると嬉しいです.

更新時刻

  • 1かいめ 2007年, 11月1日, 2:21
  • 2かいめ 2007年, 11月1日, 21:11
  • 3かいめ 2008年, 1月19日, 1:18