selection: pay attention to hard linebreaks when search for word boundaries

Double-clicking on a word in the left or right margin, would line-wrap
the selection if there was a non-empty cell in the corresponding
right/left margin on the prev/next line. Regardless of whether there
was a hard linebreak or not.

Script to reprouce:

  !/bin/bash

  cols=$(tput cols)
  printf "%*coo\nbar\n" $((${cols} - 2)) f

Run, then double click either “foo” or “bar”. Neither should select
the other part.

Closes #565
This commit is contained in:
Daniel Eklöf 2021-05-31 17:12:38 +02:00
parent d5ff8c5f6f
commit f0041882f1
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 20 additions and 4 deletions

View file

@ -258,14 +258,21 @@ selection_find_word_boundary_left(struct terminal *term, struct coord *pos,
int next_col = pos->col - 1;
int next_row = pos->row;
const struct row *row = grid_row_in_view(term->grid, next_row);
/* Linewrap */
if (next_col < 0) {
next_col = term->cols - 1;
if (--next_row < 0)
break;
}
const struct row *row = grid_row_in_view(term->grid, next_row);
row = grid_row_in_view(term->grid, next_row);
if (row->linebreak) {
/* Hard linebreak, treat as space. I.e. break selection */
break;
}
}
c = row->cells[next_col].wc;
while (c >= CELL_SPACER) {
@ -330,14 +337,21 @@ selection_find_word_boundary_right(struct terminal *term, struct coord *pos,
int next_col = pos->col + 1;
int next_row = pos->row;
const struct row *row = grid_row_in_view(term->grid, next_row);
/* Linewrap */
if (next_col >= term->cols) {
if (row->linebreak) {
/* Hard linebreak, treat as space. I.e. break selection */
break;
}
next_col = 0;
if (++next_row >= term->rows)
break;
}
const struct row *row = grid_row_in_view(term->grid, next_row);
row = grid_row_in_view(term->grid, next_row);
}
c = row->cells[next_col].wc;
while (c >= CELL_SPACER) {