vimのWordPress投稿環境構成をPy2からPy3基準に更新した記録

vim

はじめに

vimのパッケージ管理の流行りがNeoBundleからPy3依存のライブラリの多いdeinに移る等、Python3前提になりつつあることを感じつつも、以下の2点で利用しているVim及びVimのプラグインはPython2が前提の状態でした。

  • 業務都合でシステムのPythonバージョンを3へ上げづらい
  • 使っているWordPress投稿プラグインがPy2前提

ですが、いつまでも騙し騙し使うわけにもいかないことと

  • 業務で使うPythonバージョンを3へ移行する期日の目処がある程度たった
  • 高速化されたvimプラグインを使いたい場合はPy3が前提になる
  • neovimにするとPythonのパスが通しやすくなる
  • WordPress投稿用プラグインでPy3対応のものがある

の4点で重い腰を上げることにしました。

更新前後の環境構成

完全に異なる構成になりました。一応前後の構成は共存可能です。

vim プラグインマネージャ Python(pyenv) 投稿プラグイン
更新前 Kaoriya-vim NeoBundle system VimRepress
更新後 neovim dein 3.7.2(neovim) VimWordPress

更新する順序

プラグイン設定等のvim自身で編集するものもあるため、念の為以下の順番で行います。

  1. neovimの導入
  2. neovim用のvirtualenv設定
  3. neovim用のvirtualenvにneovim導入
  4. init.vimにdein.vimの導入設定を追加
  5. init.vimにneovimのpy2とpy3を設定
  6. init.vimにvimrcの中身を移植
  7. zshrcのEDITORをneovimに変更
  8. tomlにプラグインの設定を追加
  9. WordPressへの投稿用プラグインの追加

neovimの導入

ソースコードからビルドする方法もありますが、手っ取り早くhomebrewを利用しました。

brew tap neovim/neovim
brew install --HEAD neovim

neovim/neovim: Vim-fork focused on extensibility and usability

neovim用のvirtualenv設定

必ずしもvim用に用意する必要はありませんが、誤って削除することを防ぐためのラベル付けとしています。

brew install pyenv-virtualenv
pyenv install 2.7.14
pyenv install 3.7.2
pyenv virtualenv 2.7.14 neovim2
pyenv virtualenv 3.7.2 neovim3

Setting up Python for Neovim · deoplete-plugins/deoplete-jedi Wiki

neovim用のvirtualenvにneovim導入

一見何を言ってるのかわからなくなりますが、Pythonでneovimに接続するためのライブラリを導入します。現在は正確にはpynvimというライブラリ名になっています。

$PYENV_ROOT/versions/neovim2/bin/pip install pynvim
$PYENV_ROOT/versions/neovim3/bin/pip3 install pynvim

neovim/pynvim: python client and plugin host for Nvim

init.vimにdein.vimの導入設定を追加

dein.vimの設定を追加します。

参考 NeoBundleからdein.vimへの移行 - Qiita

"#####dein設定#####
" プラグインがインストールされるディレクトリ
let s:dein_dir = expand('~/.cache/dein')
" dein.vim 本体がインストールされるディレクトリ
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'

" dein.vim がなければ github から落としてくる
if &runtimepath !~# '/dein.vim'
  if !isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
  endif
  execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
endif

" 設定開始
if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)

  " プラグインリストを収めた TOML ファイル
  " 予め TOML ファイル(後述)を用意しておく
  let g:rc_dir    = expand('~/.vim/rc')
  let s:toml      = g:rc_dir . '/dein.toml'
  let s:lazy_toml = g:rc_dir . '/dein_lazy.toml'

  " 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

init.vimにneovimのpy2とpy3を設定

~/.config/nvim/init.vimにpyとpy3のパスを追加します。

echo 'let g:python3_host_prog = $PYENV_ROOT . \'/versions/neovim3/bin/python3\'' >> ~/.config/nvim/init.vim
echo 'let g:python_host_prog = $PYENV_ROOT . \'/versions/neovim/bin/python2\'' >> ~/.config/nvim/init.vim

init.vimにvimrcの中身を移植

encodingfenc等、set系の行を移植します。

zshrcのEDITORをneovimに変更

変更することでneovimによる編集へ移行します。

% vim ~/.zshrc
set EDITOR=/usr/local/Cellar/neovim/HEAD-<hash>/bin/nvim
alias vi='env LANG=ja_JP.UTF-8 /usr/local/Cellar/neovim/HEAD-<hash>/bin/nvim "$@"'
alias vim='env LANG=ja_JP.UTF-8 /usr/local/Cellar/neovim/HEAD-<hash>/bin/nvim "$@"'
% source ~/.zshrc

tomlにプラグインの設定を追加

NeoBundleにて設定していたプラグインをdeinで入れ直します。

% vim ~/.vim/rc/dein.toml
[[plugins]]
repo = 'XXX/xxx'

vimrcに追記する場合の書き方は大まかには以下の様になります。

manager install
NeoBundle
call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundle 'XXX/xxx'
call neobundle#end()
    
dein
if dein#load\_state('$HOME/.cache/dein')
    call dein#begin('$HOME/.cache/dein')
    call dein#add('XXX/xxx')
    call dein#end()
    call dein#save_state()
endif
      

WordPressへの投稿用プラグインの追加

Python2の場合はVimRepressがありましたが、Python3の場合はVimWordPressが存在します。主な操作は共通です。

MrPeterLee/VimWordpress: A Vim Plugin for Blogging in WordPress (incl. wordpress.com)

ただ、Deprecatedなクラスを使っている部分があるため正常には動作しないようです。そこで、Forkしてその部分を解消してみました。

haoyayoi/VimWordpress: A Vim Plugin for Blogging in WordPress (incl. wordpress.com)

% vim ~/.vim/rc/dein.toml
[[plugins]]
repo = 'cm-haoyayoi/VimWordPress'

vimrcをvimとneovimで共用する場合

init.vimをvimrcのシンボリックリンクとすることで、設定の手間を省くことも出来ます。nvimかどうかの判定が必要になるケースもありますが、以下の手続きで可能になります。

if has('nvim')

else

endif

Nvim documentation: nvim

まとめ

init.vimをvimrcのシンボリックリンクとすることも可能でしたが、修正行が多かったために今回は行いませんでした。

neovimには、tomlでの簡潔なプラグイン管理、pythonの呼び出しパス設定等、業務面においてもとても便利な機能が備わっています。WordPress用プラグインの対応等でvimでのPython3移行が面倒となっていた人にはおすすめです。