Naoto Ikeno
Naoto Ikeno
Backend Engineer, Software Architecture & Design, Perl, Rust, Golang, GCP

IntelliJ(Android Studio)のVimプラグイン「IdeaVim」の使い方と設定

December 25, 2017
このエントリーをはてなブックマークに追加  

English version is here.

この記事はJetBrains Advent Calendar 2017の最終日分の投稿です。前日まで空いていたため、滑り込みで参加させていただきました!

IdeaVim

IdeaVim Github: JetBrains/ideavim

IdeaVim は、IntelliJ や Android Studio などの JetBrains 系列の IDE で使える Vim プラグイン です。このプラグインを導入することで IntelliJ などを Vim っぽく操作できるようになります。
リポジトリ名を見るとわかるように、JetBrains の公式プラグインです。IntelliJ の初回起動時にもオススメされます。

※ 以下、IntelliJ を例にして進めますが、JetBrains 系列の IDE であれば基本的に一緒なはずですので自身の使っているものに置き換えてお読みください。

雰囲気

※キーマップはカスタマイズ済です。

なぜ IdeaVim を使うか

個人的には、IntelliJ と Vim のそれぞれに対して以下の点に良さを感じています。

  • IntelliJ: 補完、コードジャンプ、リファクタ機能などの強力さ、またそれらの設定の容易さ
  • Vim: テキストエディタとしての編集操作の効率の良さ、キーマップやモードの概念

IntelliJ に IdeaVim プラグインを導入することで、上記の双方の利点を同時に享受することができると考えています。 細かい部分の挙動などはまだまだ本家 Vim との差分もありますが、自分のような比較的ライトな Vim ユーザーが Vim に求めている機能については、IdeaVim はその多くをカバーできているのではないか と思います。

この記事では IdeaVim の機能や設定方法の説明を通じて、IdeaVim の良さをお伝えしていきます。

IdeaVim がサポートしている機能の一例

細かい機能まで列挙するのは難しいため、普段自分がよく使う機能に絞ってその対応状況をまとめました。
行いたい操作が未実装だったという経験は筆者は無いですが、これは vim のヘビーユース度合いにもよるのかなとも思います。

