чување c0cf33ffbb2a839895f35b060a3ca23989c68300
родитељ 6fd20578e5b13afc2da8801b722f4f60edc7650e
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Mon, 21 Feb 2022 16:13:15 +0100
Add vi H/L
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
измењених датотека: 6, додавања: 80(+), брисања: 6(-)
diff --git a/TODO b/TODO
@@ -3,10 +3,10 @@
[ ] Copy/paste?
- [ ] Add vi H/L
-
[ ] Add vi V
+ [x] Add vi H/L
+
[x] Allow creating files (error out if directory not writeable, only
create file when saving)
diff --git a/config.def.h b/config.def.h
@@ -55,6 +55,8 @@ int move_page_down(struct DrawState* state);
int move_page_up(struct DrawState* state);
int move_prev_word(struct DrawState* state);
int move_right(struct DrawState* state);
+int move_screen_bottom(struct DrawState* state);
+int move_screen_top(struct DrawState* state);
int move_start(struct DrawState* state);
int move_top(struct DrawState* state);
int move_up(struct DrawState* state);
@@ -172,17 +174,18 @@ static const struct Key command_keys[] = {
{ .ev = { .ch = ':' }, .callback = show_go_to_line },
{ .ev = { .ch = '0' }, .callback = move_start },
{ .ev = { .ch = '$' }, .callback = move_end },
+ { .ev = { .ch = 'G' }, .callback = move_bottom },
{ .ev = { .ch = 'g' }, .callback = move_top },
+ { .ev = { .ch = 'H' }, .callback = move_screen_top },
{ .ev = { .ch = 'h' }, .callback = move_left },
{ .ev = { .ch = 'j' }, .callback = move_down },
{ .ev = { .ch = 'k' }, .callback = move_up },
+ { .ev = { .ch = 'L' }, .callback = move_screen_bottom },
{ .ev = { .ch = 'l' }, .callback = move_right },
{ .ev = { .ch = 'q' }, .callback = exit_program },
{ .ev = { .ch = 'v' }, .callback = toggle_selection },
- { .ev = { .ch = 'w' }, .callback = move_next_word },
- { .ev = { .ch = 'G' }, .callback = move_bottom },
- { .ev = { .ch = 'H' }, .callback = show_help },
{ .ev = { .ch = 'W' }, .callback = move_prev_word }
+ { .ev = { .ch = 'w' }, .callback = move_next_word },
};
/* clang-format on */
diff --git a/config.h b/config.h
@@ -55,6 +55,8 @@ int move_page_down(struct DrawState* state);
int move_page_up(struct DrawState* state);
int move_prev_word(struct DrawState* state);
int move_right(struct DrawState* state);
+int move_screen_bottom(struct DrawState* state);
+int move_screen_top(struct DrawState* state);
int move_start(struct DrawState* state);
int move_top(struct DrawState* state);
int move_up(struct DrawState* state);
@@ -173,9 +175,11 @@ static const struct Key command_keys[] = {
{ .ev = { .ch = '0' }, .callback = move_start },
{ .ev = { .ch = '$' }, .callback = move_end },
{ .ev = { .ch = 'g' }, .callback = move_top },
+ { .ev = { .ch = 'H' }, .callback = move_screen_top },
{ .ev = { .ch = 'h' }, .callback = move_left },
{ .ev = { .ch = 'j' }, .callback = move_down },
{ .ev = { .ch = 'k' }, .callback = move_up },
+ { .ev = { .ch = 'L' }, .callback = move_screen_bottom },
{ .ev = { .ch = 'l' }, .callback = move_right },
{ .ev = { .ch = 'q' }, .callback = exit_program },
{ .ev = { .ch = 'v' }, .callback = toggle_selection },
diff --git a/draw.c b/draw.c
@@ -196,6 +196,9 @@ display_length(const struct DrawState* state, uint32_t* buffer,
size_t len = 0;
uint32_t* pbuf = buffer;
+ if (!buffer)
+ return len;
+
for (size_t i = 0; *pbuf && i < max_index; i++)
{
pbuf = buffer + i;
diff --git a/sled.1.in b/sled.1.in
@@ -130,10 +130,11 @@ _
\fC$\fP@Go to end of line
\fCG\fP@Go to last line in the file
\fCg\fP@Go to first line in the file
-\fCH\fP@Show help dialog
+\fCH\fP@Go to first line on the screen
\fCh\fP@Go to previous character
\fCj\fP@Go to next line
\fCk\fP@Go to previous line
+\fCL\fP@Go to last line on the screen
\fCl\fP@Go to next character
\fCq\fP@Quit
\fCv\fP@Toggle selection mode
diff --git a/sled.c b/sled.c
@@ -489,6 +489,37 @@ move_top(struct DrawState* state)
}
int
+move_screen_top(struct DrawState* state)
+{
+ if (state->row == 0)
+ return 0;
+ state->row = state->first_shown_row;
+ if (state->saved_column == -1)
+ 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->display_column = dlen;
+ else
+ 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 - 1 < state->display_column)
+ state->first_shown_column
+ = state->display_column - state->maxx + 1;
+ state->display_column = display_length(state,
+ state->buffer[state->row].text, state->column);
+ if (state->in_selection_mode)
+ {
+ state->sel_end_row = state->row;
+ state->sel_end_col = state->column;
+ }
+ return 0;
+}
+
+int
move_start(struct DrawState* state)
{
state->column = 0;
@@ -648,6 +679,38 @@ move_bottom(struct DrawState* state)
}
int
+move_screen_bottom(struct DrawState* state)
+{
+ if (state->row == state->rows_count - 1)
+ return 0;
+ if (state->first_shown_row + state->maxy - 2 < state->rows_count)
+ state->row = state->first_shown_row + state->maxy - 2;
+ if (state->saved_column == -1)
+ 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->display_column = dlen;
+ else
+ 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 - 1 < state->display_column)
+ state->first_shown_column
+ = state->display_column - state->maxx + 1;
+ state->display_column = display_length(state,
+ state->buffer[state->row].text, state->column);
+ if (state->in_selection_mode)
+ {
+ state->sel_end_row = state->row;
+ state->sel_end_col = state->column;
+ }
+ return 0;
+}
+
+int
move_end(struct DrawState* state)
{
size_t len;