LanguageClient-neovimでROS2のC++ソースを補完する


この記事は, はてなブログで公開していた記事の移植版です.

はじめに

(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"
}
]
preview
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のパスを指定するのはメンドイ
ros2  c++