@koshian's Tech Log

主に日本語に関する技術などこちらに書こうかと

Emacs でファイルを読んだら文字化けしたときの対処法が大変めんどくさいので関数書いた

長年 Emacs を使っててもなかなか覚えられない操作というのがあって、その代表格ではないかと思うのがファイルを読んだら Emacs文字コードを認識失敗して文字化けした時の対処法である。

C-x RET c utf-8-unix RET C-x C-v RET

毎回毎回覚えられずにググってる気がする。

IRC で相談しながら F1 k して調べてみると、C-x RET c は universal-coding-system-argument という関数に binding されている。コードツリーの lisp/international/mule-cmds.el を見てみると、

(defvar mule-keymap
  (let ((map (make-sparse-keymap)))
    (define-key map "f" 'set-buffer-file-coding-system)
    (define-key map "r" 'revert-buffer-with-coding-system)
    (define-key map "F" 'set-file-name-coding-system)
    (define-key map "t" 'set-terminal-coding-system)
    (define-key map "k" 'set-keyboard-coding-system)
    (define-key map "p" 'set-buffer-process-coding-system)
    (define-key map "x" 'set-selection-coding-system)
    (define-key map "X" 'set-next-selection-coding-system)
    (define-key map "\C-\\" 'set-input-method)
    (define-key map "c" 'universal-coding-system-argument)
    (define-key map "l" 'set-language-environment)
    map)
  "Keymap for Mule (Multilingual environment) specific commands.")

こんな感じでいろいろと定義されてるようだ。universal-coding-system-argument は要するにファイルの読み込み環境を設定して他のコマンドを実行する(上記の場合だと C-x C-v (find-alternate-file)) わけだが、もうこんな複雑なの覚えられないので、universal-coding-system-argument の実装を参考に関数を定義してショートカットをあてがった。

(defun set-buffer-correct-coding-system(coding-system &optional force nomodify)
  "Correct coding system"
  (interactive
   (list (read-buffer-file-coding-system)
         current-prefix-arg))
  (let ((coding-system-for-read coding-system)
        (coding-system-for-write coding-system)
        (coding-system-require-warning t))
    (find-alternate-file buffer-file-name)))

(global-set-key [(super c)] 'set-buffer-correct-coding-system)

しかしこれだと補完で utf-8-unix が出てこないんだがなんでだろうか?

iPad 充電&同期可能な USB 3.0 HUB TS-HUB3K のドライバが正常作動しない件

以前使ってたハブが動かなくなってしまったので注文したのだが、なぜかトランセンドのサイトから落としてきたドライバv1.09を入れても充電されない。

どうも Mac 用ドライバが古いのかなんなのか、パーミッションがおかしい。

続きを読む

mozc.el を Mac OS X 上の Emacs で使う方法

mozc.el は mozc_emacs_helper というコマンドを呼び出して利用されるのだけれども、なぜか Mac でのビルドがサポートされてない。ビルドしてみようかと思ったんだけどうまく行かず。

というわけでごく簡単な解決を。

  1. 仮想マシンDebian (Wheezy) をつっこむ
  2. apt-get install emacs-mozc-bin
  3. 以下の様なスクリプトMac の /usr/local/bin/mozc_emacs_helper として保存し、実行権限をつけておく
#!/bin/sh
ssh mozc.example.org mozc_emacs_helper $@

あとは mozc.el を /Application/Emacs.app/Contents/Resources/site-lisp にコピーすると、割とちゃんと使えちゃう。

あ、もちろん ssh はノンパスワード認証できるようにしておくこと。

追記

mozc 本体の設定は Mac に XQuartz をインストールして、 ssh -X で接続してから

$ /usr/lib/mozc/mozc_tool --mode=config_dialog

で行うことができる。

さらに追記

Google 日本語入力と通信する mozc_emacs_helper がビルドできたよ!

koshian.hatenablog.com

Emacs on Mac OS X における日本語入力

さて、というわけで先日ゲットした MacBook AirEmacs 24 をインストールしていたのだが、さすがにいまさらまた Canna を入れるのもどうかと思って Mozc を試してみた。が、どうやら mozc.el は Mac では非対応のよう。Mozc 本体も OSX 10.8 Mountain Lion + Xcode 4.6 ではビルドが通らない。10.5 SDK が必要のようだが……。mozc_emacs_helper だけ動けば既存の Google日本語入力 にアクセスしたり出来るんだろうかこれ。だとしたらこっそり同梱しておいてほしいなあ。

しかし Mozc は魅力的なのでなんとかならないかと思っていると、MacUIM に Mozc が同梱されてることに気付いた。MacUIM をインストールすると、 /Library/Frameworks/UIM.framework/Versions/Current/share/emacs/site-lisp/uim-el に uim.el を始め一揃いの elisp が入っている。コマンド類は /Library/Frameworks/UIM.framework/Versions/Current/bin/ にある。ので、設定はこんな感じ。

(when (locate-library "uim")
  (set-language-environment "Japanese")
  (when (eq system-type 'darwin)
    (setq uim-bin-path "/Library/Frameworks/UIM.framework/Versions/Current/bin/")
    (setq uim-el-agent (concat uim-bin-path "uim-el-agent"))
    (setq uim-el-helper-agent (concat uim-bin-path "uim-el-helper-agent")))

  ;; uim.el
  (require 'uim)
  (setq uim-default-im-prop '("action_anthy_utf8_hiragana"
                              "action_google-cgiapi-jp_hiragana"
                              "action_mozc_hiragana"))
  (setq uim-default-im-engine "mozc")
  (global-set-key "\C-o" 'uim-mode))
  (setq uim-candidate-display-inline t)
  (setq uim-lang-code-alist
        (cons '("Japanese" "Japanese" utf-8 "UTF-8")
              (delete (assoc "Jpanese" uim-lang-code-alist)
                      uim-lang-code-alist)))

しかしいくつか問題が発生。

  1. uim.el を読み込み後、uim-el-agent をスタートさせたあとしばらく操作不能になる
  2. 文字入力自体がカクカクと表示されたいへん遅く感じる

ただしこれらの問題は -nw オプションをつけて起動した場合は発生しない。描画周りの問題だろうか。また、uim-default-im-engine に値をセットすると invalid IM engine になるのが謎。

しばらくいじってみると、どうも文字入力中の描画が止まることが遅く感じる原因らしい。uim-mode 下で文字のキー押しっぱなしにすると何も表示されず、離すと一度にどばっと文字が出現する。高速に文字入力してても同じ。

うーん、さてはてどうしたものか。

*** 追記 リポジトリの最新版 では直ってるようだ。スムーズに入力ができる。