Эффективное использование SublimeText с SublimeClang для проектов CMake/С++

Я пытаюсь играть с SublimeText2 уже некоторое время. Хотя очень легко работать с Python в нем почти из коробки, работа с С++ немного сложнее. Я могу создать CMake-сборку script, скопировав и изменив существующий Makefile script, но есть много вещей, которые просто не работают, как в среде с поддержкой CMake, такой как Eclipse CDT. SublimeText 2, похоже, не понимает концепцию отдельного каталога сборки, он также не может получить автозаполнение через SublimeClang, если я включу библиотеки со ссылками на каталоги, добавленные в CMake. SublimeClang продолжает жаловаться на то, что он не может найти библиотеки, и когда я пытаюсь выполнить #include, он даже не может предложить мне автозаполнение стандартных имен заголовков STL, например, алгоритма. Если кто-то выяснит трубопровод, я был бы обязан услышать об этом.

Я задавал этот вопрос ранее в форумах, связанных с общим использованием, где я не получал никакого ответа, поэтому я подумал о его размещении здесь.

Ответ 1

Я использую Sublime Text 2 с CMake и SublimeClang. Я также использую SublimeGDB. Мой каталог сборки находится под [project root]/build. Посмотрите файл моего проекта и посмотрите, поможет ли он вам:

{
    "folders":
    [
        {
            "path": "."
        }
    ],

    "build_systems":
    [
        {
            "name": "Build",
            "cmd": [ "make", "-C", "build" ],
            "file_regex": "/([^/:]+):(\\d+):(\\d+): "
        }
    ],

    "settings":
    {
        "sublimegdb_commandline": "gdb --interpreter=mi myapp",
        "sublimegdb_workingdir": "build",

        "sublimeclang_options" :
        [
            "-Wno-reorder"
        ],
        "sublimeclang_options_script": "${project_path:scripts/compileflags.rb} ${project_path:build}"
    }
}

compileflags.rb script используется для поиска файлов flags.make в дереве сборки CMake, где CMake сохраняет свои флаговые компиляции. Эти флаги необходимы, чтобы SublimeClang знал, где их найти.

Вот что script, расположенное под scripts/:

#!/usr/bin/env ruby

# Searches for a flags.make in a CMake build tree and prints the compile flags.

def search_dir(dir, &block)
    Dir.foreach(dir) do |filename|
        next if (filename == ".") || (filename == "..")
        path ="#{dir}/#{filename}"
        if File.directory?(path)
            search_dir(path, &block)
        else
            search_file(path, &block)
        end
    end
end

def search_file(filename)
    return if File.basename(filename) != "flags.make"

    File.open(filename) do |io|
        io.read.scan(/[a-zA-Z]+_(?:FLAGS|DEFINES)\s*=\s*(.*)$/) do |match|
            yield(match.first.split(/\s+/))
        end
    end
end

root = ARGV.empty? ? Dir.pwd : ARGV[0]
params = to_enum(:search_dir, root).reduce { |a, b| a | b }
puts params