From a6fadcb171270147b35f67813fc66046a68f5359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Skog=C3=B8=20Langvand?= Date: Thu, 2 Sep 2021 22:23:16 +0200 Subject: [PATCH] Added some Emacs-style actions --- src/config.cpp | 5 +++++ src/window.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/src/config.cpp b/src/config.cpp index 2a60103..e0467fb 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -372,6 +372,11 @@ std::string Config::default_config() { "edit_shrink_selection": "a", "edit_show_or_hide": "", "edit_find": "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_clear": "", "source_spellcheck_next_error": "e", diff --git a/src/window.cpp b/src/window.cpp index abb2409..5c975e1 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -748,6 +748,64 @@ void Window::set_menu_actions() { 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", []() { if(auto view = Notebook::get().get_current_view()) { view->remove_spellcheck_errors();