👼

JetBrainsで快適にVim

2023/12/04に公開

こんにちは😊 kesojiです。 この記事はSocial Databank Tech Blog Advent Calendar 2023の4日目です。

弊社では開発ツールとしてJetBrains社のIDE (PHPStorm, WebStorm, GoLandなど) を法人プランで契約しています。

こだわりがある人は好きなIDEやエディタを使ってもらっても良いのですが、ドキュメンテーションをJetBrainsの場合とVSCodeの場合〜と分けたりするのは面倒なので、
基本的にはJetBrainsを使用するということにしています。

さて、本題ですが私はVimが好きだ(です)。 (宗教)戦争をするつもりは無いので一応補足すると、 VimでもEmacsでも、最低限の手の動きで最大限の効果を出すような思想が好きです😄
各種IDEもVSCodeでも、Vimプラグインを入れて使っていればVimだと思っています。テキストオブジェクトが扱えればVimmerだと思っています。

折に触れてVim未経験者に「Macには vimtutor ってのが最初から入ってるから一旦ターミナル開いて vimtutor ja ってやってみよっか」と勧誘しています。

(私の .vimrc などは kesoji/dotfilesにあります。 本日紹介する .ideavimrc の私の設定もこちらにあります)

みんなにVimを好きになってもらうべく、ハードルは低い方が良いと思っているので、ちょっとでも興味がある人には

🤔(kesoji) <「とりあえずIdeaVimを入れてみよっか😄」
🤔(kesoji) <「右下のこの青?緑?のVの文字からいつでもオンオフ切り替えられるから、ちょっとモチベがあるなって時にオンにして使ってみて😄 Tutor ってやつで勉強もできるよ!」

というような活動をしています。

今回は、 IdeaVimで便利なカスタマイズを紹介していきます。
完全なVim初心者向けには書いていないです。ノーマルモードやインサートモードの違いなどは... vimtutor jaしてください!

IdeaVimはインストールしている前提で進めていきます。

まずは設定ファイルの確認。

Vimにおける .vimrc のように、 JetBrains製品には .ideavimrc があります。まずはこれを作成しましょう。GUIから簡単に作成できます。 右下のプラグインのボタンから作成しましょう。

以下のファイルが新しいタブで開かれます。

" .ideavimrc is a configuration file for IdeaVim plugin. It uses
"   the same commands as the original .vimrc configuration.
" You can find a list of commands here: https://jb.gg/h38q75
" Find more examples here: https://jb.gg/share-ideavimrc

" Source your .vimrc
source ~/.vimrc

"" -- Suggested options --
" Show a few lines of context around the cursor. Note that this makes the
" text scroll if you mouse-click near the start or end of the window.
set scrolloff=5

" Do incremental searching.
set incsearch

" Don't use Ex mode, use Q for formatting.
map Q gq

" --- Enable IdeaVim plugins https://jb.gg/ideavim-plugins

" Highlight copied text
Plug 'machakann/vim-highlightedyank'
" Commentary plugin
Plug 'tpope/vim-commentary'


"" -- Map IDE actions to IdeaVim -- https://jb.gg/abva4t
"" Map \r to the Reformat Code action
"map \r <Action>(ReformatCode)

"" Map <leader>d to start debug
"map <leader>d <Action>(Debug)

"" Map \b to toggle the breakpoint on the current line
"map \b <Action>(ToggleLineBreakpoint)

Vimプラグインを使っているけどvimrcを書いたことがないという人もいますので、簡単に説明すると、 .vimrc は、Vimのカスタマイズ用ファイルで、
ホームディレクトリ直下(他の場所でもいいのですが割愛)に置いておくことで効力を発揮します。 .ideavimrc はそのJetBrains製品プラグイン用です。
(ホームディレクトリをターミナルなどで見てみるとこのファイルが出来上がっていることが分かります)

.vimrc (もといVimScriptという言語) では、 " がコメントとなります。

デフォルトの .ideavimrc で、いくつかの機能が有効になります。

  • source ~/.vimrc 既にある設定ファイルを読み込む
  • set scrolloff=5 スクロールした時のオフセット行数を設定する
  • set incsearch インクリメンタルサーチを有効にする。 / で検索をした時、確定しなくともヒットした行に移動していく
  • map Q gq Q (Shiftを押しながらq) を押すと gq を押したことにする。 (gqはフォーマットするコマンド)
  • Plug 'machakann/vim-highlightedyank' yank (コピー) した時に行をハイライトするプラグインを有効化する
  • Plug 'tpope/vim-commentary' コメントアウト/コメントインするプラグインを有効化する (これに関しては Cmd(Ctrl)+/ で十分かとは思います)

現状では変わったか変わっていないかよくわからないと思いますが、本記事で設定をオンオフする方法を覚えて実験して効果を確認してもらえればと思います。

いつでも設定を開けるようにする & すぐにリロードできるようにする

まず、 この設定を試行錯誤するために便利な設定を追加しましょう。 以下を .ideavimrc の末尾に追加して、保存してください。

