シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

半年ほどVimを使ってきたので

皆さん初めまして。今年の4月からシナプスにジョインしました、丸野 公輝と申します。
前職ではITツールの営業をしておりまして、転職を機にシステムエンジニアに転向しました。

転職してから日々新しいことを勉強していますが、(社内であんまり使われていないにも関わらず) Vimにドはまりし、今日まで使い続けて来ました。

そこで、今回はこれまでに理解したVimの魅力、おすすめのカスタマイズ、おすすめのプラグインについてご紹介させていただきます。

www.vim.org

分かり始めたVimの魅力

今更ですが、皆さんはVimを使ってますか?

すでに使いこなしているかたは、是非とも最初に使った時のことを思い出していただきたいのですが、

  • エディターなのに、なぜか文字が入力されない(起動時はノーマルモード)
  • エディターなのに、保存の仕方も終了方法も分からない(StackOverflowでもこんな記事が出てました) stackoverflow.blog
  • :qaで終われると思ったのに... 「バッファ」ってなに?

という感じで、ずいぶんと面倒なエディターだと思ったのではないでしょうか?

ただ、Vimに慣れていくと、だんだんとその素晴らしさが見えてきます。

  • 「クォーテーションの中の文字を編集する(ci')」や、「カーソル位置より前方にあるxの文字までを削除する(dFx)」といった風に、思考のスピードで編集できるようになる。 www.kadokawa.co.jp
  • バッファやレジスタ、アンドゥツリーなど、裏側の仕組みを理解すればするほどできることが増えていく
  • いくらでもカスタマイズできるし、便利なプラグインがたくさん出回っている
  • ターミナルですべての作業を完結できる
  • .コマンド(ノーマルモード)や;コマンド(ノーマルモードでの移動)、@:コマンド(Exコマンド)、@マクロといった繰り返し同じ作業を行うための機能が充実している

といった感じで、慣れれば慣れるほど編集効率が向上し、だんだん手放せなくなってくるエディターだと考えています。

Vimのおすすめ設定について

日本語入力を快適にする設定

さて、そんな魅力的なVimですが、デフォルトではどうしても日本語入力が面倒になります。 ノーマルモードでのコマンドのほとんどが単体のキー入力であるため、日本語IMのままでは操作が出来ないからです。

この問題にある程度対処するための設定を2つご紹介させていただきます。

一つはこちらの設定になります。

nnoremap あ a 
nnoremap い i
nnoremap お o

if has('win32')
  nnoremap A A
  nnoremap I I
endif

こちらの設定を行うと、日本語入力モードのままでも、そのままEnterを押せば挿入モードに移行できるようになります。

また、デフォルトのWindows環境では、日本語IMでアルファベットを入力すると全角文字になるので、A(行末に移動して挿入モード)とI(行頭に移動して挿入モード)も利用できます。
ですので、if has('OS名') endifという構文を使って、Windows環境でのみ有効になるように設定にしてあります。

二つ目はこちらの設定です。

if has('mac')
  inoremap <ESC> <ESC>:call ImInActivate()<CR>
  function! ImInActivate()
      call system("im-select 'com.apple.keylayout.ABC'")
  endfunction
endif

こちらの設定は、Mac限定かつim-selectという、ターミナル上でIMを切り替えるためのツールをインストールしておく必要がありますのでご注意ください。

github.com

ここではfunction! endfunctionという、関数を新たに設定できる構文を使っています。
その中でcall system()のコマンドを設定し、「挿入モードでEscキーを押したときにIMを切り替えるシェルコマンドを実行する」という機能を実装しています。

Windowsでもim-selectを利用可能ですが、GvimであればデフォルトでIMが切り替わる機能が実装されているので、こちらの利用をおすすめします。

www.kaoriya.net

バッファ操作を快適にする設定

初心者が理解しにくいVim機能の一つに、「バッファ」というものがあります。
普通のエディターでは、ウィンドウやタブを使って複数のファイルを開けるようになっていますが、Vimではこれらに加えてバッファという機能が存在しています。

バッファとは、言ってみれば「表に出てこないタブ」みたいなもので、なんだか使いづらそうに思えますが、Vimではこちらのほうが好まれているので、使いやすいようにしておくと幸せになれます。

set hidden
nnoremap <C-j> :bprev<CR>
nnoremap <C-k> :bnext<CR>

こちらの設定を解説させていただくと、
set hiddenを設定しておくと、現在開いているバッファが編集中でも切替ができるようになります。

nnoremap <C-j> :bprev<CR>という設定は、ノーマルモードでCtrl+jを押した時に、:bprevというコマンドを実行する設定です。

:bprev:bnextは、どちらもバッファを移動するコマンドで、この二つを設定しておけばサクサクとバッファを切替ながら複数ファイルを編集できるようになります。

おすすめのVimプラグインについて

Vimの一つの魅力は、世界中の人がVimの便利機能を作成していて、それをプラグインという形で利用できるという点にあります。
ここでは私が最近よく利用しているプラグインを2つ紹介させていただきます。

NERDTree

github.com

Visual Studio Codeにあるような、ディレクトリツリーを開けるようになるプラグインです。
:eコマンドでもファイルを開くことができますが、ディレクトリ構成を見ながらファイル編集を行えるので、開発に非常に役立つ機能になります。

ツリー上でファイルを選択して、Enterキーを押すと、新しいバッファでファイルを開くことができ、mキーを押すことでファイルの削除や追加、移動などの基本的な操作が行えるようになっています。

NERDTreeの実行イメージ
NERDTreeの実行イメージ

私は以下のような設定を作成して、スペースキーを二回押すことで開閉できるように設定しています。

nnoremap <Space><Space> :NERDTreeToggle<CR>

Undotree

github.com

ツリー上になっているアンドゥ履歴を簡単に操作できるプラグインです。
Vimでは、アンドゥ履歴がツリー上に記録されるようになっており、さらに別ファイルで保存できるようになっています。

Undotreeはこのアンドゥ履歴を分かりやすく操作できるようになるプラグインになります。

こちらもツリー上で戻りたい時点を選択して、Enterキーを押すだけで編集をもとに戻すことができます。

Undotreeの実行イメージ
Undotreeの実行イメージ

ここまで細かくアンドゥ履歴を管理できるエディターはなかなか存在しないので、これだけでもVimを活用する価値はあるかと思います。

" undofileの機能を有効化
set undofile
" undofileを保存するディレクトリを指定
set undodir=/path/to/save/undofile

nnoremap <F5> :UndotreeToggle<CR>

Coc.nvim

github.com

すごく簡単に説明すると、Visual Studio Codeを含む多くのIDEのように、イイ感じにコード補完をしてくれるプラグインです。
Visual Studio Codeで言語のプラグインをインストールするような感覚で、CocInstall 対象の拡張機能名というExコマンドを実行することでLanguage Serverをインストールすることができます。

例えば、Coc.nvimでC#を利用するには、Coc.nvimをインストールした後に:CocInstall coc-omnisharpのコマンドを実行すると利用できるようになります。
こちらのプラグインを導入すると、Vimは単なるエディターではなく「ターミナル上でも起動する超軽量IDE」になるのでおすすめです。

Coc.nvimの実行イメージ
Coc.nvimの実行イメージ

ほかの言語の拡張機能は、npmの公式ページから探してみてください。

www.npmjs.com

おわりに

ということで、まだまだVimを使いこなせているわけではないですが、おすすめ設定などを紹介させていただきました。
これからVimを使おうとしている方や、Vimをもっと使いこなしていきたい!と思っている方に響いたら良いなと思っています。

皆さんの快適Vimライフを応援します!