From: Peter Stephenson <pws@csr.com>
To: zsh-workers@sunsite.dk
Subject: Re: PATCH: displaying wide characters
Date: Mon, 24 Oct 2005 17:53:15 +0100 [thread overview]
Message-ID: <20051024175315.2c892cd0.pws@csr.com> (raw)
In-Reply-To: <EXCHANGE03qXQGW98rB00007c96@exchange03.csr.com>
Peter Stephenson <pws@csr.com> wrote:
> Mikael Magnusson wrote:
> > My terminal (rxvt-unicode) automatically breaks a wide character to
> > the next line if you try to print it in the last (singlewidth) column
> > of a line. Zsh does seem to get confused when you get to the second
> > line then.
>
> Yes, I think this is fairly standard, hence adding spaces in front ought
> to be the right thing to do.
I think this fixes the end-of-line problem, which is the easier one. If
the screen's just too narrow for the character it simply prints a '?';
that's a very unusual case where safety is probably best. However, maybe
some other character might make the user more aware of what's going on, '>'
for example?
Index: Src/Zle/zle_refresh.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_refresh.c,v
retrieving revision 1.31
diff -u -r1.31 zle_refresh.c
--- Src/Zle/zle_refresh.c 19 Oct 2005 23:45:06 -0000 1.31
+++ Src/Zle/zle_refresh.c 24 Oct 2005 16:50:20 -0000
@@ -612,7 +612,7 @@
rpms.sen = *nbuf + winw;
for (; t < tmpline+tmpll; t++) {
if (t == scs) /* if cursor is here, remember it */
- rpms.nvcs = rpms.s - (nbuf[rpms.nvln = rpms.ln]);
+ rpms.nvcs = rpms.s - nbuf[rpms.nvln = rpms.ln];
if (*t == ZWC('\n')){ /* newline */
/* text not wrapped */
@@ -631,33 +631,33 @@
}
#ifdef ZLE_UNICODE_SUPPORT
else if (iswprint(*t)) {
- int width = wcwidth(*t), break2 = 0;
- *rpms.s++ = *t;
- while (--width > 0) {
+ int width = wcwidth(*t);
+ if (width > rpms.sen - rpms.s) {
/*
- * Character is wider than a single position.
- * Put WEOF into the positions above 1 as placeholders.
- * This keeps the indexing into the video buffer correct.
+ * Too wide to fit. Insert spaces to end of current line.
*/
- if (rpms.s == rpms.sen) {
- /*
- * Text wrapped.
- *
- * TODO: hmm, what is the terminal emulator going to
- * do? Let's assume some kind of automatic margin
- * behaviour, implying we continue the procedure on the
- * next line. Wrapping behaviour has always been
- * problematic. I foresee interesting times...
- */
- if (nextline(&rpms, 1)) {
- break2 = 1;
- break;
- }
+ do {
+ *rpms.s++ = ZWC(' ');
+ } while (rpms.s < rpms.sen);
+ if (nextline(&rpms, 1))
+ break;
+ if (t == scs) {
+ /* Update cursor to this point */
+ rpms.nvcs = rpms.s - nbuf[rpms.nvln = rpms.ln];
}
- *rpms.s++ = WEOF;
}
- if (break2)
- break;
+ if (width > rpms.sen - rpms.s) {
+ /*
+ * The screen width is too small to fit even one
+ * occurrence.
+ */
+ *rpms.s++ = ZWC('?');
+ } else {
+ /* We can fit it without reaching the end of the line. */
+ *rpms.s++ = *t;
+ while (--width > 0)
+ *rpms.s++ = WEOF;
+ }
}
#endif
else if (ZC_icntrl(*t)) { /* other control character */
@@ -705,14 +705,20 @@
#ifdef ZLE_UNICODE_SUPPORT
if (iswprint(*u)) {
int width = wcwidth(*u);
- *rpms.s++ = *u;
- while (--width > 0) {
- /* Wide character, handled as above */
- if (rpms.s == rpms.sen) {
- nbuf[rpms.ln][winw + 1] = ZWC('\n');
- snextline(&rpms);
- }
- *rpms.s++ = WEOF;
+ /* Handle wide characters as above */
+ if (width > rpms.sen - rpms.s) {
+ do {
+ *rpms.s++ = ZWC(' ');
+ } while (rpms.s < rpms.sen);
+ nbuf[rpms.ln][winw + 1] = ZWC('\n');
+ snextline(&rpms);
+ }
+ if (width > rpms.sen - rpms.s) {
+ *rpms.s++ = ZWC('?');
+ } else {
+ *rpms.s++ = *u;
+ while (--width > 0)
+ *rpms.s++ = WEOF;
}
}
else
--
Peter Stephenson <pws@csr.com> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
This message has been scanned for viruses by BlackSpider MailControl - www.blackspider.com
next prev parent reply other threads:[~2005-10-24 16:53 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-10-19 20:31 Peter Stephenson
2005-10-19 20:41 ` Peter Stephenson
2005-10-20 0:39 ` Mikael Magnusson
2005-10-20 9:39 ` Peter Stephenson
2005-10-20 15:02 ` Bart Schaefer
2005-10-21 9:03 ` Peter Stephenson
2005-10-21 14:39 ` Bart Schaefer
2005-10-21 22:29 ` Peter Stephenson
2005-10-24 8:40 ` Mikael Magnusson
2005-10-24 9:07 ` Peter Stephenson
2005-10-24 12:41 ` Mikael Magnusson
2005-10-24 12:47 ` Peter Stephenson
2005-10-24 16:53 ` Peter Stephenson [this message]
2005-10-25 23:11 ` Peter Stephenson
2005-10-26 5:19 ` Mikael Magnusson
2005-10-26 9:17 ` Peter Stephenson
2005-10-26 14:31 ` Mikael Magnusson
2005-10-28 12:03 ` Peter Stephenson
2005-10-28 17:19 ` Mikael Magnusson
2005-10-19 22:47 ` Peter Stephenson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20051024175315.2c892cd0.pws@csr.com \
--to=pws@csr.com \
--cc=zsh-workers@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).