★データ解析備忘録★

ゆる〜い技術メモ

Emacsのddskkで辞書をGoogle IMEにする

Emacsでは日本語入力にSKKを利用しているのですが、どうもデフォルトの辞書では変換がショボいので、GoogleIMEを使おうと思います。

何がすごいのか

例えば、「さーばー」と入力すると、自分で辞書登録せずとも

サーバー、Server、server、SERVER

が変換候補として現れたり、 「まほうしょうじょまどかまぎか」のような普通の辞書にはない単語を

魔法少女まどか☆マギカ

といい感じに変換してくれたりします。

(古い例ですが漢字ひらがなカタカナ記号のあるいい例が思いつかなかったので...)

あるいは、「わたしのなまえは」を

私の名前は

のように文節で変換してくれたりします。

環境とか

準備

google-ime-skkという、SKKGoogleIMEを辞書として使えるサーバーがあるのでこれをインストールします。

このサーバーの詳細は以下。

blog.sushi.money

これに沿ってインストールします。

gem install google-ime-skk

init.elの編集

設定ファイルに以下を書き加えます。 このサーバーはデフォルトだと55100番なので、ポートをこれに指定してあげます。

(setq skk-server-prog "/usr/local/bin/google-ime-skk") ; google-ime-skkの場所
(setq skk-server-inhibit-startup-server nil) ; 辞書サーバが起動していなかったときに Emacs からプロセスを立ち上げる 
(setq skk-server-host "localhost") ; サーバー機能を利用
(setq skk-server-portnum 55100)     ; ポートはgoogle-ime-skk
(setq skk-share-private-jisyo t)   ; 複数 skk 辞書を共有

完了

これだけで完了です。 ただし、Emacsを起動して最初の変換ではサーバー起動の処理が入るので若干変換が遅いです。

付録

参考までに私のddskkの設定を晒しておきます。

;; ---------------------------------------------------------
;; SKK の設定
;; ---------------------------------------------------------
(when (require 'skk nil t)
  (global-set-key (kbd "C-x j") 'skk-mode) ; 良い感じに改行を自動入力してくれる機能
  (setq default-input-method "japanese-skk")         ; emacs上での日本語入力にskkを使う
  (require 'skk-study))                              ; 変換学習機能の追加

(setq skk-server-prog "/usr/local/bin/google-ime-skk") ; google-ime-skkの場所
(setq skk-server-inhibit-startup-server nil) ; 辞書サーバが起動していなかったときに Emacs からプロセスを立ち上げる
(setq skk-server-host "localhost") ; サーバー機能を利用
(setq skk-server-portnum 55100)     ; ポートはgoogle-ime-skk
(setq skk-share-private-jisyo t)   ; 複数 skk 辞書を共有

;; ノーマルステート時に状態遷移した時に、skkが起動している場合、自動的にアスキーモードにする
(when (locate-library "skk")
  (require 'skk)
  (defun my-skk-control ()
    (when skk-mode
      (skk-latin-mode 1)))
  (add-hook 'evil-normal-state-entry-hook 'my-skk-control))

;; アスキーモードのカーソルの色
(setq skk-cursor-latin-color "#5BFBD0")

;; ミニバッファでは C-j を改行にしない
(define-key minibuffer-local-map (kbd "C-j") 'skk-kakutei)

;; ";"をsticky shiftに用いることにする
(setq skk-sticky-key ";")


;; 候補表示
;; (setq skk-show-inline t)   ; 変換候補の表示位置
;; (setq skk-show-tooltip t) ; 変換候補の表示位置
(setq skk-show-candidates-always-pop-to-buffer t) ; 変換候補の表示位置
(setq skk-henkan-show-candidates-rows 2) ; 候補表示件数を2列に

;; 動的候補表示
(setq skk-dcomp-activate t) ; 動的補完
(setq skk-dcomp-multiple-activate t) ; 動的補完の複数候補表示
(setq skk-dcomp-multiple-rows 10) ; 動的補完の候補表示件数
;; 動的補完の複数表示群のフェイス
(set-face-foreground 'skk-dcomp-multiple-face "Black")
(set-face-background 'skk-dcomp-multiple-face "LightGoldenrodYellow")
(set-face-bold-p 'skk-dcomp-multiple-face nil)
;; 動的補完の複数表示郡の補完部分のフェイス
(set-face-foreground 'skk-dcomp-multiple-trailing-face "dim gray")
(set-face-bold-p 'skk-dcomp-multiple-trailing-face nil)
;; 動的補完の複数表示郡の選択対象のフェイス
(set-face-foreground 'skk-dcomp-multiple-selected-face "White")
(set-face-background 'skk-dcomp-multiple-selected-face "LightGoldenrod4")
(set-face-bold-p 'skk-dcomp-multiple-selected-face nil)
;; 動的補完時にC-nで次の補完へ
(define-key skk-j-mode-map (kbd "C-n") 'skk-completion-wrapper)

;; 動作
(setq skk-egg-like-newline t) ; Enterで改行しない
(setq skk-delete-implies-kakutei nil) ; ▼モードで一つ前の候補を表示
(setq skk-use-look t) ; 英語補完
(setq skk-auto-insert-paren t) ; 閉じカッコを自動的に
(setq skk-henkan-strict-okuri-precedence t) ; 送り仮名が厳密に正しい候補を優先して表示
(require 'skk-hint) ; ヒント
(add-hook 'skk-load-hook ; 自動的に入力モードを切り替え
      (lambda ()
        (require 'context-skk)))

;; 言語
(setq skk-japanese-message-and-error t) ; エラーを日本語に
(setq skk-show-japanese-menu t) ; メニューを日本語に

;; isearch
(add-hook 'isearch-mode-hook 'skk-isearch-mode-setup) ; isearch で skk のセットアップ
(add-hook 'isearch-mode-end-hook 'skk-isearch-mode-cleanup) ; isearch で skk のクリーンアップ
(setq skk-isearch-start-mode 'latin) ; isearch で skk の初期状態

;; カタカナを変換候補に入れる
(setq skk-search-katakana 'jisx0201-kana)

ステートとかそういう記述があるのはEvilを使ってるからです。