CLIツール

VimとNeovimの違いについて init.vimサンプル公開

VimとNeovimの比較

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

本記事では、VimとNeovimの違いについて、
解説します。

VimとNeovimの違いについては、
普段頻繁にVimなどを使う方でなければ、
正直、あまり気にしなくてもいいかなと思います。

ただ、VimやNeovimを本格的に使用していくことを考えると、
やはりこの2つについて、大まかに違いを知っておきたいもの。

本記事では、この2つの違いについてまとめました。

Vimの基本操作や、プラグイン、知っておきたい使い方など、
Vimの入門については、下記のYoutube動画でまとめて解説しております。

これからVimを触るという方でも、
VimでVSCode並の開発ができることを目指した
動画なので、VimやNeovimに興味がある方はぜひ御覧ください。

https://www.youtube.com/channel/UCsQKboXGGHPtITUO2i0B8gQ

Neovimとは何か?

Neovimは、Vimをフォークしたものの一つで、
基本的には、Vimを改良したものとされています。

細かい思想の違いなども、あるようですが、
平たく言えば進化系だと思ってもらって大丈夫です。
(進化の方向性としては、個人的にはよりリッチで操作性が良いIDEのようなイメージです)

https://neovim.io/

そもそもVim自体がViのクローンなので、
NeoVimは、クローンのクローンみたいな感じかもしれません。

最近だと、Viに触れる機会はかなり減っている印象ですが、
Viは、Vimよりも操作感やUIが玄人向け、
悪く言えば、使いにくい印象でした。

なので、Vimも、今のNeovimのように、
ある種の進化系といえそうです。
(Neovimはその進化系なので、Viとはかなり違います)

最近だと、AstroNvim のような、
デフォルトで使いやすく設定された、
ある種の完成版Neovimのようなものもあります。

ただ、ここまで来ると、
初期のVi信者とかからすると、
「これはViじゃない」と怒り狂いそうなぐらい、
良く言えば、進化してます。(悪く言えば本流から外れています。)

Neovimだと、Telescope.nvimのような
便利なNeovim製のプラグインが使えるというメリットが有るので、
特にこだわりなければ、Neovim一択のような気もします。

設定ファイルについては、.vimrcではなく、
~/.config/nvim/init.vim または、init.luaとかに
なります。

Vimで使っていたプラグインについても、
Neovimで使えます。

そのため、やはり特にこだわりがなければ、
今ならいきなりNeovimから使い始めて問題ないと思います。

 

NeovimとVimの違い

早速本題です。
両者の違いですが、

正直、Vimをたまに使うぐらいであれば、
Neovimだろうと、Vimだろうと大差ありません。

使いやすい方を使えばいいと思います。
(そこまで操作性に違いはないと思いますが...)

ただ、前述のように、
Neovimは、よりリッチで、IDEっぽくできる(Vimでもできるといえばできますが)ので、
今から入門するなら、個人的にはNeovimをおすすめします。

これらを踏まえて、
詳細な違いについて触れていきます。

INSERTモード時のカーソル

INSERTモードに入ったときに表示される、
カーソルがNeovimとVimでは異なります。

左がVim、右がNeovim

Vimの場合、NORMALモードのときと、
カーソルの形が変わりませんが、
Neovimの場合、| に変化します。

この点は、おそらくNeovimの方が
見やすくて便利でしょう。

Vimは、カーソルだけなので、
今のモードがなにかわかりにくいです。

カーソルの前に文字が入るのか後ろに入るのか、
直感的ではないでしょう。

 

ただ、慣れの範疇の気もするので、
割りと些末な違いになるかもしれません。

ターミナルモード

ターミナルモードに入ったときも、
挙動が異なります。

ちなみに、ターミナルモードとは、
INSERTモードとかと同様のモードの一種で、
:termで入ることができます。

Vimの場合、splitしてから、
ターミナルモードに入ります。

これに対し、Neovimはカレントバッファーをまるごと、
ターミナルにしてしまい、デフォルトで
ノーマルモードになっています。

これは、好みが分かれそうですが、
個人的にはVimの方が、
すぐにコマンドが打てるのと、
Ctrl + wで移動しやすいので、便利かなと思いました。

(人によっては、Neovimのほうが便利という人もいます。)

ただ、Neovimの方でも、iを押せば、
すぐにコマンドが打てますし、
戻りたいときは、Ctrl + \ Ctrl + nで戻ることができます。

しかし、デフォルトのキーバインドだとめちゃくちゃ押しづらいので、
キーマップを設定するのが良いでしょう。

tnoremap <space>jj <C-\><C-n>

これで、spaceとjjを押せば、
簡単にフォーカスを外すことができます。

キーマップの詳細については、こちらの記事を御覧ください。

参考【Vim/Neovimキーマップ】map/noremapやLeaderキー

