5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

クールでモダンなVim導入備忘録

Last updated at Posted at 2021-12-29

はじめに

こんにちは。私しがないエンジニアをしております。
今回は、業務をする中でだんだんトラックパッドを使うのが面倒になり、Vimmerへの道を歩み始めた著者のVim(neovim)環境構築の備忘録(一部始終)です。
「これからVimを使おうか」、「Vimってどんなことができるんだい」って思う人は是非読み進めていただきたいです。

完成図はこんなイメージです(今の僕のiTerm2上のVimエディタです)。
Screen Shot 2021-12-29 at 0.03.38.png

目次

  1. neovimの導入
  2. dein.vimの導入
  3. Vimの設定
  4. Vimプラグインのインストール
    番外編: エラー対処と使用言語のLSP設定
    ・エラー対処
    ・Ruby
    ・C++

前提(導入時の自分の環境)

  • 環境
    ・MacBook Air (M1, 2020)
    ・Big Sur 11.6.1

  • HomeBrewを使用

  • iTerm2にてPowerlevel10kを使用している(エディタにアイコンなど特殊文字を表示させる設定が追加で必要かと)

1. neovimの導入

neovimというのは、Vimをベースとしたテキストエディタとのことです。
前提にも書きましたが著者はHomeBrewを愛用しているので、neovimのインストールもHomeBrewを使用していきます。
コマンドは至極簡単で、

brew install neovim

です。
インストールが終われば、nvim --versionを打ってインストールがされているか確認しましょう。
そして、インストールができればviコマンドでneovimが使えるように.zshrcにエイリアスを書き足します。

~/.zshrc
alias vi="nvim"

そして、neovimは起動時の挙動を設定するためにinit.vimというファイルが利用できるので、そのファイルを作成してあげます。

mkdir -p ~/.config/nvim
touch ~/.config/nvim/init.vim

2. dein.vimの導入

Vimにはプラグインが多数存在していますが、プラグインをたくさん導入すればするほどその管理はスパゲッティのように複雑になるようです。先輩Vimmerの方々は、プラグイン管理のためにプラグインマネージャーを使っているようで、dein.vimは有名なVimプラグインマネージャーの1つです。
インストール方法は以降で紹介しますが、本家のリポジトリのリンクも貼っておきます。

本来ならgit cloneをしないといけないのですが、今回は自動的にdein.vimが追加されるように設定していきます。

  1. ~/.config/nvim/init.vim内に下記コードをペースト
  2. nvimを起動(以下viコマンドはnvimコマンド実行と同じ扱い)

編集(2021/12/31): /.cache/deinディレクトリはインストール時に自動生成されるので作成不要です。

