2005-05-05

Blog を書く時のサイトへのリンク |Blogger|Emacs|

Blog を書いていると、他のサイトへリンクを貼ることがある。今までだと、Google NewsEmacs-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