LoginSignup
70
63

More than 1 year has passed since last update.

Neovim + Dark powered plugins + coc.nvim で最高の開発環境を構築する

Last updated at Posted at 2019-09-04

大学の研究室の夏合宿でNeovimのプラグインの紹介LTを作成しました。(Neovim plugins - Google Slides)
LT用に作った資料なのでプラグインのそれぞれの軽い紹介しかできなかったので、改めてプラグインの紹介と動作の様子、キーマップなどの設定を記事にしたいと思います。
dotfiles(設定ファイル)を見たい人はこちらです。

Dork powered pluginsとは

Dork powered pluginsはShougo / 暗黒美無王さんがVim用に作成したとても使いやすいプラグインのことです。
このプラグインがなかったらVimmerになっていなかったです。
今回紹介するプラグインは以下の5つです。

  • dein.vim: プラグインマネージャー
  • denite.nvim: Vimのインターフェースを統合したプラグイン
  • defx.nvim: シンプルかつ強力なファイルエクスプローラー
  • deol.nvim: Vimのターミナル機能を拡張したプラグイン
  • coc.nvim: NeovimでLSPを使えるようにするプラグイン

coc.nvimはShougoさんが作ったものではないですが、Neovimで自動補完や定義ジャンプを使えるようにする便利なプラグインなので紹介したいと思います。

環境

  • macOS Mojave 10.14.5 / Ubuntu 18.04
  • Neovim v0.4.0-dev
  • Python 3.7.4

Neovimをインストール

現時点(2019年9月4日)ではstable版のNeovimではfloat windowが使えないためunstable版をインストールする方法を紹介します。ただし、stable版でも今回取り上げるプラグインは利用可能なのでお好きな方をインストールしてください。

# For macOS
# stable版は --HEAD オプションを削除するとインストールできます
$ brew install --HEAD neovim

# For Ubuntu
# stable版は 1行目の最後 unstable を stable に変更するとインストールできます
$ sudo add-apt-repository -y ppa:neovim-ppa/unstable \
  sudo apt update -y \
  sudo apt install neovim

上記以外のインストール方法: Installing Neovim

Python 3.x系をインストール

Dork powered pluginsはPython 3.x系で動くため、ご自身の好きな方法でインストールしてください。
この記事ではpyenvでPython 3.x系をインストールしたことを前提としているので、ご自身の環境で読み替えてください。

dein.vimをインストール

以下のコマンドを実行するとdein.vimが自動でインストールされます。
インストールが完了したらinstaller.shは削除して大丈夫です。

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

Neovimを設定する

ここでは最低限の設定しか記述しません。
こちらに全て記述されているので参考にしてください。

設定ファイル構成

~/.config/nvim
├── init.vim            # Neovimの設定ファイル
└── plugins             # プラグイン用の設定ディレクトリ
   ├── coc.rc.vim
   ├── config
   │  └── dein.toml     # 起動時ロード用の設定ファイル
   ├── defx.rc.vim
   ├── dein.rc.vim
   ├── denite.rc.vim
   └── deol.rc.vim

Neovim全体の設定

~/.config/nvim/init.vim
" Python 3.x系のPathを設定
let g:python3_host_prog = 'YOUR_PYTHON_PATH'

" dein.vim を使うために以下を記述
runtime! plugins/dein.rc.vim

私の環境ではpyenvでPython 3.x系をインストールしているので以下のような設定になります。
let g:python3_host_prog = '~/.pyenv/shims/python3/'
Python 3.x系のPathがわからない場合はターミナルでwhich python3を実行し、出力されたPathを設定してください。

dein.vimの設定

dein.vimをインストールの実行が完了すると、設定をinit.vimに記述してくださいと出力されると思いますが、一旦それは無視します。
dein.vimの設定は以下の通りです。

~/.config/nvim/plugins/dein.rc.vim
" プラグインの設定ファイルPath
let s:plugin = '~/.config/nvim/plugins/config/dein.toml'

