英辞郎第四版買ってみた。emacsで使いたい。 sdcv編

emacsで使える辞書ツールが他にもあったので紹介します。sdcvというstardictのコマンドラインバージョンでこれをemacsから使うことができます。

ここでは、[id:eiel:20090110]にて作成したpdicの1行形式を利用します。

sdcv

とりあえず、インストールしましょう。debian系だとaptで一発です。

sudo aptitude sdcv stardict-tools stardict

sdcv本体とstardict形式の辞書を作るstardict-toolsをインストールします。
stardictはなくてもいいと思いますが、辞書を配置するディレクトリを作成してくれますので、いれてみました。

stardict形式の辞書ファイルの作成

いろんな形式から変換できるようですが、tab形式というものから変換しようとおもいます。

pdic 1行テキスト形式 → タブ形式 → stardict形式

という流れになります。タブ形式のフォーマットについては
http://stardict.sourceforge.net/HowToCreateDictionary
ここに書いてありました。

一応スクリプトかいときましたので、使いたい方は以下をpdicone2tab.rbみたい名前で保存してどうぞ。*1

#!/usr/bin/ruby -Ku

require "kconv"

def make_file_list(files, suffix)
  pattern = "{#{files.join(",")}}" + suffix
  Dir.glob(pattern)
end

def pdicone2tab(input,output)
  input.read.toutf8.each_line do |line|
    line.sub!("\r\n","\n")
    line.sub!(" /// ","\t")
    line.gsub!(/\\(?=[^ ])/, '')
    line.gsub!(' \\ ','\n')
    output << line
  end
end

files = [ "eijiro", "ryakuji" , "waei" , "reiji" ]
suffix = "*.txt"

make_file_list(files, suffix).each do |i|
  File.open(i) do |input|
    File.open(i.sub(/.txt$/,".tab"),"w") do |output|
      pdicone2tab(input,output)
    end
  end
end              

バックスラッシュはざっとみた感じだといらないようにみえたので削除しました。
カレントディレクトリのeijiro*.txt,ryakuji*.txt,waei*.txt,reiji*.txtがあれば
.tabに拡張子をかえて出力してくれます

例。以下の状態で。

$ ls
eijiro112.txt
ryakuji112.txt
reiji112.txt
pdicone2tab.rb
waeiji112.txt
$ ruby pdicone2tab.rb

と実行すれば。

$ ls
eijiro112.tab
eijiro112.txt
ryakuji112.tab
ryakuji112.txt
reiji112.tab
reiji112.txt
pdicone2tab.rb
waeiji112.tab
waeiji112.txt

となるはずです。あとはstardict-toos付属のtabfileを実行します。

$ /usr/lib/stardict-tools/tabfile *.tab

dict.dz,idx,ifoファイルが作成されますので、これを以下のディレクトリに配置します。

/usr/share/stardict/dic
$(HOME)/.stardict/dic

/usr/ashare/stardict/dicのであれば

$ sudo cp *.dict.dz *.idx *.ifo /usr/share/stardict/dic/

こんな感じでしょうか。

実際に検索してみるには、

$ sdcv buffer

とすればokです。

ちなみにあいまい検索などもできるようです。詳しくはman sdcvで。
アスタリスクなんかはシェルが解釈してしまうので実際には \*wordみたいな形になりますということを、一応かいときます。

emacs用のインターフェイス

install-elispで手抜きをさせていただきます。

M-x install-elisp http://www.emacswiki.org/cgi-bin/emacs/download/showtip.el
M-x install-elisp http://www.emacswiki.org/emacs/download/sdcv.el

ユーザ用のコマンドは

  • sdcv-search-input+
  • sdcv-search-pointer
  • sdcv-search-pointer+
  • sdcv-search-simple

あたりだと思います。
適当に.emacsでバインドして使いましょう。

(require 'sdcv)
(global-set-key "\C-cw" 'sdcv-search-input)
(global-set-key (kbd "H-w") 'sdcv-search-pointer+)

なんとなくハイパーキー+wの例にしてみました。

追記

シェルに丸投げでアスタリスクやらでエスケープがめんどくさいので

--- sdcv.el     2009-03-15 16:10:14.000000000 +0900
+++ sdcv.el~    2009-03-06 00:03:43.000000000 +0900
@@ -374,7 +374,7 @@
   ;; Return translate result.
   (sdcv-filter
    (shell-command-to-string
-    (format "sdcv -n %s \"%s\""
+    (format "sdcv -n %s %s"
             (mapconcat (lambda (dict)
                          (concat "-u " dict))
                        dictionary-list " ") word))))

と修正した。

*1:辞書ファイルをすべてメモリに読みこむような気がするので低メモリな方は結構時間かかるきがしなくもない。