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

------------------------------------------------------------------------------
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to