Я пытаюсь использовать оболочку C ++ gtksourceview, я сделал это давным-давно, и я помню, что она работала, но теперь все работает, кроме синтаксиса highlight. И я не совсем уверен, что это такое. Надеюсь, вы мне поможете, я много читал об этой библиотеке в Интернете, но я могу найти решение. Вот простой код. Заранее спасибо.
#include "twindow.h"#include <iostream>
TWindow::TWindow() {
add(m_SourceView);
m_SourceView.set_size_request(640, 480);
m_SourceView.set_show_line_numbers();
m_SourceView.set_tab_width(4);
m_SourceView.set_auto_indent();
m_SourceView.set_show_right_margin();
m_SourceView.set_right_margin_position(80);
m_SourceView.set_highlight_current_line();
m_SourceView.set_smart_home_end(gtksourceview::SOURCE_SMART_HOME_END_ALWAYS);
gtksourceview::init ();
Glib::RefPtr<gtksourceview::SourceBuffer> buffer = m_SourceView.get_source_buffer () ;
if (!buffer) {
std::cerr << "gtksourceview::SourceView::get_source_buffer () failed" << std::endl ;
}
buffer->begin_not_undoable_action();
buffer->set_text(Glib::file_get_contents("main.c"));
buffer->end_not_undoable_action();
buffer->set_highlight_syntax(true);
Glib::RefPtr<gtksourceview::SourceLanguageManager> language_manager = gtksourceview::SourceLanguageManager::create();
Glib::RefPtr<gtksourceview::SourceLanguage> language = gtksourceview::SourceLanguage::create();
language = language_manager->get_language("c");
buffer->set_language(language);
show_all_children();
}
Итак, вы хотите использовать оболочку c ++ из gtksourceview, поэтому я думаю, что вы хотите использовать gtksourceviewmm.
Почему вы создаете LanguageManager
, вы можете использовать по умолчанию.
Если вы используете 3.2 gtksourceviewmm, то посмотрите на документы.
Вы также должны проверить эта функция.
Таким образом, пример будет выглядеть так;
Glib::ustring file_path = "/home/user/whatever/main.c";
Glib::RefPtr<Gsv::LanguageManager> language_manager = Gsv::LanguageManager::get_default();
Glib::RefPtr<Gsv::Language> language = language_manager->guess_language(file_path, Glib::ustring());
Еще одна вещь, которую я хочу упомянуть, это то, что вы должны создать буфер для отображения содержимого файла, так как в моих проектах я получил ошибку сегмента, когда хотел использовать get_source_buffer()
так что, по-видимому, он по умолчанию равен нулю.
Glib::RefPtr<Gsv::Buffer> buffer = Gsv::Buffer::create(language);
buffer->set_text(Glib::get_file_contents(file_path));
this->m_SourceView.set_source_buffer(buffer);