VimやNeovimを使っていくにあたって、どのようなキーマップを設定するかは、その人の個性であり、答えのない探求です。 それぐらい、キーマップの設定は、Vimを使いこなす上で必須の設定と言えます。し ...

続きを見る

デフォルトだと、若干Vimのほうが使いやすそうなものの、
Neovimでも設定はできるので、
そこまで大差ないとみなして大丈夫そうです。

ちなみに、Neovimには、toggleterm.nvimという
便利なプラグインも存在するので、
これを使えば、むしろNeovimのほうが良いぐらいでしょう。

Neovimは設定をLuaで書ける

通常、Vimの設定とかカスタマイズは、
Vim scriptで行いますが、
Neovimは、Luaでもできます。

Vim scriptとLuaの2つ選択肢があるのは、
素敵ですね。

「Vim scriptは書きにくい!」という意見は、
ちらほら聞くので、Luaでも書けるというのは、
メリットとみなしていいでしょう。

 

しかし、Neovim使い始めでいきなりluaで書く必要はない気もします。
というのも、なんだかんだでVim scriptの資産は多いので、
そちらの知識も多少は持っておいたほうが役に立つことが多いからです。

まあそうは言っても、Neovim製のイケてるプラグインは、基本Luaで記載されているので、
これからは、徐々にVimScriptからLuaに切り替わっていくような気もしますが...

既にVim scriptで、膨大な設定ファイルを持っている方は、
移行コストがかかると思うので、無理して移行する必要はないと思います。

それに、Vim scriptからLuaを呼び出すこともできるので、
ベースは、Vim scriptで、Luaをサブで呼び出すみたいにすれば、
ほとんど移行コストもかからないと思います。
(個人的にはLua完全移行が推奨ではありますが...)

ちなみに、LuaからVim scriptを呼び出すという逆パターンもできるので、
設定ファイルだけ、init.luaにしては、中身はVim scriptという、
荒業もできなくはないでしょう。

Vim scriptからLuaへの移行については、
下記が詳しいです。

https://github.com/willelz/nvim-lua-guide-ja

Vim scriptからLuaを呼び出す記法としては、

lua << EOF
require('gitsigns').setup {
-- 中略
}
EOF

のように、ヒアドキュメントのように、
先頭にluaと宣言し、EOFとかの中に閉じ込めれば、
Vim scriptの中でLuaが使えます。

最近では、プラグインのREADMEに、
Vim scriptの場合での説明がなかったりするので、
プラグインとかをNeovimに寄せていくのであれば、
Luaに移行した方が良さそうです。

あくまで、Vimベースでいくのであれば、
Luaにしなくてもいいかもしれません。

Vimでしか動かないプラグインなども
確かあったと思うので、どっちがどっちというわけでもないと思うので。

Vimの方がインストールされている環境は多い

Unix系であれば、Vimはデフォルトで
インストールされていることが多いのに対し、
Neovimは自分でインストールすることがほとんどです。

ただ、本番サーバとかは、
極力余計なものをインストールしないようにするのが、
普通だと思うので、気軽にNeovimとかはインストールできないでしょう。
(それと複数人がsshする、本番サーバーで、個人の趣味でNeovimを入れてしまったら、
宗教戦争になります。)

なので、本番サーバーとかでは、
Vim(それもプラグインとかなしの素のVim)を使うことを余儀なくされると思うので、
Neovimの便利さに慣れすぎると、その時、結構困るかもしれませんね。

もともとVimはシンプルなことをやるエディターで、
AstroNvimみたいに、VSCode顔負けに設定することは、
本流から外れているみたいな思想もあると思います。

そういう意味では、あえてNeovimにせず、
素のVimを極めるという方向性も面白いと思います。
(素のVimだけでもできることはかなりあります。)

Neovimもデフォルトでインストールされているように
なっていけば、状況も変わるかもしれませんが、
現時点ではViやVimが圧倒的です。

設定ファイルのディレクトリ階層が異なる

先述しましたが、
Neovimだと、~/.config/nvim/init.vimになります。
Vimだと、~/.vimrcなので、
Neovimのほうが階層深めですね。

まあ、requireとかで分けて呼び出すこともできるので、
これは正直どっちでも良いような気もしますし、
慣れのような気もします。

ちなみに、私はやっていませんが、
NeovimとVimで設定を使い分けていたりすると、
楽しいかもしれません。
(NeovimはIDE寄り、Vimは素の設定寄りのように)

設定例については、本記事の最後でサンプルコードを掲載しております。

アンドゥコマンドの挙動

左がNeovim、右がvim

アンドゥコマンド(u)の挙動が微妙に異なります。

上記の画像のとおりですが、履歴のみなし方が、
VimとNeovimでは異なります。

これは、正直好みでしょうね。
もう慣れている方が使いやすいに尽きると思います。

