A Riddle Wrapped in a Mystery

中身はエニグマ・Emacs

Emacs 24.3 雑感

Emacs 24.3 リリース直後に山本光晴さんがMac用のパッチを公開してくださり、 それをEmacsのソースコードにあてたgitレポジトリを公開 してくれている方 もいる。

% git clone https://github.com/railwaycat/emacs-mac-port
% cd emacs-mac-port
% ./configure --with-mac --enable-profiling --enable-mac-app
% make -j CC="/usr/bin/gcc -std=gnu99" CFLAGS=-g3 bootstrap

以下雑感。

cl-lib

cl.el は従来、Emacsの内部関数と衝突するため、標準配布パッケージではマ クロ以外の利用が禁止されている。Emacs 24.3の cl-lib パッケージは、 clの関数の名前空間をEmacsから分離して提供する。

cl-lib を使えば、一般のパッケージで堂々とcl 関数を利用できる。ただし、 例えば remove-if 関数は、 cl-remove-if と先頭に “cl-” をつける。

Emacsとclで関数名が衝突するのは、clの便利な関数をEmacs本体がサブセット の形で取り込んでいった( dolist など)から。clパッケージの誕生から20年、 ようやく安心して共存できるようになった。

Emacs 24.2 以前のユーザでも cl-lib が利用できるよう、互換パッケージが MELPAに用意されている。逆に Emacs 24.3 ユーザはこの cl-lib をインストー ルしてはいけない。

clのマクロは相変わらず、 (eval-when-compile (require 'cl)) とすれば 利用できる。

pcase.el

Emacs 24.2 から導入された pcase が最近、どんどん使われている。やはり cconv.el でその威力で知った人が多かったのか。

pcase の単純な使い方として、文字列版 case として使う方法がある。

従来の case 文は以下のように eq でしか比較できないけど、

(case var
  ('symb1 ....)
  ('symb2 ....)
  ....)

pcase 文は equal での比較ができるので、以下のような分岐が書ける。

(pcase var
  ("str1" ....)
  ("str2" ....)
  ....)

汎変数

Emacs 本体に、汎変数が導入され、 setf もEmacs本体に組み込まれた。

従来の変数や setq が、シンボルを変数としたのに対して、汎変数やsetfは構 造を変数にする。構造を作ったり (construct) 、構造を分解することが統一 表記で記述できるので、上手く使えば簡潔でわかりやすいelispが書ける。

全体としてみると

今回のリリースはバグ修正(特にメモリ関係)が多く、目立つ機能はあまり入っ ていない。特に多言語機能。MULE が6.0(花散里)になって、ちょうど10年に なる。

ただし汎変数は非常に興味深いので、後日追記予定。

Emacs Lookup で字通を読む

字通 は白川静の辞書3部作の最高峰。書籍版は重いし価格も23,000円と高いが、 CD-ROM版なら安いしHDDにコピーできてノートパソコンで持ち歩ける。

EmacsのLookup には字通CD-ROMを読むための検索エージェント ndjitsuu がある。

インデックスファイルの作成

「字通」を検索するためには、インデックスファイルを事前に作成する必要が ある。lookup のmisc フォルダに入っている jitsuu_mk_jukugo_list.rbjitsuu_mk_oyaji_list.rb を使って、インデックスファイルを作成する。

% cd ~/edicts/Jitsuu/DATA/
% ruby jitsuu_mk_oyaji_list.rb > oyaji.txt
% ruby jitsuu_mk_jukugo_list.rb > jukugo.txt

次に、生成された oyaji.txtjukugo.txt の外字をUCS漢字コードに置 換する。

M-x find-file oyaji.txt
M-x ndjitsuu-convert-gaiji-to-ucs
M-x save-buffer

M-x find-file jukugo.txt
M-x ndjitsuu-convert-gaiji-to-ucs
M-x save-buffer

oyaji.txtjukugo.txt は DATAフォルダと同じ位置に置く。

(setq lookup-search-agents
      `(...
        (ndjitsuu "~/edicts/Jitsuu")
        ...))

lookup-search-agents 変数に ndjitsuu を加えて、 M-x lookup-restart すれ ば字通をEmacsで読めるようになる。

2013-03-11-jitsuu.png

Emacs Lookup でオフラインでWikipediaを検索する

Lookup の ndzim エージェント

LookupOpenZIM 形式のファイルを検索するための ndzim エージェン トを試作した。

OpenZIM について

OpenZIM ファイル形式は、複数のWebページや付随する画像データを、整理・圧 縮して1ファイルにまとめる。主に Wikipedia 等の MediaWiki の記事をアー カイブするために開発されている。[fn:: Wikipedia 財団が公認している。]

OpenZIM の内部構造 は、LZMA2で圧縮された多数のデータの集合体である。日 本語版Wikipediaの全記事(2011年現在)を画像込みで 7GByte、英語版 Wikipediaを画像なしで 12GByte 程度に圧縮できる。様々な言語のWikipeida 全 記事をアーカイブした OpenZIMファイルがKiwixサイトにて配布されている。

ZimLibのインストール

Lookup の ndzim エージェントは、zimlib に付属するzimdump/zimsearch ツー ルでOpenZIMファイルの検索とデータのダンプを行い、w3mで整形する。

zimlib のコンパイルには lzma ライブラリが別途必要。MacPorts等でlzmaラ イブラリをインストールする場合は、CPPFLAGSやLDFLAGS環境変数を適切に設 定する。

% git clone https://gerrit.wikimedia.org/r/p/openzim.git
% cd cd openzim/zimlib
% ./autogen.sh
% ./configure
% make
% sudo make install

Lookup の設定

Lookup で OpenZIMを使うためには、 $HOME/.emacs.d/lookup/init.el に、 ZIMファイルを入れたディレクトリを検索エージェントとして設定する。

(setq lookup-search-agents
      '(...
        (ndzim "/path/to/dir")
       ))

上記のように設定すると、検索エージェントは /path/to/dir ディレクトリ 内にある、拡張子が .zim のファイルを見つける。

あとは他のエージェントと同様、 M-x lookup-restart にて、無事に辞書選 択バッファに辞書が表示されたら、単語で検索して動作を確認。

2013-03-10-ndzim.png

検索サンプル

Footnotes:

1

Wikipedia 財団が公認している。