Emacsでddskkパッケージを使用し、さらにcdb形式の辞書ファイルを自作するための設定

経緯

Emacsで日本語入力をする際にSKKを使用しています。最近、 package.elで導入するSKK でddskkがMELPAに登録されたことを知ったため、インストールしてみました。

従来の方法よりも楽になりました。

  • 辞書ファイルの統合
  • 辞書サーバの設定

も行なったので、その時の内容をメモ的に残しておきます。

ddskkパッケージ

dskkパッケージのインストール

MELPAを使用する方法は省略します。

M-x package-refresh-contents
M-x package-install ddskk

でインストールします。同時にcccとcdbの2つのパッケージもインストールされます。

init.elの設定

(require 'skk)

(global-set-key (kbd "C-x C-j") 'skk-mode)
;; (global-set-key "\C-xj" 'skk-auto-fill-mode) ;; 改行を自動入力する場合
;; (global-set-key "\C-xt" 'skk-tutorial)       ;; チュートリアル
(setq default-input-method "japanese-skk")

(setq skk-user-directory "~/Dropbox/emacs/SKK") ;; 設定ファイル、個人辞書ファイルの置き場
(setq skk-init-file "~/Dropbox/emacs/SKK/init") ;; 設定ファイルの指定

を追加します。

initの設定

使用する辞書ファイルをいくつか統合してさらにcdb化し、 SKK-JISYO.my.cdb というファイル名にしています。そこまで必要なければ SKK-JISYO.L でいいと思います。

;; -*-mode: emacs-lisp; -*-

;;; 使用する辞書の設定
;; large辞書
(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.my.cdb")
;; 個人辞書
(setq skk-jisyo "~/Dropbox/emacs/SKK/skk-jisyo")
(setq skk-backup-jisyo "~/Dropbox/emacs/SKK/skk-jisyo.bak")

;; From DDSKK 14.2:
;;   メイン辞書(L 辞書、CDB 形式辞書、辞書サーバ)以外の辞書を指定する
(setq skk-extra-jisyo-file-list
      (list
       '("/usr/local/share/skk/SKK-JISYO.JIS3_4" . euc-jisx0213)
       ))

;; 変換記録を保存するファイル名
(setq skk-record-file "~/Dropbox/emacs/SKK/record")

;;; 外見の変更
;; モードラインに色をつける設定
(setq skk-use-color-cursor t)
(setq skk-indicator-use-cursor-color t)

;; 変換候補のハイライトの設定
(setq skk-henkan-face (skk-make-face 'gray80/gray25)) ;; お好みで

これで使用できるようになったため、今までのddskkをアンインストールしました(make uninstallは用意されていないため自力で削除)。

辞書ファイルの用意

辞書ファイルの統合

統合したい辞書ファイルを用意して同じフォルダに入れ、

skkdic-expr2 \
    SKK-JISYO.JIS2 + \
    SKK-JISYO.L + \
    SKK-JISYO.assoc + \
    SKK-JISYO.edict + \
    SKK-JISYO.geo + \
    SKK-JISYO.itaiji + \
    SKK-JISYO.jinmei + \
    SKK-JISYO.law + \
    SKK-JISYO.office.zipcode + \
    SKK-JISYO.propernoun + \
    SKK-JISYO.station + \
    SKK-JISYO.zipcode | skkdic-sort > SKK-JISYO.my

のようなスクリプトを実行すると SKK-JISYO.my が生成されるため、 /usr/local/share/skk にコピーします(今回のようにcdb形式の辞書ファイルを使用する場合には不要)。

skkdic-expr2

私が使用しているVine Linuxでは skktoolsをインストールしても skkdic-expr2 コマンドが導入されなかったため少しだけ大変でした。

結果だけ書くと、メーリングリストで許可を得た上でパッケージを更新することで対処しました。

SPECファイルに

BuildRequires: glib2-devel

の行を追加することで skkdic-expr2 がビルドされるようになりました。

cdb形式の辞書の作成

このためにはパッケージを自分でインストールする必要があります。

tinycdb

tinycdb は辞書サーバであるdbskkd-cdbをビルドするために必要なプログラムです。 cdb形式の辞書を作成するためには、この中に含まれる cdb が必要です。

wget http://www.corpit.ru/mjt/tinycdb/tinycdb-0.78.tar.gz
tar xzf tinycdb-0.78.tar.gz
cd tinycdb-0.78
make
sudo make install

dbskkd-cdb

dbskkd-cdb は辞書サーバの1つです。

この中に含まれるスクリプトを改変して使用します。

  • skktocdbm.sh
    #!/bin/sh
    # Converting SKK Dictionary to cdbmake-acceptable form
    # Originally by D. J. Bernstein's 12tocdbm.sh
    # modified by Kenji Rikitake
    # bugfix of truncated strings by Hideto Kihara
    # bugfix of locale by Tatsuya Kinoshita
    LC_ALL=C awk '
      /^[^;]/ {
        s = substr($0, index($0, " ") + 1)
        print "+" length($1) "," length(s) ":" $1 "->" s
      }
      END {
        print ""
      }
    '
    
  • makeskkcdb.sh
    #!/bin/sh
    ./skktocdbm.sh < /usr/local/share/skk/SKK-JISYO.L | \
      cdb -c -t - SKK-JISYO.L.cdb
    
  • skktocdb

    上の2つのスクリプトを組み合せて作成したのが以下のスクリプトです。

    #!/bin/sh
    
    LC_ALL=C awk '
      /^[^;]/ {
        s = substr($0, index($0, " ") + 1)
        print "+" length($1) "," length(s) ":" $1 "->" s
      }
      END {
        print ""
      }
    ' $1 | cdb -c -t - $1.cdb
    

    実行権限をつけて/usr/local/binにコピーしました。

    skktocdb SKK-JISYO.my
    

    のように使用すると同じフォルダに SKK-JISYO.my.cdb が作成されます。

    このファイルを/usr/local/share/skkにコピーします。これで自作の辞書ファイルを使用できるようになります。

辞書サーバを使用する場合

この場合には、initファイルの

(setq skk-cdb-large-jisyo "/usr/local/share/skk/SKK-JISYO.my.cdb")

の記述は必要ありません。

先日、Vine Linuxの dbskkd-cdb パッケージを更新しました。

EAGLE 雑記 の内容を参考にして任意の辞書ファイルを指定することができるように改変しました。

/etc/xinetd.d/dbskkd-cdbの例

# default: on
# description: dbskkd-cdb is a skkserv implementation, \
#              a Japanese dictionary server for the Simple Kana to \
#              Kanji conversion program.
service skkserv
{
    port = 1178
    socket_type = stream
    wait = no
    only_from = 127.0.0.1
    user = nobody
    server = /usr/sbin/dbskkd-cdb
    # specify dictionary path
    server_args = /usr/local/share/skk/SKK-JISYO.my.cdb
    log_on_failure += USERID
    disable = no
}

変更後は

sudo /etc/init.d/xinetd restart

でxinet.dを再起動すれば辞書サーバでSKKを使用できるようになります。