2019年からIdeaVimを使い続けて8年。最初は「IntelliJでもVimキーバインドが使えるらしい」程度の軽い気持ちで始めたのが、今では手放せない存在になっています。
この記事では、GitHub Discussionで75人以上の開発者が共有している設定を参考にしながら、8年かけて磨き上げた394行の.ideavimrcを全公開します。特に2026年現在のAIアシスタント連携や、日本語記事ではあまり紹介されていないswitch.vim、flash.searchなどの設定も詳しく解説していきます。
IdeaVimとは
IdeaVimは、JetBrains製IDE(IntelliJ IDEA、WebStorm、PyCharm等)でVimのキーバインドを再現するプラグインです。単なるキーバインドエミュレーションではなく、マクロ、マーク、レジスタ、EXコマンド、さらにはVim Scriptまでサポートしています。
Vimの操作性とIDEの強力な機能を両立できるのが最大の魅力です。
基本設定
まずは土台となる基本設定から。これらは多くの開発者に共通する「あると便利」な設定です。
" 基本設定
set scrolloff=20 " スクロール時に画面端から20行の余白を確保
set number " 行番号表示
set relativenumber " 相対行番号(カーソルからの距離を表示)
set showmode " 現在のモード表示
set showcmd " 入力中のコマンド表示
set visualbell " ビープ音を視覚的なフラッシュに
set clipboard+=unnamed " システムクリップボードと連携
set cursorline " カーソル行をハイライト
検索設定
set ignorecase " 大文字小文字を区別しない
set smartcase " 大文字が含まれていたら区別する
set incsearch " インクリメンタル検索
set hlsearch " 検索結果をハイライト
set wrapscan " ファイル末尾で先頭に戻る
" 検索ハイライトを消す(ESC2回またはCtrl+[)
nnoremap <ESC><ESC> :nohlsearch<CR>
nnoremap <C-[> <C-[>:nohlsearch<CR>
" 検索結果を画面中央に表示
nnoremap n nzz
nnoremap N Nzz
nnoremap * *zz
nnoremap # #zz
検索結果を中央に表示するnzzのマッピングは、長いファイルを扱うときに特に効果的です。次のマッチに移動したときに「今どこにいるのか」が一目でわかります。
Emacs風インサートモード
これは8年使っていて一番手に馴染んだ設定です。インサートモードでもEmacs風のカーソル移動ができるようにしています。
" Emacs風カーソル移動(インサートモード)
inoremap <C-a> <C-o>^ " 行頭へ
inoremap <C-e> <C-o>$<Right> " 行末へ
inoremap <C-b> <Left> " 1文字左
inoremap <C-f> <Right> " 1文字右
inoremap <C-h> <BS> " バックスペース
inoremap <C-d> <Del> " Delete
inoremap <C-k> <C-o>D<Right> " カーソル以降を削除
VimとEmacsの「宗教戦争」はさておき、この設定があるとターミナルやブラウザのテキストフィールドと同じ操作感になるので、コンテキストスイッチのストレスが減ります。
IDEアクションとの連携
IdeaVimの真価は、VimのキーバインドからIDEの機能を呼び出せる点にあります。<Action>(アクション名)という特別な構文を使います。
ジャンプ系
" 履歴ナビゲーション
nmap <C-o> <Action>(Back)
nmap <C-i> <Action>(Forward)
" コード内ジャンプ
nmap [m <Action>(MethodUp) " 前のメソッド
nmap ]m <Action>(MethodDown) " 次のメソッド
nmap [e <Action>(GotoPreviousError) " 前のエラー
nmap ]e <Action>(GotoNextError) " 次のエラー
nmap [c <Action>(JumpToLastChange) " 前の変更箇所
nmap ]c <Action>(JumpToNextChange) " 次の変更箇所
nmap [g <Action>(VcsShowPrevChangeMarker) " Git差分:前
nmap ]g <Action>(VcsShowNextChangeMarker) " Git差分:次
[と]のペアで「前へ/次へ」を統一するのは、Vimの伝統的なパターンです。これに慣れると、エラー箇所やGitの差分を高速で巡回できます。
Git連携
let mapleader = " " " リーダーキーをスペースに
nmap gm <Action>(ActivateCommitToolWindow) " コミットウィンドウ
nmap gb <Action>(Git.Branches) " ブランチ一覧
nmap gB <Action>(Vcs.Show.Blame) " Git Blame
nmap gl <Action>(ActivateVersionControlToolWindow) " VCSパネル
nmap gs <Action>(Git.Status) " Git Status
nmap gp <Action>(Vcs.Push) " Push
nmap gP <Action>(Vcs.UpdateProject) " Pull
nmap gt <Action>(Git.Stash) " Stash
nmap gd <Action>(Compare.LastVersion) " 最新版との差分
gをプレフィックスにしてGit操作をまとめています。gbでブランチ、gsでステータス、gpでプッシュ…と、gitコマンドに近い感覚で操作できます。
AIアシスタント連携(2026年新機能)
2026年現在、JetBrainsにはAI Assistantが深く統合されています。Vimキーバインドからこれらを呼び出せると、コーディングのフローが途切れません。
" JetBrains AI Assistant
nmap <leader>io <Action>(AIAssistant.ToolWindow.ShowOrFocus)
vmap <leader>io <Action>(AIAssistant.ToolWindow.ShowOrFocus)
nmap <leader>ii <Action>(AIAssistant.Editor.AskAiAssistantInEditor)
nmap <leader>im <Action>(IntentionActionAsAction_com.intellij.ml.llm.intentions.chat.AIAssistantIntention)
vmap <leader>im <Action>(IntentionActionAsAction_com.intellij.ml.llm.intentions.chat.AIAssistantIntention)
" GitHub Copilot
nmap <leader>iq <Action>(copilot.chat.show)
nmap <leader>ic <Action>(copilot.chat.inline)
" インライン補完の呼び出し
imap <C-l> <Action>(CallInlineCompletionAction)
imap <C-Backspace> <Action>(CallInlineCompletionAction)
<leader>iをAI系のプレフィックスにしています。ioでAIツールウィンドウを開き、iiでエディタ内で直接AIに質問、iqでCopilot Chatを開く…という流れです。
正直なところ、最近はClaude Codeをメインで使っているのでIDE内のAI機能はあまり使わなくなりました。ただ、設定だけは残しておくといざというとき便利です。
プラグイン設定
IdeaVimには多くのVimプラグインが移植されています。私が実際に使っている9つのプラグインを紹介します。
必須プラグイン
" プラグイン有効化
Plug 'vim-scripts/argtextobj.vim' " 関数引数をテキストオブジェクト化
Plug 'machakann/vim-highlightedyank' " ヤンク範囲をハイライト
Plug 'dbakker/vim-paragraph-motion' " 段落移動の改善
Plug 'michaeljsmith/vim-indent-object' " インデントをテキストオブジェクト化
Plug 'tommcdo/vim-exchange' " テキスト交換
Plug 'easymotion/vim-easymotion' " 高速移動
Plug 'kana/vim-textobj-entire' " ファイル全体を選択
Plug 'unblevable/quick-scope' " f/F/t/Tの候補をハイライト
" 組み込みプラグイン
set surround " 囲み文字操作
set multiple-cursors " 複数カーソル
set commentary " コメント操作
set NERDTree " ファイルツリー
set easymotion " 高速移動
set which-key " キーバインドポップアップ
set ideajoin " スマートな行結合
set ideamarks " IDEのブックマーク連携
highlightedyankの設定
let g:highlightedyank_highlight_duration = "700"
ヤンク(コピー)した範囲が700ミリ秒間ハイライトされます。「何をコピーしたか」が視覚的にわかるので、意図しない範囲をコピーしてしまうミスを防げます。
quick-scopeの設定
set quickscope
let g:qs_highlight_on_keys = ['f', 'F', 't', 'T']
let g:qs_max_chars=80
fやtでジャンプするとき、到達可能な文字がハイライトされます。1行が長いコードでも、目的の位置に最短でジャンプできます。
which-keyの詳細設定
which-keyは、キーバインドを忘れても「スペースを押して待つ」だけで選択肢が表示される便利なプラグインです。海外の記事ではあまり詳しく解説されていないカスタマイズ方法を紹介します。
set which-key
set notimeout " タイムアウトを無効化
let g:WhichKey_DefaultDelay = 400 " ポップアップ表示までの遅延(ミリ秒)
" カテゴリ説明を設定
let g:WhichKeyDesc_generate = "<leader>c Generate"
let g:WhichKeyDesc_git = "<leader>g Git"
let g:WhichKeyDesc_hierarchy = "<leader>h Hierarchy"
let g:WhichKeyDesc_intelligence = "<leader>i AI"
let g:WhichKeyDesc_layout = "<leader>l Layout"
let g:WhichKeyDesc_menu = "<leader>m Menu"
let g:WhichKeyDesc_refactoring = "<leader>r Refactoring"
let g:WhichKeyDesc_task = "<leader>t Task"
let g:WhichKeyDesc_ideavimrc = "<leader>v ideavimrc"
let g:WhichKeyDesc_tab = "<leader>x Tab"
let g:WhichKeyDesc_fold = "<leader>z Folding"
WhichKeyDesc_*変数でカテゴリ名を設定すると、ポップアップがより見やすくなります。<leader>cを押すと「Generate」というラベルが表示され、その下に関連するキーバインドが一覧表示されます。
switch.vimの活用
switch.vimは、カーソル下の単語を「反対語」や「関連語」にトグル切り替えできるプラグインです。これが意外と便利で、特にログレベルやテストのマッチャーを切り替えるときに重宝します。
set switch
nnoremap ! :Switch<CR>
nnoremap ` :SwitchReverse<CR>
let g:switch_definitions = 'group:basic,group:markdown,group:javascript'
let g:switch_custom_definitions = [
\ switchWords(['log', 'info', 'warn', 'error', 'debug']),
\ switchWords(['get', 'post', 'put', 'delete']),
\ switchWords(['GET', 'POST', 'PUT', 'DELETE']),
\ switchWords(['yes', 'no']),
\ switchWords(['start', 'stop']),
\ switchWords(['enable', 'disable']),
\ switchWords(['add', 'remove']),
\ switchWords(['show', 'hide']),
\ switchWords(['before', 'after']),
\ switchWords(['async', 'await']),
\ switchWords(['valid', 'invalid']),
\ switchWords(['toBe', 'toEqual', 'toStrictEqual', 'toBeCloseTo']),
\ switchWords(['toBeTruthy', 'toBeFalsy']),
\ switchWords(['toContain', 'toHaveLength', 'toHaveProperty']),
\ switchWords(['resolves', 'rejects']),
\ ]
使い方は簡単で、console.logにカーソルを置いて!を押すとconsole.infoに変わり、もう一度押すとconsole.warn…と順番に切り替わります。テストを書くときもtoBeとtoEqualの切り替えが一瞬です。
flash.searchでの高速移動
easymotion/vim-sneakの代わりに、新しいflash.searchを使っています。
set easymotion
nmap s <Action>(flash.search)
sを押して検索文字を入力すると、画面上の候補にラベルが表示され、ラベルを押すとその位置にジャンプできます。easymotionよりも直感的で、見つけたい場所に最短で到達できます。
ウィンドウ分割操作
tをプレフィックスにして、ウィンドウ分割操作を統一しています。
nnoremap t <Nop>
nnoremap tj <C-w>j " 下のウィンドウへ
nnoremap tk <C-w>k " 上のウィンドウへ
nnoremap tl <C-w>l " 右のウィンドウへ
nnoremap th <C-w>h " 左のウィンドウへ
nnoremap ts :<C-u>sp<cr> " 水平分割
nnoremap tv :<C-u>vs<cr> " 垂直分割
nnoremap tq :<C-u>q<cr> " ウィンドウを閉じる
nnoremap tt :<C-u>tabnew<cr> " 新しいタブ
" タブ操作(IDE Action版)
nmap tx <Action>(CloseContent)
nmap ta <Action>(CloseAllEditors)
nmap to <Action>(CloseAllEditorsButActive)
nmap t, <Action>(PreviousTab)
nmap t. <Action>(NextTab)
設定ファイルの管理
設定をいじっていると、すぐに反映して試したくなります。以下の設定があると便利です。
" .ideavimrcを開く
nmap <leader>vv :e ~/.ideavimrc<cr>
" .ideavimrcを再読み込み
nmap <leader>vr <Action>(IdeaVim.ReloadVimRc.reload)
<leader>vvで設定ファイルを開き、編集したら<leader>vrで再読み込み。IDEを再起動する必要がないので、トライアンドエラーが高速にできます。
キーボード周りのカスタマイズに興味があれば、以下の記事もおすすめです。
Karabiner-Elementsユーザーに設定をTypeScriptで書くことを全力でおすすめしたいMacまとめ
8年間使い続けて辿り着いた設定のポイントをまとめると:
- プレフィックスを統一する:
gはGit、tはタブ/ウィンドウ、<leader>iはAI…と覚えやすくする - which-keyを活用する: 忘れても大丈夫な安心感がある
- IDEの機能を積極的に使う: Vimに固執せず、IDEの便利機能はActionでマッピング
- switch.vimでトグル操作を効率化: ログレベルやテストマッチャーの切り替えが一瞬
- AI連携を取り入れる: 2026年現在、AI Assistantとの連携は必須
設定ファイルの全文はGitHubのDiscussionでも共有されている他の開発者の設定と比較しながら、自分のワークフローに合わせてカスタマイズしてみてください。
最初は覚えることが多く感じるかもしれませんが、1週間も使えば指が覚えます。マウスに手を伸ばす回数が激減して、コーディングに集中できる時間が増えるはずです。