機能対応状況
モードノーマルモード、インサートモード、ビジュアルモードが存在
モーションヤンク(y), 削除(d), 変更(c), Undo(u), Redo(Ctrl-r),
テキストオブジェクト操作(ciw,vi(, ...) などなど
検索Vim と同様に/による検索が可能、:set incsearchによるインクリメンタルサーチも
置換Vim と同様に:s,:%s,:'<,'>sなどで正規表現による置換が可能
コマンド:w, :q, :tabnew, :split, 一部:setオプション などなど
設定・キーマップ.vimrcと同様の文法で各種mapや一部setオプションを.ideavimrcに記述可能
また、IntelliJ の機能をキーマッピングすることも可能(後の章で詳しく説明)
マクロ利用可能
レジスタ利用可能
その他:set surroundすることでvim-surroundを再現した機能を利用可能

より詳しく知りたいという方は、 GitHub のレポジトリ の README などご覧になってみてください。

IdeaVim のインストール方法

通常の IntelliJ プラグインと同じく、[Preferences] > [Plugins]からインストールできます。
インストール後に IntelliJ を再起動すると IdeaVim が有効になります。

Install IdeaVim

EAP ビルド

IdeaVim のアップデートは現状だと年に数回程度しか行われていません。 IntelliJ 内から[Settings] > [Plugins] > [Browse Repositories] > [Manage Repositories]に下記の URL を追加することで、まだ正式にはリリースされていない EAP[^1]ビルドの IdeaVim を利用することができます。
https://plugins.jetbrains.com/plugins/eap/ideavim
不便だと思っていた不具合が EAP ビルドでは直っているみたいなケースも少なくないので、筆者は常に最新の EAP ビルドを利用しています。

[^1]: Early Access Program

IdeaVim の設定方法

.ideavimrc

IdeaVim では、.ideavimrcというファイルに設定を記述してホームディレクトリに設置しておくことで、IntelliJ 起動時にその設定を読み込んでくれます。
.ideavimrcには 本家 Vim の.vimrcと同様、各種 map コマンドや set コマンドを記述することが可能です。

利用できるsetコマンドのオプション一覧はこちらにあります。
また、IdeaVim 独自のオプションとしてset surroundというものが存在し、本家 Vim で言うところのvim-surroundを一部再現した機能が利用可能となっています。

Vim と IdeaVim のキーマップの一元管理

mapコマンドが本家 vim と同じ記述で利用可能なため、nnoremap L $などとといったような基本的なキーマップは、通常の.vimrcから切り出して.vimrc.keymapという独立したファイルにしておき、.vimrc.ideavimrcそれぞれからsourceコマンドを使って読み込むのがおすすめです。
こうすることで、Vim と IdeaVim で共通して設定しておきたいような基本的なキーマップを一元管理できるようになります。これは.ideavimrc.vimrcとほとんど同じ文法で記述できるからこそのメリットですね。

.ideavimrc
" 切り出しておいた共通keymapファイルをロード
source .vimrc.keymap

" IdeaVim特有の設定はここに書き足していく
.vimrc.keymap
" IdeaVimとvimどちらでも共通のキーマップはここに書く

nnoremap L $
nnoremap H ^
noremap ; :

参考までに、自分の.ideavimrc.vimrc.keymapも以下に載せておきます。

IntelliJ の機能をキーマッピング

基本的なキーマップは.vimrc.keymapに切り出したので、.ideavimrcには IdeaVim 特有の設定が残ることになります。 筆者の.ideavimrcを見てもらうと、たとえば以下のように、nnoremap XXX :action YYYという記述が多くあることがわかります。

nnoremap gd :action GotoDeclaration

:actionは IdeaVim オリジナルのコマンドで、このコマンドを使うと IntelliJ の機能を呼び出すことができます。GotoDeclarationは IntelliJ の機能の一つであり、「カーソル上の変数や関数の定義元に飛ぶ」という操作です。
つまり上記の 1 行は、「gdをキーストロークするとカーソル上の変数や関数の定義元に飛ぶ」という設定となります。 このように、IdeaVim では:actionコマンドで IntelliJ の機能(アクション)を呼び出して使用することができます。IntelliJ の強力なコードジャンプやリファクタ機能についても、Vim のキーマップ的な設定や呼び出しが可能ということになります
カーソルの移動などの単純な操作から、リファクタやコードジャンプ等のもっと高次な機能まで、IntelliJ が API として提供しているアクションや、インストールしているプラグインで定義されているアクションは全て呼び出せるようです。
このアクション呼び出し機能によって、IdeaVim と IntelliJ の連携の自由度が格段に上がりました。以下に、筆者が高頻度で使うおすすめのアクションの一例を載せておきます。

設定しておくと幸せになれそうなアクションの一例

Action概要
SearchEverywhere任意のクラス・関数・ファイルを検索・ジャンプ
FindInPath開いているプロジェクト内の任意の文字列を検索(grep 的な)
FileStructurePopup編集しているファイル内の任意の関数を検索・ジャンプ
GotoDeclarationカーソル上の関数や変数の定義元にジャンプ
GotoSuperMethodカーソル上の関数のスーパーメソッドにジャンプ
GotoImplementationカーソル上のインターフェースの実装にジャンプ
JumpToLastChange最後に編集した箇所にジャンプ
FindUsagesカーソル上の関数や変数の使用箇所一覧を表示
RenameElementカーソル上の関数や変数の rename
ReformatCodeコードの整形
CommentByLineCommentコメントアウト
ShowIntentionActionsクイックフィックス
GotoActionなんでも呼び出し

設定例

nnoremap ,e :action SearchEverywhere<CR>
nnoremap ,g :action FindInPath<CR>
nnoremap ,s :action FileStructurePopup<CR>

nnoremap gd :action GotoDeclaration<CR>
nnoremap gs :action GotoSuperMethod<CR>
nnoremap gi :action GotoImplementation<CR>
nnoremap gb :action JumpToLastChange<CR>

nnoremap U :action FindUsages<CR>
nnoremap R :action RenameElement<CR>

nnoremap == :action ReformatCode<CR>
vnoremap == :action ReformatCode<CR>

nnoremap cc :action CommentByLineComment<CR>
vnoremap cc :action CommentByLineComment<CR>

nnoremap <C-CR> :action ShowIntentionActions<CR>

nnoremap ,a :action GotoAction<CR>
vnoremap ,a :action GotoAction<CR>

※ ビジュアルモードでの範囲選択に対する:actionコマンドの適用については、バージョン 0.49.3 以降で利用可能です。2018 年 2 月現在では EAP ビルドの最新版で利用できます。

アクションの検索

「自分がいつも使ってるあの機能のアクション名を知りたい」といった際に、直接的に探す方法は無いのが現在の難点です。 ただ、下記の手順を踏むとだいたいはそこまで苦労せずに見つかるかと思います。

まず、IntelliJ の[Preferences] > [Keymap]から、設定したい機能を探します。その機能に IntelliJ デフォルトで割り当てられているショートカットキーから探すと早いです。

actionlist

見つかったら、その機能の名前を確認しておきます。

次に、:actionlistコマンドを使うことで、IdeaVim で呼び出し可能なアクションの一覧を確認することができます。 また、:actionlist XXXとすると、名前にXXXを含むアクションを検索することもできます。

さきほど確認した機能名とアクション名は似ていることが多いため、機能名の一部や、その機能を連想するような単語(検索関連の機能ならsearchとか)で検索して、それっぽいのがヒットしたら試してみる、というのを当たるまで繰り返します。
検索結果には現在そのアクションに割り当てられているショートカットキーも表示されるため、それも参考にすると見つけやすいかと思います。 (ショートカットキーでアクションの検索ができるようになってくれると便利そうですね…)

2019/04/29 追記: 出していたプルリクがマージされたので、v.0.52からはショートカットキーでもアクションの絞り込みが可能となる見込みです。

おわりに

本記事では IdeaVim の機能や設定方法について紹介しました。
IdeaVim はまだ発展途上な部分もありますが、IntelliJ の強力な機能をそのまま活かしつつ Vim の操作性を取り入れることができる素晴らしいプラグインだと思います。
IdeaVim を使いこなして、快適な IntelliJ ライフを送りましょう!

Naoto Ikeno
Naoto Ikeno
Backend Engineer, Software Architecture & Design, Perl, Rust, Golang, GCP
Back to blog posts