sled

Једноставни уређивач текста
git clone https://git.sr.ht/~strahinja/sled
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување cf2bb3e3a3330ae79f5b71809a52c4e031ad87e2
родитељ 19ced272d9e06c3d24516f0d3e9104c7553f83cb
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sun, 13 Feb 2022 20:24:53 +0100

Add basic movement (g/G/Home/End/PgUp/PgDn)

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

Diffstat:
MTODO | 4+++-
Mconfig.def.h | 2+-
Mconfig.h | 2+-
Mdraw.c | 7+++++--
Msled.c | 224++++++++++++++++++++++++++++++++++---------------------------------------------
измењених датотека: 5, додавања: 107(+), брисања: 132(-)

diff --git a/TODO b/TODO @@ -1,7 +1,9 @@ TODO ==== - [ ] Create a working base by migration from poe + [~] Create a working base by migration from poe + + [ ] Implement "inverse vi mode" Legend diff --git a/config.def.h b/config.def.h @@ -25,7 +25,7 @@ static const struct StatusSegment status_segments[] = { .fg = TB_BLACK, .bg = TB_WHITE, .alignment = LEFT}, - {.format = "%ld/%ld (%ld%%)", + {.format = "%ld:%ld (%ld%%)", .callback = format_position, .fg = TB_WHITE | TB_BOLD, .bg = TB_BLUE, diff --git a/config.h b/config.h @@ -25,7 +25,7 @@ static const struct StatusSegment status_segments[] = { .fg = TB_BLACK, .bg = TB_WHITE, .alignment = LEFT}, - {.format = "%ld/%ld (%ld%%)", + {.format = "%ld:%ld (%ld%%)", .callback = format_position, .fg = TB_WHITE | TB_BOLD, .bg = TB_BLUE, diff --git a/draw.c b/draw.c @@ -484,12 +484,15 @@ draw_screen(const struct DrawState* state) if (current->text) u32_draw_string(0, cy, TEXT_FG, TEXT_BG, current->text, - state->maxx - 2, state->maxx, 1, 1, CENTER, 0, - 0, NULL, 0, 0); + state->maxx, state->maxx, 0, 0, CENTER, 0, 0, + NULL, 0, 0); i++; cy++; } + tb_set_cursor(state->display_column - state->first_shown_column, + state->row - state->first_shown_row); + return state; } diff --git a/sled.c b/sled.c @@ -143,8 +143,9 @@ format_position(char* result, size_t result_size, const char* format, { if (!result) return; - snprintf(result, result_size, format, state->column, state->row, - state->rows_count ? state->row / state->rows_count * 100 : 0); + snprintf(result, result_size, format, state->column + 1, state->row + 1, + state->rows_count ? (state->row * 100) / (state->rows_count - 1) + : 0); } void @@ -530,82 +531,53 @@ paste_paste_buffer_to_input(struct DrawState* state) void move_up(struct DrawState* state) { - /* - if (state->edit_info_focused) - { - if (state->info_first_shown_row > 0) - state->info_first_shown_row--; - return; - } - - if (state->input_row > 0) - state->input_row--; - if (state->input_first_shown_row > state->input_row) - state->input_first_shown_row = state->input_row; + if (state->row > 0) + state->row--; + if (state->first_shown_row > state->row) + state->first_shown_row = state->row; if (state->saved_column == -1) - state->saved_column = state->input_display_column; - size_t dlen = display_length(state, - state->input_buffer[state->input_row].text, - state->input_buffer[state->input_row].length); + 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->input_display_column = dlen; + state->display_column = dlen; else - state->input_display_column = state->saved_column; - state->input_column = input_length(state, - state->input_buffer[state->input_row].text, - state->input_display_column); - if (state->input_first_shown_column > state->input_display_column) - state->input_first_shown_column = state->input_display_column; - if (state->input_first_shown_column + state->edit_width - 4 - < state->input_display_column) - state->input_first_shown_column - = state->input_display_column - state->edit_width + 4; - state->input_display_column = display_length(state, - state->input_buffer[state->input_row].text, - state->input_column); - */ + 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 - 4 < state->display_column) + state->first_shown_column + = state->display_column - state->maxx + 4; + state->display_column = display_length(state, + state->buffer[state->row].text, state->column); } void move_down(struct DrawState* state) { - /* - if (state->edit_info_focused) - { - if (state->info_first_shown_row + (EDIT_HEIGHT - 3) / 2 - < state->info_rows_count) - state->info_first_shown_row++; - return; - } - - if (state->input_row < state->input_rows_count - 1) - state->input_row++; - if (state->input_first_shown_row + (EDIT_HEIGHT - 3) / 2 - < state->input_row) - state->input_first_shown_row - = state->input_row - (EDIT_HEIGHT - 3) / 2; + if (state->row < state->rows_count - 1) + state->row++; + if (state->first_shown_row + (state->maxy - 2) < state->row) + state->first_shown_row = state->row - (state->maxy - 2); if (state->saved_column == -1) - state->saved_column = state->input_display_column; - size_t dlen = display_length(state, - state->input_buffer[state->input_row].text, - state->input_buffer[state->input_row].length); + 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->input_display_column = dlen; + state->display_column = dlen; else - state->input_display_column = state->saved_column; - state->input_column = input_length(state, - state->input_buffer[state->input_row].text, - state->input_display_column); - if (state->input_first_shown_column > state->input_display_column) - state->input_first_shown_column = state->input_display_column; - if (state->input_first_shown_column + state->edit_width - 4 - < state->input_display_column) - state->input_first_shown_column - = state->input_display_column - state->edit_width + 4; - state->input_display_column = display_length(state, - state->input_buffer[state->input_row].text, - state->input_column); - */ + 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 - 4 < state->display_column) + state->first_shown_column + = state->display_column - state->maxx + 4; + state->display_column = display_length(state, + state->buffer[state->row].text, state->column); } void @@ -654,20 +626,20 @@ edit_page_down(struct DrawState* state) } void -move_start(struct DrawState* state) +move_top(struct DrawState* state) { - /* - if (state->edit_info_focused) - { - state->info_first_shown_row = 0; - state->info_first_shown_column = 0; - return; - } + state->row = 0; + state->first_shown_row = 0; - state->input_column = 0; - state->input_display_column = 0; - state->input_first_shown_column = 0; - */ + move_start(state); +} + +void +move_start(struct DrawState* state) +{ + state->column = 0; + state->display_column = 0; + state->first_shown_column = 0; } void @@ -829,29 +801,29 @@ erase_prev_word(struct DrawState* state) } void -move_end(struct DrawState* state) +move_bottom(struct DrawState* state) { - /* - if (state->edit_info_focused) - { - if (state->info_rows_count > (EDIT_HEIGHT - 3) / 2) - state->info_first_shown_row = state->info_rows_count - - (EDIT_HEIGHT - 3) / 2; - state->info_first_shown_column = 0; - return; - } + state->row = state->rows_count - 1; + state->first_shown_row + = state->row > state->maxy ? state->row - state->maxy + 2 : 0; - size_t len = state->input_buffer[state->input_row].length; - state->input_column = len; - size_t dlen = display_length(state, - state->input_buffer[state->input_row].text, - state->input_column); - state->input_display_column = dlen; - if (dlen > state->edit_width - 4) - state->input_first_shown_column = dlen - state->edit_width + 4; + move_start(state); +} + +void +move_end(struct DrawState* state) +{ + size_t len = state->buffer[state->row].length; + size_t dlen; + + state->column = len; + dlen = display_length(state, state->buffer[state->row].text, + state->column); + state->display_column = dlen; + if (dlen > state->maxx - 4) + state->first_shown_column = dlen - state->maxx + 4; else - state->input_first_shown_column = 0; - */ + state->first_shown_column = 0; } void @@ -906,37 +878,31 @@ move_list_end(struct DrawState* state) } void -move_list_page_up(struct DrawState* state) +move_page_up(struct DrawState* state) { - /* - state->error[0] = 0; - if (state->msgid_number > state->maxy - 2) + *state->error = 0; + if (state->row > state->maxy - 2) { - state->msgid_number -= state->maxy - 2; - if (state->msgid_number < state->first_shown_msgid) - state->first_shown_msgid = state->msgid_number; + state->row -= state->maxy - 2; + if (state->row < state->first_shown_row) + state->first_shown_row = state->row; } else - move_list_start(state); - */ + move_top(state); } void -move_list_page_down(struct DrawState* state) +move_page_down(struct DrawState* state) { - /* - state->error[0] = 0; - if (state->msgid_number < state->msgid_count - state->maxy - 2) + *state->error = 0; + if (state->row < state->rows_count - state->maxy - 2) { - state->msgid_number += state->maxy - 2; - if (state->msgid_number - state->first_shown_msgid - > state->maxy - 2) - state->first_shown_msgid - = state->msgid_number - (state->maxy - 2); + state->row += state->maxy - 2; + if (state->row - state->first_shown_row > state->maxy - 2) + state->first_shown_row = state->row - (state->maxy - 2); } else - move_list_end(state); - */ + move_bottom(state); } void @@ -1354,13 +1320,13 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) else if (state->show_help) strcpy(state->error, errors[ERR_DLG_OPEN]); else if (ev->key == TB_KEY_ARROW_DOWN || ev->ch == 'j') - move_list_down(state); + move_down(state); else if (ev->key == TB_KEY_ARROW_UP || ev->ch == 'k') - move_list_up(state); + move_up(state); else if (ev->key == TB_KEY_CTRL_B || ev->key == TB_KEY_PGUP) - move_list_page_up(state); + move_page_up(state); else if (ev->key == TB_KEY_CTRL_F || ev->key == TB_KEY_PGDN) - move_list_page_down(state); + move_page_down(state); else if (ev->key == TB_KEY_CTRL_S || ev->ch == 'w') { if (!state->dirty) @@ -1391,8 +1357,10 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) } else if (ev->key == TB_KEY_CTRL_Z || ev->ch == 'z') ; // toggle_fuzzy(state); - else if (ev->key == TB_KEY_END || ev->ch == 'G') - move_list_end(state); + else if (ev->ch == 'G') + move_bottom(state); + else if (ev->key == TB_KEY_END) + move_end(state); else if (ev->key == TB_KEY_ENTER) { /* @@ -1420,8 +1388,10 @@ handle_key_event(struct tb_event* ev, struct DrawState* state) ; // next_untranslated(state); else if (ev->key == TB_KEY_F9 || ev->ch == 'f') ; // next_fuzzy(state); - else if (ev->key == TB_KEY_HOME || ev->ch == 'g') - move_list_start(state); + else if (ev->ch == 'g') + move_top(state); + else if (ev->key == TB_KEY_HOME) + move_start(state); else strcpy(state->error, errors[ERR_UNKNOWN_KEY]); }