vim のコード補完プラグインYouCompleteMe クイックインストールガイド

# クイックリンク
- [vim-plug を使う場合のインストール手順](https://qiita.com/TsutomuNakamura/items/2fc8aa6c0feaf31c86e4#vim-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%A2%BA%E8%AA%8D "vim-plug を使う場合のインストール手順")
- [Vundle を使う場合のインストール手順](https://qiita.com/TsutomuNakamura/items/2fc8aa6c0feaf31c86e4#%E3%81%8A%E3%81%BE%E3%81%91-vundle-%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88 "Vundle を使う場合のインストール手順")
- [pathogen を使う場合のインストール手順](https://qiita.com/TsutomuNakamura/items/2fc8aa6c0feaf31c86e4#%E3%81%8A%E3%81%BE%E3%81%91-pathogen-%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88 "pathogen を使う場合のインストール手順")

# YouCompleteMe とは
vim のためのコード補完プラグインです。
YouCompleteMe を使うとEclipse やIDEA のようにリアルタイムにコードの候補を検索して以下の画面のように入力の手助けをしてくれるようになります。
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">vim のYouComplemeMe でここまでできるようになった。画面上側に説明が出てきてエディタ部分が下がってしまったりと、まだ調整すべきところはあるけど、とりあえず進捗は出せた🤩 <a href="https://t.co/50hLj80rzx">pic.twitter.com/50hLj80rzx</a></p>&mdash; tsutomu (@tsuna0x00) <a href="https://twitter.com/tsuna0x00/status/1053603945443028992?ref_src=twsrc%5Etfw">October 20, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# YouCompleteMe クイックインストール 
YouCompleteMe のGitHub リポジトリを見ると結構ドキュメントがいっぱい…そこで、みなさんがよく使うであろうMac 及び主要なLinux ディストリビューション上で、簡単にYouCompleteMe が使えるように、またあやたが普段使用している.vimrc に簡単に導入できるよう、可能な限り少ない設定内容且つコマンドでインストールできるようまとめてみました。

## vim バージョンとコンパイルオプションの確認 

```console:vimversion確認
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Apr 10 2018 21:31:58)
Included patches: 1-1453
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge version with GTK2 GUI.  Features included (+) or not (-):
+acl               +farsi             +mouse_sgr         -tag_any_white
......
+comments          +libcall           -python            +vreplace
+conceal           +linebreak         +python3           +wildignore    <- Python 3 サポートあり
+cryptv            +lispindent        +quickfix          +wildmenu
......
```

python のサポートについてはvim を開いて以下のコマンドを実行して、1 が表示されるかどうかで確認することもできます。

```text:vimを開いて確認する方法
:echo has('python') || has('python3')
```

Ubuntu 16.04 以降、Fedora 27 以降であれば最新版でインストールされたvim を使うことで条件を満たせます。
それ以外の場合はvim をソースコードからコンパイルする必要があります。

- vim をソースコードからコンパイルする
    - https://github.com/Valloric/YouCompleteMe/wiki/Building-Vim-from-source

## YouCompleteMe に依存するパッケージ類のインストール 
YCM をコンパイルするためにコンパイラ cmake 等の必要なパッケージをインストールします。

```console:Mac
$ brew install cmake
```

※Mac の場合は事前にMacVim もインストールしておいてください。
https://stackoverflow.com/a/21012284

```console:Ubuntu18.04
$ sudo apt-get install -y build-essential cmake python3-dev libclang-dev
```

```console:Fedora28
$ sudo dnf install cmake gcc-c++ make python3-devel
```

```console:Arch
$ sudo pacman -Sy cmake gcc make python3 clang
```

今回はvim のパッケージマネージャとしてvim-plug を使っていることを想定しています。
vim-plug のインストール

```console
$ curl -fLo "${HOME}/.vim/autoload/plug.vim" --create-dirs "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim"
```

以下記述を.vimrc に追加します。

```text:~/.vimrc
call plug#begin('~/.vim/plugged')
Plug 'Valloric/YouCompleteMe'
call plug#end()
let g:ycm_global_ycm_extra_conf = '${HOME}/.ycm_extra_conf.py'
let g:ycm_auto_trigger = 1
let g:ycm_min_num_of_chars_for_completion = 3
let g:ycm_autoclose_preview_window_after_insertion = 1
set splitbelow
```

上記YouCompleteMe のオプションの簡単な説明は以下のとおりです。

* オプション説明
<table><tbody>
  <tr>
    <th> オプション</th>
    <th> 説明</th>
  </tr>
  <tr>
    <td> g:ycm_global_ycm_extra_conf</td>
    <td> CやC++ 等のコンパイルに関するオプション等が定義してあるpython スクリプトを指定します</td>
  </tr>
  <tr>
    <td> g:ycm_auto_trigger</td>
    <td> YouCompleteMe を自動的に起動するかどうかを設定します。1 を設定すると自動起動するようになります</td>
  </tr>
  <tr>
    <td> g:ycm_min_num_of_chars_for_completion</td>
    <td> 識別子補完機能が起動するのに、ユーザが入力していなければならない文字数の最小</td>
  </tr>
  <tr>
    <td> g:ycm_autoclose_preview_window_after_insertion</td>
    <td> 1 に設定すると、vim のインサートモードを抜けた後にプレビューウィンドウを自動的に閉じるようになります。</td>
  </tr>
</tbody></table>

なお、`set splitbelow` については補完機能が起動して関数や変数の説明が表示されるとき、その説明ウィンドウが下に表示されるようにするためのオプションです。
その他のオプションについては公式のGitHub サイトに載っていますので、そちらを参考にしてください。

- YouCompleteMe オプション
    - https://github.com/Valloric/YouCompleteMe#options

## .ycm_extra_conf.py ファイルの準備 
YouCompleteMe ではC 言語系のソースコードを編集しているときにリアルタイムにコンパイルエラー等を検知してユーザに知らせることができます。
そのC 語系のソースコードをコンパイルするときのルールオプションを指定するファイル`.ycm_extra_conf.py` を準備します。

今回は`https://github.com/Valloric/ycmd` GitHub リポジトリ内のそれを使わせていただくことにします。

```console:.ycm_extra_conf.pyの準備
$ curl -fLo "${HOME}/.ycm_extra_conf.py" "https://raw.githubusercontent.com/Valloric/ycmd/master/.ycm_extra_conf.py"
```

準備ができたら、次はYouCompleteMe をインストールします。
今回はパッケージマネージャとしてvim-plug を使う場合を例に進めていきます。その他Vundle やpathogen を使った例は本記事の最後に載せておきますので参考になればと思います。

```console:YouCompleteMeインストール
$ vim +PlugInstall +"sleep 1000m" +qall
$ cd ~/.vim/plugged/YouCompleteMe
$ python3 install.py --clang-completer --system-libclang
```

以上でインストールは完了です。
試しに簡単なプログラムを書いてvim の補完が効くか確かめてみましょう。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">お、MacVim でもYouCompleteMe 動かせた。手順はメモっておこうφ(□□ﾍ) <a href="https://t.co/rVddPlAAch">pic.twitter.com/rVddPlAAch</a></p>&mdash; tsutomu (@tsuna0x00) <a href="https://twitter.com/tsuna0x00/status/1056042212075626496?ref_src=twsrc%5Etfw">October 27, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

YouCompleteMe でvim によるハッピーなプログラミングを加速させましょう!!

## おまけ: Vundle を使う場合 
vim-plug の場合との違いは主にVundle の仕様による部分がほとんどですので、細かい説明は割愛させていただきます。
備忘録としてインストールコマンドのみを貼り付けておきます。

```console:Vundleを使う場合のインストール
$ cd "${HOME}"
$ sudo apt-get install -y build-essential cmake python3-dev libclang-dev
$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
$ cat << EOF > .vimrc
> set rtp+=~/.vim/bundle/Vundle.vim
> call vundle#begin()
> Plugin 'VundleVim/Vundle.vim'
> Plugin 'Valloric/YouCompleteMe'
> call vundle#end()
> filetype plugin indent on
> 
> let g:ycm_global_ycm_extra_conf = '${HOME}/.ycm_extra_conf.py'
> let g:ycm_auto_trigger = 1
> let g:ycm_min_num_of_chars_for_completion = 3
> let g:ycm_autoclose_preview_window_after_insertion = 1
> set splitbelow
> EOF

$ curl -fLo "${HOME}/.ycm_extra_conf.py" "https://raw.githubusercontent.com/ramkalath/config_files/master/nvim/.ycm_extra_conf.py"
$ vim +PluginInstall +"sleep 1000m" +qall
$ cd .vim/bundle/YouCompleteMe/
$ python3 install.py --clang-completer --system-libclang
```

## おまけ: pathogen を使う場合 
vim-plug の場合との違いは主にpathogen の仕様による部分がほとんどですので、細かい説明は割愛させていただきます。
備忘録としてインストールコマンドのみを貼り付けておきます。

```console:pathogenを使う場合のインストール
$ cd "${HOME}"
$ sudo apt-get install -y build-essential cmake python3-dev libclang-dev
$ curl -fLo ./.vim/autoload/pathogen.vim --create-dirs https://tpo.pe/pathogen.vim

$ cat << EOF > .vimrc
> execute pathogen#infect()
>
> let g:ycm_global_ycm_extra_conf = '${HOME}/.ycm_extra_conf.py'
> let g:ycm_auto_trigger = 1
> let g:ycm_min_num_of_chars_for_completion = 3
> let g:ycm_autoclose_preview_window_after_insertion = 1
> set splitbelow
> EOF

$ curl -fLo "${HOME}/.ycm_extra_conf.py" "https://raw.githubusercontent.com/ramkalath/config_files/master/nvim/.ycm_extra_conf.py"
$ git clone https://github.com/Valloric/YouCompleteMe .vim/bundle/YouCompleteMe
$ cd .vim/bundle/YouCompleteMe/
$ git submodule update --init --recursive
$ python3 install.py --clang-completer --system-libclang
```

## 参考 
- GitHub Valloric/YouCompleteMe
    - https://github.com/Valloric/YouCompleteMe

- GitHub rdnetto/YCM-Generator
    - https://github.com/rdnetto/YCM-Generator

- script to setup vim, youcompleteme, ultisnips
    - https://www.youtube.com/watch?v=izDCeDhzXyg