---
 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

Reply via email to