karakaram-blog

IdeaVIMがmapコマンドによるモード別キーマップに対応した

 ツイート 8  シェア 0  Google+1 0  Hatena 6

ideavim-logo

IdeaVIM は、JetBRAINS 社 IDE 製品のキーマップを Vim っぽくするプラグインです。Vim 好きの皆さんはご存知ですよね。

最近になって久しぶりに IdeaVIM が更新されたので CHANGELOG を眺めていたら、何と :map コマンドによるモード別キーマップがサポートされていました。

ideavim-changelog

早速 .ideavimrc に Vim のお気に入りキーマップをいくつか移植してみたところ、結構いい感じに動いています。この機能がずっと欲しかったので個人的には神アップデートです。

IdeaVIM はインストールはしていたものの、本家 Vim との動作の違いに馴染めず、タイプミスが多くなってしまうので使わずにいましたが、:map コマンドのサポートでかなり Vim に近い操作感でコーディングできるようになりました。

動作確認環境

  • Mac OSX Mountain Lion
  • PhpStorm7.0.3
  • IdeaVIM0.35

目次

  1. .ideavimrc サンプル
  2. IDE キーマップとの競合を解決
  3. VIM キーマップは削除
  4. IDE の機能をマップすることはできない
  5. 参考サイト

.ideavimrc サンプル

ホームディレクトリ直下の .ideavimrc に設定を記述します。私の .ideavimrc はこんな感じ。

利用可能なオプションは ideavim/doc/set-commands.md を参考に。

変更は IDE を再起動しなくても :source ~/.ideavimrc コマンドで再読み込みできます。

"検索をファイルの先頭へ循環しない
set nowrapscan

"大文字小文字の区別なし
set ignorecase

"検索時に大文字を含んでいたら大/小を区別
set smartcase

"検索対象をハイライト
"ハイライトを消す場合は:noh[l]
set hlsearch

"スクロール時に表示を10行確保
set scrolloff=10

"JIS 配列 C-[ で Esc
inoremap <C-]> <Esc>

"x キー削除でデフォルトレジスタに入れない
nnoremap x "_x
vnoremap x "_x

"vv で行末まで選択
vnoremap v ^$h

"選択範囲のインデントを連続して変更
vnoremap < <gv
vnoremap > >gv

"ノーマルモード中にEnterで改行
noremap <CR> i<CR><Esc>

"インサートモードで bash 風キーマップ
inoremap <C-a> <C-o>^
inoremap <C-e> <C-o>$<Right>
inoremap <C-b> <Left>
inoremap <C-f> <Right>
inoremap <C-n> <Down>
inoremap <C-p> <Up>
inoremap <C-h> <BS>
inoremap <C-d> <Del>
inoremap <C-k> <C-o>D<Right>
inoremap <C-u> <C-o>d^
inoremap <C-w> <C-o>db

IDE キーマップとの競合を解決

Vim キーマップと IDE のキーマップ競合は、「Vim Emulation」という設定項目で管理するようになりました。

IDE Settings > Vim Emulation

ideavim-vim-emulation

.ideavimrc のキーマップと IDE のキーマップが競合すると「Undefined」で登録されるので、どちらを優先するか割り当てます。「Undefined」の状態でキー入力すると、以下のようなアラートが上がるのですぐ気づきますね。

ideavim-conflict

VIM キーマップは削除

これまで IdeaVIM を使っていた方は 「Vim」というキーマップが IdeaVIM のインストール時に自動生成されているはずです。こちらのキーマップは不要になったので、削除して1からキーマップを設定しなおすことをおすすめします。

IDE の機能をマップすることはできない

残念ながら IDE としての機能をマップすることはできません。:map や :command に IDE の機能を割り当てられるようになったらと思うと夢が膨らみます。今後に期待しています。

参考サイト

 ツイート 8  シェア 0  Google+1 0  Hatena 6