ddskkでも確定キーの挙動をAquaSKKライクに
カナモードからq押さないとひらがなモードに戻れないのは不便なので、AquaSKKと同じように C-j
(僕は C-o
) で カナ→かな になるようにしたい。
調べてみると、 skk-rom-kana-rule-list
というのに、かな・カナモード用のキーマップがあるので、それに対して自分で修正したバージョンのfuncを skk-kakutei-key
に登録してあげれば良いみたいな雰囲気。
そこで、
(defun my:skk-kakutei-key (arg)
(interactive "P")
(if skk-henkan-mode
(skk-kakutei arg)
(skk-j-mode-on)))
というような、変換中だったら普通に確定キーとして動くけど、それ以外だったらかなに戻す、という動作をするカスタム関数を定義して、それを、
(add-to-list 'skk-rom-kana-rule-list
'(skk-kakutei-key nil my:skk-kakutei-key))
してあげればOK。 skk-rom-kana-rule-list
というのは (require 'skk-setup)
しただけだとまだないので、 (require 'skk-vars)
も必要だった。
最終的な設定はこちら:
https://github.com/typester/emacs-config/blob/master/conf/init/init-ddskk.el
はー、しかしこれで、AquaSKK/uim-skk/ddskk 全部で同じ感じで入力できる環境がようやくできた。 miyagawaさんのpodcastで、yak率という言葉がでてきたけど、SKK導入のyak率は相当なものだなぁ。
ddskkをやっぱり使う
AquaSKKがEmacs上でも使えるから、ddskkとか使わないなぁと書きましたが、まちがいだった。
C-c C-o
のような、キーでも、C-o
をAquaSKKにとられてしまうのでだいぶつらい。 なので一度けしたddskkを再度インストール。
設定はとりあえずこんなかんじで:
;; key
(define-key global-map (kbd "C-x C-o") 'skk-mode)
(setq skk-kakutei-key (kbd "C-o"))
(setq mac-pass-control-to-system nil)
;; skkserv
(setq skk-server-host "127.0.0.1")
(setq skk-server-portnum 1178)
;; user dic
(setq skk-jisyo-code 'utf-8)
(setq skk-jisyo (concat (getenv "HOME") "/Dropbox/skk/skk-jisyo.utf8"))
共有辞書はskkserv経由でAquaSKKをつかう。 ユーザー辞書も文字コードをutf-8にすればAquaSKKと同じものが使える?っぽいのでAquaSKKと同じファイルを指定。 キーも他の環境に併せて C-o
に。
こっちは、uim-skkとちがってユーザー辞書もAquaSKKと同じものが使えるから、学習結果も無駄にならなくて良い感じである。
唯一、カナモードのときに C-o
を押してもひらがなモードに戻らないのが不便。 これはelispフックするかなんかすれば簡単に変更できそうだからそのうち知らべよう。
SandS
SKK導入してShiftキー酷使してつらいなー、と言っていたら、antipopさんに、SandSをおすすめされたので、試してみている。
MacでSandSするのはKeyRemap4MacBookを使うと簡単だ。
しかしどうしても手が勝手に小指でshiftキーを押してしまうので、一時的に両サイドのshiftキーは無効になるようにした。
このSandS、SKKでの日本語入力はまぁすぐに慣れるとおもうが、いままで手に染み込んだショートカットキーはだいぶ苦戦しそうだ。
例えばEmacsでのundoは、C-_
だが、押すキーは C-S--
である。 これはなかなか、キーを手で覚えているから、これをスペースにおきかえるということがすぐに思いだせなくて非常に難しい。 こういうのはまぁ無理に矯正しないでもいい気もするが、どうしようかなぁ。
あとEmacsを使っていると致命的につらいのが M-<
である。 MacでSandSで、っていう環境でこの場合押すキーは、Cmd-Space-,
だ。おしにくい!
これはIRCでぼやいていたら、handlenameさんが、「sequential_commandつかってるからM-<とか押さないですよ〜(ドヤァ」みたいな雰囲気のことを言っていた。 たしかにこれは便利そうなので使ってみよう1
最近のMacでuim-fep
先ほどのエントリーで、Macだと uim-fep
が SEGV してしまう、と書いたが、どうやらこれは gcc の最適化がよくない感じで動いてしまっているようだ。
$ export CFLAGS='-g -O0'
$ export CXXFLAGS=$CFLAGS
してビルドしたら普通に動くようになった。
こんな感じで入れた:
cd /tmp
wget https://uim.googlecode.com/files/uim-1.8.4.tar.gz
cd uim-1.8.4
export CFLAGS='-g -O0'
export CXXFLAGS=$CFLAGS
./configure --prefix=$(brew --prefix)/Cellar/uim/1.8.4 --without-x
make
make install
brew link uim
アドホックな対応だけど、これでまぁいちおう手元のターミナルでも日本語入力がOKになった。
あとは学習辞書をAquaSKKと共有したいな〜。
uim-skkでC-jでもカナからひらがなへ戻れるようにカスタマイズ
AquaSKKとuim-skkを併用していて、C-j
キー (僕は C-o
に変更してるが) の扱いの違いが若干気になった。
AquaSKKでは基本的に、C-j
を押せば、常にひらがな入力モードになる。
一方uim-skkは、q
を押してカタカナモードになっている状態で C-j
を押してもなにも反応しない。また、カタカナモードから英数モードに移行したあとで、再度 C-j
を押すとカタカナモードに復帰してしまう。 ひらかなモードに戻るには再度 q
でトグルさせてあげる必要があるみたい。
好みの問題かもしれないが、僕は AquaSKK の挙動のほうが好きなので、uim-skkもそれにあわせることにする。
しかし不幸なことに、uim-skkのドキュメントにそのように設定する項目が見当らなかったので、以下のようにアドホックにコードを変更した。
--- /usr/share/uim/skk.scm.orig 2013-03-06 19:12:01.994615339 +0900
+++ /usr/share/uim/skk.scm 2013-03-06 19:16:07.314888197 +0900
@@ -937,6 +937,11 @@
(skk-return-key? key key-state))
(skk-commit-raw sc key key-state)
#f)
+ ((skk-on-key? key key-state)
+ (skk-context-set-state! sc 'skk-state-direct)
+ (skk-context-set-kana-mode! sc skk-type-hiragana)
+ (rk-flush rkc)
+ #f)
((skk-wide-latin-key? key key-state)
(skk-context-set-state! sc 'skk-state-wide-latin)
(rk-flush rkc)
あってるかわからないが、とりあえずこれで希望通りの動作になっているっぽい。
ATOKをやめてSKKを使いはじめた
ATOKをMacを使いはじめてからずっと使っているので、そこそこ長い付き合いではあるけれど、 和英混在入力の使い勝手が悪く、いつも混在入力をするときに、ATOK自体のON/OFFをして対応してしまっていた。
この使い方は注意しないと、変な文節を学習させてしまうことになる。
例えば、
nodeよりperlが好き。
のような文章で、英語の部分ではATOKをOFFにするような入力をしていると、 「が好き」という文章をATOKに教えこませてしまう。このような意図しない学習結果が積みかさなると、普通の文章の変換も苦になるほどATOKの調子が悪くなってしまう。
そのような状態になるたびに、辞書をクリアしたり、 そもそもこのようなことを避けるために、「が」で一旦確定させるクセをつけるなどして、対応してきたが、そんなことを考えながら文章かくのであれば、もっとシンプルな、SKKのような入力方法にしちゃえばいいのではないかなーということで、とりあえず試してみることにした。
SKK入門
最初のとっかかりは、Emacsのddskkというのについてくるチュートリアルが良い、とのことなので、まずMacシステムの入力メソッドはそのままにEmacs内だけでSKKを試してみる。
それを一通り終えて、SKKの使い方が分かったところで、Mac全体でもSKKが使えるようにAquaSKKをインストール。
試してみたところEmacs内でもAquaSKKが使えるっぽいので、ddskkは別に使わなくてもいいかなーという感じで、チュートリアルそうそう、ddskkは使わなくなってしまった。 AquaSKKは、Enterで改行しない、というデフォルトで有効になっている余計なオプションを外してしまえば、あとは大体ddskkと同じような使い勝手のようだ。(SKKに詳しい人から見るといろいろ違うのかもしれないが)
入力方法自体はいたってシンプルで、すぐに覚えられる。 「困った」みたいのの変換が、まだちょっと考えないと入力できないが、まぁすぐに慣れるだろう。
しかしそれ以外にもいろいろ問題があった。
問題1. C-j がつらい
SKKは C-j
を変換確定やら日本語モードへの移行やらに使用する、言ってしまえば、SKKのメインキーである。
しかし僕はこれを改行とか、elispの評価とかに使用するのが手に染みついてしまっていて、このキーをSKKで使用するのは苦痛を伴なう。
この際だし、矯正してしまってもいいかなーともおもってしばらくがんばったが、どうにもだめなので、SKKの該当キーを C-o
に変更した。
AquaSKKのキー設定を変更するには、/Library/Input Methods/AquaSKK.app/Contents/Resources/keymap.conf
を /Users/typester/Library/Application Support/AquaSKK/keymap.conf
にコピーして、その中の、SKK_JMODE
というところを
SKK_JMODE ctrl::o
みたいな感じに修正すれば良い。
問題2. ターミナルで入力できない
入力できない、というか C-o
が効かない。ので日本語に復帰できない。(C-j
に戻してもだめだった)
uim-fep
いれろ、みたいのを見て、ウンザリしつつもインストールしたが、しばらく使っていると高確率でSEGVするのでまともに使えなかったためさらにウンザリ。
これはMacだけの現象かなーと思ってLinuxで試してみると、Linuxではうまく動いた。
ただ、日常的にターミナルで日本語入力をする場面を考えてみると、IRCをするirssiだけ。 しかも、irssiを動かしているサーバーはLinuxなので、そこにuim-fepをいれてしのぐことにした。
uim-skk でも、以下のような設定で AquaSKK と同じように C-j
を C-o
に置きかえた。
# ~/.uim
(define-key skk-on-key? '("<Control>o"))
(define-key skk-commit-key? '("<Control>o"))
(define-key skk-state-direct-no-preedit-nop-key? '("<Control>o"))
ユーザー辞書をDropboxかなにかで同期できたらいいなーとおもったが、 AquaSKKのユーザー辞書は utf-8、uim-skk のそれは euc-jp と、文字コードが違い、しかもそれを変更する方法がわからなかったので、とりあえず別々の学習になってしまってもいいか〜ってなってる。
問題3. ひらかなの小文字入力
いままでずっと「la」で「ぁ」というように l
キーで小文字入力していたが、SKKではこのキーは英字入力への切り替えキーなので使うことができない。 これもキー設定をかえてもよかったが、ここは x
を使うように矯正する方向でがんばる。
使用感
送り仮名を意識しないといけなかったり、その送り仮名が「っ」だったりするときの入力はまだまだ慣れなくて難しい。 慣れてもイメージとして、ATOKほど高速に日本語入力ができる感じはない。ATOKはやっぱり賢いのでガーーっと長文を一気に入力して一発変換という使い方をしても精度が高く、日本語だけを入力する分にはやはり最高の入力メソッドであると思う。
SKKのいいところは仕組みがシンプルなことと、実装がいっぱいあってどこでも動くところかな。
シンプルなので自分でコントロールできると思う。ATOKは学習がおかしくなってしまったらもう途方にくれるしかなかった。実装がいっぱいあるのも、AquaSKKがなくなってもEmacsがあれば大丈夫、みたいな安心感はある。
入力速度に関しては、Shiftキーを非常に多用するので、親指Shiftとかを導入したらもう少し高速に入力できるようになるのだろうかなー。