чување 235cd4267281dd0aced559345a2960b7a8d8c56f
родитељ 946da4343d10fd27776969a75d2601ae355339f9
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Thu, 24 Mar 2022 22:13:44 +0100
Add cut to paste buffer
Diffstat:
измењених датотека: 5, додавања: 96(+), брисања: 71(-)
diff --git a/TODO b/TODO
@@ -5,7 +5,7 @@
[ ] Replace (patch)
- [ ] Cut
+ [x] Cut
Legend
diff --git a/config.def.h b/config.def.h
@@ -43,6 +43,7 @@ static const char* backup_suffix = "~";
#ifdef SLED_C_GLOBALS
int cancel_close(struct DrawState* state);
+int cut_to_paste(struct DrawState* state);
int enter_command_mode(struct DrawState* state);
int enter_insert_mode(struct DrawState* state);
int erase_backwards(struct DrawState* state);
@@ -154,6 +155,8 @@ static const struct Key global_keys[] = {
.callback = erase_to_start },
{ .ev = { .key = TB_KEY_CTRL_V },
.callback = paste_from_paste },
+ { .ev = { .key = TB_KEY_CTRL_X },
+ .callback = cut_to_paste },
{ .ev = { .key = TB_KEY_CTRL_Y },
.callback = erase_line },
{ .ev = { .key = TB_KEY_CTRL_W },
@@ -249,6 +252,7 @@ static const struct Key command_keys[] = {
{ .ev = { .ch = 'v' }, .callback = toggle_selection },
{ .ev = { .ch = 'W' }, .callback = move_prev_word },
{ .ev = { .ch = 'w' }, .callback = move_next_word },
+ { .ev = { .ch = 'X' }, .callback = cut_to_paste },
{ .ev = { .ch = 'x' }, .callback = erase_forward },
{ .ev = { .ch = 'y' }, .callback = yank_to_paste },
{ .ev = { .ch = 'Z' }, .callback = write_file }
diff --git a/config.h b/config.h
@@ -43,6 +43,7 @@ static const char* backup_suffix = "~";
#ifdef SLED_C_GLOBALS
int cancel_close(struct DrawState* state);
+int cut_to_paste(struct DrawState* state);
int enter_command_mode(struct DrawState* state);
int enter_insert_mode(struct DrawState* state);
int erase_backwards(struct DrawState* state);
@@ -154,6 +155,8 @@ static const struct Key global_keys[] = {
.callback = erase_to_start },
{ .ev = { .key = TB_KEY_CTRL_V },
.callback = paste_from_paste },
+ { .ev = { .key = TB_KEY_CTRL_X },
+ .callback = cut_to_paste },
{ .ev = { .key = TB_KEY_CTRL_Y },
.callback = erase_line },
{ .ev = { .key = TB_KEY_CTRL_W },
@@ -249,6 +252,7 @@ static const struct Key command_keys[] = {
{ .ev = { .ch = 'v' }, .callback = toggle_selection },
{ .ev = { .ch = 'W' }, .callback = move_prev_word },
{ .ev = { .ch = 'w' }, .callback = move_next_word },
+ { .ev = { .ch = 'X' }, .callback = cut_to_paste },
{ .ev = { .ch = 'x' }, .callback = erase_forward },
{ .ev = { .ch = 'y' }, .callback = yank_to_paste },
{ .ev = { .ch = 'Z' }, .callback = write_file }
diff --git a/sled.1.in b/sled.1.in
@@ -115,6 +115,7 @@ _
\fCC-T\fP@Go to next word
\fCC-U\fP@Erase to start of line
\fCC-V\fP@Paste from paste buffer
+\fCC-X\fP@Cut to paste buffer
\fCC-Y\fP@Erase the entire current line
\fCC-W\fP@Erase previous word
.TE
@@ -167,6 +168,7 @@ _
\fCv\fP@Toggle selection mode
\fCW\fP@Go to previous word
\fCw\fP@Go to next word
+\fCX\fP@Cut to paste buffer
\fCx\fP@Erase character under cursor
\fCy\fP@Yank to paste buffer
\fCZ\fP@Write (save) file
diff --git a/sled.c b/sled.c
@@ -73,6 +73,7 @@ int save_file(struct DrawState* state);
void search_dialog_callback(struct DrawState* state);
void simple_insert_line(struct DrawState* state);
void simple_join_lines(struct DrawState* state);
+void simple_yank(struct DrawState* state);
int
clear_selection(struct DrawState* state)
@@ -854,6 +855,16 @@ cancel_close(struct DrawState* state)
}
int
+cut_to_paste(struct DrawState* state)
+{
+ simple_yank(state);
+ erase_selection(state);
+ position_to_selection_start(state);
+ clear_selection(state);
+ return 0;
+}
+
+int
enter_command_mode(struct DrawState* state)
{
if (!state)
@@ -1758,74 +1769,8 @@ simple_join_lines(struct DrawState* state)
state->dirty = 1;
}
-int
-toggle_overwrite(struct DrawState* state)
-{
- state->in_overwrite_mode = !state->in_overwrite_mode;
- if (state->in_overwrite_mode)
- state->in_command_mode = 0;
- return 0;
-}
-
-int
-toggle_selection(struct DrawState* state)
-{
- state->in_selection_mode = !state->in_selection_mode;
- if (state->in_selection_mode)
- {
- state->sel_start_row = state->row;
- state->sel_start_col = state->column;
- state->sel_end_row = state->row;
- state->sel_end_col = state->column;
- }
- else
- {
- state->sel_end_row = state->row;
- state->sel_end_col = state->column;
- }
- return 0;
-}
-
-int
-write_file(struct DrawState* state)
-{
- if (!state)
- return 1;
-
- int result = save_file(state);
- switch (result)
- {
- case SAVE_ERR_CANT_ALLOC:
- strcpy(state->error, errors[ERR_CANT_ALLOC]);
- state->running = 0;
- break;
- case SAVE_ERR_CANT_OPEN_FILE:
- strcpy(state->error, errors[ERR_CANT_SAVE]);
- state->running = 0;
- break;
- case SAVE_ERR_CANT_MOVE_FILE:
- strcpy(state->error, errors[ERR_CANT_MOVE]);
- state->running = 0;
- break;
- case SAVE_ERR_CANT_READLINK:
- case SAVE_ERR_CANT_STAT_FILE:
- case SAVE_ERR_CANT_SYMLINK:
- case SAVE_ERR_CANT_UNLINK:
- strcpy(state->error, strerror(errno));
- state->running = 0;
- break;
- case SAVE_ERR_NONE:
- *state->error = 0;
- state->dirty = 0;
- break;
- default:;
- }
-
- return 0;
-}
-
-int
-yank_to_paste(struct DrawState* state)
+void
+simple_yank(struct DrawState* state)
{
/* Selection start row/col */
int ssr = 0;
@@ -1845,7 +1790,7 @@ yank_to_paste(struct DrawState* state)
state->paste[0].length = 0;
}
clear_selection(state);
- return 0;
+ return;
}
if (state->sel_start_row <= state->sel_end_row)
@@ -1910,9 +1855,79 @@ yank_to_paste(struct DrawState* state)
= u32_strncpy(state->paste[state->paste_count - 1].text,
state->buffer[ser].text, sec + 1);
}
+}
- clear_selection(state);
+int
+toggle_overwrite(struct DrawState* state)
+{
+ state->in_overwrite_mode = !state->in_overwrite_mode;
+ if (state->in_overwrite_mode)
+ state->in_command_mode = 0;
+ return 0;
+}
+
+int
+toggle_selection(struct DrawState* state)
+{
+ state->in_selection_mode = !state->in_selection_mode;
+ if (state->in_selection_mode)
+ {
+ state->sel_start_row = state->row;
+ state->sel_start_col = state->column;
+ state->sel_end_row = state->row;
+ state->sel_end_col = state->column;
+ }
+ else
+ {
+ state->sel_end_row = state->row;
+ state->sel_end_col = state->column;
+ }
+ return 0;
+}
+
+int
+write_file(struct DrawState* state)
+{
+ if (!state)
+ return 1;
+ int result = save_file(state);
+ switch (result)
+ {
+ case SAVE_ERR_CANT_ALLOC:
+ strcpy(state->error, errors[ERR_CANT_ALLOC]);
+ state->running = 0;
+ break;
+ case SAVE_ERR_CANT_OPEN_FILE:
+ strcpy(state->error, errors[ERR_CANT_SAVE]);
+ state->running = 0;
+ break;
+ case SAVE_ERR_CANT_MOVE_FILE:
+ strcpy(state->error, errors[ERR_CANT_MOVE]);
+ state->running = 0;
+ break;
+ case SAVE_ERR_CANT_READLINK:
+ case SAVE_ERR_CANT_STAT_FILE:
+ case SAVE_ERR_CANT_SYMLINK:
+ case SAVE_ERR_CANT_UNLINK:
+ strcpy(state->error, strerror(errno));
+ state->running = 0;
+ break;
+ case SAVE_ERR_NONE:
+ *state->error = 0;
+ state->dirty = 0;
+ break;
+ default:;
+ }
+
+ return 0;
+}
+
+int
+yank_to_paste(struct DrawState* state)
+{
+ simple_yank(state);
+ clear_selection(state);
return 0;
}