lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On 29 October 2017 at 17:22, Sean Conner <sean@conman.org> wrote:
>   It's close to what I want, but not fully there.  The function u8_width()
> is close, but the documentation states, "[t]his function ignores control
> characters in the string," which to me, says it will treat this:
>
>         Стоял он, дум\27[31;41m великих полн
>
> as
>
>         Стоял он, дум[31;41m великих полн
>
> and not
>
>         Стоял он, дум великих полн
>
> which is what I'm trying to do.  I'm also having to treat HT (the tab
> character) specially because it can be anywhere from 0 to 8 terminal
> positions, depending upon where it occurs in the string (I don't want it
> ignored).  I'm pretty sure I can work around control codes and escape
> sequences using u8_width().
>
>   -spc (So I'm still interested in non-LPeg solutions to this)

Generally you're going to want to pre-process (or post-process)
control characters yourself. e.g. escape them.
Otherwise a user's string may contain the escape code for "go to start
of line", and nothing ends up how you expected. (or worse: clear
screen).

A notable behaviour is that bash will count any chars between \1 and
\2 as zero width for the purpose of a PS1 prompt.
I take advantage of that here:
https://gist.github.com/daurnimator/4484437#file-bash_prompt-lua-L57-L61
(sorry this is an old version, I haven't uploaded a more recent copy anywhere)

Tabs are a bit of an interesting case, as they generally have the
semantics of "go to next 8-aligned column".
However in a richer terminal ui, a text box may be offset in the x
coordinate, or you may want the facility to provide custom tab-stops.
So generally I end up handling tabs and such explicitly.