私は、Neovimのほうが長いので、
Neovimの挙動のほうが直感的に感じます。

init.vimと.tmux.confのサンプルコード

せっかくなので、
私のinit.vimをさらします。

細かい設定や、キーマップとかは不十分なのと、
そこまでおすすめでもないプラグインもまざっているので、
こだわる人は、自分なりにカスタマイズしてください

特にこだわりなければ、下記の設定でも、
VSCode不要で開発できるぐらいには、
NeovimやVimを使うことができます。

let mapleader = "\<space>"
set shiftwidth=2
syntax=on
set showmode
set number
set tabstop=2
set incsearch
set clipboard=unnamed
set cursorline
highlight CursorLine ctermfg=Blue ctermbg=Green
set cursorcolumn
set autoindent
set expandtab
set autowrite
set laststatus=0
set list " 不可視文字を表示
"set foldmethod=indent

abbr _sh #!/bin/bash
call plug#begin()
Plug 'ntk148v/vim-horizon'
Plug 'preservim/nerdtree'
Plug 'lambdalisue/fern.vim'
Plug 'nathanaelkane/vim-indent-guides'
Plug 'lambdalisue/fern-git-status.vim'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'yuki-yano/fzf-preview.vim', { 'branch': 'release/rpc' }
Plug 'https://github.com/PhilRunninger/nerdtree-visual-selection.git'
Plug 'b4b4r07/vim-shellutils'
Plug 'https://github.com/alvan/vim-closetag.git'
Plug 'easymotion/vim-easymotion'
Plug 'preservim/nerdtree' |
            \ Plug 'Xuyuanp/nerdtree-git-plugin'
