diff --git a/format.c b/format.c index 8bc4215c..d70b4f44 100644 --- a/format.c +++ b/format.c @@ -718,30 +718,19 @@ format_cb_cursor_character(struct format_tree *ft, struct format_entry *fe) xasprintf(&fe->value, "%.*s", (int)gc.data.size, gc.data.data); } -/* Callback for mouse_word. */ -static void -format_cb_mouse_word(struct format_tree *ft, struct format_entry *fe) +/* Return word at given coordinates. Caller frees. */ +char * +format_grid_word(struct grid *gd, u_int x, u_int y) { - struct window_pane *wp; - u_int x, y, end; - struct grid *gd; struct grid_line *gl; struct grid_cell gc; const char *ws; struct utf8_data *ud = NULL; + u_int end; size_t size = 0; int found = 0; + char *s = NULL; - if (!ft->m.valid) - return; - wp = cmd_mouse_pane(&ft->m, NULL, NULL); - if (wp == NULL) - return; - if (!TAILQ_EMPTY (&wp->modes)) - return; - if (cmd_mouse_at(wp, &ft->m, &x, &y, 0) != 0) - return; - gd = wp->base.grid; ws = options_get_string(global_s_options, "word-separators"); y = gd->hsize + y; @@ -794,21 +783,19 @@ format_cb_mouse_word(struct format_tree *ft, struct format_entry *fe) } if (size != 0) { ud[size].size = 0; - fe->value = utf8_tocstr(ud); + s = utf8_tocstr(ud); free(ud); } + return (s); } -/* Callback for mouse_line. */ +/* Callback for mouse_word. */ static void -format_cb_mouse_line(struct format_tree *ft, struct format_entry *fe) +format_cb_mouse_word(struct format_tree *ft, struct format_entry *fe) { struct window_pane *wp; u_int x, y; - struct grid *gd; - struct grid_cell gc; - struct utf8_data *ud = NULL; - size_t size = 0; + char *s; if (!ft->m.valid) return; @@ -819,7 +806,21 @@ format_cb_mouse_line(struct format_tree *ft, struct format_entry *fe) return; if (cmd_mouse_at(wp, &ft->m, &x, &y, 0) != 0) return; - gd = wp->base.grid; + + s = format_grid_word(wp->base.grid, x, y); + if (s != NULL) + fe->value = s; +} + +/* Return line at given coordinates. Caller frees. */ +char * +format_grid_line(struct grid *gd, u_int y) +{ + struct grid_cell gc; + struct utf8_data *ud = NULL; + u_int x; + size_t size = 0; + char *s = NULL; y = gd->hsize + y; for (x = 0; x < grid_line_length(gd, y); x++) { @@ -832,9 +833,33 @@ format_cb_mouse_line(struct format_tree *ft, struct format_entry *fe) } if (size != 0) { ud[size].size = 0; - fe->value = utf8_tocstr(ud); + s = utf8_tocstr(ud); free(ud); } + return (s); +} + +/* Callback for mouse_line. */ +static void +format_cb_mouse_line(struct format_tree *ft, struct format_entry *fe) +{ + struct window_pane *wp; + u_int x, y; + char *s; + + if (!ft->m.valid) + return; + wp = cmd_mouse_pane(&ft->m, NULL, NULL); + if (wp == NULL) + return; + if (!TAILQ_EMPTY (&wp->modes)) + return; + if (cmd_mouse_at(wp, &ft->m, &x, &y, 0) != 0) + return; + + s = format_grid_line(wp->base.grid, y); + if (s != NULL) + fe->value = s; } /* Merge a format tree. */ diff --git a/tmux.1 b/tmux.1 index 3d2d204d..6273eddf 100644 --- a/tmux.1 +++ b/tmux.1 @@ -4219,6 +4219,8 @@ The following variables are available, where appropriate: .It Li "command_list_alias" Ta "" Ta "Command alias if listing commands" .It Li "command_list_name" Ta "" Ta "Command name if listing commands" .It Li "command_list_usage" Ta "" Ta "Command usage if listing commands" +.It Li "copy_cursor_line" Ta "" Ta "Line the cursor is on in copy mode" +.It Li "copy_cursor_word" Ta "" Ta "Word under cursor in copy mode" .It Li "copy_cursor_x" Ta "" Ta "Cursor X position in copy mode" .It Li "copy_cursor_y" Ta "" Ta "Cursor Y position in copy mode" .It Li "cursor_character" Ta "" Ta "Character at cursor in pane" diff --git a/tmux.h b/tmux.h index b8bf8d8f..5540ad4a 100644 --- a/tmux.h +++ b/tmux.h @@ -1789,6 +1789,8 @@ void format_defaults_pane(struct format_tree *, void format_defaults_paste_buffer(struct format_tree *, struct paste_buffer *); void format_lost_client(struct client *); +char *format_grid_word(struct grid *, u_int, u_int); +char *format_grid_line(struct grid *, u_int); /* format-draw.c */ void format_draw(struct screen_write_ctx *, diff --git a/window-copy.c b/window-copy.c index bca236e3..473112e3 100644 --- a/window-copy.c +++ b/window-copy.c @@ -564,6 +564,7 @@ static void window_copy_formats(struct window_mode_entry *wme, struct format_tree *ft) { struct window_copy_mode_data *data = wme->data; + char *s; format_add(ft, "scroll_position", "%d", data->oy); format_add(ft, "rectangle_toggle", "%d", data->rectflag); @@ -578,6 +579,18 @@ window_copy_formats(struct window_mode_entry *wme, struct format_tree *ft) format_add(ft, "selection_end_x", "%d", data->endselx); format_add(ft, "selection_end_y", "%d", data->endsely); } + + s = format_grid_word(data->screen.grid, data->cx, data->cy); + if (s != NULL) { + format_add(ft, "copy_cursor_word", "%s", s); + free(s); + } + + s = format_grid_line(data->screen.grid, data->cy); + if (s != NULL) { + format_add(ft, "copy_cursor_line", "%s", s); + free(s); + } } static void