highlight

2016年3月16日水曜日

emacs から pre タグ内へ paste

blog にコードを貼り付けるとき、別のファイルからテキストをコピーして pre タグ内へ貼り付けている。html や xml ファイルをまるごと自分で書く場合には、<![CDATA[....]]> でくくれば良いが、少なくともここの blog のフォームからの投稿時にはそれが使えないようだった。

C++ の template のように、< や > を使いまくるテキストを投稿するためには、いちいち実体参照表記に変換してやる必要がある。テキストをフォームに貼り付けたら、この変換をやってくれる親切なページがあるが、それでもその操作が段々億劫になってくる。

幸いにも私が使うテキストエディタは emacs なので、テキストを選択してコマンドを実行したら、クリップボードに実体参照変換済みのテキストが乗っている、というようなコマンドは作れそうだ。


(defun copy-html-pre-tag-escaped (&optional st en)
  (interactive "r")
  "Copy text in the region. and replace meta characters for html pre tag."
  (kill-new
   (replace-regexp-in-string
    "<" "&lt;"
    (replace-regexp-in-string
     ">" "&gt;"
     (replace-regexp-in-string
      "&" "&amp;"
      (buffer-substring-no-properties st en)))))
  )

文字列置換は別に正規表現で無くていいと思ったが、それらしい関数が探しきれなかった。 使い方はリージョンを選択してこのコマンドを呼ぶ(M-x copy-html-pre-tag-escaped)だけ。 実体参照変換後の文字列がクリップボードに乗っているので、それを paste すれば良い。

一応説明を書いておくと、buffer-substring-no-properties でリージョンにあるテキストを取得して、三種類の文字を対象に文字列変換する。 それを kill-new という物騒な名前の関数に渡せば kill-ring に入ると同時にクリップボードにもコピーされているという仕組み。

ググっている内に複数文字列を一挙に変換する関数をパッケージとして公開しているページを見つけた。面白そうなページなので、後でじっくり読んでみよう。

0 件のコメント:

コメントを投稿

スパムフィルタが機能しないようなので、コメント不可にしました。

注: コメントを投稿できるのは、このブログのメンバーだけです。