Blog を書いていると、他のサイトへリンクを貼ることがある。今までだと、Google News や Emacs-w3m のページにリンクを貼った。これをメール・ポストする場合、a 要素を使うわけだが、例えば Google News の場合、<a href="http://www.google.co.jp/nwshp?hl=ja&tab=wn&ie=UTF-8">Google News</a> という文字列を直接入力している。
でも、これはコピー & ペーストを使うにしても面倒だし、メールを書いている時の可読性も低い。Blog ツール (?) の一つ、chalow では、「自動文字列置換」という機能があって、例えば googlenews を任意の文字列 (この例では Google News へのリンク) へと変換してくれる (要 Perl)。せっかく Emacs 上からポストをするのだから、この自動文字列置換のコードを EmacsLisp で書けないかと考えてみた。そこで思いついたのが、abbrev (略語展開) の機能を使う方法。
abbrev 機能というのは、省略形 bg を文字列 background に展開する機能。省略形と展開する文字列は一対一対応していて、ユーザーが自由に定義できる。そこで、googlenews という省略形を、上で書いた Google News へのリンクに展開するようにしようというわけ。
まず、abbrev 定義ファイルの設定を .emacs に追加する。
;; ;; abbrev ;; (setq abbrev-file-name "~/.emacs.d/abbrev.defs") (quietly-read-abbrev-file)
Emacs 上で M-x edit-abbrevs すると abbrev を定義しているファイルが開かれるので、ファイルの一番最後に次の書式で abbrev を定義する。
"省略語" 0 "展開される文字列"
保存するだけで、自動的に設定が反映される。自分で定義した省略語の後ろにポイントを置き、C-x a e してみよう。展開されるかな? 一括して展開したければ、リージョンで囲んだ後 M-x expand-region-abbrevs を実行してみよう。リージョン内の全ての省略語が展開される。
ところで、今、欲しいのはリンクなわけだから書式はある程度決まっている。そこで
foo<TAB>http://www.bar.com
という書式を
"foo" 0 "<a href=\"http://www.bar.com\">foo</a>
に変換するコードを quick hack してみた。もしよければ使って下さい。
(defun my-abbrev-define-aref () (interactive) (beginning-of-line) (let* ((bol-pos (point)) (eol-pos (line-end-position)) (sep-pos (search-forward "\t" eol-pos)) (abbr (buffer-substring bol-pos (1- sep-pos))) (expand (buffer-substring sep-pos eol-pos))) (delete-region bol-pos eol-pos) (insert (format "%-15s0 \"<a href=\\\"%s\\\">%s</a>\"" (concat "\"" abbr "\"") expand abbr))) (forward-line))
No comments:
Post a Comment