" Neovim起動時にdein.tomlファイルをチェックし、未インストールのプラグインがあった場合インストールする
if dein#check_install()
  call dein#install()
endif

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')
  " dein.tomlを起動時ロードの設定ファイルとして読み込む
  call dein#load_toml(s:plugin, {'lazy': 0})
  call dein#end()
  call dein#save_state()
endif

filetype plugin indent on
syntax enable

プラグインのインストールと設定

TOMLファイルは以下のような構成となっています。[[plugin]]からつぎの[[plugin]]までが一つのテーブルとなっていて、その中のrepoにプラグインのリポジトリ名を指定するとdein.vimでインストールすることができます。hook_add内でそのプラグインの設定を記述することができますが、ここでは設定ファイルを別の場所に分けて、その設定ファイルを読み込んでいます。

~/.config/nvim/plugins/config/dein.toml
[[plugins]]
repo = "neoclide/coc.nvim"
merge = 0
rev = "release"
hook_add = """
source ~/.config/nvim/plugins/coc.rc.vim
"""

[[plugins]]
repo = "Shougo/defx.nvim"
depends = ["defx-git"]
hook_add = """
source ~/.config/nvim/plugins/defx.rc.vim
"""

[[plugins]]
repo ="kristijanhusak/defx-git"
hook_add = """
source ~/.config/nvim/plugins/defx-git.rc.vim
"""

[[plugins]]
repo = "Shougo/denite.nvim"
hook_add = """
source ~/.config/nvim/plugins/denite.rc.vim
"""

[[plugins]]
repo = "shougo/deol.nvim"
hook_add = """
source ~/.config/nvim/plugins/deol.rc.vim
"""

TOMLファイルを保存し、Neovimで:call dein#install()を実行するか、もう一度Neovimを立ち上げるとプラグインのインストールが自動で開始されます。

denite.nvim

denite.nvimはNeovimのインターフェースを統合するプラグインです。
個人的には主にファイル、バッファ、コマンドの検索・実行に利用しています。

denite_all.png denite_grep.png

上の画像では、カレントディレクトリのファイルとバッファを表示しています。
Vim / Neovimで開いたファイルはバッファに保存されるため、バッファを活用することができれば目的のファイルを素早く開くことができます。denite.nvimはバッファの一覧も表示することができるためファイル操作が格段に向上します。
また、grep機能もあるため、指定した文字列を含むファイルの検索も容易に行うことができます。

以下がdenite.nvimのキーマップなどを設定したファイルです。

~/.config/nvim/plugins/denite.rc.vim
" 【Ctrl + d + a】 カレントディレクトリとバッファを表示
nnoremap <silent><C-d>a :<C-u>Denite file buffer -split=floating file:new<CR>
" 【Ctrl + d + b】 バッファを表示
nnoremap <silent><C-d>b :<C-u>Denite buffer -split=floating file:new<CR>
" 【Ctrl + d + f】 カレントディレクトリを表示
nnoremap <silent><C-d>f :<C-u>Denite file -split=floating file:new<CR>
" 【Ctrl + d + r】 カレントディレクトリ以下を再帰的に表示
nnoremap <silent><C-d>r :<C-u>Denite file/rec -split=floating file:new<CR>
" 【Ctrl + d + gr】 カレントディレクトリ以下のファイルから指定した文字列を検索
nnoremap <silent><C-d>gr :<C-u>Denite grep -buffer-name=search<CR>
" 【Ctrl + d + ,】 カレントディレクトリ以下のファイルからカーソル下の文字列を検索
nnoremap <silent><C-d>, :<C-u>DeniteCursorWord grep -buffer-name=search line<CR>
" 【Ctrl + d + gs】 grepした結果を再表示
nnoremap <silent><C-d>gs :<C-u>Denite -resume -buffer-name=search<CR>
" 【Ctrl + d + c】 Neovim内で実行したコマンドを表示
nnoremap <silent><C-d>c :<C-u>Denite command_history -split=floating<CR>