let mapleader = ' '
nnoremap <Leader>ev :<C-u>vsplit ~/.ideavimrc<CR>
nnoremap <Leader>sv :<C-u>source ~/.ideavimrc<CR>

保存した後、 IDEを再起動しましょう。 Shift2回 -> restart ide と打ってエンターで再起動です!

今回設定したのは
let mapleader = ' '
今後出てくる<Leader> という文字列の変換先を半角スペースに指定するという意味です。

nnoremap <Leader>ev :<C-u>vsplit ~/.ideavimrc<CR>
<Leader>ev Leader(=半角スペース)、e、v という順番でキーを打った時に、 .ideavimrcをv(vertical=垂直)分割して開くという意味です。早速実行してみましょう。vimrcが隣に開きます。 ([e]dit, [v]imrc という理由からのキー選定です。)

nnoremap <Leader>sv :<C-u>source ~/.ideavimrc<CR>
半角スペース、s、v という順番でキーを打った時に、 .ideavimrcをリロードする、という意味です。([s]ource, [v]imrc という理由からのキー選定です。)

設定ファイル変更 -> 半角スペースsv を打つことで、すぐに反映した設定を確認できます。
(プラグインが提供するショートカットの Cmd(Ctrl)+Shift+I でもリロードできるみたいです)

では、早速③の機能を確認してみましょう。 .ideavimrc の末尾に以下を追加してください。

inoremap jk <ESC>

その後、 半角スペースsv を打って設定リロードし、 インサートモードに入りましょう。その後、 jk と打つことでノーマルモードに戻れます。
Ctrl+[ が遠く感じる人にはとても便利なマッピングだと思います。

ここまでで準備完了です。ここからはオススメの設定を紹介していきます。

おすすめ設定やコマンド

Vim単体でできる設定は割愛して、 JetBrainsの機能のマッピングをメインで紹介していきます。

yank(コピー)した時にクリップボードに入るようにする

set clipboard+=unnamed

読んで字のごとくです。Cmd(Ctrl)+Cと使い分けしたくないですよね。

定義/インタフェースの実装に移動する

定義への移動はいわゆる Cmd(Ctrl) + クリックですね。 これについてはマッピング不要で使えます。 gd です。

nmap gi <Action>(GotoImplementation)

インタフェースの実装に移動は、「I」マークを押した時の動作です。 go to implementation からとっています。

ファイル内のGitの変更箇所にジャンプする

nmap [c <Action>(VcsShowPrevChangeMarker)
nmap ]c <Action>(VcsShowNextChangeMarker)

このそもそものIDEの機能を知らない人も多いイメージなのですが、 ファイル内のGitの変更箇所にジャンプできます。
大きめのファイルを触っている時、「変えたところどこだっけ...」みたいなことをよくやっているのを見かけます。

[ が上向き、 ] が下向きで、 c は ChangeのCです。

ファイル内のエラー箇所にジャンプする

nmap [q <Action>(GotoPreviousError)
nmap ]q <Action>(GotoNextError)

JetBrainsの Problems に表示されている箇所にジャンプできます。
q は、Vimの QuickFix という機能が同様な機能なので、その q をとっています。

マウスホバーした時の情報を出す

エラー表示がある時など、マウスホバーで情報を見る時に、Vim使っているのであればわざわざマウスに手を伸ばしたくないですよね。

nnmap <Leader>k <Action>(ShowHoverInfo)

k は、マニュアルを見る時にVimでは K を使うことから取っています。
K 自体も、デフォルトの機能として関数コメントを見られます。

JetBrainsのアクションをマッピングするのに便利な機能

これまで出てきた VcsShowPrevChangeMarker とか GotoNextError とか、これはどうやって調べればいいのでしょうか。
プラグインが便利な機能を提供してくれています。

IdeaVimの Track Action Ids を有効化しましょう (Shift2回か、 Cmd(Ctrl)+Shift+A から検索すればでてきます)

有効にすると、IDEのアクションを実行した時に、以下のようなポップアップがでてきて、マッピング用のIDを教えてくれます。

「この機能、マウス無しで実行したいな」とか、「この機能、Vimのノーマルモードで使いたいな」と思った時、是非これを使って設定してみてください。

まとめ

「Vim使えるようになりたいんだよな〜」と言ってくれる将来有望な方々はたくさんいるのですが、やはりハードルは高いと感じています。(そのハードルを超えた先に素晴らしい世界が待っているというのに...)
JetBrainsやVSCodeのプラグインだと、カジュアルにオンオフしながら使えるので、是非使ってみて欲しいと思います。
今回の執筆を機に色々変更もしましたが、 私の .ideavimrc も参考にしてもらえればと思います。

あとはやっぱり vimtutor (vimtutor ja) を毎朝1周ですかね。1週間続ければだいたいのことはなんとかなります!

ハバナイスVimライフ!

ロゴはKaoriyaさんに掲載されているものを使用しました。

ソーシャルデータバンク テックブログ

Discussion