Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Neovim の設定を綺麗に整理してみた

More than 1 year has passed since last update.

はじめに

Neovim の設定を一年以上サボっていたので、久しぶりに整理しました。
Neovim を導入した当初は、他の方の設定ファイルをコピペしたものだったので、今回はしっかりドキュメントなどを見て設定しました。

やったこと

  • init.vim の設定
  • dein.vim の導入
  • Vim プラグインの導入
  • Vim プラグインごとの設定

環境

  • macOS Sierra: v10.12.6
  • Neovim: v0.3.0
  • Python2: v2.7.10
  • Python3: v3.7.0
  • Ruby: v2.4.4p296
  • Node.js: v10.6.0

設定ファイルだけ見たい方はこちら

GitHub に設定ファイルを共有しているので、設定ファイルだけ見たい方はそちらをご覧ください。

repository: https://github.com/tamago3keran/neovim-config/tree/master/plugins

久しぶりの Neovim 設定

なぜ .config ディレクトリ?

Neovim のドキュメントにも明記されていますが、 ~/.config/nvim/init.vim に設定を書きました。

  • Use $XDG_CONFIG_HOME/nvim/init.vim instead of .vimrc for configuration.
  • Use $XDG_CONFIG_HOME/nvim instead of .vim to store configuration files.

.config ディレクトリ直下に設定ファイルを置くのは、 Neovim が XDG Base Directory Specification に対応しているからのようです。

  • XDG_CONFIG_HOME
    • ユーザー個別の設定が書き込まれるディレクトリ ( /etc と類似)。
    • デフォルトは $HOME/.config です。

init.vim の参考例

~/.config/nvim/init.vim
set number             "行番号を表示
set autoindent         "改行時に自動でインデントする
set tabstop=2          "タブを何文字の空白に変換するか
set shiftwidth=2       "自動インデント時に入力する空白の数
set expandtab          "タブ入力を空白に変換
set splitright         "画面を縦分割する際に右に開く
set clipboard=unnamed  "yank した文字列をクリップボードにコピー
set hls                "検索した文字をハイライトする

dein.vim でプラグイン管理

dein.vim は Shougo さんによって作成された Vim / Neovim のプラグインマネージャです。
このツールを使って、Vim プラグインの管理を簡潔にしました。

denite.vim の導入方法

dein.vim の導入方法も非常に簡単で、ドキュメント通りに行いました。

まずは以下のコマンドを実行しました。

% curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
% sh ./installer.sh ~/.cache/dein

コマンドを実行した後に init.vim に以下のコードを追記しました。

~/.config/nvim/init.vim
if &compatible
  set nocompatible
endif
set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim
if dein#load_state('~/.cache/dein')
  call dein#begin('~/.cache/dein')
  call dein#end()
  call dein#save_state()
endif
filetype plugin indent on
syntax enable

これでプラグインを入れる準備は完了です!

プラグインの導入方法

いよいよ自分が好きなプラグインを入れていきます。
私は init.vim を膨らませたくなかったので、 toml ファイルに入れたいプラグインを書きました。

まずは init.vim に toml ファイルを読み込むコードを書きました。

~/.config/nvim/init.vim
 if &compatible
   set nocompatible
 endif
 set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim
 if dein#load_state('~/.cache/dein')
   call dein#begin('~/.cache/dein')
+  call dein#load_toml('~/.config/nvim/dein.toml', {'lazy': 0})
+  call dein#load_toml('~/.config/nvim/dein_lazy.toml', {'lazy': 1})
   call dein#end()
   call dein#save_state()
 endif
 filetype plugin indent on
 syntax enable

dein.tomldein_lazy.toml という2つの toml ファイルを作成していますが、以下のような違いがあります。

  • dein.toml
    • Neovim を起動した際にロードされる
  • dein_lazy.toml
    • プラグインを使用する際にロードされる

では dein.toml というファイルを作って、以下の書式でプラグイン名を書いていきます。

~/.config/nvim/dein.vim
[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]]
repo = 'tpope/vim-endwise'

[[plugins]]
repo = 'Townk/vim-autoclose'

[[plugins]]
repo = 'joshdick/onedark.vim'
hook_add = '''
  colorscheme onedark
'''

[[plugins]]
repo = 'w0rp/ale'

[[plugins]]
repo = 'airblade/vim-gitgutter'
hook_add = '''
  set signcolumn=yes
  set updatetime=1000
  nnoremap [gitgutter] <Nop>
  nmap <C-h> [gitgutter]
  nmap [gitgutter]j <Plug>GitGutterNextHunk
  nmap [gitgutter]k <Plug>GitGutterPrevHunk
  nmap [gitgutter]u <Plug>GitGutterUndoHunk
'''

[[plugins]]
repo = 'tpope/vim-fugitive'
hook_add = '''
  command Gst :Gstatus
  command Gdf :Gdiff
  command Gbl :Gblame
'''

