fish shell上で快適(個人的感想)なneovim&python環境を構築してみた

vim

どうもDI部の岩澤です。

突然ですが、neovimっていいですよね。
pythonもいいですよね。
つまり、neovimで快適にpython書けたら最高ですよね!!(笑顔)

そこで、neovimで快適なpython環境を構築してみました。

環境

macOS Mojave 10.14.4
iTerm2 Build 3.2.8
fish version 2.7.1
NVIM v0.3.1

方針

  • fish shell上で使う
  • pythonまわり
    • pyenv使いたい
    • 仮想環境をactivateしていたらそちらを優先したい
    • 通常はneovim用の仮想環境を参照したい
    • 入力補完したい
    • そのままpythonを実行したい
  • neovimまわり
    • 色々表示したい

こんな感じになりました

左側のウィンドウでファイルを選択して開いたり、現在開いているファイルの実行結果が右下に表示されています。

各種設定ファイルと解説

fish

fishのインストールについては以下を参考にしました。
fish shell を使いたい人生だった | DevelopersIO

~/.config/fish/fish.config

  • neovimの設定を~/.config/ にまとめるためXDG_CONFIG_HOME定数を設定
  • pyenvとvirtual-env回りの設定
  
# neovimの設定ファイル配置場所
set -gx XDG_CONFIG_HOME "$HOME/.config"

# pyenv関連設定
eval (pyenv init - | source)
eval (pyenv virtualenv-init - | source)
set -x PYENV_ROOT (pyenv root)

neovimのインストールとneovim用仮想環境の構築

以下を参照に構築しました。
Setting up Python for Neovim · deoplete-plugins/deoplete-jedi Wiki

※fish shellを使っているので、

$ pyenv activate neovim3

$ source ~/.pyenv/versions/neovim3/bin/activate.fish

で読み替える必要があります。

neovimの設定構成について

neovimの設定です。
設定内容が多いため、複数ファイルに分けています。

各ファイルの内容については以下を参照してください。
setting_files(1.0.0.0001)

ファイル 説明
~/.config/nvim/init.vim メインの設定ファイル。プラグインやスキーマ読み込み
~/.config/nvim/keymap.rc.vim keymap設定をまとめたファイル
~/.config/nvim/options.rc.vim オプション設定をまとめたファイル
~/.config/nvim/dein/dein.toml 共通のプラグイン
~/.config/nvim/dein/dein_lazy.toml 言語依存のプラグイン
~/.config/nvim/plugins/*.rc.vim プラグインごとの設定をまとめたファイル

~/.config/nvim/init.vim

(1) activateした仮想環境があればそちらを参照し、ない場合はデフォルトの仮想環境を参照
activate中はVIRTUAL_ENVに設定が入っているので、それを参照します。
ない場合はデフォルト仮想環境を参照します。
また、QuickRun実行時にデフォルト仮想環境のpythonを認識させるため$PATHに追記しています。
(2) 管理プラグイン「dein」を使用するための設定
プラグインの登録はdein.toml, dein_lazy.tomlに記載するようになっています。
未インストールのプラグインは自動インストールします。
(未登録プラグインの自動アンインストールもできるのですが、体感できるほど起動が遅くなるのでコメントアウトしています)
(3) カラースキーマ設定
コメント色を変えたかったのでその設定も書いています。

  
if &compatible
  set nocompatible
endif

" (1) activateした仮想環境があればそちらを参照し、ない場合はデフォルトの仮想環境を参照
if exists("$VIRTUAL_ENV")
    let g:python3_host_prog = $VIRTUAL_ENV . '/bin/python'
else
    let g:python3_host_prog = $HOME . '/.pyenv/versions/neovim3/bin/python'
    " QuickRun実行時対応
    let $PATH = $HOME . '/.pyenv/versions/neovim3/bin:' . $PATH
endif

" (2) 管理プラグイン「dein」を使用するための設定
" Add the dein installation directory into runtimepath
set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim

if dein#load_state('~/.cache/dein')
  call dein#begin('~/.cache/dein')
  call dein#add('~/.cache/dein/repos/github.com/Shougo/dein.vim')
  
  " TOML を読み込み、キャッシュしておく
  let g:rc_dir    = $XDG_CONFIG_HOME . '/nvim/dein'
  let s:toml      = g:rc_dir . '/dein.toml'
  let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'
  call dein#load_toml(s:toml,      {'lazy': 0})
  call dein#load_toml(s:lazy_toml, {'lazy': 1})

  " 設定終了
  call dein#end()
  call dein#save_state()
endif

" 未インストールのプラグインがあればインストールを行う
if dein#check_install()
  call dein#install()
endif

filetype plugin indent on
syntax enable

" (3) カラースキーマ設定 
" コメントの色を固定する(colorschemeより前に設定すること)
autocmd ColorScheme * highlight Comment ctermfg=167 guifg=#008800

set background=dark
colorscheme atom-dark-256

runtime! options.rc.vim
runtime! keymap.rc.vim

導入プラグインについて

快適な環境構築のため、複数のpluginをインストールしています。

外観とか

便利系プラグイン

python関連

なお設定値は以下のサイトを参考にしました。
ALE(on NeoVim)でPythonコードを楽に整形する - Qiita

入力補完

入力補完関連のプラグインです。jedi-vimだけ設定をしています。
- 補完ウィンドウは手動、CTRL+Spaceで表示 - 補完ウィンドウが開いたときは未選択状態

[[plugins]]  
repo = 'davidhalter/jedi-vim'  
on_ft = ['python','py']  
hook_source = '''  
  let g:jedi#popup_on_dot = 0 " ドット(.)を入力したとき自動で補完しない(Ctrl+Space)  
  let g:jedi#popup_select_first = 0 " 補完候補の1番目を選択しない  
  let g:jedi#show_call_signatures = 1 " 関数の引数表示  
  autocmd FileType python setlocal omnifunc=jedi#completions   " 補完エンジンはjediを使う  
  autocmd FileType python setlocal completeopt-=preview        " ポップアップを表示しない  
'''  

まとめ

かなりの時間がかかってしまいましたが、いい感じな環境が作れて今は満足しています。
次はlanguage server protocol での入力補完が気になっているので手を出すかもしれません。

参考文献

Setting up Python for Neovim · deoplete-plugins/deoplete-jedi Wiki
neovim向けのPython周りの設定で参考にしました。

NeoBundle から dein.vim に乗り換えたら爆速だった話 - Qiita deinの自動インストールについてです。

[dein.vim] hook の便利な使い方 - Qiita
deinのhook_add, hook_sourceについて詳細な説明があります。

ALE(on NeoVim)でPythonコードを楽に整形する - Qiita
ALEプラグインの設定で参考にしました。

NeoVim用のPython環境を整える - Qiita
pyenvと固定値回りの設定を参考にしました。

neovimの設定ファイルとディレクトリの置き場 - neovim/vim入門
neovimの設定ファイルのディレクトリ構築を参考にしました。

Neovim の設定を綺麗に整理してみた - Qiita
プラグイン設定ファイルのディレクトリ構成を参考にさせていただきました。