Neovim 使ってみませんか?
この記事は TSG Advent Calendar 2023 の8日目の記事です。
初めに
最近エディタは VSCode 一強ですが、VSCode しか触ったことがない人には、ぜひ Neovim を体験してほしいです!
最初の数日は hjkl
の移動に慣れるのに苦労すると思いますが、移動に慣れてしまえば他は意外と学習コストは高くなく、編集効率が上がりますし、何よりかっこいいのでおすすめです!
...とは言っても、なかなかゼロからいきなりターミナルで純粋な Neovim を始めるのが大変なのは確かなので、この記事では Neovim の基本操作と設定の書き方を網羅して書きたいと思います。
- 説明が多すぎて敬遠されると悲しいので、詳細説明は折りたたんであります。
- VSCode と統合できたりするので、VSCode にこだわりがある人もぜひ読んでみてください。
Neovim の嬉しさ
まずは自分が思う Neovim の嬉しいところを紹介します
Vim, Neovim 共通
- 起動が速い
- 操作してるのかっこいい(かっこいい)
- キーボードからマウス,トラックパッドまで手を大きく動かす必要がない
- vi と操作がほぼ一緒なので、OS インストール時の設定などをいじるときに困らない
- mode の概念が強く、編集効率が上がる
- 全てを自分好みにカスタマイズできうる
Neovim 特有
- 設定ファイルに Lua が使えるので柔軟性が高い
- Lua で書かれたプラグインに使いやすいものが多い
- Neovim は Vim を拡張するのが目的のものなので、Vim にない機能があって楽しい
Neovim のインストール
大抵の場合は各 OS のパッケージマネージャーで簡単にインストールできると思いますが、少しバージョンが古かったりすると Lua で設定を書く機能が使えなかったりします。その場合は公式のインストール手順にしたがって最新の Neovim をインストールしましょう。
Neovim 入門
では早速 Neovim を触ってみましょう。下に挙げる3つが有力なんじゃないかなと思います。自分に合いそうなものを選んでください。
-
- Neovim のキーバインドを徐々に学習できるので、最も簡単に始めることができる
- VSCode の拡張機能
- 裏で実際に Neovim を動かす
- VSCode の豊富な拡張機能と、Neovim の自分なりにカスタマイズできる利点を残している
- 拡張機能なので on/off を簡単に切り替えられて、Neovim を試すのに丁度いい
- VSCode との設定の競合などがあり、カスタマイズ性は少し低くなる
- 参考: 超融合!時空を越えた絆 Neo Vim(VSCode)を試してみた
-
- 既にいろいろな設定がされている Neovim
- Vim/Neovim 固有のキーバインド覚えるくらいならいいけど、設定を大量に書くのはめんどくさい人におすすめ(使ったことないので、たぶん)
- リンク先を見れば簡単にインストールできる
- 最初から使いやすく、カスタマイズ性も損なわない
- 参考: VSCodeが物足りない人へ AstroNvimの紹介
- 似たプロジェクトに NvChad, neovide などがあるらしい
-
Neovim
- ゼロから設定を書いて完全に自分好みにしたい人におすすめ
- パフォーマンスにこだわれる
- 愛着がわく
基本操作
Vim/Neovim には mode という概念があります。よく使うのは Normal mode, Insert mode, Command mode, Visual mode の4つです。
Normal mode
カーソル移動、削除、コピペなどの基本操作を行う mode です。
ターミナルで nvim test.txt
などとして立ち上げた直後は Normal mode です。
- カーソル移動:
h
,j
,k
,l
でカーソルを 左,下,上,右 に移動できます。 - 削除:
x
でカーソル位置の文字を削除、diw
でカーソル上の単語を削除、dd
で行全体を削除できます。 - コピペ:
yy
で行全体をコピーできます。p
でペーストできます。ちなみに、Vim ではコピー/ペーストのことをヤンク/プットと呼びます。
他にも様々なキーバインドがあって、0
,$
で行頭、行末に行けたり、gg
,G
でファイルの先頭、末尾に行けたりします。
operator, motion
基本的に Normal mode での操作は operator と motion からなります。先に操作の例を示してから operator, motion について解説します。更に便利な text object selection についても解説します。
先に document をおいておきます。Neovim を開き :help motion.txt
としても同じ内容が見れます。`4
入力例 | 操作 |
---|---|
y$ |
カーソル位置から行末までコピー |
d$ |
カーソル位置から行末まで削除 |
cG |
カーソル行からファイル末尾まで削除し入力を待つ |
operator
operator によってどのような操作をするかを指定します。
- operator の前に数字を付けることでその回数 operator を繰り返す
- 同じ operator を2回入力することで、操作がカーソル行に適用される
という性質があります。代表的な operator は以下です。
operator | 操作 |
---|---|
c |
変更(change) |
d |
削除(delete) |
y |
ヤンク(yunk) |
p |
プット(put) |
motion
motion によってどのように移動するかを指定します。
- motion の前に数字を付けることでその回数 motion を繰り返す
という性質があります。代表的な motion は以下です。h
,j
,k
,l
は省いています。
motion | 移動先 |
---|---|
0 |
行頭(0列目) |
^ |
行頭(最初の文字) |
$ |
行末 |
gg |
1行目 |
G |
最終行 |
countG (4G ) |
count 行目(4行目) |
text object selection
実は operator の後は motion だけでなく、text object selection というものも使えます。
名前の通り、text を選択できます。
text object selection | 説明 |
---|---|
iw |
カーソル上の単語(inner word) |
ap |
カーソルがあるパラグラフ(a paragraph) |
これを用いると、diw
(カーソル上の単語を削除)、yi"
(カーソルが囲まれているダブルクオーテーション内をコピー) などができるようになり、とても効率的な操作が実現できます。
Insert mode
テキスト入力を直接行う mode です。
- Normal mode からの切替:
a
,A
,i
,I
,o
,O
のいずれかを入力
それぞれの挙動は複数行のテキストを打った上で実際に確かめてみてください。a
とi
、A
とI
、o
とO
を比較するとわかりやすいです。 -
Esc
で Normal mode に戻る
o
, O
が結構便利な印象です。
Command mode
コマンドを打つ mode です。
- Normal mode からの切替:
:
を入力 -
Esc
で Normal mode に戻る
代表的な Vim コマンドは以下です。
コマンド | 操作 |
---|---|
w |
保存(write) |
q |
終了(quit) |
s |
置換(substitute) |
! |
OS コマンド実行 |
-
s/before/after
のように使うと、カーソル行を前から順に見て最初のbefore
をafter
に置換する-
%
を先頭に付けるとファイル全体に適用される-
%y
,%d
などもできて、競プロで使ったり使わなかったり
-
-
/g
を最後に付けると行内のbefore
を全てafter
に置換する
-
-
!ls
とするとカレントディレクトリでls
した結果が返ってくる
いろいろ便利なコマンドは他にもたくさんあります。よく使うものはわざわざ Command mode にいかないでも実行できるように、後に説明する設定ファイルでキーバインドを設定するのがいいでしょう。
コマンド | 操作 |
---|---|
nohlsearch |
検索のハイライトを戻す |
tabnew |
新しいタブを作る |
tabn |
次のタブに移動 |
tabp |
前のタブに移動 |
new filename |
filename を水平分割で開く |
vs filename |
filename を垂直分割で開く |
その他にも set number
とすることで左に行番号を表示させたりなど、設定をいじることもできますが、基本的に設定は設定ファイルに書くので、Command mode で設定をいじるのは、試したい設定があるときくらいです。
Visual mode
テキストの領域選択を行う mode です。
- Normal mode からの切替:
v
,V
,<C-v>
(Ctrl+v) のいずれかを入力-
V
: 行選択 -
<C-v>
: 矩形選択
-
-
Esc
で Normal mode に戻る
Normal mode と同じ要領でカーソルを動かせます。領域を選択した状態で y
(yunk) や d
(delete) などができます。選択した状態から Command mode に行くこともできて、:s/before/after/g
などと入力すると選択範囲内のみで置換できます。
<C-v>
が結構便利で、例えば複数行の先頭に //
を挿入するなどがとても簡単にできます。<C-v>jjI//<Esc>
で3行の先頭に //
を挿入できます。
Terminal mode
Terminal mode
ターミナルを Neovim 内部で動かせる mode です。
- Normal mode からの切替:
:terminal
と入力 -
<C-\><C-n>
で Normal mode に戻る(は?)
初心者の頃、これで最初抜け出せなくなり、閉じるとき毎回親ターミナルを落としていた記憶があります...
Normal mode に戻ると、ターミナルの出力がコピーできるので便利です。あとは簡単にターミナルをトグルできれば使い心地がいいので、あとで説明するプラグインで toggleterm.nvim というものを入れるといい感じです。
設定ファイル
これで基本操作は完璧です!ここからは設定を自分好みにいじりましょう。
Neovim は設定ファイルとして ~/.config/nvim/init.vim
または ~/.config/nvim/init.lua
を真っ先に読みに行きます(2つのファイルは共存できません。また、Vim の設定ファイルは ~/.vimrc
に書きます)。拡張子が .vim
の場合は VimScript で、.lua
の場合は Lua で記述します。
例えば、行番号を表示し、Insert mode で jj
を押すと Normal mode に移動するようにするなら、
" VimScript の例
set number
inoremap jj <esc>
-- Lua の例
vim.opt.number = true
vim.keymap.set("i", "jj", "<esc>")
と記述して、新たに Neovim を立ち上げると適用されます。
設定ファイルの書き方を検索すると VimScript での設定例がよく出てくると思いますが、Lua との対応は簡単なので、拡張性が高く書きやすい Lua で書くことを推奨します(好みですが)。
プラグイン
Vim/Neovim もさらに豊かなものにしたいという人たちが便利な機能を作ったものがプラグインです。プラグインの例としては、補完機能から画面下部にかっこいいステータスラインを表示するものまで、本当に様々なものがあります。Lua で書かれているものは Neovim でしか動きません。
プラグインマネージャー
プラグインを自分の環境で動かすには、基本的にはプラグインマネージャーが何か1つ必要です。
Vim/Neovim には一応デフォルトでプラグインを管理する機能があることにはあるんですが、有志によって作られた数々のプラグインマネージャーで使いやすいものがたくさんあるので、わざわざデフォルトのものを使う意味はほぼありません。
最初にプラグインマネージャーを選ぶのが一番難しいと思います。初めて使ってみるのにおすすめなのは vim-jetpack ですかね。以下にいくつかプラグインマネージャーを挙げます。
-
vim-plug
クラシックなプラグインマネージャーで、最近のものに比べるとかなり機能が少ないです。 -
dein.vim
使うまでプラグインを読み込まない遅延起動によって、適切な設定を書けばプラグインマネージャーの中でもかなり高速に起動します。 -
vim-jetpack
vim-plug を高機能、高速にしたようなもので、設定項目が少ないので初めに使うのに丁度いいと思います。
参考: とても速いVimプラグインマネージャvim-jetpack -
packer.nvim
Lua 製のプラグインマネージャーといえばこれという感じでしたが、2023年8月に開発終了しました。 -
lazy.nvim
Lua 製の新しいプラグインマネージャーで、packer.nvim が開発終了したこともあり、使う人が多く開発も盛んです。
参考: プラグインマネージャーの歴史と新世代のプラグインマネージャー dpp.vim
おすすめプラグイン
これらのサイトを使いながら調べると、github のスター数や最終コミットがどれくらい前かなどがぱっとわかるので、人気で勢いのあるプラグインが見つけやすいです。
Neovim を IDE のようにして使いたいのなら、ほぼ必須な機能がいくつかありますね。各機能でそれぞれ人気なものを少し紹介します(AstroNvim を使っている人は、ほぼ揃っていると思います)。
- ファイラー
- NERDTree
- neo-tree
- Fern
- nvim-tree
- 参考: 2020秋 Vim のファイラー系プラグイン比較
- ファジーファインダー
- telescope.nvim
- fzf.vim
- 参考: Vimにたくさんあるファジーファインダー系プラグインを比較してみる
- 補完機能
- nvim-cmp
- coc.nvim
- ddc.vim
- LSP 管理 & 設定
- mason.nvim & nvim-lspconfig
最後に
アドカレに間に合わせるためにちょっと適当になったところがあるので、適宜更新していきたいと思います。いろいろ内容を詰め込んだのでちょっと読みづらいかもしれませんが、ぜひ Neovim を使って快適に過ごしましょう!
Discussion