アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

NeoVimをpyenvベースでインストールして自動補完を有効にするまでの手順(Mac OSX)

f:id:otoyo0122:20201022083639p:plain:w300

NeoVimを始めるよくある動機のひとつに、自動補完のdeoplete.nvimのような強力なプラグインを使いたいというのがあります。

しかし、deoplete.nvimなど一部のプラグインはPythonが必要なことがあり、環境構築は少々大変です。

そこでこのエントリでは、NeoVimをanyenv/pyenvを使ってPythonにパスを通しつつMacにインストールして自動補完プラグインを有効にするまでの手順を紹介します。

1. anyenv/pyenvのインストール

anyenvはpyenvやrubyenvなどを一元管理するためのツールで、Homebrewでインストールできます。

インストールしたらターミナルを一度閉じて開きなおします。

$ brew install anyenv
$ anyenv init
# ターミナルを開き直す

anyenvを使ってpyenvをインストールします。

pyenvはバージョンの異なるPythonを管理するためのツールです。

$ anyenv install pyenv

使っているシェルに合わせて ~/.bashrc もしくは ~/.zshrc に下記を追記します。

eval "$(pyenv init -)"

追記したらターミナルを一度閉じて開きなおします。

2. pyenv-virtualenvとPythonの構築

Python環境を構築するためにpyenv-virtualenvをインストールします。

$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

使っているシェルに合わせて ~/.bashrc もしくは ~/.zshrc の先ほど追加したeval "$(pyenv init -)"の下あたりに下記を追記します。

eval "$(pyenv virtualenv-init -)"

追記したらターミナルを一度閉じて開きなおします。

pyenv-virtualenvを使ってNeoVimのためのPython2系、3系それぞれの環境を作っていきます。

# 最新のバージョン情報を取得(pyenvをもともと使っていた人向け)
cd ~/.anyenv/envs/pyenv/plugins/python-build/../.. && git pull && cd -

# Python2系
$ pyenv install 2.7.17
$ pyenv virtualenv 2.7.17 neovim2
$ pyenv activate neovim2
$ pip2 install neovim

# Python3系
$ pyenv install 3.8.6
$ pyenv virtualenv 3.8.6 neovim3
$ pyenv activate neovim3
$ pip install neovim

$ pyenv deactivate

Python2環境をneovim2、Python3環境をneovim3という名前で作成しました。

3. NeoVimのインストールと設定

HomebrewでNeoVimをインストールします。

$ brew install neovim

インストールしたらNeoVimの設定ファイルを作成します。

NeoVimの設定ファイルは ~/.config/nvim/init.vim になります。

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

~/.config/nvim/init.vim を開き下記を記述します。

let g:python_host_prog = $PYENV_ROOT.'/versions/neovim2/bin/python'
let g:python3_host_prog = $PYENV_ROOT.'/versions/neovim3/bin/python'

追記したらnvimコマンドでNeoVimを立ち上げます。

立ち上げたらPythonのパスが通っているか確認します。コマンドモードで:checkhealthと入力します。

$ nvim
# :checkhealth と入力

少し待って## Python 2 provider (optional)## Python 3 provider (optional)の項目が表示されOKになっていれば正しくパスが通っています。

4. プラグインマネージャとプラグインのインストール

プラグインマネージャはvim-plugを使用します(別にdein.vimというのもあるようです)。

NeoVim用のインストールコマンドを実行します。

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

インストールしたら再度設定ファイル ~/.config/nvim/init.vim を開き下記のcall plug#begin以降を追記します。

let g:python_host_prog = $PYENV_ROOT.'/versions/neovim2/bin/python'
let g:python3_host_prog = $PYENV_ROOT.'/versions/neovim3/bin/python'
" ↓追記
call plug#begin(stdpath('data') . '/plugged')

" Make sure you use single quotes

call plug#end()

これでプラグインを使う準備ができました。

