| tbetter \r handling - plan9port - [fork] Plan 9 from user space | |
| git clone git://src.adamsgaard.dk/plan9port | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 0e25d6094f3afc39eea454adcbcb01827906ba3e | |
| parent 7703861002dd128b498b18148ca0b7595bdb22a8 | |
| Author: rsc <devnull@localhost> | |
| Date: Tue, 20 Apr 2004 06:49:32 +0000 | |
| better \r handling | |
| Diffstat: | |
| M src/cmd/9term/9term.c | 21 +++++++++++++++------ | |
| 1 file changed, 15 insertions(+), 6 deletions(-) | |
| --- | |
| diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c | |
| t@@ -88,7 +88,7 @@ void doreshape(void); | |
| void runewrite(Rune*, int); | |
| void consread(void); | |
| void conswrite(char*, int); | |
| -int bswidth(Rune c); | |
| +int bswidth(Rune c, uint start, int eatnl); | |
| void cut(void); | |
| void paste(Rune*, int, int); | |
| void snarfupdate(void); | |
| t@@ -888,7 +888,7 @@ key(Rune r) | |
| case 0x15: /* ^U: erase line */ | |
| case 0x17: /* ^W: erase word */ | |
| if (t.q0 != 0 && t.q0 != t.qh) | |
| - t.q0 -= bswidth(r); | |
| + t.q0 -= bswidth(r, t.q0, 1); | |
| cut(); | |
| break; | |
| default: | |
| t@@ -900,7 +900,7 @@ key(Rune r) | |
| } | |
| int | |
| -bswidth(Rune c) | |
| +bswidth(Rune c, uint start, int eatnl) | |
| { | |
| uint q, eq, stop; | |
| Rune r; | |
| t@@ -909,7 +909,7 @@ bswidth(Rune c) | |
| /* there is known to be at least one character to erase */ | |
| if(c == 0x08) /* ^H: erase character */ | |
| return 1; | |
| - q = t.q0; | |
| + q = start; | |
| stop = 0; | |
| if(q > t.qh) | |
| stop = t.qh; | |
| t@@ -917,7 +917,7 @@ bswidth(Rune c) | |
| while(q > stop){ | |
| r = t.r[q-1]; | |
| if(r == '\n'){ /* eat at most one more characte… | |
| - if(q == t.q0) /* eat the newline */ | |
| + if(q == start && eatnl) /* eat the newline */ | |
| --q; | |
| break; | |
| } | |
| t@@ -930,7 +930,7 @@ bswidth(Rune c) | |
| } | |
| --q; | |
| } | |
| - return t.q0-q; | |
| + return start-q; | |
| } | |
| int | |
| t@@ -1069,6 +1069,15 @@ runewrite(Rune *r, int n) | |
| initial++; | |
| else | |
| --q; | |
| + } else if(*p == '\r') { /* treat like ^U */ | |
| + /* convert CR without NL into erased line */ | |
| + /* i feel really sleazy about this but it helps */ | |
| + if(i<n-1 && *(p+1) != '\n'){ | |
| + while(q > r && *(q-1) != '\n') | |
| + q--; | |
| + if(q==r) | |
| + initial = bswidth(0x15, t.qh, 0); | |
| + } | |
| } else if(*p) | |
| *q++ = *p; | |
| p++; |