みずぴー日記

月に行こうという目標があったから、アポロは月に行けた。飛行機を改良した結果、月に行けたわけではない。

iTerm2/Apple TerminalでAquaSKKを使う

あたりの解決策。

問題点

iTerm2 + AquaSKKには以下の問題がある。なお、前者の問題はApple Terminal(Terminal.app)にもあるので、まとめて解説する。

  • Ctrl-Jが使えない問題でひらかなモードに切り替わらず、改行されてしまう。
  • l/L/q/Qで入力モードを切り替えると、その文字も入力されてしまう。

それぞれ原因が異なるので、一つづつ解説していく。

Ctrl-J問題

iTerm2の問題だが、AquaSKKが使えない問題(Issue263, Issue 2629)、ドイツ語キーボードが使えない問題(Issue 1097)、DefaultKeyBinding.dictが使えない問題(Issue 350)が絡みあっており、修正は難しい。

ただ、iTerm2であっても「かな」キーを押せば、ひらかなモードにできるので、Ctrl-Jを「かな」にリマップすれば、この問題を回避できる。

Karabinerをインストールしたのち、設定アプリからMisc&Uninstall -> Open private.xmlとし、private.xmlを以下のように変更する。

<?xml version="1.0"?>
<root>
    <list>
        <item>
            <name>AquaSKK</name>
            <appdef>
                <appname>Terminal</appname>
                <equal>com.googlecode.iterm2</equal>
                <equal>com.apple.Terminal</equal>
            </appdef>
            <list>
                <item>
                     <name>Ctrl-J to Kana on Apple Terminal/iTerm2</name>
                     <only>Terminal</only>
                     <identifier>private.iterm2.ctrl_j_to_kana</identifier>
                     <autogen>
                         __KeyToKey__
                         KeyCode::J, ModifierFlag::CONTROL_L,
                         KeyCode::JIS_KANA
                     </autogen>
                </item>
                <item>
                     <name>Ctrl-J to Kana on Apple Terminal/iTerm2 for Dvorak user</name>
                     <only>Terminal</only>
                     <identifier>private.iterm2.ctrl_j_to_kana.dvorak</identifier>
                     <autogen>
                         __KeyToKey__
                         KeyCode::C, ModifierFlag::CONTROL_L,
                         KeyCode::JIS_KANA
                     </autogen>
                </item>
            </list>
        </item>
    </list>
</root>

その後、Change Key->Reload XMLしたのち、該当行にチェックをいれれば、有効になる。

f:id:mzp:20150315213140p:plain

l/L/q/Q問題

(2016/5/15追記) 以下の内容の改良版がiTerm2に取り込まれた。 詳しくは iTerm2 + AquaSKK - みずぴー日記を参照。

iTerm2に以下のパッチを当てる必要がある。 Issue 3451としてパッチを報告したので、そのうち取り込まれるかもしれない。

(2015/3/20追記) AquaSKK統合を使っているとダメだったので、再度修正した。プルリクエスト出しています。(Use handleEvent instead of interpretKeyEvents #202) バイナリもRelease Fix for AquaSKK · mzp/iTerm2として置いてあります。

古いパッチ

diff --git a/sources/PTYTextView.m b/sources/PTYTextView.m
index c8e48b3..8979c88 100644
--- a/sources/PTYTextView.m
+++ b/sources/PTYTextView.m
@@ -2207,13 +2207,23 @@ NSMutableArray* screens=0;
         // wrong instnace of PTYTextView. We work around the issue by using a global variable to
         // track the instance of PTYTextView that is currently handling a key event and rerouting
         // calls as needed in -insertText and -doCommandBySelector.
+
         gCurrentKeyEventTextView = [[self retain] autorelease];
+
+        // Some Input methods(e.g. AquaSKK https://github.com/codefirst/aquaskk) use key to change
+        // keyboard type.
+        // So, in some case, while there is no inserting text, IME has processed the key.
+        //
+        // To handle this case, let compare prev/current keyboard input source id.
+        NSString* prevKeyboard = self.inputContext.selectedKeyboardInputSource;
         [self interpretKeyEvents:[NSArray arrayWithObject:event]];
+        NSString* currentKeyboard = self.inputContext.selectedKeyboardInputSource;
         gCurrentKeyEventTextView = nil;
 
         // If the IME didn't want it, pass it on to the delegate
         if (!prev &&
             !_inputMethodIsInserting &&
+            [prevKeyboard isEqualToString:currentKeyboard] &&
             ![self hasMarkedText]) {
             DLog(@"PTYTextView keyDown IME no, send to delegate");
             [delegate keyDown:event];