Plug 'https://github.com/posva/vim-vue.git'
Plug 'https://github.com/tyru/open-browser.vim.git'
Plug 'https:/github.com/lambdalisue/gina.vim.git'
Plug 'https://github.com/tpope/vim-commentary.git'
Plug 'https://github.com/tpope/vim-surround.git'
Plug 'https://github.com/simeji/winresizer.git'
Plug 'https://github.com/easymotion/vim-easymotion.git'
Plug 'junegunn/goyo.vim'
Plug 'https://github.com/Shougo/unite.vim.git'
Plug 'https://github.com/Shougo/neomru.vim.git'
Plug 'https://github.com/ctrlpvim/ctrlp.vim.git'
Plug 'https://github.com/vimplugin/project.vim'
Plug 'https://github.com/Quramy/tsuquyomi'
Plug 'https://github.com/vim-syntastic/syntastic'
Plug 'Shougo/vimproc.vim', {'do' : 'make'} 
Plug 'https://github.com/ycm-core/YouCompleteMe'
Plug 'vim-test/vim-test'
Plug 'https://github.com/vim-scripts/ScrollColors'
Plug 'kyazdani42/blue-moon'Plug 'https://github.com/AlessandroYorba/Breve.git'
Plug 'vim-jp/vimdoc-ja'
Plug 'https://github.com/leafgarland/typescript-vim.git'
Plug 'peitalin/vim-jsx-typescript'
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} 
call plug#end()
let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files']
let g:typescript_indent_disable = 1
inoremap { {}<LEFT>
inoremap [ []<LEFT>
inoremap ( ()<LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>
inoremap jj <ESC>
nnoremap <silent> un :<C-u>Unite buffer<CR>
nnoremap <silent> unf :<C-u>Unite file<CR>
nnoremap <silent> ufr :<C-u>Unite file_rec<CR>
nnoremap <silent> ub :<C-u>Unite bookmark<CR>
nnoremap <silent> umru :<C-u>Unite file_mru<CR>
nnoremap <silent> ur :<C-u>Unite -buffer-name=register register<CR>
nnoremap <ESC><ESC> :nohlsearch<CR>
noremap ss ^
noremap ;; $
nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
command! -nargs=0 Format :call CocAction('format')
command! Solitary :echo '人生字を識るは憂患の始まり'
command! SS :so ~/.config/nvim/init.vim
command! Svs :source ~/.vimrc
command! Co :colorscheme
command  Eve :colorscheme evening
clet mapleader = "\<space>"ommand! Bre :colorscheme breve
command  Horizon :colorscheme horizon
nmap <silent> <space>fmt <Plug>(coc-format)
nmap gx <Plug>(openbrowser-smart-search)
vmap gx <Plug>(openbrowser-smart-search)
nnoremap <Leader>o :<C-u>execute "OpenBrowser" "file:///" . expand('%:p:gs?\\?/?')<CR>
let g:indent_guides_enable_on_vim_startup = 1
let g:gitgutter_highlight_lines = 1
let g:closetag_filenames = '*.html,*.xhtml,*.phtml,*.ctp,*.php,*.vue'
set helplang=ja,en " vim help日本語化のため
set termguicolors
" colorscheme slate
" colorscheme horizon
" colorscheme hybrid
" colorscheme blue
" colorscheme evening
colorscheme blue-moon
let g:lightline = { 'colorscheme': 'blue-moon' }

" Rubyの文法チェック"
augroup rbsyntaxcheck
  autocmd!
  autocmd BufWrite *.rb w !ruby -c
augroup END

" ファイル名表示
set statusline=%F

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0

基本的には、
.vimrcでも同様に作用するはずです。

プラグインのインストールは、
上記では、vim-plugを使っているので、
:PlugInstallで導入できます。

詳しい導入手順については、
下記の記事をご参考ください。

VimでNERDTreeインストール
参考Vim/NeoVimプラグインのNERDTree導入でVSCode化

本記事では、主にプラグインの導入方法を解説します。導入するプラグインとしては、NERDTreeという、ファイルエクスプローラープラグインをインストールします。 NERDTreeは使用者も多く、導入する ...

続きを見る

あと、これは完全におまけですが、
Neovim(IDE寄り)を使う際は、
個人的には、Tmuxも必須なので、
そちらも一旦さらします。(そこまで凝った設定はしておりません)

set -g prefix C-s
unbind C-b

bind d split-window -h
bind v split-window -v
bind s choose-tree -Zw
bind r source-file ~/.tmux.conf \; display "Reloaded!"
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

set -g base-index 1
set-option -g mouse on

set-window-option -g mode-keys vi
set-option -g status-right-length 190

set -g status-bg "colour52"
set -g status-fg "colour93"
set-option -g status-left  "\
#[bg=colour129]#[fg=colour255] #S:#I.#P "

set-option -g status-interval 1
set-option -g status-justify centre

set-option -g status-right "\
#[fg=colour93]#[bg=colour52]\
 #h #(echo '嗟嘆') \
#[fg=colour255]#[bg=colour52]\
%Y/%m/%d(%a) %H:%M:%S"

setw -g window-status-current-format '\
#[fg=colour249]#[bg=colour234]#[bg=colour239]#[fg=colour119]\
#I#[fg=colour220]:#[fg=colour255]#W#[fg=colour249]\
#F#[fg=colour239]#[bg=colour234]'

bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi V send-keys -X select-line
bind -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind -T copy-mode-vi y send-keys -X copy-selection
bind -T copy-mode-vi Y send-keys -X copy-line
bind-key -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'select-pane -t=; copy-mode -e; send-keys -M'"

 

Tmuxの詳細については、下記の記事でも紹介しています。

参考【Tmux入門】インストールから操作設定まで完全解説

本ブログでは、主にVim/Neovim系の記事が多いのですが、Vim/Neovimには、どんなときにも一緒に戦う相棒が存在します。 それがTmuxです。 Tmuxだけでもダメですし、Vimだけでもだめ ...

続きを見る

vimやNeovimについて本格的に勉強したい方は、
書籍もおすすめです。

  • この記事を書いた人
  • 最新記事

reisuta

Webエンジニア | 20代中盤 | 大学時代はGmailすら知らないIT音痴でプログラミングとは無縁の生活を送る → 独学でプログラミングを学ぶ → Web系受託開発企業にエンジニアとして就職 → Web系自社サービス企業に転職 | 実務未経験の頃からVimを愛好しており、仕事でもプライベートでも開発はVimとTmuxを使っているので、VSCodeに疎いのが最近の悩み。何だかんだでやっぱりRubyが好き。

おすすめ記事はこちら

Vim/Neovimプラグイン 1

プラグインをどれだけ入れるかは、その人の思想なども関係するので、一概にこれがいいというのはないかもしれません。 プラグインを全く入れない人もいれば、100個以上入れる人もいます。 ただそれでも、これだ ...

VimとNeovimの比較 2

本記事では、VimとNeovimの違いについて、解説します。 VimとNeovimの違いについては、普段頻繁にVimなどを使う方でなければ、正直、あまり気にしなくてもいいかなと思います。 ただ、Vim ...

Ruby変数やすべてがオブジェクトについて 3

本記事は、Rubyの基礎文法である、変数や真偽値、論理演算子に触れると同時に、「すべてがオブジェクト」というRubyの特徴的な思想についても解説します。 この思想は、Rubyの文法の根幹になっているの ...

4

エンジニアにおすすめの技術書 書籍学習は、エンジニアの嗜みみたいなところがありますが、 良書というものは、意外とそこまで多くもありません。 そこで本記事では「技術書マニアの筆者が厳選した技術書20選」 ...

5

エンジニアになるには? プログラミングは、専門性が高く自分一人で勉強するのが大変に感じることも多いですよね。 そこで本記事では「おすすめのプログラミングスクール5選」を特徴と、現役エンジニア目線で優れ ...

-CLIツール