ref: 7828ffb8a486e188b61394436a434e8cae4fd487
parent: 3331ccc6a4e1959253e3d34beee495d191484660
author: Jacob Moody <moody@posixcafe.org>
date: Wed Aug 17 10:20:56 EDT 2022
ktrans: use stdio by default The kbdtap is now given as the first argument instead. The use of stdio allows for multiple taps to be chained together in something like: ; </dev/kbdtap ktrans | progB | progC >/dev/kbdtap
--- a/sys/man/1/ktrans
+++ b/sys/man/1/ktrans
@@ -4,39 +4,41 @@
.SH SYNOPSIS
.B ktrans
[
-.B -t
-.I kbdtap
-]
-[
.B -l
.I lang
]
+[
+.I kbdtap
+]
.SH DESCRIPTION
.I Ktrans
-provides a transliteration layer
-to keyboard input through reads and
-writes to
-.BR /dev/kbdtap .
-The
-.B -t
-flag changes the
+transliterates a stream of keyboard
+events. Without any arguments,
+.I ktrans
+reads events from standard input
+and writes out converted events to stdout.
+If a
.I kbdtap
-file used. The
-.B -l
-flag changes the initial
-language.
+file is given, it is used for both
+input and output instead.
.SH CONVERSION
-Conversion is done in two steps: An implicit layer
-that is used for direct mappings between ascii characters and
-an explicit multi rune conversion used for compound mappings.
+Conversion is done in two layers, an implicit
+layer for unambigious mappings, and an explicit
+layer for selecting one match out of a list of
+ambigious matches.
+.PP
+The implicit layer happens automatically as characters
+are input, transforming a consecutive set of key strokes
+in to their rune counterpart. A series of these runes can
+then be explicitely converted using ctrl-\\. Consecutive
+inputs of ctrl-\\ can then be used to cycle through all the
+matches. A newline may also be used to perform an explicit
+conversion, but will not cycle through other possible matches.
+.PP
+Input is always passed along, when a match is found
.I Ktrans
-does implicit conversion by passing through characters
-as they are input. Then when a sequence of input is matched,
-backspaces are emitted to clear the input sequence and the matched
-rune sequence is emitted. The last 'word' of input may be then
-explicitely transliterated by typing ctrl-\\. A newline character also
-performs this lookup, but additional newline characters will not
-cycle through alternatives.
+will emit backspaces to clear the input sequence and replace
+it with the matched sequence.
.SH CONTROL
The language is selected by typing a control character:
.TP
--- a/sys/src/cmd/ktrans/main.c
+++ b/sys/src/cmd/ktrans/main.c
@@ -581,7 +581,7 @@
void
usage(void)
{
- fprint(2, "usage: %s [ -t tap ] [ -l lang ]\n", argv0);
+ fprint(2, "usage: %s [ -l lang ] [ kbdtap ]\n", argv0);
threadexits("usage");
}
@@ -592,14 +592,9 @@
{
char *jishoname, *zidianname;
- char *tap;
- tap = "/dev/kbdtap";
deflang = LangEN;
ARGBEGIN{
- case 't':
- tap = EARGF(usage());
- break;
case 'l':
deflang = parselang(EARGF(usage()));
if(deflang < 0)
@@ -608,12 +603,19 @@
default:
usage();
}ARGEND;
- if(argc != 0)
+ switch(argc){
+ case 0:
+ kbdin = 0;
+ kbdout = 1;
+ break;
+ case 1:
+ kbdin = kbdout = open(argv[0], ORDWR);
+ if(kbdin < 0)
+ sysfatal("failed to open kbdtap: %r");
+ break;
+ default:
usage();
-
- kbdin = kbdout = open(tap, ORDWR);
- if(kbdin < 0 || kbdout < 0)
- sysfatal("failed to get keyboard: %r");
+ }
memset(backspace, '\b', sizeof backspace-1);
backspace[sizeof backspace-1] = '\0';