-/* $OpenBSD: grid-reader.c,v 1.3 2021/03/09 08:24:09 nicm Exp $ */
+/* $OpenBSD: grid-reader.c,v 1.4 2021/04/05 08:43:48 nicm Exp $ */
/*
* Copyright (c) 2020 Anindya Mukherjee <anindya49@hotmail.com>
/* Move cursor back one position. */
void
-grid_reader_cursor_left(struct grid_reader *gr)
+grid_reader_cursor_left(struct grid_reader *gr, int wrap)
{
struct grid_cell gc;
break;
gr->cx--;
}
- if (gr->cx == 0 && gr->cy > 0) {
+ if (gr->cx == 0 && gr->cy > 0 &&
+ (wrap ||
+ grid_get_line(gr->gd, gr->cy - 1)->flags & GRID_LINE_WRAPPED)) {
grid_reader_cursor_up(gr);
grid_reader_cursor_end_of_line(gr, 0, 0);
} else if (gr->cx > 0)
}
return 0;
}
+
+/* Jump back to the first non-blank character of the line. */
+void
+grid_reader_cursor_back_to_indentation(struct grid_reader *gr)
+{
+ struct grid_cell gc;
+ u_int px, py, xx, yy;
+
+ yy = gr->gd->hsize + gr->gd->sy - 1;
+ grid_reader_cursor_start_of_line(gr, 1);
+
+ for (py = gr->cy; py <= yy; py++) {
+ xx = grid_line_length(gr->gd, py);
+ for (px = 0; px < xx; px++) {
+ grid_get_cell(gr->gd, px, py, &gc);
+ if (gc.data.size != 1 || *gc.data.data != ' ')
+ break;
+ }
+ if (~grid_get_line(gr->gd, py)->flags & GRID_LINE_WRAPPED)
+ break;
+ }
+}
-/* $OpenBSD: tmux.h,v 1.1100 2021/03/16 09:14:58 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1101 2021/04/05 08:43:48 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
u_int grid_reader_line_length(struct grid_reader *);
int grid_reader_in_set(struct grid_reader *, const char *);
void grid_reader_cursor_right(struct grid_reader *, int, int);
-void grid_reader_cursor_left(struct grid_reader *);
+void grid_reader_cursor_left(struct grid_reader *, int);
void grid_reader_cursor_down(struct grid_reader *);
void grid_reader_cursor_up(struct grid_reader *);
void grid_reader_cursor_start_of_line(struct grid_reader *, int);
const struct utf8_data *);
int grid_reader_cursor_jump_back(struct grid_reader *,
const struct utf8_data *);
+void grid_reader_cursor_back_to_indentation(struct grid_reader *);
/* grid-view.c */
void grid_view_get_cell(struct grid *, u_int, u_int, struct grid_cell *);
-/* $OpenBSD: window-copy.c,v 1.321 2021/04/01 06:46:12 nicm Exp $ */
+/* $OpenBSD: window-copy.c,v 1.322 2021/04/05 08:43:48 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
window_copy_cursor_back_to_indentation(struct window_mode_entry *wme)
{
struct window_copy_mode_data *data = wme->data;
- u_int px, py, xx;
- struct grid_cell gc;
-
- px = 0;
- py = screen_hsize(data->backing) + data->cy - data->oy;
- xx = window_copy_find_length(wme, py);
+ struct screen *back_s = data->backing;
+ struct grid_reader gr;
+ u_int px, py, oldy, hsize;
- while (px < xx) {
- grid_get_cell(data->backing->grid, px, py, &gc);
- if (gc.data.size != 1 || *gc.data.data != ' ')
- break;
- px++;
- }
+ px = data->cx;
+ hsize = screen_hsize(back_s);
+ py = hsize + data->cy - data->oy;
+ oldy = data->cy;
- window_copy_update_cursor(wme, px, data->cy);
- if (window_copy_update_selection(wme, 1, 0))
- window_copy_redraw_lines(wme, data->cy, 1);
+ grid_reader_start(&gr, back_s->grid, px, py);
+ grid_reader_cursor_back_to_indentation(&gr);
+ grid_reader_get_cursor(&gr, &px, &py);
+ window_copy_acquire_cursor_up(wme, hsize, data->oy, oldy, px, py);
}
static void
oldy = data->cy;
grid_reader_start(&gr, back_s->grid, px, py);
- grid_reader_cursor_left(&gr);
+ grid_reader_cursor_left(&gr, 1);
grid_reader_get_cursor(&gr, &px, &py);
window_copy_acquire_cursor_up(wme, hsize, data->oy, oldy, px, py);
}
py = hsize + data->cy - data->oy;
oldy = data->cy;
- if (px > 0)
- px--;
-
grid_reader_start(&gr, back_s->grid, px, py);
+ grid_reader_cursor_left(&gr, 0);
if (grid_reader_cursor_jump_back(&gr, data->jumpchar)) {
grid_reader_get_cursor(&gr, &px, &py);
window_copy_acquire_cursor_up(wme, hsize, data->oy, oldy, px,
grid_reader_start(&gr, back_s->grid, px, py);
if (grid_reader_cursor_jump(&gr, data->jumpchar)) {
- grid_reader_cursor_left(&gr);
+ grid_reader_cursor_left(&gr, 1);
grid_reader_get_cursor(&gr, &px, &py);
window_copy_acquire_cursor_down(wme, hsize,
screen_size_y(back_s), data->oy, oldy, px, py, 0);
py = hsize + data->cy - data->oy;
oldy = data->cy;
- if (px > 0)
- px--;
-
- if (px > 0)
- px--;
-
grid_reader_start(&gr, back_s->grid, px, py);
+ grid_reader_cursor_left(&gr, 0);
+ grid_reader_cursor_left(&gr, 0);
if (grid_reader_cursor_jump_back(&gr, data->jumpchar)) {
grid_reader_cursor_right(&gr, 1, 0);
grid_reader_get_cursor(&gr, &px, &py);
grid_reader_cursor_right(&gr, 0, 0);
grid_reader_cursor_next_word_end(&gr, separators);
if (keys == MODEKEY_VI)
- grid_reader_cursor_left(&gr);
+ grid_reader_cursor_left(&gr, 1);
grid_reader_get_cursor(&gr, &px, &py);
*ppx = px;
*ppy = py;
grid_reader_cursor_right(&gr, 0, 0);
grid_reader_cursor_next_word_end(&gr, separators);
if (keys == MODEKEY_VI)
- grid_reader_cursor_left(&gr);
+ grid_reader_cursor_left(&gr, 1);
grid_reader_get_cursor(&gr, &px, &py);
window_copy_acquire_cursor_down(wme, hsize, screen_size_y(back_s),
data->oy, oldy, px, py, no_reset);