Hi

Try this please which works out whether to use UTF-8 based on the same
rules as tmux uses on startup (-u or LANG/LC_ALL/etc).

Index: cmd-list-buffers.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/cmd-list-buffers.c,v
retrieving revision 1.19
diff -u -p -r1.19 cmd-list-buffers.c
--- cmd-list-buffers.c  2 Apr 2014 18:12:18 -0000       1.19
+++ cmd-list-buffers.c  17 Apr 2014 17:31:34 -0000
@@ -42,6 +42,8 @@ enum cmd_retval
 cmd_list_buffers_exec(unused struct cmd *self, struct cmd_q *cmdq)
 {
        struct args             *args = self->args;
+       struct client           *c = cmdq->client;
+       int                      utf8flag;
        struct paste_buffer     *pb;
        struct format_tree      *ft;
        u_int                    idx;
@@ -51,11 +53,16 @@ cmd_list_buffers_exec(unused struct cmd 
        if ((template = args_get(args, 'F')) == NULL)
                template = LIST_BUFFERS_TEMPLATE;
 
+       if (c != NULL)
+               utf8flag = c->flags & CLIENT_UTF8;
+       else
+               utf8flag = 0;
+
        idx = 0;
        while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) {
                ft = format_create();
                format_add(ft, "line", "%u", idx - 1);
-               format_paste_buffer(ft, pb, 0);
+               format_paste_buffer(ft, pb, utf8flag);
 
                line = format_expand(ft, template);
                cmdq_print(cmdq, "%s", line);


On Fri, Apr 04, 2014 at 12:43:51PM +0900, Kosuke ASAMI wrote:
> Thank you for checking.
> 
> I am worried if users feel strange if outputs of list-buffers and
> choose-buffer are different.
> Also, I think the caller supports don't really matter because user who
> has UTF-8 characters in buffer may use UTF-8 supported terminal.
> 
> I seem trimming at the RHS is nicer selection than hard-coding the
> width as 50 cells too.
> I'll write patches for trimming.
> 
> 2014-04-03 3:13 GMT+09:00 Nicholas Marriott <nicholas.marri...@gmail.com>:
> > Hi
> >
> > I applied this to OpenBSD now, with some changes.
> >
> > Notably, I don't think we should do this for list-buffers because we
> > don't know if the caller supports UTF-8. It is fine for choose-buffer.
> >
> > Also if we are appending ... or if we have double-width UTF-8, the width
> > could be >50 cells. That doesn't really matter so I just bumped the
> > limit higher and removed the quotes so it should trim at the RHS of the
> > screen in choose mode, which seems nicer anyway.
> >
> >
> > On Mon, Mar 10, 2014 at 12:47:46AM +0900, Kosuke ASAMI wrote:
> >> The first zero check of 'len' seem to be unnecessary.
> >>
> >> I have fixed the decrement number from 'src' when an UTF-8 character
> >> doesn't finish.
> >>
> >> 2014-03-09 18:16 GMT+09:00 Nicholas Marriott <nicholas.marri...@gmail.com>:
> >> > Actually I think this function is wrong because it reads over the end of
> >> > src. len is the length of src, not dst. We know there is always enough
> >> > space in dst.
> >> >
> >> > I haven't time now to look at this closely or test it but maybe
> >> > something like:
> >> >
> >> > diff --git a/utf8.c b/utf8.c
> >> > index 63723d7..b1f44bf 100644
> >> > --- a/utf8.c
> >> > +++ b/utf8.c
> >> > @@ -352,3 +352,51 @@ 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;
> >> > +
> >> > +       if (len == 0) {
> >> > +               *dst = '\0';
> >> > +               return (0);
> >> > +       }
> >> > +
> >> > +       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 - 1);
> >> > +                       }
> >> > +               }
> >> > +               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);
> >> > +}
> >> >
> >> >
> >> >
> >> > On Sun, Mar 09, 2014 at 10:30:39AM +0900, Kosuke ASAMI wrote:
> >> >> I have tested, and it works fine!
> >> >>
> >> >> However, there is a mistake in my first patch.
> >> >> The flag needs to be cleared before next iteration. (like following 
> >> >> diff)
> >> >>
> >> >> I have attached the complete patch.
> >> >>
> >> >> ----------
> >> >>
> >> >> diff --git a/utf8.c b/utf8.c
> >> >> index 10200dd..0465a32 100644
> >> >> --- a/utf8.c
> >> >> +++ b/utf8.c
> >> >> @@ -379,6 +379,7 @@ utf8_strvis(char *dst, const char *src, size_t
> >> >> len, int flag)
> >> >>   src++;
> >> >>   for (i = 0; i < utf8data.size; i++)
> >> >>   *dst++ = utf8data.data[i];
> >> >> + more = -1;
> >> >>   continue;
> >> >>   } else if (utf8data.have > 0) {
> >> >>   /* Not a complete UTF-8 character. */
> >> >>
> >> >> 2014-03-09 1:51 GMT+09:00 Nicholas Marriott 
> >> >> <nicholas.marri...@gmail.com>:
> >> >> > Hi
> >> >> >
> >> >> > Here's it with a little tidying up. I didn't test this but can you 
> >> >> > take
> >> >> > a look?
> >> >> >
> >> >> >
> >> >> > 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 63723d7..10200dd 100644
> >> >> > --- a/utf8.c
> >> >> > +++ b/utf8.c
> >> >> > @@ -352,3 +352,42 @@ 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).
> >> >> > + */
> >> >> > +int
> >> >> > +utf8_strvis(char *dst, const char *src, size_t len, int flag)
> >> >> > +{
> >> >> > +       struct utf8_data         utf8data;
> >> >> > +       char                    *start;
> >> >> > +       int                      more;
> >> >> > +       size_t                   i;
> >> >> > +
> >> >> > +       for (start = dst; (dst - start) < len;) {
> >> >> > +               if (utf8_open(&utf8data, *src)) {
> >> >> > +                       while ((dst - start) + utf8data.have < len) {
> >> >> > +                               src++;
> >> >> > +
> >> >> > +                               more = utf8_append(&utf8data, *src);
> >> >> > +                               if (!more)
> >> >> > +                                       break;
> >> >> > +                       }
> >> >> > +                       if (!more) {
> >> >> > +                               /* UTF-8 character finished. */
> >> >> > +                               src++;
> >> >> > +                               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 - 1);
> >> >> > +                       }
> >> >> > +               }
> >> >> > +               dst = vis(dst, src[0], flag, src[1]);
> >> >> > +               src++;
> >> >> > +       }
> >> >> > +       *dst = '\0';
> >> >> > +       return (dst - start);
> >> >> > +}
> >> >> >
> >> >> >
> >> >> >
> >> >> > On Sat, Mar 08, 2014 at 09:06:02PM +0900, Kosuke ASAMI wrote:
> >> >> >>    >*Arguments the wrong way round?
> >> >> >>    Sorry, I have fixed it.
> >> >> >>    I have moved the method from compat/vis.c to utf8.c and renamed 
> >> >> >> it.
> >> >> >>
> >> >> >>    2014-03-08 18:25 GMT+09:00 Nicholas Marriott
> >> >> >>    <[1]nicholas.marri...@gmail.com>:
> >> >> >>
> >> >> >>      Hi
> >> >> >>
> >> >> >>      vis.c is only built on some platforms so the new function would 
> >> >> >> be
> >> >> >>      better in utf8.c as something like utf8_strvis.
> >> >> >>
> >> >> >>      Also this looks wrong:
> >> >> >>
> >> >> >>      - * * * * * * * format_paste_buffer(ft, pb);
> >> >> >>      + * * * * * * * format_paste_buffer(wp, ft, pb);
> >> >> >>
> >> >> >>      Arguments the wrong way round?
> >> >> >>
> >> >> >>      On Sat, Mar 08, 2014 at 06:15:25PM +0900, Kosuke ASAMI wrote:
> >> >> >>      > * *I have implemented a better UTF-8 support for 
> >> >> >> buffer_sample in
> >> >> >>      > * *choose-buffer and list-buffers.
> >> >> >>      >
> >> >> >>      > * *When an user enables UTF-8 on window option, choose-buffer 
> >> >> >> and
> >> >> >>      > * *list-buffers show UTF-8 characters if so. Otherwise, they 
> >> >> >> do as
> >> >> >>      until now.
> >> >> >>
> >> >> >>      >
> >> >> >>      
> >> >> >> ------------------------------------------------------------------------------
> >> >> >>      > Subversion Kills Productivity. Get off Subversion & Make the 
> >> >> >> Move to
> >> >> >>      Perforce.
> >> >> >>      > With Perforce, you get hassle-free workflows. Merge that 
> >> >> >> actually
> >> >> >>      works.
> >> >> >>      > Faster operations. Version large binaries. *Built-in WAN 
> >> >> >> optimization
> >> >> >>      and the
> >> >> >>      > freedom to use Git, Perforce or both. Make the move to 
> >> >> >> Perforce.
> >> >> >>      >
> >> >> >>      
> >> >> >> [2]http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
> >> >> >>
> >> >> >>      > _______________________________________________
> >> >> >>      > tmux-users mailing list
> >> >> >>      > [3]tmux-users@lists.sourceforge.net
> >> >> >>      > [4]https://lists.sourceforge.net/lists/listinfo/tmux-users
> >> >> >>
> >> >> >> References
> >> >> >>
> >> >> >>    Visible links
> >> >> >>    1. mailto:nicholas.marri...@gmail.com
> >> >> >>    2. 
> >> >> >> http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
> >> >> >>    3. mailto:tmux-users@lists.sourceforge.net
> >> >> >>    4. https://lists.sourceforge.net/lists/listinfo/tmux-users
> >> >> >
> >> >> >
> >
> >

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to