~/.config/nvim/init.vim
" インストールディレクトリの指定
let s:dein_dir = expand('~/.cache/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
let s:toml_file = expand('~/.config/nvim/dein') . '/plugins.toml'
let s:toml_dir = expand('~/.config/nvim/dein/plugins')
if match( &runtimepath, '/dein.vim' ) == -1
	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
" dein の設定
if dein#load_state(s:dein_dir)
	call dein#begin(s:dein_dir)
  " 各プラグインのtomlを読み込む
	call dein#load_toml( s:toml_dir . '/init_plugin.toml', {'lazy': 0} )
	call dein#load_toml( s:toml_dir . '/lazy_plugin.toml', {'lazy': 1} )
  call dein#end()
	call dein#save_state()
endif
" 各プラグインのインストールチェック(なかったら自動的に追加される)
if dein#check_install()
	call dein#install()
endif

細かいコードの意味等は解説を控えますが、Vimを再起動すれば自動でインストールされます。

3. Vimの設定

ここからが本題です。そして、ここからがVimの本領発揮する場面であり、沼であり、自分の知識がまだまだ足りていない箇所になります。

それがVimの設定です。

ここまで色々インストールしてきて、モダンなIDEみたいになったと思ったら大きな勘違い。
まだまだ行番号すらないような、見づらい真っ黒い画面のままです。

そこで、先程の起動時のファイルinit.vimに書き込みます。個人的にはinit.vimが長くなりすぎるのは嫌なので、init_config.vimという別ファイルを作成して設定を書き加えていきます。

Vimの設定は細かくでき、キーマップなども自分で設定することができますが、今回は自分もVimを使って日が浅いということでキーマップの紹介は辞めておきます。

init_config.vim内で使用している設定は以下のものです。
設定を書き終えたら、init.vim内にsource ~/.config/nvim/init_config.vimを書いて設定を読み込ませるのを忘れないようにしましょう。

init_config.vim
" #####表示設定#####
set number "行番号を表示する
set title "編集中のファイル名を表示
set showmatch "括弧入力時の対応する括弧を表示
set expandtab "タブ文字の代わりにスペースを使う
set splitbelow  " 水平分割時に下に表示
set splitright  " 縦分割時を右に表示
set ruler " カーソルの位置表示
set cursorline " カーソルハイライト
syntax on "コードの色分け
set tabstop=4 "インデントをスペース4つ分に設定
set smartindent "オートインデント
set laststatus=2 "常にステータスを表示
set autoindent "改行時に自動的にインデントを適用
set list "タブ、空白、改行の可視化
set showcmd "入力中のコマンドを表示

" #####検索設定#####
set ignorecase "大文字/小文字の区別なく検索する
set smartcase "検索文字列に大文字が含まれている場合は区別して検索する
set wrapscan "検索時に最後まで行ったら最初に戻る
set hlsearch "検索結果をハイライト表示
set incsearch
set wildmenu "コマンドラインモードの補完を見やすく

4. Vimプラグインのインストール

2でインストールしたdein.vimを用いて、Vimプラグインをインストールしていきます。
僕はtomlファイルを活用してプラグインをインストールしているのでその方法を紹介します。

先程のinit.vimファイルのこの記述をご覧ください。

init.vim
let s:toml_dir = expand('~/.config/nvim/dein/plugins')
...中略
" 各プラグインのtomlを読み込む
	call dein#load_toml( s:toml_dir . '/init_plugin.toml', {'lazy': 0} )
	call dein#load_toml( s:toml_dir . '/lazy_plugin.toml', {'lazy': 1} )

解説すると、

  • ~/.config/nvim/dein/pluginsディレクトリをtomlファイルを置くフォルダとして定義しています

  • ~/.config/nvim/dein/pluginsディレクトリにプラグインのtomlファイルを設置しています

  • init_plugin.tomllazy_plugin.tomlでプラグインを分類しています

  • init_plugin.tomlはVim起動時に機能して欲しいプラグインになります({'lazy':0}で設定)

  • lazy_plugin.tomlは遅延ロードを適用したいプラグインで、特定のタイミングにVimに起動してほしいプラグインです({'lazy':1}で設定).

    => 遅延ロードは、Ruby用のプラグインだから拡張子が.rbのファイルの時だけ起動してほしいな、というようにVim起動後にロードされるものになります(起動時だと拡張子関係なく無差別にロードされます)。

さっそくIDEライクな機能にするためにプラグインをインストールしていきます。

1. ~/.config/nvim/dein/plugins配下にtomlファイルを配置する

ディレクトリの場所についてですが、let s:toml_dirで設定できるので、任意の場所に設定してください。
また、init_plugin.tomlという風に一つのファイルに複数のプラグインをまとめて書くのではなく、{plugin_name}.tomlという風にプラグインごとにファイルを作成するという方もいらっしゃるので自分の好きな方法をお使いください

2. tomlファイル内に使いたいプラグインを書き足していく

tomlファイル内での基本的な設定方法は以下の通りです。

[[plugins]]
repo = 'ユーザ名/リポジトリ名'
hook_add = '''
  プラグインの個別設定を記述
'''

プラグインによってはレポジトリの設定や、依存関係の設定も必要なので参考程度に書いておきます(引用記事)。

# ブランチやタグを指定したいとき
[[plugins]]
repo = 'delphinus35/typescript-vim'
rev  = 'colorize-template-strings'

# 特定の条件で読み込みたいとき
[[plugins]]
repo = 'elzr/vim-json'
if   = '''! has('kaoriya')'''

# 依存関係を指定したいとき
[[plugins]]
repo    = 'vim-airline/vim-airline'
depends = ['vim-airline-themes']

# 依存関係を指定したからと言って、自動でインストールはされない(ここは NeoBundle と違う)
[[plugins]]
repo = 'vim-airline/vim-airline-themes'

そして、こちらが最上部に掲載した写真のようにするのに僕が使用しているプラグインになります(一部おすすめプラグインを入れています)。

**各プラグインのレポジトリ一覧**
init_plugin.toml
# vim-airlineと依存関係にあるプラグイン(後述に詳細記述)
[[plugins]]
repo = 'tpope/vim-fugitive'

# 言語ごとのLSPを使用可能にする
[[plugins]]
repo = 'neoclide/coc.nvim'
rev = 'release'
on_i = 1
merged = 0

# ファイル検索用
[[plugins]]
repo = 'junegunn/fzf'
hook_post_update = './install --all'
merged = 0

[[plugins]]
repo = 'junegunn/fzf.vim'
depends = 'fzf'
hook_add = '''
        command! -bang -nargs=* Rg
        \ call fzf#vim#grep(
        \ 'rg --column --line-number --hidden --ignore-case --no-heading --color=always '.shellescape(<q-args>), 1,
        \ <bang>0 ? fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'up:60%')
        \ : fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'right:50%:hidden', '?'),
        \ <bang>0)
        nnoremap <C-g> :Rg<Space>
        nnoremap <silent> FF :Files<CR>
        nnoremap <silent> HH :History<CR>
'''

# IDEのようにディレクトリをツリー構造で表示させる
[[plugins]]
repo = 'preservim/nerdtree'
depends = ['Xuyuanp/nerdtree-git-plugin', 'ryanoasis/vim-devicons']
hook_add = '''
        nmap <C-f> :NERDTreeToggle<CR>
        let g:airline#extensions#tabline#enabled = 1
        autocmd vimenter * NERDTree
'''

# 上記NerdTREEプラグインにgit管理状態を表示させる
[[plugins]]
repo = 'Xuyuanp/nerdtree-git-plugin'

# 上記NerdTREEプラグインに言語ごとにアイコンを表示させる
[[plugins]]
repo = 'ryanoasis/vim-devicons'

# 画面下部のステータスに編集ファイル、ブランチ名、エラーなどをかっこよく表示させる
[[plugins]]
repo = 'vim-airline/vim-airline'
depends =['vim-airline/vim-airline-themes', 'tpope/vim-fugitive']
hook_add = '''
        let g:airline_powerline_fonts = 1
        let g:airline#extensions#tabline#enabled = 1
        let g:airline#extensions#tabline#buffer_nr_show = 1
        let g:airline#extensions#branch#enabled=1
        let g:airline#extensions#hunks#enabled=0
        if !exists('g:airline_symbols')
                let g:airline_symbols = {}
        endif
        let g:airline_section_a = airline#section#create(['mode', 'crypt'])
'''

# 上記airlineのテーマを設定する
[[plugins]]
repo = 'vim-airline/vim-airline-themes'
hook_add = '''
        let g:airline_theme = 'powerlineish'
'''

# インデント表示を可視化
[[plugins]]
repo = 'nathanaelkane/vim-indent-guides'
hook_add = '''
        let g:indent_guides_enable_on_vim_startup = 1
'''

# vimエディタのテーマにSolarizedを使用する
[[plugins]]
repo = 'altercation/vim-colors-solarized'

# 直近のコミットからどの行に変更があったかを表示
[[plugins]]
repo = 'airblade/vim-gitgutter'
hook_add = '''
        set signcolumn=yes
        let g:gitgutter_async = 1
        let g:gitgutter_sign_modified = 'rw'
        highlight GitGutterAdd ctermfg=green
        highlight GitGutterChange ctermfg=yellow
        highlight GitGutterDelete ctermfg=red
        highlight GitGutterChangeDelete ctermfg=yellow
'''

# コメントアウトを簡単にする
# ビジュアルモード時に"?"を入力したら指定範囲がコメントアウト
[[plugins]]
repo = 'tomtom/tcomment_vim'
hook_add = '''
    vnoremap ? :'<,'>TComment<CR>
'''

# {},[]などカッコが色分けされる
[[plugins]]
repo = 'luochen1990/rainbow'
hook_add = '''
        let g:rainbow_active = 1
'''

# ウインドウのリサイズが簡単になる
[[plugins]]
repo = 'simeji/winresizer'
hook_add = '''
        let g:winresizer_vert_resize = 1
        let g:winresizer_horiz_resize = 1
'''

編集(2021/12/31): fzfを使用する際には、HomeBrewfzfをインストールしておく必要があります。ですので、上記tomlファイルへの追加に加えて、brew install fzfも実行しておく必要があります。

あとはVimを再起動すればプラグインがインストールされて、VimがIDEライクなビジュアルになるはずです。


番外編

エラー対処まとめ

  • vim-airline導入したけどブランチ名が表示されない
    こちら最近(2021年12月)導入した自分で発生したので、これから挑戦しようと思われる方は同じものに遭遇されるかもしれません。
    以下の順番で試してもらえれば解決するかと思います。

1. vim-fugitiveをインストールする
こちらvim-airlineと依存関係にあるプラグインです。
重要なのは、vim-airlineの記述よりも上部にvim-fugitiveの記述を書くことです。

tomlファイル
# vim-airlineよりも上部にvim-fugitiveを記載
[[plugins]]
repo = 'tpope/vim-fugitive'

# dependsにvim-fugitiveを記述
[[plugins]]
repo = 'vim-airline/vim-airline'
depends =['vim-airline/vim-airline-themes', 'tpope/vim-fugitive']

2. vim-airlineを最新のコミットからチェックアウトする
まず、.cache/dein/repos/github.com/vim-airline/vim-airlineに移動してください。
インストールして特別なことをしていない限り、masterブランチの最新コミットになっていると思うので、以下コマンドを打って、前のコミットに戻ってください。

git checkout HEAD~1

自分は上記2つを組み合わせたらブランチ名が表示されるようになりました。

Ruby環境構築

**`coc.nvim`を用いた各言語用の拡張機能インストール方法(`coc.nvim`の使い方がわからない場合、先にこちらをお読みください)**

基本的に補完は上記coc.nvimを用いたものを使っています。
まず、coc.nvimの設定方法について紹介していきます。
方法はjsonファイルを使った方法と、:CocInstallコマンドを使った二つの方法があるのでそれぞれ紹介していこうと思います(おそらく両方利用すると思います)。

言語の対応状況はこちらの公式ドキュメントをご覧ください。

  • jsonファイルを使った場合

    1. ~/.config/nvim配下にcoc-settings.jsonファイルを作成
    2. 任意の言語に対応した記述を追加
  • CocIntallコマンドを使った場合

    1. 任意の言語に置き換えて:CocInstall {coc_lsp_name}を打つ

以上です。
:CocList extensionsでインストールされているか一覧が表示されるので確認しましょう。

coc.nvimではsolargraphを使用しているのでそれを使います。
加えて、ifなどの終了を示すendを自動で追加してもらいたいので、vim-endwiseを遅延ロードさせます。

  1. gem install solargraphsolargraph自体をOSにインストールする

  2. :CocInstall coc-solargraphcoc.nvimの拡張機能に追加する

  3. 遅延ロードを設定したtomlファイル内に以下のコードを追加する

    lazy_plugin.toml
    [[plugins]]
    repo = 'tpope/vim-endwise'
    on_ft = ['ruby']
    
    

以上で、Vimエディタ内で補完機能が有効化されているはずです。

C++環境構築

競プロにより本格的に取り組みたいと思い、最近C++を学び始めました。
まだまだ改善の余地はありますが、少なくともコードフォーマット、補完、という最低限のことはできる環境は構築できたので、参考程度にご覧ください(自分自身の備忘録という意味合いが大きいです)。

coc.nvimcclsを使用し、且つフォーマット用にclang-formatを使用します

  1. brew install clang-format cclsを入力

  2. Vim起動時の設定ファイルに以下を追加(ファイル保存時に自動フォーマット)

    "C++のコードフォーマッタの自動実行
    function! s:clang_format()
      let now_line = line(".")
      exec ":%! clang-format"
      exec ":" . now_line
    endfunction
    
    if executable('clang-format')
      augroup cpp_clang_format
        autocmd!
        autocmd BufWrite,FileWritePre,FileAppendPre *.[ch]pp call s:clang_format()
      augroup END
    endif
    
  3. coc-settings.jsonに以下を追加

    "ccls": {
          "command": "ccls",
          "filetypes": ["c", "cc", "cpp", "c++", "objc", "objcpp"],
          "rootPatterns": [".ccls", "compile_commands.json", ".git/", ".hg/"],
          "initializationOptions": {
              "cache": {
               "directory": "/tmp/ccls"
              }
            }
        }
    

以上で、コード補完とフォーマットがC++環境で機能するはずです。

おわりに

まだまだVimを使って日が浅いですが、Vimに慣れるともう抜け出せないのだろうな、というのは感じています。
この記事を読んでVim入門のきっかけとなれば嬉しいです。

間違えている箇所があればコメントいただけると嬉しいです!

拙い文章でしたが、最後までご覧いただきありがとうございました!!

5
7
0

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
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?