indent-region-excluding-pre-with-html
EmacsでePubファイルジェネレーターのようなものを作っていたのですが、(indent-region (point-min) (point-max))
した時にpre
タグ内までインデントされてしまったので、それを回避するための関数を書きました。indent-region
では、indent-region-function
が設定されていると、その関数が呼ばれるようになっています。
まずは、モードフック時にバッファーローカルなindent-region-function
を設定します。
メインの処理の流れはindent-region
のデフォルトと同様ですが、pre
タグそのものを含む行とpre
タグ内外の行でそれぞれインデントするかどうかが考えられます。
現ポイントがpre
タグ内外かは、HTML(SGML)モードとnXMLモードで分けました。SGMLモードはノードツリーを使わずに検索でノード移動をするためにうまくいかない場合があるかもしれない。
SGMLモードとnXMLモードでは(indent-according-to-mode)
の挙動が異なるため、PREタグの位置によってインデンテーションが異なります。SGMLモードのインデンテーションの方が好みではありますが、今後考えるべきかもしれません。gist