autocmd FileType denite call s:denite_my_settings()
function! s:denite_my_settings() abort
  nnoremap <silent><buffer><expr> <CR>
  \ denite#do_map('do_action')
  " 【o】 ファイルを開く
  nnoremap <silent><buffer><expr> o
  \ denite#do_map('do_action')
  " 【s】 ウィンドウを水平分割してファイルを開く
  nnoremap <silent><buffer><expr> s
  \ denite#do_map('do_action', 'split')
  " 【v】 ウィンドウを垂直分割してファイルを開く
  nnoremap <silent><buffer><expr> v
  \ denite#do_map('do_action', 'vsplit')
  " 【d】 ファイルを削除する
  nnoremap <silent><buffer><expr> d
  \ denite#do_map('do_action', 'delete')
  " 【p】 ファイルをプレビュー画面で開く
  nnoremap <silent><buffer><expr> p
  \ denite#do_map('do_action', 'preview')
  " 【ESC】 / 【q】 denite.nvimを終了する
  nnoremap <silent><buffer><expr> <Esc>
  \ denite#do_map('quit')
  nnoremap <silent><buffer><expr> q
  \ denite#do_map('quit')
  " 【i】 ファイル名で検索する
  nnoremap <silent><buffer><expr> i
  \ denite#do_map('open_filter_buffer')
  " 【SPACE】 ファイルを複数選択する
  nnoremap <silent><buffer><expr> <Space>
  \ denite#do_map('toggle_select').'j'
endfunction

autocmd FileType denite-filter call s:denite_filter_my_settings()
function! s:denite_filter_my_settings() abort
  imap <silent><buffer> <C-o> <Plug>(denite_filter_quit)
endfunction

その他の詳しいコマンド等はNeovimで:help denite.txtを実行するかドキュメントを参考にしてください。

deol.nvim

deol.nvimはNeovim上でターミナルを実行できるプラグインです。ターミナルを実行できるため、Neovimを抜けることなくプログラムのデバッグ作業ができるためかなり重宝しています。
通常のNeovimでも:terminalを実行するとターミナルを起動できますが、deol.nvimの今後の開発によってさらに使いやすいプラグインになると信じて紹介します。

deol.png
~/.config/nvim/plugins/deol.rc.vim
" 【Ctrl + o】 float windowでターミナルを表示
nnoremap <silent><C-o> :<C-u>Deol -split=floating<CR>
" 【ESC】 ターミナルモードから抜ける
tnoremap <ESC>   <C-\><C-n>

deol.nvimは【ESC】キーでターミナルモードから抜けることができないので上記のようにキーマップを設定しています。新しいターミナルウィンドウを立ち上げたいときはインサートモードになっていない状態で【Ctrl + z】で立ち上げることができます。
その他の詳しいコマンドやキーマップはNeovimで:help deol.txtを実行するかドキュメントを参考にしてください。

defx.nvim

defx.nvimはファイルエクスプローラーで、以前はNERDTreeを使っていましたが、シンプルかつ多機能なdefx.nvimに乗り換えました。プラグインを追加することでアイコンの表示や、Gitのステータスを表示することができます。

defx.png
~/.config/nvim/plugins/defx.rc.vim
" 【Ctrl + f】 defx.nvimを起動
nnoremap <silent><C-f> :<C-u>Defx<CR>

call defx#custom#option('_', {
    \ 'columns': 'indent:git:icons:filename',
    \ 'show_ignored_files': 1,
    \ })

let g:defx_icons_enable_syntax_highlight = 1
let g:defx_icons_column_length = 2

