чување 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:
измењених датотека: 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;