version 1.322, 2021/04/05 08:43:48 |
version 1.323, 2021/06/10 07:56:47 |
|
|
static void window_copy_cursor_next_word_end(struct window_mode_entry *, |
static void window_copy_cursor_next_word_end(struct window_mode_entry *, |
const char *, int); |
const char *, int); |
static void window_copy_cursor_previous_word_pos(struct window_mode_entry *, |
static void window_copy_cursor_previous_word_pos(struct window_mode_entry *, |
const char *, int, u_int *, u_int *); |
const char *, u_int *, u_int *); |
static void window_copy_cursor_previous_word(struct window_mode_entry *, |
static void window_copy_cursor_previous_word(struct window_mode_entry *, |
const char *, int); |
const char *, int); |
static void window_copy_scroll_up(struct window_mode_entry *, u_int); |
static void window_copy_scroll_up(struct window_mode_entry *, u_int); |
|
|
SEL_LINE, /* select one line at a time */ |
SEL_LINE, /* select one line at a time */ |
} selflag; |
} selflag; |
|
|
const char *ws; /* word separators */ |
const char *separators; /* word separators */ |
|
|
u_int dx; /* drag start position */ |
u_int dx; /* drag start position */ |
u_int dy; |
u_int dy; |
|
|
tried = 1; |
tried = 1; |
goto retry; |
goto retry; |
} |
} |
window_copy_cursor_previous_word(wme, "}]) ", 1); |
window_copy_cursor_previous_word(wme, close, 1); |
} |
} |
continue; |
continue; |
} |
} |
|
|
tried = 1; |
tried = 1; |
goto retry; |
goto retry; |
} |
} |
window_copy_cursor_next_word_end(wme, "{[( ", |
window_copy_cursor_next_word_end(wme, open, 0); |
0); |
|
continue; |
continue; |
} |
} |
/* For vi, continue searching for bracket until EOL. */ |
/* For vi, continue searching for bracket until EOL. */ |
|
|
u_int np = wme->prefix; |
u_int np = wme->prefix; |
|
|
for (; np != 0; np--) |
for (; np != 0; np--) |
window_copy_cursor_next_word(wme, " "); |
window_copy_cursor_next_word(wme, ""); |
return (WINDOW_COPY_CMD_NOTHING); |
return (WINDOW_COPY_CMD_NOTHING); |
} |
} |
|
|
|
|
u_int np = wme->prefix; |
u_int np = wme->prefix; |
|
|
for (; np != 0; np--) |
for (; np != 0; np--) |
window_copy_cursor_next_word_end(wme, " ", 0); |
window_copy_cursor_next_word_end(wme, "", 0); |
return (WINDOW_COPY_CMD_NOTHING); |
return (WINDOW_COPY_CMD_NOTHING); |
} |
} |
|
|
|
|
window_copy_cmd_next_word(struct window_copy_cmd_state *cs) |
window_copy_cmd_next_word(struct window_copy_cmd_state *cs) |
{ |
{ |
struct window_mode_entry *wme = cs->wme; |
struct window_mode_entry *wme = cs->wme; |
struct session *s = cs->s; |
|
u_int np = wme->prefix; |
u_int np = wme->prefix; |
const char *ws; |
const char *separators; |
|
|
ws = options_get_string(s->options, "word-separators"); |
separators = options_get_string(cs->s->options, "word-separators"); |
|
|
for (; np != 0; np--) |
for (; np != 0; np--) |
window_copy_cursor_next_word(wme, ws); |
window_copy_cursor_next_word(wme, separators); |
return (WINDOW_COPY_CMD_NOTHING); |
return (WINDOW_COPY_CMD_NOTHING); |
} |
} |
|
|
|
|
window_copy_cmd_next_word_end(struct window_copy_cmd_state *cs) |
window_copy_cmd_next_word_end(struct window_copy_cmd_state *cs) |
{ |
{ |
struct window_mode_entry *wme = cs->wme; |
struct window_mode_entry *wme = cs->wme; |
struct session *s = cs->s; |
|
u_int np = wme->prefix; |
u_int np = wme->prefix; |
const char *ws; |
const char *separators; |
|
|
ws = options_get_string(s->options, "word-separators"); |
separators = options_get_string(cs->s->options, "word-separators"); |
|
|
for (; np != 0; np--) |
for (; np != 0; np--) |
window_copy_cursor_next_word_end(wme, ws, 0); |
window_copy_cursor_next_word_end(wme, separators, 0); |
return (WINDOW_COPY_CMD_NOTHING); |
return (WINDOW_COPY_CMD_NOTHING); |
} |
} |
|
|
|
|
u_int np = wme->prefix; |
u_int np = wme->prefix; |
|
|
for (; np != 0; np--) |
for (; np != 0; np--) |
window_copy_cursor_previous_word(wme, " ", 1); |
window_copy_cursor_previous_word(wme, "", 1); |
return (WINDOW_COPY_CMD_NOTHING); |
return (WINDOW_COPY_CMD_NOTHING); |
} |
} |
|
|
|
|
window_copy_cmd_previous_word(struct window_copy_cmd_state *cs) |
window_copy_cmd_previous_word(struct window_copy_cmd_state *cs) |
{ |
{ |
struct window_mode_entry *wme = cs->wme; |
struct window_mode_entry *wme = cs->wme; |
struct session *s = cs->s; |
|
u_int np = wme->prefix; |
u_int np = wme->prefix; |
const char *ws; |
const char *separators; |
|
|
ws = options_get_string(s->options, "word-separators"); |
separators = options_get_string(cs->s->options, "word-separators"); |
|
|
for (; np != 0; np--) |
for (; np != 0; np--) |
window_copy_cursor_previous_word(wme, ws, 1); |
window_copy_cursor_previous_word(wme, separators, 1); |
return (WINDOW_COPY_CMD_NOTHING); |
return (WINDOW_COPY_CMD_NOTHING); |
} |
} |
|
|
|
|
window_copy_cmd_select_word(struct window_copy_cmd_state *cs) |
window_copy_cmd_select_word(struct window_copy_cmd_state *cs) |
{ |
{ |
struct window_mode_entry *wme = cs->wme; |
struct window_mode_entry *wme = cs->wme; |
struct session *s = cs->s; |
struct options *session_options = cs->s->options; |
struct window_copy_mode_data *data = wme->data; |
struct window_copy_mode_data *data = wme->data; |
u_int px, py, nextx, nexty; |
u_int px, py, nextx, nexty; |
|
|
|
|
data->lineflag = LINE_SEL_LEFT_RIGHT; |
data->lineflag = LINE_SEL_LEFT_RIGHT; |
data->rectflag = 0; |
data->rectflag = 0; |
data->selflag = SEL_WORD; |
data->selflag = SEL_WORD; |
data->dx = data->cx; |
data->dx = data->cx; |
data->dy = screen_hsize(data->backing) + data->cy - data->oy; |
data->dy = screen_hsize(data->backing) + data->cy - data->oy; |
|
|
data->ws = options_get_string(s->options, "word-separators"); |
data->separators = options_get_string(session_options, |
window_copy_cursor_previous_word(wme, data->ws, 0); |
"word-separators"); |
|
window_copy_cursor_previous_word(wme, data->separators, 0); |
px = data->cx; |
px = data->cx; |
py = screen_hsize(data->backing) + data->cy - data->oy; |
py = screen_hsize(data->backing) + data->cy - data->oy; |
data->selrx = px; |
data->selrx = px; |
|
|
nexty++; |
nexty++; |
} |
} |
if (px >= window_copy_find_length(wme, py) || |
if (px >= window_copy_find_length(wme, py) || |
!window_copy_in_set(wme, nextx, nexty, data->ws)) |
!window_copy_in_set(wme, nextx, nexty, WHITESPACE)) |
window_copy_cursor_next_word_end(wme, data->ws, 1); |
window_copy_cursor_next_word_end(wme, data->separators, 1); |
else { |
else { |
window_copy_update_cursor(wme, px, data->cy); |
window_copy_update_cursor(wme, px, data->cy); |
if (window_copy_update_selection(wme, 1, 1)) |
if (window_copy_update_selection(wme, 1, 1)) |
|
|
begin = 0; |
begin = 0; |
if (data->dy > yy || (data->dy == yy && data->dx > xx)) { |
if (data->dy > yy || (data->dy == yy && data->dx > xx)) { |
/* Right to left selection. */ |
/* Right to left selection. */ |
window_copy_cursor_previous_word_pos(wme, data->ws, 0, |
window_copy_cursor_previous_word_pos(wme, |
&xx, &yy); |
data->separators, &xx, &yy); |
begin = 1; |
begin = 1; |
|
|
/* Reset the end. */ |
/* Reset the end. */ |
|
|
} else { |
} else { |
/* Left to right selection. */ |
/* Left to right selection. */ |
if (xx >= window_copy_find_length(wme, yy) || |
if (xx >= window_copy_find_length(wme, yy) || |
!window_copy_in_set(wme, xx + 1, yy, data->ws)) |
!window_copy_in_set(wme, xx + 1, yy, WHITESPACE)) { |
window_copy_cursor_next_word_end_pos(wme, |
window_copy_cursor_next_word_end_pos(wme, |
data->ws, &xx, &yy); |
data->separators, &xx, &yy); |
|
} |
|
|
/* Reset the start. */ |
/* Reset the start. */ |
data->selx = data->selrx; |
data->selx = data->selrx; |
|
|
struct screen *back_s = data->backing; |
struct screen *back_s = data->backing; |
struct grid_reader gr; |
struct grid_reader gr; |
u_int px, py, hsize; |
u_int px, py, hsize; |
int keys; |
|
|
|
px = data->cx; |
px = data->cx; |
hsize = screen_hsize(back_s); |
hsize = screen_hsize(back_s); |
py = hsize + data->cy - data->oy; |
py = hsize + data->cy - data->oy; |
|
|
grid_reader_start(&gr, back_s->grid, px, py); |
grid_reader_start(&gr, back_s->grid, px, py); |
keys = options_get_number(oo, "mode-keys"); |
if (options_get_number(oo, "mode-keys") == MODEKEY_VI) { |
if (keys == MODEKEY_VI && !grid_reader_in_set(&gr, separators)) |
if (!grid_reader_in_set(&gr, WHITESPACE)) |
grid_reader_cursor_right(&gr, 0, 0); |
grid_reader_cursor_right(&gr, 0, 0); |
grid_reader_cursor_next_word_end(&gr, separators); |
grid_reader_cursor_next_word_end(&gr, separators); |
if (keys == MODEKEY_VI) |
|
grid_reader_cursor_left(&gr, 1); |
grid_reader_cursor_left(&gr, 1); |
|
} else |
|
grid_reader_cursor_next_word_end(&gr, separators); |
grid_reader_get_cursor(&gr, &px, &py); |
grid_reader_get_cursor(&gr, &px, &py); |
*ppx = px; |
*ppx = px; |
*ppy = py; |
*ppy = py; |
|
|
struct screen *back_s = data->backing; |
struct screen *back_s = data->backing; |
struct grid_reader gr; |
struct grid_reader gr; |
u_int px, py, oldy, hsize; |
u_int px, py, oldy, hsize; |
int keys; |
|
|
|
px = data->cx; |
px = data->cx; |
hsize = screen_hsize(back_s); |
hsize = screen_hsize(back_s); |
|
|
oldy = data->cy; |
oldy = data->cy; |
|
|
grid_reader_start(&gr, back_s->grid, px, py); |
grid_reader_start(&gr, back_s->grid, px, py); |
keys = options_get_number(oo, "mode-keys"); |
if (options_get_number(oo, "mode-keys") == MODEKEY_VI) { |
if (keys == MODEKEY_VI && !grid_reader_in_set(&gr, separators)) |
if (!grid_reader_in_set(&gr, WHITESPACE)) |
grid_reader_cursor_right(&gr, 0, 0); |
grid_reader_cursor_right(&gr, 0, 0); |
grid_reader_cursor_next_word_end(&gr, separators); |
grid_reader_cursor_next_word_end(&gr, separators); |
if (keys == MODEKEY_VI) |
|
grid_reader_cursor_left(&gr, 1); |
grid_reader_cursor_left(&gr, 1); |
|
} else |
|
grid_reader_cursor_next_word_end(&gr, separators); |
grid_reader_get_cursor(&gr, &px, &py); |
grid_reader_get_cursor(&gr, &px, &py); |
window_copy_acquire_cursor_down(wme, hsize, screen_size_y(back_s), |
window_copy_acquire_cursor_down(wme, hsize, screen_size_y(back_s), |
data->oy, oldy, px, py, no_reset); |
data->oy, oldy, px, py, no_reset); |
|
|
/* Compute the previous place where a word begins. */ |
/* Compute the previous place where a word begins. */ |
static void |
static void |
window_copy_cursor_previous_word_pos(struct window_mode_entry *wme, |
window_copy_cursor_previous_word_pos(struct window_mode_entry *wme, |
const char *separators, int already, u_int *ppx, u_int *ppy) |
const char *separators, u_int *ppx, u_int *ppy) |
{ |
{ |
struct window_copy_mode_data *data = wme->data; |
struct window_copy_mode_data *data = wme->data; |
struct screen *back_s = data->backing; |
struct screen *back_s = data->backing; |
|
|
py = hsize + data->cy - data->oy; |
py = hsize + data->cy - data->oy; |
|
|
grid_reader_start(&gr, back_s->grid, px, py); |
grid_reader_start(&gr, back_s->grid, px, py); |
grid_reader_cursor_previous_word(&gr, separators, already); |
grid_reader_cursor_previous_word(&gr, separators, /* already= */ 0, |
|
/* stop_at_eol= */ 1); |
grid_reader_get_cursor(&gr, &px, &py); |
grid_reader_get_cursor(&gr, &px, &py); |
*ppx = px; |
*ppx = px; |
*ppy = py; |
*ppy = py; |
|
|
struct screen *back_s = data->backing; |
struct screen *back_s = data->backing; |
struct grid_reader gr; |
struct grid_reader gr; |
u_int px, py, oldy, hsize; |
u_int px, py, oldy, hsize; |
|
int stop_at_eol; |
|
|
|
stop_at_eol = |
|
options_get_number(wme->wp->window->options, "mode-keys") |
|
== MODEKEY_EMACS; |
|
|
px = data->cx; |
px = data->cx; |
hsize = screen_hsize(back_s); |
hsize = screen_hsize(back_s); |
py = hsize + data->cy - data->oy; |
py = hsize + data->cy - data->oy; |
oldy = data->cy; |
oldy = data->cy; |
|
|
grid_reader_start(&gr, back_s->grid, px, py); |
grid_reader_start(&gr, back_s->grid, px, py); |
grid_reader_cursor_previous_word(&gr, separators, already); |
grid_reader_cursor_previous_word(&gr, separators, already, stop_at_eol); |
grid_reader_get_cursor(&gr, &px, &py); |
grid_reader_get_cursor(&gr, &px, &py); |
window_copy_acquire_cursor_up(wme, hsize, data->oy, oldy, px, py); |
window_copy_acquire_cursor_up(wme, hsize, data->oy, oldy, px, py); |
} |
} |
|
|
data->selflag = SEL_CHAR; |
data->selflag = SEL_CHAR; |
switch (data->selflag) { |
switch (data->selflag) { |
case SEL_WORD: |
case SEL_WORD: |
if (data->ws != NULL) { |
if (data->separators != NULL) { |
window_copy_update_cursor(wme, x, y); |
window_copy_update_cursor(wme, x, y); |
window_copy_cursor_previous_word_pos(wme, data->ws, 0, |
window_copy_cursor_previous_word_pos(wme, |
&x, &y); |
data->separators, &x, &y); |
y -= screen_hsize(data->backing) - data->oy; |
y -= screen_hsize(data->backing) - data->oy; |
} |
} |
window_copy_update_cursor(wme, x, y); |
window_copy_update_cursor(wme, x, y); |