sled

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

чување 1021a3f538bcb0dd6c1633e78bb64ea28d9f0f4c
родитељ 987ff09dc98949a895d4e7e840bc8719cc35cbe8
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sun, 27 Feb 2022 00:57:29 +0100

New key: C-W -> erase previous word

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

Diffstat:
Mconfig.def.h | 3+++
Mconfig.h | 3+++
Msled.1.in | 1+
Msled.c | 62+++++++++++++++++++++++++++++++-------------------------------
измењених датотека: 4, додавања: 38(+), брисања: 31(-)

diff --git a/config.def.h b/config.def.h @@ -43,6 +43,7 @@ int enter_insert_mode(struct DrawState* state); int erase_backwards(struct DrawState* state); int erase_forward(struct DrawState* state); int erase_line(struct DrawState* state); +int erase_prev_word(struct DrawState* state); int erase_to_end(struct DrawState* state); int erase_to_start(struct DrawState* state); int exit_program(struct DrawState* state); @@ -140,6 +141,8 @@ static const struct Key global_keys[] = { .callback = paste_from_paste }, { .ev = { .key = TB_KEY_CTRL_Y }, .callback = erase_line }, + { .ev = { .key = TB_KEY_CTRL_W }, + .callback = erase_prev_word }, { .ev = { .key = TB_KEY_DELETE }, .callback = erase_forward }, { .ev = { .key = TB_KEY_F1 }, .callback = show_help }, diff --git a/config.h b/config.h @@ -43,6 +43,7 @@ int enter_insert_mode(struct DrawState* state); int erase_backwards(struct DrawState* state); int erase_forward(struct DrawState* state); int erase_line(struct DrawState* state); +int erase_prev_word(struct DrawState* state); int erase_to_end(struct DrawState* state); int erase_to_start(struct DrawState* state); int exit_program(struct DrawState* state); @@ -140,6 +141,8 @@ static const struct Key global_keys[] = { .callback = paste_from_paste }, { .ev = { .key = TB_KEY_CTRL_Y }, .callback = erase_line }, + { .ev = { .key = TB_KEY_CTRL_W }, + .callback = erase_prev_word }, { .ev = { .key = TB_KEY_DELETE }, .callback = erase_forward }, { .ev = { .key = TB_KEY_F1 }, .callback = show_help }, diff --git a/sled.1.in b/sled.1.in @@ -110,6 +110,7 @@ _ \fCC-U\fP@Erase to start of line \fCC-V\fP@Paste from paste buffer \fCC-Y\fP@Erase the entire current line +\fCC-W\fP@Erase previous word .TE . .sp 1 diff --git a/sled.c b/sled.c @@ -814,6 +814,37 @@ erase_line(struct DrawState* state) } int +erase_prev_word(struct DrawState* state) +{ + int i = state->column; + struct BufferLine* current = NULL; + int d; + + current = state->buffer + state->row; + + if (i > 0 && u32_is_word_boundary(current->text[i - 1], 0)) + i--; + while (i > 0 && u32_is_word_boundary(current->text[i], 0)) + i--; + while (i > 0 && !u32_is_word_boundary(current->text[i], 0) + && !u32_is_word_boundary(current->text[i - 1], 0)) + i--; + + d = state->column - i; + + for (int j = i; j < current->length - d; j++) + current->text[j] = current->text[j + d]; + + current->length -= d; + current->text[current->length] = 0; + state->column = i; + state->display_column + = display_length(state, current->text, state->column); + state->dirty = 1; + return 0; +} + +int erase_to_end(struct DrawState* state) { struct BufferLine* buffer_line = &state->buffer[state->row]; @@ -1978,37 +2009,6 @@ go_to_line_callback(struct DrawState* state) } int -erase_prev_word(struct DrawState* state) -{ - int i = state->column; - size_t len = state->buffer[state->row].length; - - uint32_t* pline = state->buffer[state->row].text; - - if (i > 0 && u32_is_word_boundary(pline[i - 1], 0)) - i--; - while (i > 0 && u32_is_word_boundary(pline[i], 0)) - i--; - while (i > 0 && !u32_is_word_boundary(pline[i], 0) - && !u32_is_word_boundary(pline[i - 1], 0)) - i--; - - int d = state->column - i; - - for (int j = i; j < len - d; j++) - pline[j] = pline[j + d]; - - len -= d; - state->buffer[state->row].length = len; - pline[len] = 0; - state->column = i; - state->display_column = display_length(state, - state->buffer[state->row].text, state->column); - state->dirty = 1; - return 0; -} - -int main(int argc, char** argv) { struct tb_event ev;