autocmd FileType defx call s:defx_my_settings()
    function! s:defx_my_settings() abort
      nnoremap <silent><buffer><expr> <CR>
     \ defx#do_action('open')
      " 【o】 ファイルを開く
      nnoremap <silent><buffer><expr> o
      \ defx#do_action('open')
      " 【s】 ウィンドウを水平分割してファイルを開く
      nnoremap <silent><buffer><expr> s
      \ defx#do_action('open', 'split')
      " 【v】 ウィンドウを垂直分割してファイルを開く
      nnoremap <silent><buffer><expr> v
      \ defx#do_action('open', 'vsplit')
      " 【c】 ファイルをコピーする
      nnoremap <silent><buffer><expr> c
      \ defx#do_action('copy')
      " 【m】 ファイルを移動する
      nnoremap <silent><buffer><expr> m
      \ defx#do_action('move')
      " 【p】 ファイルを貼り付ける
      nnoremap <silent><buffer><expr> p
      \ defx#do_action('paste')
      " 【n】 新しいファイルを作成する
      nnoremap <silent><buffer><expr> n
      \ defx#do_action('new_file')
      " 【N】 新しいディレクトリを作成する
      nnoremap <silent><buffer><expr> N
      \ defx#do_action('new_directory')
      " 【d】 ファイルを削除する
      nnoremap <silent><buffer><expr> d
      \ defx#do_action('remove')
      " 【r】 ファイル名を変更する
      nnoremap <silent><buffer><expr> r
      \ defx#do_action('rename')
      " 【t】 ツリーを表示/非表示する
      nnoremap <silent><buffer><expr> t
      \ defx#do_action('open_or_close_tree')
      " 【x】 ファイルを実行する
      nnoremap <silent><buffer><expr> x
      \ defx#do_action('execute_system')
      " 【yy】 ファイル/ディレクトリのパスをコピーする
      nnoremap <silent><buffer><expr> yy
      \ defx#do_action('yank_path')
      nnoremap <silent><buffer><expr> .
      " 【.】 隠しファイルを表示/非表示する
      \ defx#do_action('toggle_ignored_files')
      nnoremap <silent><buffer><expr> ..
      " 【..】 親ディレクトリに移動する
      \ defx#do_action('cd', ['..'])
      nnoremap <silent><buffer><expr> ~
      " 【~】 ホームディレクトリに移動する
      \ defx#do_action('cd')
      " 【ESC】 / 【q】 defx.nvimを終了する
      nnoremap <silent><buffer><expr> <Esc> 
      \ defx#do_action('quit')
      nnoremap <silent><buffer><expr> q
      \ defx#do_action('quit')
      " 【j】 カーソルを下に移動する
      nnoremap <silent><buffer><expr> j
      \ line('.') == line('$') ? 'gg' : 'j'
      " 【k】 カーソルを上に移動する
      nnoremap <silent><buffer><expr> k
      \ line('.') == 1 ? 'G' : 'k'
      " 【cd】 Neovim上のカレントディレクトリを変更する
      nnoremap <silent><buffer><expr> cd
      \ defx#do_action('change_vim_cwd')
endfunction

その他の詳しいコマンドやキーマップはNeovimで:help defx.txtを実行するかドキュメントを参考にしてください。

coc.nvim

coc.nvimはNeovimでLSP(Language Server Protocol)を使えるようにするプラグインで、自動補完やエラーチェック、フォーマット、定義先に移動することができます。coc.nvimが対応しているLSPとその設定は方法はこちらに記載されているので確認してください。
また、coc.nvimの設定は公式の例をそのままコピーしてキーマップを少しいじるだけでいいと思います。
デフォルトのキーマップは以下のようになっています(よく使う機能のみ抜粋しています)。

  • 【rn】 リネームする
  • 【[c】 直前の警告/エラー部分に移動する
  • 【[c】 直後の警告/エラー部分に移動する
  • 【gd】 定義先に移動する
  • 【gr】 参照されている部分を表示する
  • 【K】 ドキュメントを表示する

coc.png

その他の詳しいコマンドやキーマップはNeovimで:help coc-nvimを実行するかWikiを参考にしてください。

おわりに

先日インターンに参加して刺激を受けて記事やらコードやらを書きたい欲が爆発しています。
そのインターンでいろんな方のターミナルを拝見する機会があったのですが、テーマを設定していなく見づらいなぁ、と感じたので次の記事ではターミナルとそのテーマなどを情熱が続いていたら紹介したいと思います。

70
63
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
63