【FreeBSD】Neovimのインストールと設定ファイル

Vimか、Neovimか。 それが問題だ。

(言ってみたかっただけ)

つまらん概要は要らん、迷わずNeovim使うぞという人は「やること」へGo!

確認環境

   
PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.1-RELEASE-p1
Neovim NVIM v0.4.3

Neovimとは?

NeovimはVimをリファクトしてスリムにしてメンテしやすくしようというプロジェクト。

以前はプラグインとの非同期連携と組込TerminalがNeovimの売りだと思ってたけど、
どちらも既にVimに実装されたっぽい。 (ただ、最近のVimを使ってないので詳細は分からんとです)

今でもVimに対して有利な点があるとすれば、以下の点かなぁと思う。

  • プラグイン開発に好きな言語が使える(APIがあれば)
    • API提供言語: C/C++, C#, Clojure, D, Elixir, Go, Haskell, Java, JavaScript/Node.js, Julia, Lisp, Lua, Perl, Python, Racket, Ruby, Rust
    • VimScriptが分からない人でも得意な言語で作れる ⇒ 開発者増加の期待
    • でもプラグイン開発言語のビルド環境や実行環境が必要になるデメリットがある
    • Luaを標準にしたいっぽい (かといってVimScriptを廃止することはない)
  • エディタとしてのコア機能とUIがしっかり分離されているっぽい

逆にNeovimの不利な点というより、個人的に不満なのは以下の点。

  • 何か調べたいとき、Vimより情報が少ない
    • とはいえ、Vimとほぼ共通でいけることも多い
    • プラグイン系の情報はちょっと少なめな印象
  • migemoでインクリメンタルサーチができない。ツラい
    • コマンドウィンドウを使った:Migemo検索ならできる
    • kaoriyaさんパッチのNeovim版、、、というよりプラグイン作ればいけるのかしら

Vimとの違いはこちらを確認されたし。
これからのNeovimが知りたい人は公式のロードマップを確認されたし。

次のバージョン0.5ではついにLSPクライアントが実装されるっぽい。
(本記事執筆時点ではnightlyリリースされてるっぽい)

やること

今回は、以下について説明する。

  1. Neovimのインストール
  2. Neovimの設定ファイル
  3. 設定ファイルの補足
    1. 設定ファイルを分割したい場合
    2. Vimと設定ファイルを共通化したい場合
    3. 複数の環境で設定ファイルを共通化したい場合

Neovimのインストール

以下のコマンドを打ち込むだけ。(管理者権限で実行してね)

> pkg install neovim

インストールが無事に終われば、nvimコマンドでNeovimを起動できるよ。

Neovimの設定ファイルの作成

Neovimと設定ディレクトリと設定ファイルは以下の通り。

Vim Neovim
設定ディレクトリ ~/.vim ~/$XDG_CONFIG_HOME/nvim
設定ファイル ~/.vimrc ~/$XDG_CONFIG_HOME/nvim/init.vim

環境変数$XDG_CONFIG_HOMEが未定義の場合、設定ファイルは~/.config/nvim/init.vimになる。

ササッと作っちゃおう。

> mkdir -p ~/.config/nvim
> touch ~/.config/nvim/init.vim

設定ファイル補足

設定ファイルを分割したい場合

設定ファイルが長くなってくると、複数のファイルに分割したくなるかもしれない。

僕の場合は、init.vimの他にキーバインド設定用を別ファイルに分けている。
各プラグインのキーバインドも含めてそのファイルに記述している感じ。

init.vimは他のファイルを読み込む処理しか書いてない人もいる。
自分が好きな方法で分割すればいいし、もちろん分割しなくてもいい。

ただ、設定ファイルの構成は最初に決めておいた方がいいと思う。
後からファイルを分割する場合、分割時にどこかミスって何か変になった!ってなるかも。

他の設定ファイル(VimScript)を読み込むコマンド

設定ファイルを分ける場合は、init.vimから下記のようにsourceコマンドで読み込む設定ファイルを指定すればいい。

source ~/.config/nvim/keymap.vim

他にも、runtimeコマンドを使う方法がある。
ワイルドカードが使えるので指定ディレクトリ以下の一括指定ができる。

runtime! myconfigs/init/*.vim

こちらはruntimepathに設定されているディレクトリリストから、指定のファイルを探す為、予めruntimepathをセットしておく必要がある。

runtimepathの設定値が知りたい場合は、:set runtimepath?で確認できる。

~/.config/nvimはデフォルトでセットされていると思う。

Vimと設定ファイルを共通化したい場合

基本的にNeovimにはVimと同じオプションがあると思っていい。
ないものはエラーが出るし、ヘルプも存在しないのですぐに気付くと思う。

ただ、VimとNeovimでデフォルト値が違うものは結構ある。
設定ファイルを共通化するなら各オプションは明示的に指定した方がいい。

Vimと設定ファイルを共通化している人は、下のようにリンクを貼って設定ファイルを共通化している人が多そうだ。
※既に.vim.vimrcがある人は削除なり移動なりさせて実行してね
$XDG_CONFIG_HOMEを定義してない人は直接パスを指定してね

> ln -s $XDG_CONFIG_HOME/nvim ~/.vim
> ln -s $XDG_CONFIG_HOME/nvim/init.vim ~/.vimrc

もし、NeovimもしくはVimだけでしか使えない設定がある場合、下のifで切り分ければOK。

if has('nvim')
    " Neovim用の設定
else
    " Vim用の設定
endif

もし、論理を反転したい場合は、hasの前に!をつければいい。

if !has('nvim')
    " Vim用の設定
endif

複数の環境で設定ファイルを共通化したい場合

OSによる分岐

if has('wsl')
    " WSL(Windows Subsisytem for Linux)
elseif has('win32')
    " Windows(32 or 64bit)
elseif has('unix')
    " UNIX系OS (FreeBSDもこれ)
endif

Neovimのマニュアルにはmacが無いけど、unixに含まれるのだろうか。
下のサイトさんでは使える雰囲気だけど、最新状況は不明...

ホスト名による分岐

if hostname()=='myhost'
    " ホスト名がmyhostのPC
else
    " その他のホスト名のPC
endif

インストール済みPythonによる分岐

if has('python3')
    " Python3系インストール済み
elseif has('python2')
    " Python2系インストール済み
endif

if has('pythonx')
    " 何れかのバージョンのPythonインストール済み
else
    " Python未インストール
endif

特定のコマンドが使用可否での分岐

if executable('rg')
    " rgコマンド実行可能
else
    " rgコマンド実行不可
endif

パスの設定

諸々のパス指定では、環境変数を活用したりVimScript変数に代入しておいた方が共通化しやすいかもしれない。

if has('unix')
    let g:my_file=expand("$HOME/my/path/.file")
elseif has('win32') || has('win64')
    let g:my_file=expand("$HOME/my/path/_file")
endif

ただ、オプション設定のsetでは展開されないっぽいので注意。
下のようにすればいい。

let s:my_undodir=expand("$HOME/nvim/undo")
set undodir=s:my_undodir    " これだと's:my_undodir'という文字列が設定される
let &undodir=s:my_undodir   " オプション名に&をつけてletすればOK

最後に

ひとまずこれで、Neovimが起動できて、設定するファイルも分かったと思う。

使い方については、こちらの戯言で紹介したサイトさんや本を参考にして頂きたい。

次回は、最低限やっておきたい設定をざっくり紹介しようと思う。

参考

以上。