Mozc

競合コピーが生じないようにemacs-mozc辞書を共有する方法

mozc辞書をDropboxに置いて、そのシンボリックをそれぞれの各端末に貼って辞書共有をしている人は多いと思います。

リアルタイムで同時使用はしない…という使い方であれば何も問題ないのですが、 自分の場合は、基本メイン機のEmacsは起動しっぱなし(蓋閉じでSleep)なので、その状態でサブ機のEmacsを立ち上げると、mozcのON/OFFとは関係なく~/Dropbox/mozc/.mozc/ に競合コピーが量産されます。

そこで、簡単な回避方法を考えてみました。大げさなタイトルですが、Tipsといえるほどのものではありません。

ファイル体系

くどくど説明するより下図を見ていただければ、“な〜んだ” と理解いただけると思います。

メイン機の .mozc/ は、Dropboxに保存してシンボリックリンクで使い、サブ機で使うときはEmacsを起動するたびにDropboxにある最新の .mozc/ をコピーして使うという仕組みです。

※ maine-machine
~/.mozc <-- symbolic link -- ~/Dropbox/mozc/.mozc
                                | Copy latest every time
※ sub-mchine                    |
~/.mozc <-- symbolic link -- ~/Dropbox/backup/mozc/.mozc

Emacsの設定

emacsの設定ファイルはメイン機とサブ機で共有しているので、uname -n を条件子としてメイン機(自分の場合はe590)でない場合(サブ機のとき)は、emacsを起動したときにmozc辞書をコピーしています。シンボリックリンクは、一度貼っておけばコピーのたびに貼り直さなくても大丈夫です。

;; Clone the mozc dictionary placed in Dropbox to Nextcloud.
(defun mozc-copy ()
 "Copy mozc for submachine."
 (interactive)
 (unless (string-match "e590" (shell-command-to-string "uname -n"))
	 (compile "cp -rf ~/Dropbox/mozc/.mozc ~/Dropbox/backup/mozc")))
(add-hook 'emacs-startup-hook 'mozc-copy)

使い方

Dropboxに配置したmozc辞書は、メイン機での単語登録や入力履歴を記憶し常に最新の状態でバックアップされます。 サブマシーンの場合は、emacsを起動するたびに最新の辞書をコピーしてそれを使うという簡単な割り切りです。

サブマシーンで単語登録したら、元辞書へ書き戻すという仕組みも考えれますが、結局は、競合コピーをどう回避するかという課題になると思うので割り切ることにしました。良い方法があれば教えてください。

メイン機、サブ機の定義は特にありません。使用頻度の高い方をメイン機として構成すればいいかなと思います。

ac-mozc : モードレス日本語入力を試してみた

随分前に一度試してみたが、mozc.elと併用する時に若干変換ルールに違いがあって使いにくく、そのうち使わなくなっていた。 その後、elispの勉強も進み Emacsのスキルも多少向上したので、再度工夫して試してみることにした。

mozc.el導入時には、ローマ字テーブルに azik を使っていたが、これが曲者だということに最近気づいた。結局、標準の mozc.elの romotableを使って、azikのうち手慣れたものだけ追加して試してみたところ、快適に使えるようになったので備忘録に残しておくことにした。

アルファベットと日本語との間に半角スペースを空けるかどうかについては諸論あるけれど、見やすさを優先した。

pangu-spacing.elというパッケージを使うときは自動的に処理してくれるのでいのだけれど、数字にも反応するので日付表示のときはどうにも間の抜けた感じになる。 なので数字には対応させないようにした。

使ってみた感想

スムーズに変換できているときにはとても効率がいいのだけれど、一度ミスタイプになったものを修正しようとするとおかしな変換になるときがあり、 修正するときは mozc-modeにして対応するということが多い。結局、どちらが快適という点はよくわからない。