[[plugins]]
repo = 'Shougo/denite.nvim'
hook_add = '''
  nnoremap [denite] <Nop>
  nmap <C-d> [denite]
  nnoremap <silent> [denite]g :<C-u>Denite grep -buffer-name=search-buffer-denite<CR>
  nnoremap <silent> [denite]r :<C-u>Denite -resume -buffer-name=search-buffer-denite<CR>
  nnoremap <silent> [denite]p :<C-u>Denite file_rec<CR>
  call denite#custom#option('default', 'prompt', '>')
  call denite#custom#option('_', 'highlight_matched_range', 'None')
  call denite#custom#option('_', 'highlight_matched_char', 'None')
  call denite#custom#map('insert', "<Tab>", '<denite:move_to_next_line>')
  call denite#custom#map('insert', "<S-Tab>", '<denite:move_to_previous_line>')
  call denite#custom#map('insert', "<C-t>", '<denite:do_action:tabopen>')
  call denite#custom#map('insert', "<C-v>", '<denite:do_action:vsplit>')
  call denite#custom#map('normal', "v", '<denite:do_action:vsplit>')
  call denite#custom#var('grep', 'command', ['pt', '--follow', '--nogroup', '--nocolor', '--hidden'])
  call denite#custom#var('grep', 'default_opts', [])
  call denite#custom#var('grep', 'recursive_opts', [])
  call denite#custom#var('file_rec', 'command', ['pt', '--follow', '--nocolor', '--nogroup', '--hidden', '-g', ''])
'''

[[plugins]]
repo = 'osyo-manga/vim-anzu'
hook_add = '''
  nmap n <Plug>(anzu-n-with-echo)
  nmap N <Plug>(anzu-N-with-echo)
  nmap * <Plug>(anzu-star)
  nmap # <Plug>(anzu-sharp)
'''

dein_lazy.toml ファイルにもプラグイン名を書きます。

~/.config/nvim/dein_lazy.toml
[[plugins]]
repo = 'Shougo/deoplete.nvim'
on_event = 'InsertEnter'
hook_add = '''
  let g:deoplete#enable_at_startup = 1
  inoremap <expr><Tab> pumvisible() ? "\<DOWN>" : "\<Tab>"
  inoremap <expr><S-Tab> pumvisible() ? "\<UP>" : "\<S-Tab>"
'''

最後に Vim を起動して、ノーマルモードで以下のコマンドを実行しました。このコマンドでプラグインが読み込まれました。

:call dein#install()

プラグインのインストールを自動化

Vim プラグインを入れる度にインストールのコマンドを実行するのは面倒なので、 新しく入れたプラグインがあれば、Vim 起動時に自動でインストールするようにしました。

~/.config/nvim/init.vim
  if &compatible
    set nocompatible
  endif
  set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim
  if dein#load_state('~/.cache/dein')
    call dein#begin('~/.cache/dein')
    call dein#load_toml('~/.config/nvim/dein.toml', {'lazy': 0})
    call dein#load_toml('~/.config/nvim/dein_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

プラグインごとに設定ファイルを分ける

プラグインごとにキーマップなどの設定を書いていくと、上記の dein.toml のように見づらくなってしまいました。
そこで設定ファイルをプラグインごとに分けて書く方法をとりました。

まずは dein.tomldein_lazy.toml を修正しました。

~/.config/nvim/dein.vim
  [[plugins]]
  repo = 'Shougo/dein.vim'

  [[plugins]]
  repo = 'tpope/vim-endwise'

  [[plugins]]
  repo = 'Townk/vim-autoclose'

  [[plugins]]
  repo = 'joshdick/onedark.vim'
  hook_add = '''
    colorscheme onedark
  '''

  [[plugins]]
  repo = 'w0rp/ale'

  [[plugins]]
  repo = 'airblade/vim-gitgutter'
  hook_add = '''
-   set signcolumn=yes
-   set updatetime=1000
-   nnoremap [gitgutter] <Nop>
-   nmap <C-h> [gitgutter]
-   nmap [gitgutter]j <Plug>GitGutterNextHunk
-   nmap [gitgutter]k <Plug>GitGutterPrevHunk
-   nmap [gitgutter]u <Plug>GitGutterUndoHunk
+   source ~/.config/nvim/plugins/gitgutter.vim
  '''

  [[plugins]]
  repo = 'tpope/vim-fugitive'
  hook_add = '''
-   command Gst :Gstatus
-   command Gdf :Gdiff
-   command Gbl :Gblame
+   source ~/.config/nvim/plugins/fugitive.vim
  '''

  [[plugins]]
  repo = 'Shougo/denite.nvim'
  hook_add = '''
-   nnoremap [denite] <Nop>
-   nmap <C-d> [denite]
-   nnoremap <silent> [denite]g :<C-u>Denite grep -buffer-name=search-buffer-denite<CR>
-   nnoremap <silent> [denite]r :<C-u>Denite -resume -buffer-name=search-buffer-denite<CR>
-   nnoremap <silent> [denite]p :<C-u>Denite file_rec<CR>
-   call denite#custom#option('default', 'prompt', '>')
-   call denite#custom#option('_', 'highlight_matched_range', 'None')
-   call denite#custom#option('_', 'highlight_matched_char', 'None')
-   call denite#custom#map('insert', "<Tab>", '<denite:move_to_next_line>')
-   call denite#custom#map('insert', "<S-Tab>", '<denite:move_to_previous_line>')
-   call denite#custom#map('insert', "<C-t>", '<denite:do_action:tabopen>')
-   call denite#custom#map('insert', "<C-v>", '<denite:do_action:vsplit>')
-   call denite#custom#map('normal', "v", '<denite:do_action:vsplit>')
-   call denite#custom#var('grep', 'command', ['pt', '--follow', '--nogroup', '--nocolor', '--hidden'])
-   call denite#custom#var('grep', 'default_opts', [])
-   call denite#custom#var('grep', 'recursive_opts', [])
-   call denite#custom#var('file_rec', 'command', ['pt', '--follow', '--nocolor', '--nogroup', '--hidden', '-g', ''])
+   source ~/.config/nvim/plugins/denite.vim
  '''

  [[plugins]]
  repo = 'osyo-manga/vim-anzu'
  hook_add = '''
-   nmap n <Plug>(anzu-n-with-echo)
-   nmap N <Plug>(anzu-N-with-echo)
-   nmap * <Plug>(anzu-star)
-   nmap # <Plug>(anzu-sharp)
+   source ~/.config/nvim/plugins/anzu.vim
  '''
