IntelliJ IDEAのVimエミュレータを設定する方法

IntelliJ IDEAのVimエミュレータを設定する方法

IntelliJ IDEAにVimエミュレータ拡張Ideavimを設定したので概要を残しておきます。
最後に設定例を貼っておくので参考にして下さい。

IdeaVim

JetBrainsが直々に作っているIntelliJのIDE上で動くVimエミュレータです。
環境設定 > プラグイン からインストールします。

Ideavim
https://plugins.jetbrains.com/plugin/164-ideavim

この時点で基本的なVim操作が行えるようになります。

.ideavimrc

.vimrcではなく、~/.ideavimrcに置かれた設定を読み込むので作成しておきます。

日本語入力切り替えの自動化

Insertモードから抜けるときに自動的に半角英数に切り替えるプラグインです。
Ideavimとは別途プラグインからインストールします。

IdeaVimExtension
https://plugins.jetbrains.com/plugin/9615-ideavimextension

英数に切り替えるだけではなくInsertモードに戻ったら元の状態を復元するかなど、色々と設定可能です。

Normalモードに戻ったら必ず半角にしたい場合は set keep-english-in-normal を.ideavimrcにセットすればOKです。

コマンド 説明
:set keep-english-in-normal enable auto-switch feature
:set keep-english-in-normal-and-restore-in-insert restore input method when return insert mode.
:set nokeep-english-in-normal-and-restore-in-insert keep auto-switch feature, but doesn’t restore input method when return insert mode
:set nokeep-english-in-normal disable auto-switch feature

Plugin

VimやNeovimのプラグインは動きません。
Ideavimがプラグインをエミュレートしてくれているプラグインだけ動きます。

プラグインは.vimrcにset *****とプラグイン名をセットするだけで有効になります。
別途ダウンロードしてくる必要はありません。

一覧
https://github.com/JetBrains/ideavim/wiki/Emulated-plugins

万人におすすめなものを紹介します。

IdeaVim-EasyMotion

エディタ内の指定文字の場所にカーソルをジャンプできるEasyMotionです。
このプラグインだけ例外でIDEAのプラグインから追加する必要があります。
依存している別プラグインも自動的に追加されます。

IdeaVim-EasyMotion
https://plugins.jetbrains.com/plugin/13360-ideavim-easymotion

let mapleader=","
set easymotion

サポートしているコマンド一覧
https://github.com/AlexPl292/IdeaVim-EasyMotion#supported-commands

NERDTree

お馴染みのファイルエクスプローラーですが、アレが出てくるのではなくIDE標準のエクスプローラーをNERDTreeのキーバインドで操作できるようになります。

surround

テキストオブジェクトの範囲を指定した文字で囲みます。
正直sandwichの方が嬉しいけど、あるだけで有り難いです。

multiple-cursors

マルチカーソルが使えるようになります。

commentary

gccで現在行をコメントアウトしたり、gc + motionで指定した範囲をコメントアウト出来るようになります。

ReplaceWithRegister

grのオペレータが追加され、ヤンクしてRegisterに入っている値で指定した範囲を置き換えられます。

argtextobj

aaaiのテキストオブジェクトが追加され、メソッドの引数を1つ削ったり書き換えたりといった指定が可能になります。

highlightedyank

ヤンク対象がピカッと光ります。

IDEの操作をマップする

IDEの デバッグを実行するなどの操作をマップできます。
JetBrainではActionと呼ばれるようです。

マップするにはマップしたいActionのaction_idが必要です。

調べ方

なんでも検索 (shift x 2)を開き、Track action Idsと検索してトグルをオンにして有効化します。
有効化された状態でIDEでActionを実行すると右下に実行したActionとaction_idが表示されます。

gifアニメーション

マップ例

map <leader>d <Action>(Debug)  " <Action>({action_id})

有志のプラグイン

JetBrainではなく有志が配布しているプラグインもいくつかあるようです。

IdeaVim-Sneak
https://plugins.jetbrains.com/plugin/15348-ideavim-sneak

Which-Key
https://plugins.jetbrains.com/plugin/15976-which-key

Q&A

ヤンクした内容をクリップボードにコピーして欲しい

set clipboard+=unnamedplus

uで一つ前に戻したときにVimと挙動が違うんだけど

仕様です。
おかしいでしょと公式にissueが挙がって既に9年ほどディスカッションを続けてるようですが未だCloseしていません。

Undo requires one more step if the cursor is not at the position where it was after undo
https://youtrack.jetbrains.com/issue/VIM-308

設定例

setting

set incsearch
set ignorecase
set smartcase
set number
set relativenumber
set clipboard+=unnamedplus
set keep-english-in-normal

map

let mapleader=" "
" reload vimrc
nnoremap <leader><leader> :source ~/.ideavimrc<cr>
" leave insert
inoremap jk <esc>
" save file
nnoremap <C-s> :update<cr>
" delete buffer
noremap <leader>q :bd<cr>
" highlight off
nnoremap <leader>; :nohlsearch<cr>
" yank
nnoremap Y y$
" paste
nnoremap p ]p
xnoremap p ]p
" incremental
nnoremap + <C-a>
nnoremap - <C-x>
" window
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l
nnoremap <C-k> <C-w>k
nnoremap <C-j> <C-w>j
" join
nnoremap gJ J
" cursor
nnoremap J 5j
nnoremap K 5k
xnoremap J 5j
xnoremap K 5k
nnoremap 0 ^
nnoremap ^ 0
vnoremap 0 ^
vnoremap ^ 0
" tab
nnoremap <C-n> gt
nnoremap <C-p> gT
" vim-asterisk"
vnoremap * y/<C-r>0<cr>
" debug
map <leader>d <Action>(Debug)
map <leader>r <Action>(RenameElement)
map <leader>c <Action>(Stop)
map <leader>z <Action>(ToggleDistractionFreeMode)
map <leader>a <Action>(Annotate)
map <leader>h <Action>(Vcs.ShowTabbedFileHistory)
map <S-Space> <Action>(GotoNextError)
map <leader>b <Action>(ToggleLineBreakpoint)
map <leader>o <Action>(FileStructurePopup)
map gh <Action>(ShowErrorDescription)
map <C-w><C-o> <Action>(CloseAllEditorsButActive)

plugin

" enabled
set easymotion
set NERDTree
set surround
set multiple-cursors
set commentary
set ReplaceWithRegister
set argtextobj
set highlightedyank

" easymotion
map <leader>f <Plug>(easymotion-s)
map <leader>j <Plug>(easymotion-j)
map <leader>k <Plug>(easymotion-k)

" NERDTree
nmap <leader>e :NERDTreeFind<cr>
nmap <leader>E :NERDTreeToggle<cr>

 

プログラミングカテゴリの最新記事