sled

Једноставни уређивач текста
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување c0cf33ffbb2a839895f35b060a3ca23989c68300
родитељ 6fd20578e5b13afc2da8801b722f4f60edc7650e
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Mon, 21 Feb 2022 16:13:15 +0100

Add vi H/L

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
MTODO | 4++--
Mconfig.def.h | 9++++++---
Mconfig.h | 4++++
Mdraw.c | 3+++
Msled.1.in | 3++-
Msled.c | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
измењених датотека: 6, додавања: 80(+), брисања: 6(-)

diff --git a/TODO b/TODO @@ -3,10 +3,10 @@ [ ] Copy/paste? - [ ] Add vi H/L - [ ] Add vi V + [x] Add vi H/L + [x] Allow creating files (error out if directory not writeable, only create file when saving) diff --git a/config.def.h b/config.def.h @@ -55,6 +55,8 @@ int move_page_down(struct DrawState* state); int move_page_up(struct DrawState* state); int move_prev_word(struct DrawState* state); int move_right(struct DrawState* state); +int move_screen_bottom(struct DrawState* state); +int move_screen_top(struct DrawState* state); int move_start(struct DrawState* state); int move_top(struct DrawState* state); int move_up(struct DrawState* state); @@ -172,17 +174,18 @@ static const struct Key command_keys[] = { { .ev = { .ch = ':' }, .callback = show_go_to_line }, { .ev = { .ch = '0' }, .callback = move_start }, { .ev = { .ch = '$' }, .callback = move_end }, + { .ev = { .ch = 'G' }, .callback = move_bottom }, { .ev = { .ch = 'g' }, .callback = move_top }, + { .ev = { .ch = 'H' }, .callback = move_screen_top }, { .ev = { .ch = 'h' }, .callback = move_left }, { .ev = { .ch = 'j' }, .callback = move_down }, { .ev = { .ch = 'k' }, .callback = move_up }, + { .ev = { .ch = 'L' }, .callback = move_screen_bottom }, { .ev = { .ch = 'l' }, .callback = move_right }, { .ev = { .ch = 'q' }, .callback = exit_program }, { .ev = { .ch = 'v' }, .callback = toggle_selection }, - { .ev = { .ch = 'w' }, .callback = move_next_word }, - { .ev = { .ch = 'G' }, .callback = move_bottom }, - { .ev = { .ch = 'H' }, .callback = show_help }, { .ev = { .ch = 'W' }, .callback = move_prev_word } + { .ev = { .ch = 'w' }, .callback = move_next_word }, }; /* clang-format on */ diff --git a/config.h b/config.h @@ -55,6 +55,8 @@ int move_page_down(struct DrawState* state); int move_page_up(struct DrawState* state); int move_prev_word(struct DrawState* state); int move_right(struct DrawState* state); +int move_screen_bottom(struct DrawState* state); +int move_screen_top(struct DrawState* state); int move_start(struct DrawState* state); int move_top(struct DrawState* state); int move_up(struct DrawState* state); @@ -173,9 +175,11 @@ static const struct Key command_keys[] = { { .ev = { .ch = '0' }, .callback = move_start }, { .ev = { .ch = '$' }, .callback = move_end }, { .ev = { .ch = 'g' }, .callback = move_top }, + { .ev = { .ch = 'H' }, .callback = move_screen_top }, { .ev = { .ch = 'h' }, .callback = move_left }, { .ev = { .ch = 'j' }, .callback = move_down }, { .ev = { .ch = 'k' }, .callback = move_up }, + { .ev = { .ch = 'L' }, .callback = move_screen_bottom }, { .ev = { .ch = 'l' }, .callback = move_right }, { .ev = { .ch = 'q' }, .callback = exit_program }, { .ev = { .ch = 'v' }, .callback = toggle_selection }, diff --git a/draw.c b/draw.c @@ -196,6 +196,9 @@ display_length(const struct DrawState* state, uint32_t* buffer, size_t len = 0; uint32_t* pbuf = buffer; + if (!buffer) + return len; + for (size_t i = 0; *pbuf && i < max_index; i++) { pbuf = buffer + i; diff --git a/sled.1.in b/sled.1.in @@ -130,10 +130,11 @@ _ \fC$\fP@Go to end of line \fCG\fP@Go to last line in the file \fCg\fP@Go to first line in the file -\fCH\fP@Show help dialog +\fCH\fP@Go to first line on the screen \fCh\fP@Go to previous character \fCj\fP@Go to next line \fCk\fP@Go to previous line +\fCL\fP@Go to last line on the screen \fCl\fP@Go to next character \fCq\fP@Quit \fCv\fP@Toggle selection mode diff --git a/sled.c b/sled.c @@ -489,6 +489,37 @@ move_top(struct DrawState* state) } int +move_screen_top(struct DrawState* state) +{ + if (state->row == 0) + return 0; + state->row = state->first_shown_row; + if (state->saved_column == -1) + state->saved_column = state->display_column; + size_t dlen = display_length(state, state->buffer[state->row].text, + state->buffer[state->row].length); + if (dlen < state->saved_column) + state->display_column = dlen; + else + state->display_column = state->saved_column; + state->column = buffer_length(state, state->buffer[state->row].text, + state->display_column); + if (state->first_shown_column > state->display_column) + state->first_shown_column = state->display_column; + if (state->first_shown_column + state->maxx - 1 < state->display_column) + state->first_shown_column + = state->display_column - state->maxx + 1; + state->display_column = display_length(state, + state->buffer[state->row].text, state->column); + if (state->in_selection_mode) + { + state->sel_end_row = state->row; + state->sel_end_col = state->column; + } + return 0; +} + +int move_start(struct DrawState* state) { state->column = 0; @@ -648,6 +679,38 @@ move_bottom(struct DrawState* state) } int +move_screen_bottom(struct DrawState* state) +{ + if (state->row == state->rows_count - 1) + return 0; + if (state->first_shown_row + state->maxy - 2 < state->rows_count) + state->row = state->first_shown_row + state->maxy - 2; + if (state->saved_column == -1) + state->saved_column = state->display_column; + size_t dlen = display_length(state, state->buffer[state->row].text, + state->buffer[state->row].length); + if (dlen < state->saved_column) + state->display_column = dlen; + else + state->display_column = state->saved_column; + state->column = buffer_length(state, state->buffer[state->row].text, + state->display_column); + if (state->first_shown_column > state->display_column) + state->first_shown_column = state->display_column; + if (state->first_shown_column + state->maxx - 1 < state->display_column) + state->first_shown_column + = state->display_column - state->maxx + 1; + state->display_column = display_length(state, + state->buffer[state->row].text, state->column); + if (state->in_selection_mode) + { + state->sel_end_row = state->row; + state->sel_end_col = state->column; + } + return 0; +} + +int move_end(struct DrawState* state) { size_t len;