Skip to content

Commit f3d3bf7

Browse files
committed
Add option altnotation to pretty-print control characters
Add a new option, `altnotation` (abbreviation `an`), inspired by the Nvi2 2.2.1 option of the same name; if set, most control characters less than 0x20 will be displayed in <C-char> notation, and carriage feed, escape, and delete will be displayed as <Ret>, <Esc>, and <Del>, respectively. Closes #31 Signed-off-by: Jeffrey H. Johnson <[email protected]>
1 parent 5b8f0c6 commit f3d3bf7

File tree

4 files changed

+246
-1
lines changed

4 files changed

+246
-1
lines changed

ChangeLog

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
OpenVi 7.4.24 -> OpenVi 7.4.25: Fri Oct 27 11:44:45 2023
2+
+ Add a new option, `altnotation` (abbreviation `an`), inspired
3+
by the Nvi2 2.2.1 option of the same name; if set, most control
4+
characters less than 0x20 will be displayed in <C-char> notation,
5+
and carriage feed, escape, and delete will be displayed as <Ret>,
6+
<Esc>, and <Del>, respectively
7+
18
OpenVi 7.4.23 -> OpenVi 7.4.24: Tue Oct 10 19:47:07 2023
29
+ Silence a warning when building with recent Clang compilers.
310
+ Treat consecutive paragraph indicators as different paragraphs;
@@ -182,7 +189,7 @@ OpenVi 7.0.9 -> OpenVi 7.0.10: Wed Feb 9 16:36:25 2022
182189
+ Handle `SIGQUIT` like `SIGINT`, which prevents `^\` (Control-\)
183190
from causing ex-mode to abort and drop core; aligns closer to
184191
Vim's behavior in ex-mode - which uses non-canonical input mode,
185-
so `^\` doesn't cause a stop. The rationale for this change is
192+
so `^\` doesn't cause a stop. The rationale for this change is
186193
because we're using `^\` as a shortcut to enter our ex-mode (which
187194
for `nex` uses standard canonical line-based input), if `SIGQUIT`
188195
is unhandled, it's easy to abort by accident by sending more than

common/key.c

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,10 @@ v_key_name(SCR *sp, CHAR_T ch)
248248
* followed by the character offset from the '@' character in the ASCII
249249
* character set. Del (0x7f) is represented as '^' followed by '?'.
250250
*
251+
* If set O_ALTNOTATION, most control characters less than 0x20 are
252+
* displayed using <C-char> notation. Carriage feed, escape, and
253+
* delete are displayed as <Ret>, <Esc>, and <Del>, respectively.
254+
*
251255
* XXX
252256
* The following code depends on the current locale being identical to
253257
* the ASCII map from 0x40 to 0x5f (since 0x1f + 0x40 == 0x5f). I'm
@@ -267,9 +271,236 @@ pr: sp->cname[0] = ch;
267271
goto done;
268272
}
269273
nopr: if (iscntrl(ch) && (ch < 0x20 || ch == 0x7f)) {
274+
if (O_ISSET(sp, O_ALTNOTATION)) {
275+
if (ch == 0x00) {
276+
sp->cname[0] = '<';
277+
sp->cname[1] = 'C';
278+
sp->cname[2] = '-';
279+
sp->cname[3] = '@';
280+
sp->cname[4] = '>';
281+
len = 5;
282+
} else if (ch == 0x01) {
283+
sp->cname[0] = '<';
284+
sp->cname[1] = 'C';
285+
sp->cname[2] = '-';
286+
sp->cname[3] = 'a';
287+
sp->cname[4] = '>';
288+
len = 5;
289+
} else if (ch == 0x02) {
290+
sp->cname[0] = '<';
291+
sp->cname[1] = 'C';
292+
sp->cname[2] = '-';
293+
sp->cname[3] = 'b';
294+
sp->cname[4] = '>';
295+
len = 5;
296+
} else if (ch == 0x03) {
297+
sp->cname[0] = '<';
298+
sp->cname[1] = 'C';
299+
sp->cname[2] = '-';
300+
sp->cname[3] = 'c';
301+
sp->cname[4] = '>';
302+
len = 5;
303+
} else if (ch == 0x04) {
304+
sp->cname[0] = '<';
305+
sp->cname[1] = 'C';
306+
sp->cname[2] = '-';
307+
sp->cname[3] = 'd';
308+
sp->cname[4] = '>';
309+
len = 5;
310+
} else if (ch == 0x05) {
311+
sp->cname[0] = '<';
312+
sp->cname[1] = 'C';
313+
sp->cname[2] = '-';
314+
sp->cname[3] = 'e';
315+
sp->cname[4] = '>';
316+
len = 5;
317+
} else if (ch == 0x06) {
318+
sp->cname[0] = '<';
319+
sp->cname[1] = 'C';
320+
sp->cname[2] = '-';
321+
sp->cname[3] = 'f';
322+
sp->cname[4] = '>';
323+
len = 5;
324+
} else if (ch == 0x07) {
325+
sp->cname[0] = '<';
326+
sp->cname[1] = 'C';
327+
sp->cname[2] = '-';
328+
sp->cname[3] = 'g';
329+
sp->cname[4] = '>';
330+
len = 5;
331+
} else if (ch == 0x08) {
332+
sp->cname[0] = '<';
333+
sp->cname[1] = 'C';
334+
sp->cname[2] = '-';
335+
sp->cname[3] = 'h';
336+
sp->cname[4] = '>';
337+
len = 5;
338+
} else if (ch == 0x0A) {
339+
sp->cname[0] = '<';
340+
sp->cname[1] = 'N';
341+
sp->cname[2] = 'L';
342+
sp->cname[3] = '>';
343+
len = 4;
344+
} else if (ch == 0x0B) {
345+
sp->cname[0] = '<';
346+
sp->cname[1] = 'C';
347+
sp->cname[2] = '-';
348+
sp->cname[3] = 'k';
349+
sp->cname[4] = '>';
350+
len = 5;
351+
} else if (ch == 0x0C) {
352+
sp->cname[0] = '<';
353+
sp->cname[1] = 'C';
354+
sp->cname[2] = '-';
355+
sp->cname[3] = 'l';
356+
sp->cname[4] = '>';
357+
len = 5;
358+
} else if (ch == 0x0D) {
359+
sp->cname[0] = '<';
360+
sp->cname[1] = 'R';
361+
sp->cname[2] = 'e';
362+
sp->cname[3] = 't';
363+
sp->cname[4] = '>';
364+
len = 5;
365+
} else if (ch == 0x0E) {
366+
sp->cname[0] = '<';
367+
sp->cname[1] = 'C';
368+
sp->cname[2] = '-';
369+
sp->cname[3] = 'n';
370+
sp->cname[4] = '>';
371+
len = 5;
372+
} else if (ch == 0x0F) {
373+
sp->cname[0] = '<';
374+
sp->cname[1] = 'C';
375+
sp->cname[2] = '-';
376+
sp->cname[3] = 'o';
377+
sp->cname[4] = '>';
378+
len = 5;
379+
} else if (ch == 0x10) {
380+
sp->cname[0] = '<';
381+
sp->cname[1] = 'C';
382+
sp->cname[2] = '-';
383+
sp->cname[3] = 'p';
384+
sp->cname[4] = '>';
385+
len = 5;
386+
} else if (ch == 0x11) {
387+
sp->cname[0] = '<';
388+
sp->cname[1] = 'C';
389+
sp->cname[2] = '-';
390+
sp->cname[3] = 'q';
391+
sp->cname[4] = '>';
392+
len = 5;
393+
} else if (ch == 0x12) {
394+
sp->cname[0] = '<';
395+
sp->cname[1] = 'C';
396+
sp->cname[2] = '-';
397+
sp->cname[3] = 'r';
398+
sp->cname[4] = '>';
399+
len = 5;
400+
} else if (ch == 0x13) {
401+
sp->cname[0] = '<';
402+
sp->cname[1] = 'C';
403+
sp->cname[2] = '-';
404+
sp->cname[3] = 's';
405+
sp->cname[4] = '>';
406+
len = 5;
407+
} else if (ch == 0x14) {
408+
sp->cname[0] = '<';
409+
sp->cname[1] = 'C';
410+
sp->cname[2] = '-';
411+
sp->cname[3] = 't';
412+
sp->cname[4] = '>';
413+
len = 5;
414+
} else if (ch == 0x15) {
415+
sp->cname[0] = '<';
416+
sp->cname[1] = 'C';
417+
sp->cname[2] = '-';
418+
sp->cname[3] = 'u';
419+
sp->cname[4] = '>';
420+
len = 5;
421+
} else if (ch == 0x16) {
422+
sp->cname[0] = '<';
423+
sp->cname[1] = 'C';
424+
sp->cname[2] = '-';
425+
sp->cname[3] = 'v';
426+
sp->cname[4] = '>';
427+
len = 5;
428+
} else if (ch == 0x17) {
429+
sp->cname[0] = '<';
430+
sp->cname[1] = 'C';
431+
sp->cname[2] = '-';
432+
sp->cname[3] = 'w';
433+
sp->cname[4] = '>';
434+
len = 5;
435+
} else if (ch == 0x18) {
436+
sp->cname[0] = '<';
437+
sp->cname[1] = 'C';
438+
sp->cname[2] = '-';
439+
sp->cname[3] = 'x';
440+
sp->cname[4] = '>';
441+
len = 5;
442+
} else if (ch == 0x19) {
443+
sp->cname[0] = '<';
444+
sp->cname[1] = 'C';
445+
sp->cname[2] = '-';
446+
sp->cname[3] = 'y';
447+
sp->cname[4] = '>';
448+
len = 5;
449+
} else if (ch == 0x1A) {
450+
sp->cname[0] = '<';
451+
sp->cname[1] = 'C';
452+
sp->cname[2] = '-';
453+
sp->cname[3] = 'z';
454+
sp->cname[4] = '>';
455+
len = 5;
456+
} else if (ch == 0x1B) {
457+
sp->cname[0] = '<';
458+
sp->cname[1] = 'E';
459+
sp->cname[2] = 's';
460+
sp->cname[3] = 'c';
461+
sp->cname[4] = '>';
462+
len = 5;
463+
} else if (ch == 0x1C) {
464+
sp->cname[0] = '<';
465+
sp->cname[1] = 'C';
466+
sp->cname[2] = '-';
467+
sp->cname[3] = '\\';
468+
sp->cname[4] = '>';
469+
len = 5;
470+
} else if (ch == 0x1D) {
471+
sp->cname[0] = '<';
472+
sp->cname[1] = 'C';
473+
sp->cname[2] = '-';
474+
sp->cname[3] = ']';
475+
sp->cname[4] = '>';
476+
len = 5;
477+
} else if (ch == 0x1E) {
478+
sp->cname[0] = '<';
479+
sp->cname[1] = 'C';
480+
sp->cname[2] = '-';
481+
sp->cname[3] = '^';
482+
sp->cname[4] = '>';
483+
len = 5;
484+
} else if (ch == 0x1F) {
485+
sp->cname[0] = '<';
486+
sp->cname[1] = 'C';
487+
sp->cname[2] = '-';
488+
sp->cname[3] = '_';
489+
sp->cname[4] = '>';
490+
len = 5;
491+
} else if (ch == 0x7F) {
492+
sp->cname[0] = '<';
493+
sp->cname[1] = 'D';
494+
sp->cname[2] = 'e';
495+
sp->cname[3] = 'l';
496+
sp->cname[4] = '>';
497+
len = 5;
498+
}
499+
} else {
270500
sp->cname[0] = '^';
271501
sp->cname[1] = ch == 0x7f ? '?' : '@' + ch;
272502
len = 2;
503+
}
273504
} else if (O_ISSET(sp, O_OCTAL)) {
274505
#define BITS (sizeof(CHAR_T) * 8)
275506
#define SHIFT (BITS - BITS % 3)

common/options.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ int f_imctrl (SCR *, OPTION *, char *, unsigned long *);
5353
*/
5454

5555
OPTLIST const optlist[] = {
56+
/* O_ALTNOTATION Nvi2 */
57+
{"altnotation", f_print, OPT_0BOOL, OPT_EARLYSET},
5658
/* O_ALTWERASE 4.4BSD */
5759
{"altwerase", f_altwerase, OPT_0BOOL, 0},
5860
/* O_AUTOINDENT 4BSD */
@@ -217,6 +219,7 @@ typedef struct abbrev {
217219

218220
static OABBREV const abbrev[] = {
219221
{"ai", O_AUTOINDENT}, /* 4BSD */
222+
{"an", O_ALTNOTATION}, /* Nvi2 */
220223
{"ap", O_AUTOPRINT}, /* 4BSD */
221224
{"aw", O_AUTOWRITE}, /* 4BSD */
222225
{"bf", O_BEAUTIFY}, /* 4BSD */

docs/USD.doc/vi.man/vi.1

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2309,6 +2309,10 @@ and
23092309
.Nm vi
23102310
modes, unless otherwise specified.
23112311
.Bl -tag -width Ds
2312+
.It Cm altnotation , an Bq off
2313+
Display most control characters less than 0x20 using <C-char> notation.
2314+
Carriage feed, escape, and delete are displayed as <Ret>, <Esc>, and <Del>,
2315+
respectively.
23122316
.It Cm altwerase Bq off
23132317
.Nm vi
23142318
only.

0 commit comments

Comments
 (0)