neovim + clang + lldbでC++開発環境構築メモ(自動補完、文法チェック、デバッガフロントエンド)

今までWindowsで開発してたけど、ある理由でlinuxで開発をすることになった
linuxで快適にC++開発がしたくていろいろ試行錯誤して環境構築したので忘れないようにメモ

なお、今回用いた環境はUbuntu 16.04LTSである


###どんな環境を求めたか
- vim上で編集、コンパイル、デバッグが(簡単に)できる
- C++のコード補完もしたい(Intellisenseっぽく)
- デバッグはVisualStudioみたいにソースエディタ上でしたい(ブレークポイント設定とか)

###結局どういう環境にしたか
- エディタにneovim
- コンパイラにclang、デバッガにlldb
- lldbフロントエンドに[lldb.nvim](https://github.com/critiqjo/lldb.nvim)
- C++補完に[YouCompleteMe](https://github.com/Valloric/YouCompleteMe)

###What is neovim?
vimと互換性を保った、新しいエディタ
旧来のvimはベースが古く改修がしづらく、新機能が盛り込めなかったために開発された
内部構造が抜本的に変更され、今までのvimではできなかった様々なことができるようになる
(今回neovimを使ったのもプラグインがnvim専用だったから)

###What is clang & lldb?
clangは、アップルが主導で開発を進めているオープンソースのC/C++,Objective-Cコンパイラ
gccよりもかなり最近に開発され、コンパイルが軽量、ライセンスが緩いなどの特徴がある
lldbはclangでコンパイルされたプログラム用のCUIベースのデバッガ(操作感はgdbに近い)

今回自分がclangを選んだのはVisualStudioでAndroid ndkの開発してた時に手触り感がgccより良かったから


##導入手順
####1.clang,lldbのインストール
普通にapt-getするだけ。

```bash
$ sudo apt-get install clang lldb
```

####2.neovimをインストール
以下のページを参考にした。
[Installing Neovim · neovim/neovim Wiki](https://github.com/neovim/neovim/wiki/Installing-Neovim)
[dein.vimを使ってみる - Qiita](http://qiita.com/yoza/items/2f8bd33a18225754f346)

まずはneovimのリポジトリを追加する。

```bash
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:neovim-ppa/unstable
$ sudo apt-get update
```

追加できたらapt-getでインストールする

```bash
$ sudo apt-get install neovim
```

#####・設定ファイルについて
vimでは起動時に~/.vimrcを読み込んでいたが、
neovimでは、環境変数${XDG_CONFIG_HOME}に格納されたパス内にnvimフォルダを作り、そこのinit.vimを読むらしい。
とりあえず~/.config以下に設定しておく。　~/.bashrcに1行追加する

```bash:~/.bashrc
export XDG_CONFIG_HOME="$HOME/.config"
```

現在のセッションでも同様にexportしておく。これで以後は~/.config/nvim/init.vimを編集すればよい。
(vimと設定を共有したければ~/.vimrcへのsym linkを張っておいてもいいかも)

#####・プラグインマネージャ導入
あとは、プラグインマネージャとしてdeinを簡単に導入しておく
まずはdein.vim本体をcloneする

```bash
$ mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim
$ git clone https://github.com/Shougo/dein.vim.git \
    ~/.vim/dein/repos/github.com/Shougo/dein.vim
```

init.vimにdeinを起動するコードを書く

```vim:init.vim
"Dein initialization
if &compatible
  set nocompatible
endif
set runtimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vim

call dein#begin(expand('~/.vim/dein'))

call dein#add('Shougo/dein.vim')

"ここに　call dein#add('プラグイン名')　の行を追加していく

call dein#end()
```

なお、init.vimにプラグインを追加した後は、nvim上で以下のコマンドを実行しインストールする

```vim
:call dein#install()
```

以上で完了である

####2.lldb.nvimの導入

lldb.vimを導入するにはneovimにpython-clientを入れないといけないらしい。

#####・python-clientの導入
以下のサイトを参考にした。
https://github.com/neovim/python-client

pipを使ってpython2にneovimのパッケージをインストールするだけ。
(pipを入れてなければ`sudo apt-get install python2-pip`で入れておく)

```bash
$ pip2 install neovim
```

####・本体の導入
基本は普通のプラグインと同様に追加すればよいが、一点だけ注意が必要。

まずはinit.vimの`dein#begin`と`dein#end`の間に一行追加する。

```vim:init.vim
call dein#begin(expand('~/.vim/dein'))
"(中略)
call dein#add('critiqjo/lldb.nvim')
"(中略)
call dein#end()
```

neovimを再起動し、`call dein#install()`を実行する

そして重要なのが、インストールの後に**:UpdateRemotePluginsを実行する**ことだ
これはlldb.nvimがRemotePluginをいう新機能を利用していることに起因する

neovimを再起動し、以下のコマンドを実行する

```vim
:UpdateRemotePlugins
```

以上で完了である

#####・使い方について
Youtubeにサンプル動画があった。
https://youtu.be/rd654OxlmQs

- ソースファイルを開いた状態で:LLSession newで、デバッグモードの準備をする
- :LLmode debugでデバッグウィンドウ表示
- あとは:LL {cmd}でコマンドを実行できるので :LL rなり:LL sなり:LL cなりでデバッグ
- ちなみに`:nmap <M-b> <Plug>LLBreakSwitch`とかするとAlt+Bで選択した行のBreakPointの設定ができるらしい。(詳しくは:h lldb-mappings参照)


####3.YouCompleteMeのインストール
以下のサイトを参考にした。
[YouCompleteMe の設定で疲れた - Diary over Finite Fields](http://hikaru515.hatenablog.com/entry/2015/10/25/162530)


まずは、さっきと同様にdeinでリポジトリ`'Valloric/YouCompleteMe'`を追加し、インストールする
YouCompleteMeはC++で動くので、インストール後は以下のようにしてコンパイルする

```bash
$ cd ~/.vim/dein/repos/github.com/Valloric/YouCompleteMe
$ git submodule update --init --recursive
$ python2 ./install.py --clang-completer --system-libclang
```

しばらく待つとコンパイルが完了する

#####・補完設定について
編集中のディレクトリ(もしくは親ディレクトリ)に「.ycm_extra_conf.py」というファイルがあるとそれを補完設定として読み込むらしい
サンプルが同梱されてるのでとりあえずそれをデフォルトに設定しておく。init.vimに一行追加

```vim:init.vim
let g:ycm_global_ycm_extra_conf = '~/.vim/dein/repos/github.com/Valloric/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
```

とりあえずこれでC++を自動で補完してくれるようになる上、文法チェックまでやってくれる。
Intellisenseにも全く引けを取らない出来である。(しかも動作はむしろYCMのほうが速い)
素晴らしい。

##まとめ
linuxでも、かなり高性能な開発環境を(しかも無料で)構築できることが分かった。
みんなもneovim + clang + lldb + lldb-nvim + YouCompleteMeで Let's enjoy!


(追記履歴)
2017.01.15 YouCompleteMeのビルドでgit submodule updateを入れ忘れていたのを修正