summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/einfuehrung2/KEYTABLE.PAS
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/latex/einfuehrung2/KEYTABLE.PAS')
-rw-r--r--Master/texmf-dist/doc/latex/einfuehrung2/KEYTABLE.PAS270
1 files changed, 270 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/einfuehrung2/KEYTABLE.PAS b/Master/texmf-dist/doc/latex/einfuehrung2/KEYTABLE.PAS
new file mode 100644
index 00000000000..97fb30b80e4
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/einfuehrung2/KEYTABLE.PAS
@@ -0,0 +1,270 @@
+unit KeyTable;
+
+{$I-,V-,X+}
+interface
+
+uses Dos, Drivers, Views, Editors;
+
+const
+ N = 33;
+ evInvalidKey = 1024; { entspricht /$2^{10}$/ }
+ edNoKeyTab = 11;
+ kbBlank = $3920;
+
+ function ReadKeyTable: boolean;
+ function EditKeyTable: boolean;
+ procedure ShowKeyTable;
+ procedure GetComm (var Pos: Word; var E: TEvent);
+
+ implementation
+
+ var T: array [0..199] of record
+ k1,k2,cm: word
+ end;
+ top: integer;
+ ShiftState: byte absolute $40:$17;
+
+ const Commands: array [0..N-1] of
+ record
+ s: string [12];
+ v: word
+ end=
+ ((S:'Cut'; v:Cmcut),
+ (s:'Copy'; v:cmcopy),
+ (s:'Paste'; v:cmPaste),
+ (s:'Undo'; v:cmUndo),
+ (s:'Clear'; v:cmClear),
+ (s:'Save'; v:cmSave),
+ (s:'SaveAs'; v:cmSaveAs),
+ (s:'Find'; v:cmFind),
+ (s:'Replace'; v:cmReplace),
+ (s:'SearchAgain'; v:cmSearchAgain),
+ (s:'CharLeft'; v:cmCharLeft),
+ (s:'CharRight'; v:cmCharRight),
+ (s:'WordLeft'; v:cmWordLeft),
+ (s:'WordRight'; v:cmWordRight),
+ (s:'LineStart'; V:cmLineStart),
+ (s:'LineEnd'; v:cmLineEnd),
+ (s:'LineUp'; v:cmLineup),
+ (s:'LineDown'; v:cmLineDown),
+ (s:'PageUp'; v:cmPageUp),
+ (s:'PageDown'; V:cmPageDown),
+ (s:'TextStart'; v:cmTextStart),
+ (s:'TextEnd'; v:cmTextEnd),
+ (s:'NewLine'; v:cmNewLine),
+ (s:'BackSpace'; v:cmBackSpace),
+ (s:'DelChar'; V:cmDelChar),
+ (s:'DelWord'; v:cmDelWord),
+ (s:'DelStart'; v:cmDelStart),
+ (s:'DelEnd'; v:cmDelEnd),
+ (s:'DelLine'; V:cmDelLine),
+ (s:'InsMode'; v:cmInsMode),
+ (s:'StartSelect'; v:cmStartSelect),
+ (s:'HideSelect'; v:cmHideSelect),
+ (s:'IndentMode'; v:CmIndentMode));
+ KVal: array [$47..$53] of word= (1,2,3,4,5,0,6,7,8,9,10,11,12);
+ KName: array [0..13] of String[6]=
+ ('???','Home','UP','Pgup','Minus',
+ 'Left','Right','Plus','End',
+ 'Down','Pgdn','Ins','Del',
+ 'PrtSrc');
+ MName: array [0..3] of String [5]= ('','Shift','Ctrl','Alt');
+ SName: array [$72..$77] of word= (13,5,6,8,10,1);
+
+ type Str2=String[2];
+
+ function Num(b: byte): Str2;
+ begin
+ if b=0 then Num:='10'
+ else Num:=Chr(b+$30);
+ end;
+
+ function Conv(key: word): String;
+ var cc: char;
+ scan,cval: byte;
+ begin
+ scan:=Hi(key);
+ cval:=Lo(key);
+ case scan of
+ $00: Conv:='';
+ $01: Conv:='ESC';
+ $04..$07: Conv:=MName[scan mod 2 xor 1+1]+' '+KName[scan div 2+9];
+ $0E: if cval=8 then Conv:='Bksp'
+ else Conv:='Ctrl Bksp';
+ $0F: if cval=9 then Conv:='Tab'
+ else Conv:='Shift Tab';
+ $1C: if cval=13 then Conv:='Cr'
+ else Conv:='Ctrl Cr';
+ $10..$32: begin
+ cc:=GetAltChar(scan*256);
+ case cval of
+ 0: Conv:='Alt '+cc;
+ 1..$1B: Conv:='Ctrl '+Cc;
+ $41..$5B,
+ $61..$7B: Conv:=cc;
+ end;
+ end;
+ $39: Conv:='';
+ $3B..$44: Conv:='F'+Num(scan-$3A);
+ $47..$53: Conv:=KName[KVal[scan]];
+ $54..$71: Conv:=MName[(scan-$49) div 10]+' '+'F'+Num((scan-$49) Mod 10);
+ $72..$77: Conv:='Ctrl '+KName[SName[scan]];
+ $84: Conv:='Ctrl Pgup';
+ else Conv:='???'
+ end;
+ end;
+
+ function find(key: word): integer;
+ var i,j,m: integer;
+ found: boolean;
+ begin
+ i:=-1;
+ j:=top;
+ found:=false;
+ while (i<j-1) do
+ begin
+ m:=(i+j) div 2;
+ if T[m].k1<key then i:=m
+ else if T[m].k1>=key then j:=m
+ end;
+ while (j>0) and (T[j-1].k1=key) do
+ Dec(j);
+ find:=j
+ end;
+
+ function insert(k1,k2,cm:word): integer;
+ var i: integer;
+ begin
+ insert:=-1;
+ if k1=0 then Exit;
+ insert:=-2;
+ if (k1=kbEsc) and (k2=kbEsc) then Exit;
+ insert:=0;
+ i:=find (k1);
+ if (T[i].k1=k1) and (k2=0) or
+ (T[i].k2=0) then Exit;
+ while (T[i].k1=k1) and (T[i].k2<k2) do
+ Inc(i);
+ if (T[i].k1=k1) and (T[i].k2=k2) then
+ Exit;
+ move(T[i],T[i+1],(top-i+1)*sizeof(T[0]));
+ T[i].k1:=k1;
+ T[i].k2:=k2;
+ T[i].cm:=cm;
+ Inc(top);
+ insert:=1;
+ end;
+
+ function ReadKbd: word;
+ var E: TEvent;
+ begin
+ repeat GetKeyEvent(E);
+ until E.What<>evNothing;
+ if (ShiftState and 3 <> 0) and
+ (E.ScanCode in [$47..$51]) then
+ E.CharCode:=#0;
+ Write(Conv(E.KeyCode));
+ if E.KeyCode=kbBlank then ReadKbd:=0
+ else ReadKbd:=E.KeyCode;
+ end;
+
+ function EditKeyTable;
+ var state,k: integer;
+
+ f: File;
+ begin
+ top:=0;
+ T[0].k1:=$FFFF;
+ T[0].k2:=$FFFF;
+ for k:=0 to N-1 do
+ begin
+ repeat
+ write(Commands[k].s,': ');
+ state:=insert(ReadKbd,ReadKbd,k);
+ writeln;
+ if state=0 then
+ writeln('Key(s) already defined');
+ until (state<0);
+ if state=-2 then
+ begin
+ EditKeyTable:=ReadKeyTable;
+ Exit;
+ end;
+ end;
+ EditKeyTable:=True;
+ Assign(f,'edit.cfg');
+ Rewrite(f,1);
+ blockwrite(f,top,2);
+ blockwrite(f,T,top*sizeof(T[0]));
+ close(f)
+ end;
+
+ function ReadKeyTable;
+ var f: file;
+ Result: word;
+ begin
+ top:=0;
+ ReadKeyTable:=False;
+ assign(f,'edit.cfg');
+ reset(f,1);
+ if IOResult<>0 then
+ begin
+ EditorDialog(edNoKeyTab,NiL);
+ Exit
+ end;
+ blockread(f,top,2,Result);
+ if Result<>2 then
+ begin
+ EditorDialog(edNoKeyTab,Nil);
+ Close(f);
+ Exit;
+ end;
+ blockread(f,T,sizeof(T[0])*top);
+ cloSe(f);
+ ReadKeyTable:=True;
+ T[top].k1:=$FFFF;
+ T[top].k2:=$FFFF
+ end;
+
+ procedure GetComm;
+ begin
+ if (ShiftState and 3<>0) and (E.ScanCode in [$47..$51])
+ then E.CharCode:=#0;
+ if Pos=0 then
+ begin
+ Pos:=find(E.KeyCode);
+ if T[Pos].k1<>E.KeyCode then Pos:=0
+ else if T[Pos].k2=0 then
+ begin
+ E.Command:=Commands[T[pos].cm].v;
+ E.What:=evCommand;
+ Pos:=0;
+ end
+ else E.What:=evNothing;
+ end
+ else
+ begin
+ while (T[Pos+1].k1=T[Pos].k1) and
+ (T[Pos+1].k2<=E.KeyCode) do Inc(Pos);
+ if T[POS].k2=E.KeyCode then
+ begin
+ E.What:=evCommand;
+ E.Command:=Commands[T[pos].cm].v;
+ end
+ else E.What:=evInvalidKey;
+ Pos:=0;
+ end;
+ end;
+
+ procedure ShowKeyTable;
+ var k: integer;
+ f: text;
+ begin
+ Assign(f,'out.$$$');
+ Rewrite(f);
+ for k:=0 to top-1 do
+ writeln(f,Commands[T[k].cm].s,' : ',Conv(T[k].k1),Conv(T[k].k2));
+ Close(f)
+ end;
+
+ end.