iTerm2/Apple TerminalでAquaSKKを使う
今ってAquaSKKでiTermのctrl-j問題を回避するにはどうしたらいいんじゃろか
— ゆーけー (@ukstudio) November 17, 2014
あたりの解決策。
問題点
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したのち、該当行にチェックをいれれば、有効になる。
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];