From 2b4eb18d937e365d2376e1880bfda9e595995c74 Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 30 Sep 2015 11:03:14 +0200 Subject: [PATCH 01/11] Improved smart delete key. --- src/source.cc | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/source.cc b/src/source.cc index 76e4a41..3e27c35 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1006,22 +1006,30 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { //"Smart" delete key else if(key->keyval==GDK_KEY_Delete && !get_buffer()->get_has_selection()) { auto insert_iter=get_buffer()->get_insert()->get_iter(); - if(!(insert_iter.starts_line() && insert_iter.ends_line())) { - auto iter=insert_iter; - bool perform_smart_delete=false; - bool first_line=true; - while(*iter==' ' || *iter=='\t' || (first_line && iter.ends_line())) { - if(iter.ends_line()) { + auto iter=insert_iter; + bool perform_smart_delete=false; + if(iter.starts_line() && iter.ends_line()) {} + else if(iter.ends_line() && iter.forward_char()) { + if(!iter.ends_line()) { + bool first_line=true; + while((*iter==' ' || *iter=='\t' || (first_line && iter.ends_line())) && iter.forward_char()) { perform_smart_delete=true; - first_line=false; + if(first_line && iter.ends_line()) + first_line=false; } - if(!iter.forward_char()) { + } + } + else { + while((*iter==' ' || *iter=='\t') && iter.forward_char()) { + perform_smart_delete=true; + if(iter.ends_line()) { + iter.forward_char(); break; } } - if(perform_smart_delete && iter.backward_char()) - get_buffer()->erase(insert_iter, iter); } + if(perform_smart_delete && iter.backward_char()) + get_buffer()->erase(insert_iter, iter); } bool stop=Gsv::View::on_key_press_event(key); From 521bd82bb8e0118067eca522eb732dad25d8cd8a Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 1 Oct 2015 08:41:11 +0200 Subject: [PATCH 02/11] Minor entrybox cleanup, and entry text has now no max size limit. --- src/entrybox.cc | 1 + src/window.cc | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/entrybox.cc b/src/entrybox.cc index 8cfb1d2..a8bbb85 100644 --- a/src/entrybox.cc +++ b/src/entrybox.cc @@ -92,6 +92,7 @@ void EntryBox::clear() { void EntryBox::show() { std::vector focus_chain; for(auto& entry: entries) { + entry.set_max_length(0); lower_box.pack_start(entry, Gtk::PACK_SHRINK); focus_chain.emplace_back(&entry); } diff --git a/src/window.cc b/src/window.cc index 8d2ca5c..364abb4 100644 --- a/src/window.cc +++ b/src/window.cc @@ -741,6 +741,7 @@ void Window::goto_line_entry() { } }); auto entry_it=entry_box.entries.begin(); + entry_it->set_placeholder_text("Line number"); entry_box.buttons.emplace_back("Go to line", [this, entry_it](){ entry_it->activate(); }); @@ -776,6 +777,7 @@ void Window::rename_token_entry() { } }); auto entry_it=entry_box.entries.begin(); + entry_it->set_placeholder_text("New name"); entry_box.buttons.emplace_back("Rename", [this, entry_it](){ entry_it->activate(); }); From 1c7e5762ccb4dc206832c97d7064f12a8d7fba25 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 1 Oct 2015 10:50:25 +0200 Subject: [PATCH 03/11] Fix to clang include on OS X. --- src/source.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index 3e27c35..10f5f85 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1427,7 +1427,7 @@ std::vector Source::ClangViewParse::get_compilation_commands() { if(std::regex_match(clang_version_string, sm, clang_version_regex)) { auto clang_version=sm[1].str(); arguments.emplace_back("-I/usr/lib/clang/"+clang_version+"/include"); - arguments.emplace_back("-I/usr/local/lib/clang/"+clang_version+"/include"); + arguments.emplace_back("-I/usr/local/Cellar/llvm/"+clang_version+"/lib/clang/"+clang_version+"/include"); arguments.emplace_back("-IC:/msys32/mingw32/lib/clang/"+clang_version+"/include"); arguments.emplace_back("-IC:/msys32/mingw64/lib/clang/"+clang_version+"/include"); arguments.emplace_back("-IC:/msys64/mingw32/lib/clang/"+clang_version+"/include"); From d77aed7ab575ad8d6b50c6010b40f85c3396c764 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 2 Oct 2015 10:31:53 +0200 Subject: [PATCH 04/11] Fixed comments within system includes, should now get all brief comments if existing doxygen doc. Small commit, took weeks to figure out... --- src/source.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index 10f5f85..5233984 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1433,7 +1433,7 @@ std::vector Source::ClangViewParse::get_compilation_commands() { arguments.emplace_back("-IC:/msys64/mingw32/lib/clang/"+clang_version+"/include"); arguments.emplace_back("-IC:/msys64/mingw64/lib/clang/"+clang_version+"/include"); } - + arguments.emplace_back("-fretain-comments-from-system-headers"); if(file_path.extension()==".h") //TODO: temporary fix for .h-files (parse as c++) arguments.emplace_back("-xc++"); From c4097eefbd742482360d5e6bcc0652cc81878f40 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 2 Oct 2015 19:07:05 +0200 Subject: [PATCH 05/11] More effective tag_similar_tokens. Especially when sourcemap is turned on (might be an OS X issue only though).. --- src/source.cc | 19 ++++++++++++++++--- src/source.h | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/source.cc b/src/source.cc index 5233984..1115c3d 100644 --- a/src/source.cc +++ b/src/source.cc @@ -2216,16 +2216,29 @@ Source::ClangViewAutocomplete(file_path, project_path, language) { void Source::ClangViewRefactor::tag_similar_tokens(const Token &token) { if(source_readable) { if(token && last_tagged_token!=token) { - get_buffer()->remove_tag(similar_tokens_tag, get_buffer()->begin(), get_buffer()->end()); + for(auto &mark: similar_token_marks) { + get_buffer()->remove_tag(similar_tokens_tag, mark.first->get_iter(), mark.second->get_iter()); + get_buffer()->delete_mark(mark.first); + get_buffer()->delete_mark(mark.second); + } + similar_token_marks.clear(); auto offsets=clang_tokens->get_similar_token_offsets(static_cast(token.type), token.spelling, token.usr); for(auto &offset: offsets) { - get_buffer()->apply_tag(similar_tokens_tag, get_buffer()->get_iter_at_line_index(offset.first.line-1, offset.first.index-1), get_buffer()->get_iter_at_line_index(offset.second.line-1, offset.second.index-1)); + auto start_iter=get_buffer()->get_iter_at_line_index(offset.first.line-1, offset.first.index-1); + auto end_iter=get_buffer()->get_iter_at_line_index(offset.second.line-1, offset.second.index-1); + get_buffer()->apply_tag(similar_tokens_tag, start_iter, end_iter); + similar_token_marks.emplace_back(get_buffer()->create_mark(start_iter), get_buffer()->create_mark(end_iter)); } last_tagged_token=token; } } if(!token && last_tagged_token) { - get_buffer()->remove_tag(similar_tokens_tag, get_buffer()->begin(), get_buffer()->end()); + for(auto &mark: similar_token_marks) { + get_buffer()->remove_tag(similar_tokens_tag, mark.first->get_iter(), mark.second->get_iter()); + get_buffer()->delete_mark(mark.first); + get_buffer()->delete_mark(mark.second); + } + similar_token_marks.clear(); last_tagged_token=Token(); } } diff --git a/src/source.h b/src/source.h index 88c3735..4cb7ece 100644 --- a/src/source.h +++ b/src/source.h @@ -257,6 +257,7 @@ namespace Source { ClangViewRefactor(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language); ~ClangViewRefactor(); private: + std::list, Glib::RefPtr > > similar_token_marks; void tag_similar_tokens(const Token &token); Glib::RefPtr similar_tokens_tag; Token last_tagged_token; From 634a1161844d1dcd54b605d439275bb14e599ee6 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 2 Oct 2015 21:09:11 +0200 Subject: [PATCH 06/11] Now compiles on Ubuntu 14. --- src/source.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index 1115c3d..b5efc4a 100644 --- a/src/source.cc +++ b/src/source.cc @@ -2077,7 +2077,7 @@ bool Source::ClangViewAutocomplete::restart_parse() { Source::ClangViewRefactor::ClangViewRefactor(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language): Source::ClangViewAutocomplete(file_path, project_path, language) { similar_tokens_tag=get_buffer()->create_tag(); - similar_tokens_tag->property_weight()=Pango::WEIGHT_ULTRAHEAVY; + similar_tokens_tag->property_weight()=1000; //TODO: replace with Pango::WEIGHT_ULTRAHEAVY in 2016 or so (when Ubuntu 14 is history) get_buffer()->signal_changed().connect([this]() { if(!renaming && last_tagged_token) { From 8b7ae024faaead83b453ea780aa14d31ad721792 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 3 Oct 2015 00:55:19 +0200 Subject: [PATCH 07/11] Minor fix to similar_tokens_tag at buffer change. --- src/source.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index b5efc4a..4536f16 100644 --- a/src/source.cc +++ b/src/source.cc @@ -2081,7 +2081,12 @@ Source::ClangViewAutocomplete(file_path, project_path, language) { get_buffer()->signal_changed().connect([this]() { if(!renaming && last_tagged_token) { - get_buffer()->remove_tag(similar_tokens_tag, get_buffer()->begin(), get_buffer()->end()); + for(auto &mark: similar_token_marks) { + get_buffer()->remove_tag(similar_tokens_tag, mark.first->get_iter(), mark.second->get_iter()); + get_buffer()->delete_mark(mark.first); + get_buffer()->delete_mark(mark.second); + } + similar_token_marks.clear(); last_tagged_token=Token(); } }); From 00b8a08c9a4ecda0a41b5fc8c96b9b0cc3ee1c33 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 3 Oct 2015 11:43:22 +0200 Subject: [PATCH 08/11] Source map show/hide configuration is now working. --- src/notebook.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/notebook.cc b/src/notebook.cc index 5b09708..e6d138a 100644 --- a/src/notebook.cc +++ b/src/notebook.cc @@ -107,7 +107,6 @@ void Notebook::open(const boost::filesystem::path &file_path) { #if GTK_VERSION_GE(3, 18) source_maps.emplace_back(Glib::wrap(gtk_source_map_new())); - hboxes.back()->pack_end(*source_maps.back(), Gtk::PACK_SHRINK); gtk_source_map_set_view(GTK_SOURCE_MAP(source_maps.back()->gobj()), source_views.back()->gobj()); #endif configure(source_views.size()-1); @@ -146,10 +145,12 @@ void Notebook::configure(int view_nr) { auto source_font_description=Pango::FontDescription(Singleton::Config::source()->font); auto source_map_font_desc=Pango::FontDescription(static_cast(source_font_description.get_family())+" "+Singleton::Config::source()->map_font_size); source_maps.at(view_nr)->override_font(source_map_font_desc); - if(Singleton::Config::source()->show_map) - source_maps.at(view_nr)->show(); - else - source_maps.at(view_nr)->hide(); + if(Singleton::Config::source()->show_map) { + if(hboxes.at(view_nr)->get_children().size()==1) + hboxes.at(view_nr)->pack_end(*source_maps.at(view_nr), Gtk::PACK_SHRINK); + } + else if(hboxes.at(view_nr)->get_children().size()==2) + hboxes.at(view_nr)->remove(*source_maps.at(view_nr)); #endif } From f7d8b9c9e9e3f97efc5f9ea87f2830813d3a285f Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 3 Oct 2015 11:45:48 +0200 Subject: [PATCH 09/11] Improved spellcheck context settings for non-clang files. --- src/source.cc | 15 ++++++++++++--- src/source.h | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/source.cc b/src/source.cc index 4536f16..c9ef005 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1210,13 +1210,16 @@ Source::GenericView::GenericView(const boost::filesystem::path &file_path, Glib: catch(const std::exception &e) { Singleton::terminal()->print("Error: error parsing language file "+language_file.string()+": "+e.what()+'\n'); } - add_keywords(completion_buffer_keywords, pt); + bool has_context_class=false; + parse_language_file(completion_buffer_keywords, has_context_class, pt); + if(!has_context_class) + spellcheck_all=false; completion_words->register_provider(completion_buffer_keywords); } } } -void Source::GenericView::add_keywords(Glib::RefPtr &completion_buffer, const boost::property_tree::ptree &pt) { +void Source::GenericView::parse_language_file(Glib::RefPtr &completion_buffer, bool &has_context_class, const boost::property_tree::ptree &pt) { bool case_insensitive=false; for(auto &node: pt) { if(node.first=="") { @@ -1231,8 +1234,14 @@ void Source::GenericView::add_keywords(Glib::RefPtr &completio completion_buffer->insert_at_cursor(data+'\n'); } } + else if(!has_context_class && node.first=="context") { + auto class_attribute=node.second.get(".class", ""); + auto class_disabled_attribute=node.second.get(".class-disabled", ""); + if(class_attribute.size()>0 || class_disabled_attribute.size()>0) + has_context_class=true; + } try { - add_keywords(completion_buffer, node.second); + parse_language_file(completion_buffer, has_context_class, node.second); } catch(const std::exception &e) { } diff --git a/src/source.h b/src/source.h index 4cb7ece..c69f178 100644 --- a/src/source.h +++ b/src/source.h @@ -171,7 +171,7 @@ namespace Source { public: GenericView(const boost::filesystem::path &file_path, Glib::RefPtr language); - void add_keywords(Glib::RefPtr &completion_buffer, const boost::property_tree::ptree &pt); + void parse_language_file(Glib::RefPtr &completion_buffer, bool &has_context_class, const boost::property_tree::ptree &pt); }; class ClangViewParse : public View { From 50174e5e12450da06ad5ab86df9c9f6d6df8bce5 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 3 Oct 2015 12:11:05 +0200 Subject: [PATCH 10/11] More robust case insensitive search for completion on non-clang files. --- src/source.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index c9ef005..60e8ac0 100644 --- a/src/source.cc +++ b/src/source.cc @@ -1223,7 +1223,9 @@ void Source::GenericView::parse_language_file(Glib::RefPtr &co bool case_insensitive=false; for(auto &node: pt) { if(node.first=="") { - if(static_cast(node.second.data())==" case insensitive ") + auto data=static_cast(node.second.data()); + std::transform(data.begin(), data.end(), data.begin(), ::tolower); + if(data.find("case insensitive")!=std::string::npos) case_insensitive=true; } else if(node.first=="keyword") { From 997f3fc855df94dd2df918dc168868bead9b2186 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 3 Oct 2015 12:25:02 +0200 Subject: [PATCH 11/11] Fixed a bug where renamed tokens remained bold. --- src/source.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/source.cc b/src/source.cc index 60e8ac0..224ddb6 100644 --- a/src/source.cc +++ b/src/source.cc @@ -2136,7 +2136,7 @@ Source::ClangViewAutocomplete(file_path, project_path, language) { for(auto &mark: marks) { renaming=true; get_buffer()->erase(mark.first->get_iter(), mark.second->get_iter()); - get_buffer()->insert_with_tag(mark.first->get_iter(), text, similar_tokens_tag); + get_buffer()->insert(mark.first->get_iter(), text); get_buffer()->delete_mark(mark.first); get_buffer()->delete_mark(mark.second); }