Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

IdeaVIMのキーバインドを考える

$
0
0

IDEA系エディタでVimのキーバインドを使うために、 IdeaVIMというプラグインがある。
流石にVim純正プラグインがそのまま動くわけではないので、足りない機能はIDEA純正の機能にVimプラグイン風のキーを割り当てて補うことを考える。

以下はGitHubから他人の .ideavimrcを見漁って自分なりにまとめた .ideavimrcの設定である。

コード折り畳みを無効化

自分にとってIDEのコード折り畳み機能は不要な機能であるが、IDEの設定から無効化するだけでは不完全であった。

.ideavimrc
nnoremap zM <Nop>nnoremap zc <Nop>nnoremap zC <Nop>nnoremap zR <Nop>nnoremap zo <Nop>nnoremap zO <Nop>

surround を有効化

tpope/vim-surroundと同じ機能とキーバインドを実現。

.ideavimrc
set surround

AceJump にキーバインドを割り当てる

AceJumpvim-easymotionと似た挙動をするIDEA用のプラグイン。
私の場合は Space 2回押下で呼び出すように設定する。

.ideavimrc
nnoremap<Space><Space> :<C-u>action AceAction<CR>

Vimモードでは少し挙動がおかしいのであまり使っていない。

検索機能をIDEA純正に

テキストハイライトがついて見やすく、凝った検索をしなければVim純正と似たような操作性で検索ができる。

.ideavimrc
nnoremap / :<C-u>action Find<CR>

ジャンプ機能をIDEA純正に

コードジャンプ機能はIDEAの方が完成度が高いので、こちらを標準で使います。

.ideavimrc
nnoremap<C-o> :<C-u>action Back<CR>nnoremap<C-i> :<C-u>action Forward<CR>nnoremap<C-S-o><C-o>nnoremap<C-S-i><C-i>

コードジャンプ

カーソル化の変数の出現

.ideavimrc
nnoremap [o :<C-u>action PreviousOccurence<CR>nnoremap ]o :<C-u>action NextOccurence<CR>

前/次のメソッド定義へジャンプ

.ideavimrc
nnoremap [m :<C-u>action MethodUp<CR>nnoremap ]m :<C-u>action MethodDown<CR>

前/次の変更箇所へジャンプ

.ideavimrc
nnoremap [c :<C-u>action VcsShowPrevChangeMarker<CR>nnoremap ]c :<C-u>action VcsShowNextChangeMarker<CR>

前/次のエラー箇所へジャンプ

.ideavimrc
nnoremap [e :<C-u>action GotoPreviousError<CR>nnoremap ]e :<C-u>action GotoNextError<CR>

[ + アルファベットで前方検索、] + アルファベットで後方検索。ついでに現在の行の前/後に空行を挿入するキーバインドも紹介する。

.ideavimrc
nnoremap [<Space> O<Esc>jnnoremap ]<Space>o<Esc>k

タグジャンプ

キーセット動作
KJavaDocを表示
gjKインターフェイスへジャンプ
gjk宣言へジャンプ
gji実装クラスへジャンプ
gjsスーパークラスへジャンプ
gjtテストクラスへジャンプ
Ctrl + k出現箇所の検索

基本的に gj + アルファベットをタグジャンプに割り当てている。

.ideavimrc
nnoremap K :<C-u>action QuickJavaDoc<CR>nnoremap gjK :<C-u>action GotoDeclaration<CR>nnoremap gjk :<C-u>action GotoTypeDeclaration<CR>nnoremap gji :<C-u>action GotoImplementation<CR>nnoremap gjs :<C-u>action GotoSuperMethod<CR>nnoremap gjt :<C-u>action GotoTest<CR>nnoremap<C-k> :<C-u>action ShowUsages<CR>

コードリファクタリング機能

あまりしっくりくるキーバインドが浮かばなかったのでパクったものをそのまま使ってる。

.ideavimrc
nnoremapcre :<C-u>action RenameElement<CR>nnoremap cS :<C-u>action ChangeSignature<CR>nnoremap cts :<C-u>action ChangeTypeSignature<CR>

IDEのリッチな機能にキーバインドを割り当てる

キーバインドを覚えるコストを少しでも削減するために、以下のルールを設けてみた。

  • スペースキー + 小文字アルファベットでIDEの機能で何かする。
  • スペースキー + 大文字アルファベットでIDEの機能で何か大げさなことをする。

ものすごく漠然としているが、例を見て頂ければ理解できると思う。

キーセット動作
Space + aIDEアクションを検索
Space + Gコード生成メニューを表示
Space + gn新規クラスを生成
Space + goメソッドをオーバーライド
Space + gcコンストラクタを生成
Space + ggGetter を生成
Space + gsSetter を生成
Space + gaGetter/Setter を生成
Space + geequals を生成
Space + gtテストメソッドを生成
Space + =現在のバッファをフォーマット
Space + oアウトラインを表示
Space + q現在のバッファを閉じる
Space + Q最後の閉じたバッファを開く
Space + fファイルを検索
Space + Fファイルを全文検索
Space + sクラスを検索
Space + Sシンボルを検索
Space + t端末を表示
Space + r実行
Space + R現在のクラスを実行
Space + dデバッグ
Space + D現在のクラスをデバッグ
Space + b現在の行をブレークポイントに指定/指定解除

以上を反映したものがこちらである。

.ideavimrc
nnoremap<Space>a :<C-u>action GotoAction<CR>nnoremap<Space>G :<C-u>action Generate<CR>nnoremap<Space>gn :<C-u>action NewClass<CR>nnoremap<Space>go :<C-u>action OverrideMethods<CR>nnoremap<Space>gc :<C-u>action GenerateConstructor<CR>nnoremap<Space>gg :<C-u>action GenerateGetter<CR>nnoremap<Space>gs :<C-u>action GenerateSetter<CR>nnoremap<Space>ga :<C-u>action GenerateGetterAndSetter<CR>nnoremap<Space>ge :<C-u>action GenerateEquals<CR>nnoremap<Space>gt :<C-u>action GenerateTestMethod<CR>nnoremap<Space>= :<C-u>action ReformatCode<CR>nnoremap<Space>o :<C-u>action FileStructurePopup<CR>nnoremap<Space>q :<C-u>action CloseContent<CR>nnoremap<Space>Q :<C-u>action ReopenClosedTab<CR>nnoremap<Space>e :<C-u>action SearchEverywhere<CR>nnoremap<Space>f :<C-u>action GotoFile<CR>nnoremap<Space>F :<C-u>action FindInPath<CR>nnoremap<Space>s :<C-u>action GotoClass<CR>nnoremap<Space>S :<C-u>action GotoSymbol<CR>nnoremap<Space>t :<C-u>action ActivateTerminalToolWindow<CR>nnoremap<Space>P :<C-u>action ManageRecentProjects<CR>nnoremap<Space>b :<C-u>action ToggleLineBreakpoint<CR>

バッファがない状態、あるいはコードエリアからフォーカスが外れてしまうとキーバインドが使えなくなるのが残念。

IDEのアクションを呼び出す

:actionlist [フィルタ]

でIdeaVIMから呼び出せる機能を参照できる。

:action [アクション名]

でアクションの呼び出しが行えるので、どのような挙動をするのかを試すことが出来る。

これからやる

  • 何も含んでいない最終行にキャレットが移動しないバグがあるので、修正したものを近々PRを送る。
  • SelectWord , UnSelectWordは actionlist に含まれていたが、Vimの範囲選択とは連携できないので修正する。
  • RenameElementが不自然なので、Vimのモード、範囲選択と自然に連携するように修正する

Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>