変換スピードがもう少し改善されたら更に使いやすくなると思うので、誰か companyと連携した ac-mozc作ってくれないかしらと思う。

 ;; ac-mozc with extended auto-complete
  (leaf auto-complete
	:ensure t
	:bind (:ac-completing-map
		   ("<tab>" . ac-next)
		   ("<backtab>" . ac-previous))
	:hook ((text-mode-hook markdown-mode-hook) . auto-complete-mode)
	:custom (ac-comphist-file . "~/.emacs.d/tmp/ac-comphist.dat")
	:config
	(leaf ac-mozc
	  :ensure t
	  :hook ((text-mode-hook markdown-mode-hook) . my-ac-mozc-setup)
	  :config
	  (add-to-list 'ac-modes '(text-mode . markdown-mode))
	  (bind-key* "<henkan>" 'ac-complete-mozc ac-mode-map)
	  (defun my-ac-mozc-setup ()
		(setq ac-sources
			  '(ac-source-mozc ac-source-ascii-words-in-same-mode-buffers))
		(set (make-local-variable 'ac-auto-show-menu) 0.2)))
	;; auto add space between Japanese and English characters.
	(leaf pangu-spacing
	  :ensure t
	  :hook (markdown-mode-hook . pangu-spacing-mode)
	  :custom (pangu-spacing-real-insert-separtor . t)))

mozc-tempを使ったモードレス日本語入力が快適

モードレスに魅せられて、ac-mozcを導入して使っていたが、新しいモードレスのコードで、mozc-tempなるものがあることを知った。早速使って見た。

mozc-tempのREADMEを見るとコンセプトがよく分かる。

mozc-tempはmozc.elによる入力をモードレス化するラッパーです。 ac-mozcをもとに作成されました。 基本的な挙動はac-mozcと同じになるように作られていて、全角文字と半角文字の混在する文章の入力を楽にすることを目的としています。 ac-mozcとの違いは、これがmozc.elのインターフェイスに対するラッパーであるということです。 そのため、変換時の候補選択はmozc.elのものと同じ操作が可能です。

Alt Text

導入

パッケージインストールで mozc-temp.elを入れて、init.elに以下を設定するだけ。

(global-set-key (kbd "s-j") #'toggle-input-method)
(global-set-key (kbd "s-m") #'mozc-temp-convert)

Alt Text

感想

ac-mozcを使ってモードレスの環境を試したことはあったが、拗音(っ)とかの変換がうまくできないので中途半端な印象でした。 その点mozc-tempはそうした問題もなくとても使いやすいです。

Emacsで快適にmozcを使うためには、Emacs使用時は、他の日本語入力メソッドが同時に機能しないようにコントロールすることがとても大切です。それぞれの環境によって工夫が必要ですが、わたしの場合(MaC)について、別Tipsで紹介していますので参考にしてください。

Mac+Emacs で emacs-mozc をかなキーで ON/OFF させる裏技

mozc_emacs_helper on macOS Sierra

macOS Sierra をクリーンインストールしたので mozc_emacs_helper を使えるようにした。google日本語入力と連携できるようにビルドできるという以下のサイトの Tips を参考にしたが、ちょっと解りにくかったので備忘録として整理しておく。

準備

Xcodeが必要と言うことだけどコマンドラインツールのみで大丈夫だった。

xcode-select --install

ninja が要るらしいので homebrew でインストールしておく。

brew install ninja

mozc をダウンロードする

作業ディレクトリはどこでもいいが、僕は基本的にdesktopで作業することが多い。

cd desktop
git clone https://github.com/google/mozc.git -b master --single-branch --recursive

Mac の google日本語入力と連携させるためにソースを修正

以下のファイルを作ってパッチをかけてもいいが、簡単なのでぼくは直接修正した。

diff --git a/src/build_mozc.py b/src/build_mozc.py
index a56aaaf..d419f49 100644
--- a/src/build_mozc.py
+++ b/src/build_mozc.py
@@ -167,6 +167,8 @@ def GetGypFileNames(options):
   # Include subdirectory of win32 and breakpad for Windows
   if options.target_platform == 'Windows':
     gyp_file_names.extend(glob.glob('%s/win32/*/*.gyp' % SRC_DIR))
+  elif options.target_platform == 'Mac':
+    gyp_file_names.extend(glob.glob('%s/unix/emacs/*.gyp' % SRC_DIR))
   elif options.target_platform == 'Linux':
     gyp_file_names.extend(glob.glob('%s/unix/*/*.gyp' % SRC_DIR))
     # Add ibus.gyp if ibus version is >=1.4.1.
diff --git a/src/mac/mac.gyp b/src/mac/mac.gyp
index 76b540d..2ee4006 100644
--- a/src/mac/mac.gyp
+++ b/src/mac/mac.gyp
@@ -586,7 +586,6 @@
             ['branding=="GoogleJapaneseInput"', {
               'dependencies': [
                 'DevConfirmPane',
-                'codesign_client',
               ],
             }],
           ],
           

コンパイル

cd mozc/src
GYP_DEFINES="mac_sdk=10.12 mac_deployment_target=10.12" python build_mozc.py gyp --noqt --branding=GoogleJapaneseInput
$ python build_mozc.py build -c Release unix/emacs/emacs.gyp:mozc_emacs_helper

動作確認

以下のように表示されれば成功!