--- cmd-choose-buffer.c | 6 +++++- cmd-list-buffers.c | 6 +++++- format.c | 5 +++-- paste.c | 17 ++++++++++------- tmux.h | 6 ++++-- utf8.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 69 insertions(+), 13 deletions(-)
diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c index d79f6fd..a46db3e 100644 --- a/cmd-choose-buffer.c +++ b/cmd-choose-buffer.c @@ -45,6 +45,7 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq) struct client *c; struct window_choose_data *cdata; struct winlink *wl; + struct window_pane *wp; struct paste_buffer *pb; char *action, *action_data; const char *template; @@ -61,6 +62,9 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL) return (CMD_RETURN_ERROR); + if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL) + return (CMD_RETURN_ERROR); + if (paste_get_top(&global_buffers) == NULL) return (CMD_RETURN_NORMAL); @@ -79,7 +83,7 @@ cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq) cdata->ft_template = xstrdup(template); format_add(cdata->ft, "line", "%u", idx - 1); - format_paste_buffer(cdata->ft, pb); + format_paste_buffer(cdata->ft, wp, pb); xasprintf(&action_data, "%u", idx - 1); cdata->command = cmd_template_replace(action, action_data, 1); diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c index 02a4183..6a9fb5e 100644 --- a/cmd-list-buffers.c +++ b/cmd-list-buffers.c @@ -42,12 +42,16 @@ enum cmd_retval cmd_list_buffers_exec(unused struct cmd *self, struct cmd_q *cmdq) { struct args *args = self->args; + struct window_pane *wp; struct paste_buffer *pb; struct format_tree *ft; u_int idx; char *line; const char *template; + if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL) + return (CMD_RETURN_ERROR); + if ((template = args_get(args, 'F')) == NULL) template = LIST_BUFFERS_TEMPLATE; @@ -55,7 +59,7 @@ cmd_list_buffers_exec(unused struct cmd *self, struct cmd_q *cmdq) while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) { ft = format_create(); format_add(ft, "line", "%u", idx - 1); - format_paste_buffer(ft, pb); + format_paste_buffer(ft, wp, pb); line = format_expand(ft, template); cmdq_print(cmdq, "%s", line); diff --git a/format.c b/format.c index 497b5b5..05cd4ed 100644 --- a/format.c +++ b/format.c @@ -603,9 +603,10 @@ format_window_pane(struct format_tree *ft, struct window_pane *wp) /* Set default format keys for paste buffer. */ void -format_paste_buffer(struct format_tree *ft, struct paste_buffer *pb) +format_paste_buffer(struct format_tree *ft, struct window_pane *wp, + struct paste_buffer *pb) { - char *pb_print = paste_print(pb, 50); + char *pb_print = paste_print(pb, wp, 50); format_add(ft, "buffer_size", "%zu", pb->size); format_add(ft, "buffer_sample", "%s", pb_print); diff --git a/paste.c b/paste.c index 28f1230..6101195 100644 --- a/paste.c +++ b/paste.c @@ -149,23 +149,26 @@ paste_replace(struct paste_stack *ps, u_int idx, char *data, size_t size) /* Convert a buffer into a visible string. */ char * -paste_print(struct paste_buffer *pb, size_t width) +paste_print(struct paste_buffer *pb, struct window_pane *wp, size_t width) { - char *buf; - size_t len, used; + char *buf; + size_t len, used; + const int flags = VIS_OCTAL|VIS_TAB|VIS_NL; if (width < 3) width = 3; - buf = xmalloc(width * 4 + 1); + buf = xmalloc(width * 4 + 4); /* four bytes each plus "...\0" */ len = pb->size; if (len > width) len = width; - used = strvisx(buf, pb->data, len, VIS_OCTAL|VIS_TAB|VIS_NL); + if (options_get_number(&wp->window->options, "utf8")) + used = utf8_strvis(buf, pb->data, len, flags); + else + used = strvisx(buf, pb->data, len, flags); if (pb->size > width || used > width) - strlcpy(buf + width - 3, "...", 4); - + strlcpy(buf + width, "...", 4); return (buf); } diff --git a/tmux.h b/tmux.h index 5aac390..195c955 100644 --- a/tmux.h +++ b/tmux.h @@ -1540,7 +1540,7 @@ void format_winlink(struct format_tree *, struct session *, struct winlink *); void format_window_pane(struct format_tree *, struct window_pane *); -void format_paste_buffer(struct format_tree *, +void format_paste_buffer(struct format_tree *, struct window_pane *, struct paste_buffer *); /* mode-key.c */ @@ -1711,7 +1711,8 @@ int paste_free_top(struct paste_stack *); int paste_free_index(struct paste_stack *, u_int); void paste_add(struct paste_stack *, char *, size_t, u_int); int paste_replace(struct paste_stack *, u_int, char *, size_t); -char *paste_print(struct paste_buffer *, size_t); +char *paste_print(struct paste_buffer *, struct window_pane *, + size_t); void paste_send_pane(struct paste_buffer *, struct window_pane *, const char *, int); @@ -2323,6 +2324,7 @@ int utf8_open(struct utf8_data *, u_char); int utf8_append(struct utf8_data *, u_char); u_int utf8_combine(const struct utf8_data *); u_int utf8_split2(u_int, u_char *); +int utf8_strvis(char *, const char *, size_t, int); /* osdep-*.c */ char *osdep_get_name(int, char *); diff --git a/utf8.c b/utf8.c index 5babcb3..20e3513 100644 --- a/utf8.c +++ b/utf8.c @@ -352,3 +352,45 @@ utf8_width(const struct utf8_data *utf8data) } return (1); } + +/* + * Encode len characters from src into dst, which is guaranteed to have four + * bytes available for each character from src (for \abc or UTF-8) plus space + * for \0. + */ +int +utf8_strvis(char *dst, const char *src, size_t len, int flag) +{ + struct utf8_data utf8data; + const char *start, *end; + int more; + size_t i; + + start = dst; + end = src + len; + + while (src < end) { + if (utf8_open(&utf8data, *src)) { + more = 1; + while (++src < end && more) + more = utf8_append(&utf8data, *src); + if (!more) { + /* UTF-8 character finished. */ + for (i = 0; i < utf8data.size; i++) + *dst++ = utf8data.data[i]; + continue; + } else if (utf8data.have > 0) { + /* Not a complete UTF-8 character. */ + src -= utf8data.have; + } + } + if (src < end - 1) + dst = vis(dst, src[0], flag, src[1]); + else if (src < end) + dst = vis(dst, src[0], flag, '\0'); + src++; + } + + *dst = '\0'; + return (dst - start); +} -- 1.9.1 ------------------------------------------------------------------------------ _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users