読者です 読者をやめる 読者になる 読者になる

osx yosemite の入力環境が色々とかったるいので、考えてみた

tech macos settings shellscript

先日、osx yosemite の日本語入力環境が色々とかったるい、と言う話 をしました。

で、「結局のところ plist ファイルなわけでだから、defaults コマンドとかでパッとできないものか」考えるのが常。

と言うことで、こーしました、と言うお話です。

バックスラッシュキーの入力は、バックスラッシュ

当然でしょ、って話なのにねぇ...

こちらはいつも通り。で今回、痺れたのは次。

スペース (空白、ブランク) はじめ、記号類は常に半角入力に

これは plistbuddy を使うことにしました。 あ、さっきもですが、プロンプトは略します。

どうでしょうか。
分からなかったのが、ハイフン(マイナス)とダブルクォーテーション。
これってどうしたら良いのでしょう。どなたか...

つか思いの他たくさんあって嫌になった。

Kotoeri?

まず前者の、バックスラッシュキー入力の件。

こちらはいつもの通りで、特に難しい話ではなかったのですが、
ドメインcom.apple.inputmethod.Kotoeri とあって、あれ? と。ことえりですって。

でも killall を見れば分かる通り、kotoeri ではなく JapaneseIM。

この辺りの仕組み、よく分かってません。悪しからず。

あと、JIMPrefCharacterForYenKeyのタイプはnumberで良いみたいです。

defaults コマンドでもいけるけど、PlistBuddy を使うことに

そして次の、スペースや記号の常時半角入力の件。

実のところ PlistBuddy コマンドと言うのはどうも苦手で、できるならば defaults でやれたら良いのに思っていたのですが、plist 覗いてみて「あーだめかもな」と断念 *1PlistBuddy で、と。

つまづいたのは、key がシングルクオーテーション、plist 内では文字実体参照 '''、で表記されている情報の扱い。

Plistbuddy の対話形式で作業できるモードあって助けられた

今回初めて使いました。

例のここにも 書いてありますが、対話的に作業を進めることができるインタラクティブモード interactive mode と言うのがあって。;

Unless specified by the -c switch, PlistBuddy runs in interactive mode.

-c オプションを付けないと、このインタラクティブモードに入る、と。

これを始めて使ってみる。

今回のケースでは、"それぞれに、アクセスできるかどうか" を確認したかったので、対象と思われるスペースや記号の要素を適当にサンプリングし探ってみることにしてます。

まず、
Plistbuddy コマンドにつづけて、直接ターゲットとするファイルのパスを引数に与える。

% /usr/libexec/PlistBuddy /System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist

そして enter 押すと、Command: と言うプロンプトが出てくる。ここに今回は Print コマンドを使う*2

例えば、上位の key 要素である 'keys' を入れてみると、結果がドバっと出てくる。
具体的にはこんな感じになります。;

% /usr/libexec/PlistBuddy /System/Library/Input\ Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist
Command: print :keys
Dict {
    * = Dict {
        '*' = Dict {
            character = *
        }
:
:

これをだんだん絞って行って、...

スペースの箇所だとこうなるようです。;

% pb="/usr/libexec/PlistBuddy"
% plist="/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist"
% $pb $plist
Command: Print :keys:before_typing:\'' \''
Dict {
    character =  
    command = direct_input
}
Command:

いけるいける、と言うことで、冒頭のスクリプトのようになりました、ということで。

あ、ちなみに見るだけならばdefaults でもアクセスできます。;

defaults read /System/Library/Input\ Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist

はい、おしまいです。

*1:KeySetting_Default.plist、結構深くネストしているので。確か defaults コマンドは、多層構造をとるような plist の扱いは結構苦かったような記憶があり。またそんなこと言っておられる方もぽつぽつおるようですし...;
» How to nest dictionary in dictionary and array ... Apple Support Communities
» How to manually edit defaults plist files in Mavericks - CNET

*2:コマンドのイニシャルキャップは気にしなくて良いらしいです。'print' でもイケると。