くいでのあるあし

ロボットの研究とか たぶんそのままだと役に立たない

vim-ros とcatkin-toolsの設定

はじめに

ROSをVimでコーディングする際のプラグインとしてtaketwo/vim-rosが挙げられているみたいですgithub.com

このブログでも結構昔に 書いたことがあった様子.忘れてたけれど.

自分の.vimrc には書いてあったけれどまともに使っていませんでした. しかしVimのQuickfixを知り,自分が使っているcatkin-toolsでの設定に気づいたら確かに使えるなぁって思ったのでメモしておくことにしました.

しかしながらこのプラグインはPython2に依存しています. ROS2への以降もそろそろ現実的になったような気がする今日このごろになっては遅い話なので話半分のつもりで書きます.

環境とか

  • Ubuntu16.04
  • sudo apt install vim-nox-py2 でインストールしたVim7.4
  • NeoBundleでVimプラグインを導入
  • catkin-tools

本当はNeoBundleも開発が止まって今はDeinになっているようなのでそっちのほうがいいとは思っています. ただ現在の最新版がVim8以降を対象としていて,それ以前は対応してません. 多分Ubuntu18.04以降だとVim8以降が普通にインストールされるはず.

ROS1でのビルドは流石にみんながindigo以降を使っていると思われるので,

  • catkin_make
  • catkin-tools
  • colcon のどれかを使っているはずです.

個人の感想ですが,taketwo/vim-rosプラグインではcatkin_makeの場合はすんなり動きそうです. colconは試してないので知りません. catkin-toolsはcatkin_make コマンドより,出力の見た目とかサブコマンドの使い勝手が気に入っているので移行して使っているのですが,プラグインに対する設定に注意が要るようです.

(catkin-toolsでは$ catkin build --this のように叩きます)

Vimでの:make とQuickfixのための設定

VimにはQuickfixという情報表示のための一時的なバッファがあり,:makeと合わせて使われています. 正直わたしはVimを雰囲気で使っているので,自分の理解をさらっと述べさせていただくと,

  1. Vim:make でビルドする
  2. (コードをミスって)エラーメッセージが出てきて,それがVimに読み込まれる.
  3. エラーメッセージに対応したQuickfixリストが準備される.リストの対応するところでEnterを押すとその行に飛べる

っていう流れになっているようです.(ちょっと正確でないかも) ctrl+z で端末に戻ってコマンド叩いてビルドしてまたVimに戻るでもいいといえばいいのですが,こっちのが確かに便利な感じです.

taketwo/vim-rosを利用するために,Vimコマンドラインモードでの設定として説明します.

第一段階については,&makeprgという:makeのためのオプションを設定する必要があります. catkin_makeの場合は:set makeprg=catkin_makeです. (:pwdした時にcatkinワークスペースのrootにいるか,:make -C "catkinルートディレクトリ"をする必要があるでしょう.)

caktin-toolsの場合は:set makeprg=catkin\ build です.空白をエスケープしてやる気遣いがあります. またこれに加えて,プラグインの変数を設定する必要があります. この辺で設定するべき変数が記述されています. どうやら,明示的に:let g:ros_build_system = "catkin-tools" としてやる必要があるようです.

これで:makeができるようになります. (ただ,Vimのカレントディレクトリによって自動的に&makeprgに設定した内容に,そこにあるパッケージのみをビルドするオプションが付いたりするようです.)

第二段階では:makeから出力されたエラーメッセージが&errorformatオプションに設定された正規表現を通してVimに読み込まれて,エラー部分のコードの行番号などが解析されているようです. このときcatkin_makeは問題ないのですが,catkin-toolsでは正規表現で読み込まれるメッセージの部分にANSIエスケープシーケンスで太字などの装飾が加えられた状態で出力されます. そのために行番号の解析が上手くいかず,対応するファイルの行番号ジャンプにしくじってしまいます. この装飾はcatkin-toolsではなくコンパイラによって付けられているようなので,コンパイラに対して-fdiagnostics-colorというオプションを設定することで削除します. :make -DCMAKE_CXX_FLAGS="-fdiagnostics-color=never" と一度:makeを叩くときに設定しておくと次回以降に単に:makeと叩いてもcatkin-toolsでは同じ設定が使われます.

catkin_makeの場合はビルドコマンドへのオプションはプラグインの変数経由で渡せるようです.(未確認) :let g:ros_catkin_make_options="-DCMAKE_CXX_FLAGS=\"-fdiagnostics-color=never\"" として設定します(なくていいはずです).必要なら-DCMAKE_BUILD_TYPEなどもここで設定してください.

これまでの設定で,:makeを叩いてエラーが発生した場合は,そのエラーに関するバッファの行までカーソルがジャンプするようになります. 更に:copenを叩いてQuickfixリストを開いて,エラー部分にカーソルを置いてEnterを置くと,同様に対応するバッファの行までカーソルがジャンプするようになります.

おわりに

  • 久々に記事を書いた
  • 文章は相変わらず微妙
  • Python2脱却とROS2移行を考えると悪い内容かもしれない
  • -fdiagnostic-color以外は.vimrcに書いてしまってもいいのかも
  • Vimを知ることは他でも役立つと思う(&errorformatとか知れたのは良かった)
  • そういえばC++でしか試してなかった.