Compare commits

...

5 Commits

  1. 9
      docs/language_servers.md
  2. 5
      src/config.cpp
  3. 2
      src/source_clang.cpp
  4. 14
      src/source_language_protocol.cpp
  5. 58
      src/window.cpp

9
docs/language_servers.md

@ -182,12 +182,13 @@ chmod 755 /usr/local/bin/glsl-language-server
**Note that we recommend using the builtin C/C++ support in juCi++ instead.** **Note that we recommend using the builtin C/C++ support in juCi++ instead.**
- Prerequisites: - Prerequisites:
- A language server installed on your system, for example clangd or ccls - A C/C++ language server installed on your system, for example clangd
Create symbolic link to enable language server in juCi++. For example, if you have the clangd Create executable to enable server in juCi++:
installed and available on path:
```sh ```sh
# Usually as root: # Usually as root:
ln -s `which clangd` /usr/local/bin/clang-language-server echo '#!/bin/sh
clangd' > /usr/local/bin/clang-language-server
chmod 755 /usr/local/bin/clang-language-server
``` ```

5
src/config.cpp

@ -391,6 +391,11 @@ std::string Config::default_config() {
"edit_shrink_selection": "<primary><shift><alt>a", "edit_shrink_selection": "<primary><shift><alt>a",
"edit_show_or_hide": "", "edit_show_or_hide": "",
"edit_find": "<primary>f", "edit_find": "<primary>f",
"edit_go_to_beginning_of_line": "",
"edit_go_to_end_of_line": "",
"edit_go_to_previous_line": "",
"edit_go_to_next_line": "",
"edit_insert_line": "",
"source_spellcheck": "", "source_spellcheck": "",
"source_spellcheck_clear": "", "source_spellcheck_clear": "",
"source_spellcheck_next_error": "<primary><shift>e", "source_spellcheck_next_error": "<primary><shift>e",

2
src/source_clang.cpp

@ -893,7 +893,7 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
autocomplete.is_restart_key = [this](guint keyval) { autocomplete.is_restart_key = [this](guint keyval) {
auto iter = get_buffer()->get_insert()->get_iter(); auto iter = get_buffer()->get_insert()->get_iter();
iter.backward_chars(2); iter.backward_chars(2);
if(keyval == '.' || (keyval == ':' && *iter == ':') || (keyval == '>' && *iter == '-')) if(keyval == '.' || (*iter == ':' && keyval == ':') || (*iter == '-' && keyval == '>'))
return true; return true;
return false; return false;
}; };

14
src/source_language_protocol.cpp

@ -1610,7 +1610,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
autocomplete->is_restart_key = [this](guint keyval) { autocomplete->is_restart_key = [this](guint keyval) {
auto iter = get_buffer()->get_insert()->get_iter(); auto iter = get_buffer()->get_insert()->get_iter();
iter.backward_chars(2); iter.backward_chars(2);
if(keyval == '.' || (keyval == ':' && *iter == ':')) if(keyval == '.' || (*iter == ':' && keyval == ':') || (*iter == '-' && keyval == '>'))
return true; return true;
return false; return false;
}; };
@ -1657,7 +1657,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
} }
return true; return true;
} }
else if(prevprev.backward_char() && *prevprev == ':' && *prev == ':') { else if(prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>'))) {
{ {
LockGuard lock(autocomplete->prefix_mutex); LockGuard lock(autocomplete->prefix_mutex);
autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end); autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end);
@ -1689,7 +1689,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end); autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end);
} }
auto prevprev = prev; auto prevprev = prev;
autocomplete_enable_snippets = !(*prev == '.' || (prevprev.backward_char() && *prevprev == ':' && *prev == ':')); autocomplete_enable_snippets = !(*prev == '.' || (prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>'))));
return true; return true;
} }
@ -1808,7 +1808,13 @@ void Source::LanguageProtocolView::setup_autocomplete() {
prefix = autocomplete->prefix; prefix = autocomplete->prefix;
} }
for(auto &item : items) { for(auto &item : items) {
auto label = item.string_or("label", ""); auto label = item.string_or("filterText", item.string_or("label", ""));
if(!label.empty()) {
if(starts_with(label, "."))
label.erase(0, 1);
else if(starts_with(label, "::") || starts_with(label, "->"))
label.erase(0, 2);
}
if(starts_with(label, prefix)) { if(starts_with(label, prefix)) {
auto detail = item.string_or("detail", ""); auto detail = item.string_or("detail", "");
LanguageProtocol::Documentation documentation(item.child_optional("documentation")); LanguageProtocol::Documentation documentation(item.child_optional("documentation"));

58
src/window.cpp

@ -754,6 +754,64 @@ void Window::set_menu_actions() {
search_and_replace_entry(); search_and_replace_entry();
}); });
menu.add_action("edit_go_to_beginning_of_line", []() {
if(auto view = Notebook::get().get_current_view()) {
auto buffer = view->get_buffer();
auto iter = buffer->get_insert()->get_iter();
// If we're already at the beginning of the line, move to
// first character excluding spaces.
if(iter.starts_line())
while(iter.get_char() == 0x20)
iter.forward_char();
else if(iter.backward_line())
iter.forward_line();
buffer->place_cursor(iter);
}
});
menu.add_action("edit_go_to_end_of_line", []() {
if(auto view = Notebook::get().get_current_view()) {
auto buffer = view->get_buffer();
auto iter = buffer->get_insert()->get_iter();
if(!iter.ends_line()) {
iter.forward_to_line_end();
buffer->place_cursor(iter);
}
}
});
menu.add_action("edit_go_to_previous_line", []() {
if(auto view = Notebook::get().get_current_view()) {
auto buffer = view->get_buffer();
auto iter = buffer->get_insert()->get_iter();
int offset = iter.get_visible_line_offset();
if(iter.backward_line()) {
int length = iter.get_chars_in_line();
iter.set_visible_line_offset(length < offset ? length : offset);
}
buffer->place_cursor(iter);
}
});
menu.add_action("edit_go_to_next_line", []() {
if(auto view = Notebook::get().get_current_view()) {
auto buffer = view->get_buffer();
auto iter = buffer->get_insert()->get_iter();
int offset = iter.get_visible_line_offset();
if(iter.forward_line()) {
int length = iter.get_chars_in_line();
iter.set_visible_line_offset(length < offset ? length : offset);
}
buffer->place_cursor(iter);
}
});
menu.add_action("edit_insert_line", []() {
if(auto view = Notebook::get().get_current_view()) {
auto buffer = view->get_buffer();
auto iter = buffer->get_insert()->get_iter();
if(iter.forward_line())
buffer->insert(iter, "\n");
}
});
menu.add_action("source_spellcheck", []() { menu.add_action("source_spellcheck", []() {
if(auto view = Notebook::get().get_current_view()) { if(auto view = Notebook::get().get_current_view()) {
view->remove_spellcheck_errors(); view->remove_spellcheck_errors();

Loading…
Cancel
Save