~/.config/nvim/dein_lazy.toml
  [[plugins]]
  repo = 'Shougo/deoplete.nvim'
  on_event = 'InsertEnter'
  hook_add = '''
-   let g:deoplete#enable_at_startup = 1
-   inoremap <expr><Tab> pumvisible() ? "\<DOWN>" : "\<Tab>"
-   inoremap <expr><S-Tab> pumvisible() ? "\<UP>" : "\<S-Tab>"
+   source ~/.config/nvim/plugins/deoplete.vim
  '''

次にプラグインごとの設定ファイルを作成しました。

~/.config/nvim/plugins/anzu.vim
nmap n <Plug>(anzu-n-with-echo)
nmap N <Plug>(anzu-N-with-echo)
nmap * <Plug>(anzu-star)
nmap # <Plug>(anzu-sharp)
~/.config/nvim/plugins/denite.vim
nnoremap [denite] <Nop>
nmap <C-d> [denite]
nnoremap <silent> [denite]g :<C-u>Denite grep -buffer-name=search-buffer-denite<CR>
nnoremap <silent> [denite]r :<C-u>Denite -resume -buffer-name=search-buffer-denite<CR>
nnoremap <silent> [denite]p :<C-u>Denite file_rec<CR>

call denite#custom#option('default', 'prompt', '>')
call denite#custom#option('_', 'highlight_matched_range', 'None')
call denite#custom#option('_', 'highlight_matched_char', 'None')
call denite#custom#map('insert', "<Tab>", '<denite:move_to_next_line>')
call denite#custom#map('insert', "<S-Tab>", '<denite:move_to_previous_line>')
call denite#custom#map('insert', "<C-t>", '<denite:do_action:tabopen>')
call denite#custom#map('insert', "<C-v>", '<denite:do_action:vsplit>')
call denite#custom#map('normal', "v", '<denite:do_action:vsplit>')
call denite#custom#var('grep', 'command', ['pt', '--follow', '--nogroup', '--nocolor', '--hidden'])
call denite#custom#var('grep', 'default_opts', [])
call denite#custom#var('grep', 'recursive_opts', [])
call denite#custom#var('file_rec', 'command', ['pt', '--follow', '--nocolor', '--nogroup', '--hidden', '-g', ''])
~/.config/nvim/plugins/deoplete.vim
let g:deoplete#enable_at_startup = 1
inoremap <expr><Tab> pumvisible() ? "\<DOWN>" : "\<Tab>"
inoremap <expr><S-Tab> pumvisible() ? "\<UP>" : "\<S-Tab>"
~/.config/nvim/plugins/fugitive.vim
command Gst :Gstatus
command Gdf :Gdiff
command Gbl :Gblame
~/.config/nvim/plugins/gitgutter.vim
set signcolumn=yes
set updatetime=1000

nnoremap [gitgutter] <Nop>
nmap <C-h> [gitgutter]
nmap [gitgutter]j <Plug>GitGutterNextHunk
nmap [gitgutter]k <Plug>GitGutterPrevHunk
nmap [gitgutter]u <Plug>GitGutterUndoHunk

これでだいぶ見やすくなりました!
Neovim を使ってみたいという方は、ぜひ参考にしてください!

私が現在使用しているプラグインの紹介と使い方についてまとめましたので、そちらもご覧ください。
=> 私が使う Vim プラグインまとめ

tamago3keran
React Nativeでアプリ開発を行っています。 アニメーションが好きで、Adobe After Effectsでアニメーションを作成して、Lottieを使ってアプリに組み込んだりしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away