平衡点


2010/12/20

_ SKK の辞書の充実(あるいは, 他の形式の辞書からの変換に関するアレコレ)

この記事は SKK Advent Calendar の 12/20 日分の記事です. 昨日は Daiki Ueno さんによる ibus-skk 0.0.1 Antinews でした.

id:khiker さんに誘われたので, 軽い気持で参加したは良いけれど, 他の人の記事ほどタメになる記事は書けないなぁ, なんて思いつつ, お題の通り「他の形式の辞書から変換することで SKK の辞書を充実させて幸せになる」お話をしてみようと思います.

SKK の辞書は SKK辞書 で公開/開発が行なわれており, 必要に応じて複数の辞書を変換候補として設定したり, 辞書サーバに管理させる辞書を追加したりして使います. 辞書サーバを上げない/上げられない場合には, 手元の適当なディレクトリに辞書を置いて, skk の起動時に読み込む(もしくは変換候補が無い段階で読み込みに行く)みたいな設定をします.

それはそれとして.

専門用語の辞書, というのが世の中には幾つか公開されているわけです. 個人的な必要性から, とある辞書を常に使い続けています.

この手の「有志がメンテしている専門(?)用語の辞書」って結構沢山あります. 例えば フリーのかな漢字変換辞書たち なんかにリストがありますね(最終更新が 2004 年ですし, リンク切れているのもあったりしますが). これらの辞書の形式としてメジャーなのは, *nix/BSD 系の場合は Wnn/Canna, Windows の場合は MS-IME とか ATOK とかです. そんな訳でこれらの辞書を SKK で使う場合には, SKK の辞書形式に変換する必要があります. SKK 本家の方でも辞書を変換するためのツールが 辞書メンテナンスツール の方で公開されていますね.

...

とか, これだけだとなんか紹介しただけですので, とある辞書を変換する際にはまった話など. 2ch の顔文字辞書として2ちゃんねる顔文字辞書・2chアスキーアート・AAアイコン素材 MatsuCon の辞書を使用しています. で, 顔文字って「;」を使う事が多いんですね. ですが skk の辞書の形式では「;」は注釈のためのセパレータだったりします. そんな訳で, 適当に辞書を変換したあとで文字列を置換しておく必要があります. たとえば,

#!/usr/bin/env ruby

require 'nkf'

src = ARGV[0]
if ARGV.size < 1
  puts "usage: kaomoji2skk.rb ime_dictionary"
  exit 0
end
File.open(src, "r") {|f|
  f.each do |line|
    line_euc = NKF.nkf("-S -e",line)
    if line_euc =~ /^([^!]+?)\t(.+?)\t.+$/
      entry = $1
      content = $2
      if content =~/;/
        puts entry + " /(concat \""+ content.gsub(';','\\\\073')+"\")/"
      elsif content =~/\//
        puts entry + " /(concat \""+ content.gsub('/','\\\\057')+"\")/"
      else
        puts entry + " /"+ content +"/"
      end
    end
  end
}

こんな塩梅で. まあ, 辞書の文字コードが SJIS 決め打ちだったりするのであんまり汎用性が無いですが, こういうはまりもありますよ, というネタでした((うひー. 石投げないで)). そんな訳で, 顔文字で満足できない人は id:znz の 「はてなダイアリーキーワードふりがなリスト」をSKKの辞書に変換なんかも使うと良いと思います.

...てか, こんなネタしか無いのかね, 私は...

というわけで, 辞書を充実させて, 楽しい SKK ライフを!!

次回は id:lisp_interaction の記事です. +(0゜・∀・) + ワクテカ +

...誘われたのにショボくてすみません > id:khiker


2011/12/20

_ THANX - Best of Die in Cries -

昔の音源ひっぱり出してきたのだけれど, 聞きたい曲が無かったので中古屋巡り(今, 見たら Amazon にもあった)

B00005EIDZ

最近ずっと聞いてる...んー。


2014/12/20

_ モードラインのダイエット (2/n)

昨日 の続き。

DDSKK のモード表示,その2

昨日の advice に付け加えて,安直だけれど major-mode の切替時に一度 skk を呼ぶことで modeline を更新することに. ~/.skk

(defadvice skk-make-indicator-alist
    (after my:set-skk-default-indicator activate)
  (dolist (elem
           '((abbrev " [aA]" . "--[aA]:")
             (latin " [_A]" . "--[_A]:")
             (default " [--]" . "--[--]:")))
    (setq ad-return-value
          (append (cons elem nil)
                  (delq (assoc (car elem) ad-return-value) ad-return-value)))))

~/.emacs.d/init.el

(defun my:update-modeline-for-ddskk ()
  ""
  (progn
    (skk-mode) (skk-mode)))
(add-hook 'after-change-major-mode-hook 'my:update-modeline-for-ddskk)

かっこ悪いなぁ….トグルする関数無かったっけ?

elscreen

上に TAB を表示させているので,modeline に番号を表示する必要はない. modeline に番号を表示するかどうかについての設定は

(setq elscreen-display-screen-number nil)

で良い.

良い…のだが,初回起動時に常に mode-line-format が更新されている. これは require された時に

(let ((point (memq 'mode-line-position mode-line-format))
      (elscreen-mode-line-elm '(elscreen-display-screen-number
                                (" " elscreen-mode-line-string))))
  (when (null (member elscreen-mode-line-elm mode-line-format))
    (setcdr point (cons elscreen-mode-line-elm (cdr point)))))

が実行されているから. 安直にはこれをコメントアウトすれば良いのだけれど,なんか良い方法無いかなぁ….

major-mode, minor mode の表示設定

カスタマイズする際には以下を参考に

考えてみれば minor-mode の表示は見ていないので,全部非表示にしても全く問題無い.というわけで, ~/.emacs.d/init.el

(defvar my:mode-line-cleaner-alist
  '(
    ;; major,
    (global-whitespace-mode . "")
    (lisp-interaction-mode  . "LI")
    (emacs-lisp-mode        . "EL")
    ;; ...
    ))
(defun my:clean-mode-line ()
  (interactive)
  (setq minor-mode-alist nil)
  (loop for (mode . mode-str) in my:mode-line-cleaner-alist
        do
        (when (eq mode major-mode)
          (setq mode-name mode-str))))
(add-hook 'after-change-major-mode-hook 'my:clean-mode-line)

としてみたり.

結果

結局,こんな感じ.

mode-lineのカスタマイズ結果

時計とか行数は全く表示させていないので,右側がとってもシンプルだけれど,まあ良いか,という.