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

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

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

11

Решение

Я использую 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скрипт используется для поиска flags.make файлы в дереве сборки CMake, где CMake хранит свои флаги компиляции. Эти флаги необходимы для того, чтобы SublimeClang знал, где найти ваши включения.

Вот этот сценарий, расположенный под 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
10

Другие решения

Других решений пока нет …

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.