Vim/GVim => Neovim/Neovim-qt 마이그레이션할 때 수행한 작업

5737 단어 neovimVim
이전에 쓴 기사 에서 소개한 Vim 설정 파일군을 Neovim 에 대응시켰으므로, 변경점을 써 갑니다.

XDG Base Directory Specification



Neovim의 설정 파일은 XDG Base Directory Specification 라는 사양에 따릅니다.
자세한 사양은 이 근처이 참고가 될 것입니다.

간단히 말하면, 설정 파일은 ~/.config 이하, 유저 고유의 캐시 파일등은 ~/.local/cache 이하에 배치하는 등, 각 어플리케이션 관계의 파일을 통일적으로 관리하기 쉽게 하는 것이 목적의 사양입니다.
Neovim의 설정 파일은 ~/.config/nvim/init.vim 에 배치하는 것이 관례가 되어 있어, 이 사양에 따르고 있다고 말할 수 있습니다.

파일 구성



Neovim 마이그레이션에 있어 기존의 Vim 설정을 모두 ~/.vimrc 에 쓰고 있던 사람은 거의 그대로 ~/.config/nvim/init.vim 에 copipe로 끝납니다.

그러나 나는 이전의 기사에 쓴 것처럼, 설정을 여러가지 분할해 관리하고 있었으므로, 그대로 copipe 하면 외부 파일을 읽어들일 수 없거나 하고, 일근줄로는 가지 않았습니다.

대응책으로서, 설정 파일을 두는 PATH를 Vim 환경 변수로 설정해, 외부 파일을 읽어들이는 부분에서 그것을 사용하는 형태로 했습니다.

또한 Vim과 Neovim을 공존시키기 위해, 기점의 설정 자체는 종래대로 ~/.vimrc 에 써, ~/.config/nvim/init.vim 에 Symlink를 붙였습니다.
이전에 ~/.vim 에 배치했던 파일군은 XDG 사양에 따라 ~/.config/vim 로 이동했습니다.
폴더 구조 자체는 변하지 않습니다.



~/.config/nvim/init.vim



~/.config/nvim/init.vim(~/.vimrc)
let $XDG_VIM_HOME = $HOME.'/.config/vim'

set runtimepath+=$XDG_VIM_HOME
set runtimepath+=$XDG_VIM_HOME/after

runtime! init/*.vim
runtime! functions.vim

첫 번째 줄에서 구성 파일의 PATH를 환경 변수 XDG_VIM_HOME로 설정했습니다.
이후, 외부의 파일을 읽어들일 때는 반드시 이 환경 변수를 사용합니다.

아래 줄에서 이것을 사용하여 runtimepath를 추가하고 있습니다.

dein.vim 설정


dein.vim 자체의 다운로드와 플러그인의 설치 처리를 vim/init/10_dein.vim 에 쓰고 있습니다.
설치할 플러그인 목록은 dein.tomldein_lazy.toml로 이동하고 있으므로 vim/init/10_dein.vim에서 이러한 파일을 읽습니다.
이 때의 로드처 지정을 $XDG_VIM_HOME 로 재기입했습니다.

vim/init/10_dein.vim
  ...

  if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)

-   let s:toml      = expand($HOME.'/.vim/dein.toml')
-   let s:lazy_toml = expand($HOME.'/.vim/dein_lazy.toml')
+   let s:toml      = expand($XDG_VIM_HOME.'/dein.toml')
+   let s:lazy_toml = expand($XDG_VIM_HOME.'/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

  ...

플러그인 설정 파일 불러오기


dein.vim 에서 로드하는 플러그인 설정은 dein.toml 또는 dein_lazy.toml 에 포함할 수 있지만,
나는 별도로 설정 파일을 만들고 그것을 읽는 방법을 취하고 있습니다.vim/plugins/*.vim는 해당 구성 파일입니다.
이 설정 파일을 dein.tomldein_lazy.toml 로부터 읽어들일 때의 PATH 지정을 재기입했습니다.

vim/dein.toml
  ...

  [[plugins]]
  repo = 'osyo-manga/vim-over'
- hook_add = 'source $HOME/.vim/plugins/vim-over.vim'
+ hook_add = 'source $XDG_VIM_HOME/plugins/vim-over.vim'

  [[plugins]]
  repo = 'tyru/caw.vim'
- hook_add = 'source $HOME/.vim/plugins/caw.vim'
+ hook_add = 'source $XDG_VIM_HOME/plugins/caw.vim'

  [[plugins]]
  repo = 'thinca/vim-splash'
- hook_add = 'source $HOME/.vim/plugins/vim-splash.vim'
+ hook_add = 'source $XDG_VIM_HOME/plugins/vim-splash.vim'

  ...

Vim/Neovim에서 플러그인 분리



어느 한쪽에서만 사용하는 플러그인은 다른 한쪽에서는 읽고 싶지 않기 때문에 dein.vim 의 기능인 on_if 옵션 + has 함수를 사용해 잘라 냈습니다.

dein_lazy.toml
...

[[plugins]]
repo = 'Shougo/deoplete.nvim'
on_i = 1
on_if = 'has("nvim")'
hook_source = 'source $XDG_VIM_HOME/plugins/deoplete.vim'

[[plugins]]
repo = 'Shougo/neocomplete.vim'
on_i = 1
on_if = '!has("nvim")'
hook_source = 'source $XDG_VIM_HOME/plugins/neocomplete.vim'

...

옵션 분리



클립보드 연계 등 Vim/Neovim에서 설정 방법이 다른 옵션도 있습니다.
여기도 플러그인과 마찬가지로 has 함수로 분기했습니다.

vim/init/20_general.vim
...

if has('nvim')
    set clipboard=unnamedplus
else
    set clipboard=unnamed,autoselect
endif

...


PATH 문제로 조금 막혔지만 Vim과 거의 같은 설정을 Neovim에서도 움직일 수 있게 되었습니다.
물론 Vim도 지금까지 제대로 작동하고 있습니다.

좋은 웹페이지 즐겨찾기