問題概要
vi 系のエディタを使っていて困るのは、IME 周り。
理由は、vi 系ではモードという概念が有るため。
Esc でノーマル・モードに戻り、他のモードに移るつもりで、i, /, ?, : をタイプした時に、日本語入力が ON のままだと、「い」「・」「?」「:」となり凹む。後者の2つは、半角固定にしていればそのまま Enter で済むが、前者だとorz。
その為、ノーマル・モードに戻った時は、日本語入力が OFF になってほしい。
既存の方法
追加ツール無しで可能な方法
Fcitx の設定だけを用いる方法
昨今の Linux では入力環境として、Fcitx が採用されているので、この設定を変更して、Esc で入力メソッドを切り替えることが出来る。→「FcitxのIMEをEscapeでOffにする」
ただこの方法だと、
- 日本語入力 ON だと、最初の Esc で日本語入力は OFF になるものの、ノーマル・モードに戻るためにはもう一度 Esc をタイプする必要が有る
- 日本語入力が OFF だと、既に日本語入力が OFF なので、最初の Esc でノーマル・モードになる
と日本語入力 ON/OFF で動きが変わってしまう。
Google 日本語入力の設定だけ用いる方法
次に入力メソッド Google 日本語入力の設定で変更する方法「 SSHを介してVimを使う人に感動的なESCキーを押すとESCキーが効きつつIMEがオフになる設定(Google日本語入力とVimの相性は最強!)Add Star」があるが、オープンソース版 Mozc を使っているせいか、私の環境では全くうまくいかない。
vim のプラグインを用いる方法
他の一般的な方法として、「Vim/GVimで「日本語入力固定モード」を使用する」があるので、大抵はこの方法を取ればよい。
私が試した方法
しかし私の好みとして、
- 使用するプラグインは少なくしたい
- 入力メソッドが切り替わるのではなく、あくまで直接入力モードになるだけで良い
- 固定は好みではない
という条件で何とか方法がないのか? を上記サイトを参考に考えてみた。
要は「Esc で直接入力モードにするか、IME を無効化するキー・コードを追加で送信すれば良い」を使う事が肝要。
以下は Linux の場合なので、それ以外の場合は、「Vim/GVimで「日本語入力固定モード」を使用する」を参考にして欲しい。
入力メソッドを OFF にすれば良い場合
先ず A だけなら、Fcitx で入力メソッドを OFF にすれば良いので、.vimrc に次の記述をすればよい。
ここでは、他の環境と .vimrc を共有することも考え、Unix の環境に限定し、入力モードとコマンドモードの設定だけ置き換えている。
入力メソッドは ON のまま、IME を無効化する場合
- 入力メソッドの設定
入力メソッドはそのままに、IME を無効化するだけとなると、入力メソッド側の設定変更も必要になる。
- 設定起動
- Ubuntu なら Unity で、「mozc」で検索
- ターミナルを使うなら
/usr/lib/mozc/mozc_tool --mode=config_dialog
- 編集起動
起動したら「キー設定の選択」の [編集] を起動。
- キー設定の追加
- [編集] から「エントリーを追加」を選び、キー設定を追加する
この時- 上記の「入力キー」「コマンド」は同じ設定で、最後の「モード」は、自分がどういった場面で、「ノーマルモードに戻り、IME を無効化したいのか?」に応じて選択
私は「入力文字なし」だけにしているが、「変換前入力中」が一般的な - 「入力キー」は、他と重ならず使わない適当なキーを割り当てる
- 全角/半角 等 IME の有効/無効とは別にする
- 私は Ctrl+無変換 にしている
- 最後の「コマンド」は「キャンセルして後 IME を無効化」
- 上記の「入力キー」「コマンド」は同じ設定で、最後の「モード」は、自分がどういった場面で、「ノーマルモードに戻り、IME を無効化したいのか?」に応じて選択
- 「モード」は、先の通り「ノーマルモードに戻り、IME を無効化したいのか?」に応じて、上記の「入力キー」「コマンド」は同じ設定で、場合によって複数個「エントリーを追加」
- [編集] から「エントリーを追加」を選び、キー設定を追加する
- キーコードを送信する xvkbd のインストール
「Ubuntu software Center」では検索が上手くいかないようなので、ターミナルに
sudo apt install -y xvkbdを入力。パスワードの入力を求められたら、管理者 (通常は自分) のパスワードを入力
この時、場合によっては複数のパッケージがインストールされる
- 先の「入力キー」に応じて .vimrc に記述を追加
私の Ctrl+無変換 だとif has('unix') inoremap <silent><Esc> <Esc>:silent call system('xvkbd -text "\C\[Muhenkan]" > /dev/null 2>&1')<CR> if has('gui_running') " ターミナルでカーソル・キーで履歴が辿れなくなる-- cnoremap <silent><Esc> <Esc>:silent call system('xvkbd -text "\C\[Muhenkan]" > /dev/null 2>&1')<CR> endif endif\C\[Muhenkan] の部分が、「入力キー」Ctrl+無変換 に対応
よく使うキーとしては、
- \C
- Ctrl
- \A
- Alt
- \e
- Esc
- \t
- Tab
- \S
- Shift
- \M
- Meta
- \[keysym]
- keysym
\C\[Muhenkan] でも用いている keysym については、「List of Keysyms Recognised by Xmodmap」に一覧が有る。よく使いそうな、全角/半角 は Zenkaku_Hankaku なので、\[Zenkaku_Hankaku] となる。
- 設定起動
欠点
この方法にも欠点がないわけではない。
Esc を使っている場合は問題ないのだが、vi 系で同じ意味を持つ Ctrl+[ で問題が発生する。
上記の設定のまま、Ctrl+[ が Esc として動作し IME も無効化出来る。
しかしながら、ついついやりがちな連続したタイプでは、
- 2 回目以降は Ctrl を押したまま、[ だけをタイプ、つまり「押す/離す」
- Ctrl を押さずに [ をタイプした扱いになる
- Ctrl+[ を 3 回だと Ctrl+[ が 3 回ではなく、Ctrl+[ を 1 回と [ を 2 回の扱いになる
- よって後半部分で、
:help [[にある
- [[
- [count] セクション後方に、もしくは1桁目が '{' で始まる
前の場所に。|exclusive|
Note しばしば|exclusive-linewise|になる。
これは Ctrl+[ の設定を、Esc 同様に追加しても変わらない。
2017/01/09 追記
その後の試した方法としては、
この方法は、次の欠点が有り、使うのを止めた。
- インサート・モードで Ctrl+〜 系でタイプした直後に、Ctrl+[ でノーマル・モードに戻ろうとすると、上手くいかず「[」が入力されてしまう
- どういった時か不明だが、IME を OFF にするように設定したキーが、Ctrl を押さないタイプが連続して起きる。上記の設定だと、無変換 が連続したタイプした扱いになる