vim-plugではcall plug#begin()call plug#end()の間に追加したいプラグインを記述します。

試しにカラースキームであるjellybeansをインストールしてみましょう。

~/.config/nvim/init.vim にPlug 'nanotech/jellybeans.vim'colorscheme jellybeansを追記します。

let g:python_host_prog = $PYENV_ROOT.'/versions/neovim2/bin/python'
let g:python3_host_prog = $PYENV_ROOT.'/versions/neovim3/bin/python'

call plug#begin(stdpath('data') . '/plugged')

" Make sure you use single quotes

Plug 'nanotech/jellybeans.vim' " ←追記

call plug#end()

colorscheme jellybeans " ←追記

保存したら一度NeoVimを開きなおし:PlugInstallを実行します。

インストールが完了したら、NeoVimで適当なファイルを開いてみましょう。カラースキームが適用されているはずです。

f:id:otoyo0122:20201021215839p:plain:w500
カラースキームjellybeansが適用された

5. deoplete.nvimを使って自動補完を有効にする

最後に冒頭で紹介した自動補完のベースとなるdeoplete.nvimプラグインをインストールして自動補完を有効にしてみます。

今回はGo言語で試すためvim-goも一緒に導入します。

call plug#begin()call plug#end()の間に下記を追記します。

Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
let g:deoplete#enable_at_startup = 1

Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }

保存したら一度NeoVimを開きなおし:PlugInstallを実行します。

インストールが完了したら、nvim hello.goのようにしてGoファイルを開いてみます。するとvim-goによってテンプレートが挿入されます。

試しにmain関数内でfmとタイプすると下記のように自動補完候補が表示されるはずです。

補完候補はCtrl+Nで次の候補、Ctrl+Pで前の候補を選びCtrl+Yやスペース、エンターで決定します。

f:id:otoyo0122:20201022082445p:plain:w400
自動補完により候補が表示された

キーマップに慣れない場合は ~/.config/nvim/init.vim に下記の設定を追記することで↓↑矢印キーで候補選択、エンターで決定に変更することができます。

" Completion                                                                                                                                                                                                
set completeopt=menuone,noinsert                                                                                                                                                                            
inoremap <expr><CR>  pumvisible() ? "<C-y>" : "<CR>"                                                                                                                                                        
inoremap <expr><C-n> pumvisible() ? "<Down>" : "<C-n>"                                                                                                                                                      
inoremap <expr><C-p> pumvisible() ? "<Up>" : "<C-p>" 

~/.config/nvim/init.vim は最終的に下記のようになりました。

let g:python_host_prog = $PYENV_ROOT.'/versions/neovim2/bin/python'
let g:python3_host_prog = $PYENV_ROOT.'/versions/neovim3/bin/python'

call plug#begin(stdpath('data') . '/plugged')

" Make sure you use single quotes

Plug 'nanotech/jellybeans.vim'

Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
let g:deoplete#enable_at_startup = 1

Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }

call plug#end()

colorscheme jellybeans

" Completion                                                                                                                                                                                                
set completeopt=menuone,noinsert                                                                                                                                                                            
inoremap <expr><CR>  pumvisible() ? "<C-y>" : "<CR>"                                                                                                                                                        
inoremap <expr><C-n> pumvisible() ? "<Down>" : "<C-n>"                                                                                                                                                      
inoremap <expr><C-p> pumvisible() ? "<Up>" : "<C-p>" 

手がvimで慣れてしまっていて今後はNeoVimを使っていくという人は ~/.bashrc や~/.zshrc に下記のようにエイリアスを記述しておくと便利です。

alias vim='nvim'

追記したら忘れずにsource ~/.zshrcするかターミナルを一度閉じて開きなおしておきましょう。

以上です。

このエントリでは、NeoVimをanyenv/pyenvを使ってPythonにパスを通しつつMacにインストールして自動補完プラグインを有効にするまでの手順を紹介しました。

参考サイト