From bbea5f5b44b44a0efd8aed42bd643b1acc302fbb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gergely=20Sz=C3=A1sz?= Date: Wed, 25 Apr 2012 11:45:37 +0400 Subject: [PATCH] Ticket #1480 (home/end keys enchencement) The Home key go to the first column on first press, and after second press go to the beginning of non-whitespace char. The End key go to the last column on first press, and after second press go to the end of non-whitespace char. Signed-off-by: Ilia Maslakov --- src/editor/edit-impl.h | 2 ++ src/editor/edit.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/editor/edit-impl.h b/src/editor/edit-impl.h index 9b965fb58..7d004b63e 100644 --- a/src/editor/edit-impl.h +++ b/src/editor/edit-impl.h @@ -200,7 +200,9 @@ void edit_move_down (WEdit * edit, unsigned long i, int scroll); void edit_move_to_prev_col (WEdit * edit, long p); int edit_get_col (WEdit * edit); long edit_bol (WEdit * edit, long current); +long edit_bol_var (WEdit * edit, long current); long edit_eol (WEdit * edit, long current); +long edit_eol_var (WEdit * edit, long current); void edit_update_curs_row (WEdit * edit); void edit_update_curs_col (WEdit * edit); void edit_find_bracket (WEdit * edit); diff --git a/src/editor/edit.c b/src/editor/edit.c index 87791d60a..091aa686c 100644 --- a/src/editor/edit.c +++ b/src/editor/edit.c @@ -1044,7 +1044,7 @@ edit_move_to_bottom (WEdit * edit) static void edit_cursor_to_bol (WEdit * edit) { - edit_cursor_move (edit, edit_bol (edit, edit->curs1) - edit->curs1); + edit_cursor_move (edit, edit_bol_var (edit, edit->curs1) - edit->curs1); edit->search_start = edit->curs1; edit->prev_col = edit_get_col (edit); edit->over_col = 0; @@ -1056,7 +1056,7 @@ edit_cursor_to_bol (WEdit * edit) static void edit_cursor_to_eol (WEdit * edit) { - edit_cursor_move (edit, edit_eol (edit, edit->curs1) - edit->curs1); + edit_cursor_move (edit, edit_eol_var (edit, edit->curs1) - edit->curs1); edit->search_start = edit->curs1; edit->prev_col = edit_get_col (edit); edit->over_col = 0; @@ -2469,6 +2469,53 @@ edit_set_codeset (WEdit * edit) #endif } +/* returns index of first char on line or the first nonspace char */ +long +edit_bol_var (WEdit * edit, long current) +{ + long tmp; + int b; + + if (current < 0) + current = 0; + + if (edit_get_byte (edit, current - 1) != '\n') /* not at BOL */ + return edit_bol (edit, current); + + if (edit_get_byte (edit, current) == '\n') /* on an empty line */ + return current; + + for (tmp = current; (b = edit_get_byte (edit, tmp)) != '\n'; tmp++) + { + if (b != ' ' && b != '\t') + return tmp; + } + return current; +} + +/* returns index of last char on line or the last nonspace char */ +long +edit_eol_var (WEdit * edit, long current) +{ + long tmp; + int b; + + if (current >= edit->last_byte) + current = edit->last_byte; + + if (edit_get_byte (edit, current) != '\n') /* not at BOL */ + return edit_eol (edit, current); + + if (edit_get_byte (edit, current - 1) == '\n') /* on an empty line */ + return current; + + for (tmp = current - 1; (b = edit_get_byte (edit, tmp)) != '\n'; tmp--) + { + if (b != ' ' && b != '\t') + return tmp + 1; + } + return current; +} /* --------------------------------------------------------------------------------------------- */ /** -- 2.11.4.GIT