Visual Studio Codeの C/C++ Clang extensionのためのいくらかの設定をすると、Ruby extensionを開発するときに補完が効くようになり、開発が楽になります。
C/C++ Clang - Visual Studio Marketplace
ところでRuby extensionのCFLAGSなどの設定はわりと難しくて、実際のMakefileを読み込んでmakeを実行するのがてっとりばやいです。
というわけで、extconfを起動してMakefileをつくり、そこから必要なマクロを抜き出して .vscode/settings.json
に書きだすためのタスクをつくってみました。
# additional Rake task for "ext/foo" namespace :vscode do desc "Setup Visual Studio Code C/C++ settings (.vscode/setting.json)" task :setup do require "json" require "shellwords" FileUtils.mkdir_p("tmp/vscode") cflags = Dir.chdir("tmp/vscode") do # to create Makefile system("ruby", File.join(__dir__, "ext/foo/extconf.rb")) # Makefile macro to get CFLAGS for editors / IDEs task = "\n\nshow-cflags:\n\t$(ECHO) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS)\n\n" IO.write("Makefile", task, mode: "a") Shellwords.split(`make show-cflags`) end settings = { "clang.cflags" => cflags, "clang.completion.triggerChars" => [ ".", ":", ">", "_" ], } FileUtils.mkdir_p(".vscode") IO.write(".vscode/settings.json", JSON.pretty_generate(settings)) end end
こんな感じで補完が出ます。
しかし、補完が出るのに数秒かかるので思ったほど快適ではない… 😔
追記: Microsoft公式のvscode.cpptoolsだと補完が快適でした。それ用のtaskはこんな感じです。
namespace :vscode do desc "Setup Visual Studio Code C/C++ settings (.vscode/setting.json)" task :setup do require "json" require "shellwords" FileUtils.mkdir_p("tmp/vscode") cflags = Dir.chdir("tmp/vscode") do # to create Makefile system("ruby", *Dir.glob(File.join(__dir__, "ext/**/extconf.rb"))) # Makefile macro to get CFLAGS for editors / IDEs task = "\n\nshow-cflags:\n\t$(ECHO) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS)\n\n" IO.write("Makefile", task, mode: "a") Shellwords.split(`make show-cflags`) end include_path = cflags.select do |flag| flag.start_with?('-I') end.map do |flag| flag.sub(/\A-I/, '') end # http://code.visualstudio.com/docs/languages/cpp configurations = [ { name: "Mac", includePath: include_path, }, { name: "Linux", includePath: include_path, }, { name: "Win32", includePath: include_path, }, ] FileUtils.mkdir_p(".vscode") IO.write(".vscode/c_cpp_properties.json", JSON.pretty_generate(configurations: configurations)) end end