この記事は, はてなブログで公開していた記事の移植版です.
はじめに
(neo)vimでC++を書く時,ROS2のような外部ライブラリはパスを設定しておかないと補完が効きません.
neovim + LanguageClient-neovim (cquery) 環境では, cmake
(or colcon build
)の引数で CMAKE_EXPORT_COMPILE_COMMANDS
をつけた際に生成される compile_commands.json
がプロジェクト下にあるといい感じに補完してくれます.
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=1
生成されるcompile_commands.jsonの例
[
{
"directory": "/path_to_colcon_ws/ros2_ws/build/examples_rclcpp_minimal_publisher",
"command": "/usr/bin/clang++ -I/opt/ros/dashing/include -Wall -Wextra -Wpedantic -std=gnu++14 -o CMakeFiles/publisher_lambda.dir/lambda.cpp.o -c /path_to_colcon_ws/ros2_ws/src/examples/rclcpp/minimal_publisher/lambda.cpp",
"file": "/path_to_colcon_ws/ros2_ws/src/examples/rclcpp/minimal_publisher/lambda.cpp"
},
{
"directory": "/path_to_colcon_ws/ros2_ws/build/examples_rclcpp_minimal_publisher",
"command": "/usr/bin/clang++ -I/opt/ros/dashing/include -Wall -Wextra -Wpedantic -std=gnu++14 -o CMakeFiles/publisher_member_function.dir/member_function.cpp.o -c /path_to_colcon_ws/ros2_ws/src/examples/rclcpp/minimal_publisher/member_function.cpp",
"file": "/path_to_colcon_ws/ros2_ws/src/examples/rclcpp/minimal_publisher/member_function.cpp"
},
{
"directory": "/path_to_colcon_ws/ros2_ws/build/examples_rclcpp_minimal_publisher",
"command": "/usr/bin/clang++ -I/opt/ros/dashing/include -Wall -Wextra -Wpedantic -std=gnu++14 -o CMakeFiles/publisher_not_composable.dir/not_composable.cpp.o -c /path_to_colcon_ws/ros2_ws/src/examples/rclcpp/minimal_publisher/not_composable.cpp",
"file": "/path_to_colcon_ws/ros2_ws/src/examples/rclcpp/minimal_publisher/not_composable.cpp"
}
]

Figure 1. プレビュー
ですが,各パッケージのcompile_commands.jsonは,colcon build
した場所に生成される build/${package name}/ の下に生成されます.そのため,補完を有効にするためには src/${package name}/ の下に持ってくる必要があります [1]. この場合はシンボリックリンクでOK.
以下に置いたのは,そのためのスクリプトです.
コード
スクリプトについて
気が向いたらします.
課題
-
srcディレクトリ下がシンボリックリンクになっていると動作しない(気がする…).
colcon list
で取得できるパッケージのパスがシンボリックリンクの実態のパスを引っ張ってくるため.
おわりに
他に何かいい方法はあるのだろうか…
追記
youtalkさんが同様のものを使いやすいようにインストールコマンドを追加してリリースしてくださっているので,そっちを使う方が楽そうです.
1. vim-lspかcqueryでパスを指定すれば直下にいなくても大丈夫なようですが,各プロジェクトのcompile_commands.jsonのパスを指定するのはメンドイ