sled

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

чување 235cd4267281dd0aced559345a2960b7a8d8c56f
родитељ 946da4343d10fd27776969a75d2601ae355339f9
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Thu, 24 Mar 2022 22:13:44 +0100

Add cut to paste buffer

Diffstat:
MTODO | 2+-
Mconfig.def.h | 4++++
Mconfig.h | 4++++
Msled.1.in | 2++
Msled.c | 155+++++++++++++++++++++++++++++++++++++++++++------------------------------------
измењених датотека: 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; }