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

正規表現の問い合わせ置換

HTML helperモードで、以下のように雛形を.emacsに書いておくと、.htmlファイルの新規作成時にその雛形を自動的に挿入してくれる。(参考:Emacs で HTML

(defvar html-helper-new-buffer-template
  '("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"
    "<html lang=\"ja\">\n"
    ここに続けて雛形を書く
)
  "*Template for new buffers, inserted by html-helper-insert-new-buffer-strings if
html-helper-build-new-buffer is set to t")


この雛形を既存の.htmlファイルからコピーして作る際に問題になるのが以下の2点。

  • それぞれの行をダブルクオートで囲んで、改行文字を挿入しなくてはならない
  • 従って、HTMLファイル内のダブルクオートはエスケープしないといけない

こんなことを手書きでやってたんじゃ間違えるかもしれないし、めんどくさいので、Meadowの「正規表現での問い合わせ置換(C-M-%)」を使った。

まず最初にダブルクオートのエスケープを行う(これは正規表現を使わなくて大丈夫)
Query replace regexp: " RET
Query replace regexp r with: \" RET

実行結果の例:
<html lang="ja">    =>    <html lang=\"ja\">
次に、それぞれの行をダブルクオートで囲んで、改行文字を挿入
Query replace regexp: <\(.*\)> RET
Query replace regexp r with: "<\1>\\n" RET

実行結果の例:
<html lang="ja">    =>    "<html lang=\"ja\">\n"
.emacsに追加する雛形の設定例
(defvar html-helper-new-buffer-template
  '(
    "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n"
    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"

    "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\">\n"
    "<head>\n"
    "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n"
    "<meta http-equiv=\"Content-Style\" content=\"text/css\" />\n"
    "<link rel=\"stylesheet\" href=\"css/mystyle.css\" type=\"text/css\" />\n"
    "<title></title>\n"
    "</head>\n"
    "<body>\n"
    "<address>\n"
    "Copyright &copy ; 2006 HogeCompany All Rights Reserved.<br />\n"
    "<!-- hhmts start -->"
    "<!-- hhmts end -->"
    "</address>\n"
    "</body>\n"
    "</html>\n"
    )
  "*Template for new buffers, inserted by html-helper-insert-new-buffer-strings if
html-helper-build-new-buffer is set to t")

(defvar html-helper-timestamp-start "<!-- hhmts start -->")
(add-hook 'html-helper-timestamp-hook
	  (function (lambda ()
		      (insert "Last modified: "
			      (format-time-string "%Y-%m-%d %T\n")))))


余談だけど、新規作成で雛形が挿入されたら、C-x hでバッファ全体を選択して、M-x indent-regionを実行すれば、インデントもきちんとそろって便利。


今回は正規表現に助けられた。もっと本格的に勉強すれば、すごく強力な武器になるのかもしれない。今年中にはオライリー詳説 正規表現 第2版を読んでみたいな。

参考

入門vi 第6版(p95の8.の正規表現の書き方を参考にした)