Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

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

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

どんな環境を求めたか

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

結局どういう環境にしたか

  • エディタにneovim
  • コンパイラにclang、デバッガにlldb
  • lldbフロントエンドにlldb.nvim
  • C++補完に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するだけ。

$ sudo apt-get install clang lldb

2.neovimをインストール

以下のページを参考にした。
Installing Neovim · neovim/neovim Wiki
dein.vimを使ってみる - Qiita

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

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

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

$ sudo apt-get install neovim
・設定ファイルについて

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

~/.bashrc
export XDG_CONFIG_HOME="$HOME/.config"

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

・プラグインマネージャ導入

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

$ 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を起動するコードを書く

init.vim
"Dein initializationif&compatiblesetnocompatibleendifsetruntimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vimcall dein#begin(expand('~/.vim/dein'))call dein#add('Shougo/dein.vim')"ここに call dein#add('プラグイン名') の行を追加していくcall dein#end()

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

: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で入れておく)

$ pip2 install neovim

・本体の導入

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

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

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を再起動し、以下のコマンドを実行する

: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

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

$ cd ~/.vim/dein/repos/github.com/Valloric/YouCompleteMe
$ python2 ./install.py --clang-completer --system-libclang

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

・補完設定について

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

init.vim
letg: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!


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>