SUBROUTINE ANY_KEY_TRM ! Copyright 1994-2021 Marcus Rhodes ! This program is free software; You can redistribute it and/or ! modify it under the terms of the GNU general public license ! version 3 as published by the Free Software Foundation. ! Modified: 04/18/2021 09:08:15 by Marcus ! Platform: Any Pick; Any OS; Any emulator; Any emulation ! Function: Detects the terminal/emulator and emulation, returning the ! terminal and ANY keyboard type via ANY_KEYS(). ! Syntax : CALL ANY_KEY_TRM ! Vars____ IO Typ Description____________________________________________ ! N/A ! Syntax : CALL ANY_KEY_TRM ! Examples: CALL ANY_KEY_TRM ;! No parameters. ! Upcoming: Add ntcon to the list of default term types. ! Done! 07/26/2020 14:08:02 by Marcus ! Add Ubuntu 20.04 mate-terminal (gnome-terminal) ! Done! 10/06/2020 10:01:09 by Marcus ! Work around a problem where AccuTerm responds with incorrect ! settings information when queried too soon after starting. ! Done! 11/15/2020 22:11:11 by Marcus ! Correct all CUx emulator types to CUE. ! Done! 12/03/2020 12:13:12 by Marcus ! Add byobu detection, and assign it to GTM. ! Done! 01/01/2021 14:31:13 by Marcus ! Add term id response {000} to inquiry {027}[>c for NTC. ! Done! 02/19/2021 12:15:14 by Marcus ! Abort if running as a phantom. ! Done! 03/03/2021 20:52:14 by Marcus ! Added two rows to CHECK.FOR.OTHERS' TERM_TBL ! Done! 04/18/2021 09:08:15 by Marcus ! Find a work-around for the second mouse-click problem, which ! is that AccuTerm reports the first mouse-click without ! waiting to see if it was followed by a second mouse-click. ! That means that WE have to wait for a second mouse click, but ! only for half a second, and no longer. And thaaaat's the ! problem, especially on UniVerse, because the first click ! might be the only thing the user does, waiting to see the ! effect of their input. And that could leave both waiting ! forever, the user and this program. ! Project : https://github.com/MarcusAureliusRhodes/AnyKey ! Old name: EMV_TRM_GET ! New name: ANY_KEY_TRM ! Catalog : ANY_KEY_TRM EQU IDENTITY TO 'ANY_KEY_TRM' INCLUDE ANY_KEY_EQU IF IDENTITY THEN GOSUB START.OUR.VARS.ETC IF KEYB_TYP ELSE GOSUB CHECK.FOR.ACCUTERM IF KEYB_TYP ELSE GOSUB CHECK.FOR.PUTTY IF KEYB_TYP ELSE GOSUB CHECK.FOR.OTHERS IF KEYB_TYP ELSE GOSUB FETCH.THE.DEFAULT RETURN START.OUR.VARS.ETC: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' START.OUR.VARS.ETC' PROMPT '' KEY_FLGS = 1 ;! Obviated by this subroutine. ! Beg Pick AP ===================== Generic Pick ===================== HEADLESS = SYSTEM( 24 ) ! End Pick AP ===================== Generic Pick ===================== ! Beg Pick D3 ================= Rocket Software's D3 ================= HEADLESS = SYSTEM( 24 ) ! End Pick D3 ================= Rocket Software's D3 ================= ! Beg Pick IC ================= InsterSytems' Cache ================== HEADLESS = SYSTEM( 25 ) ! End Pick IC ================= InsterSytems' Cache ================== ! Beg Pick NR ================= Northgate's Reality ================== HEADLESS = SYSTEM( 25 ) ! End Pick NR ================= Northgate's Reality ================== ! Beg Pick ON ======== Onware Software Corporations's Onware ========= HEADLESS = SYSTEM( 25 ) ! End Pick ON ======== Onware Software Corporations's Onware ========= ! Beg Pick UD ============== Rocket Software's UniData =============== HEADLESS = SYSTEM( 48 ) ! End Pick UD ============== Rocket Software's UniData =============== ! Beg Pick UV ============== Rocket Software's UniVerse ============== HEADLESS = SYSTEM( 25 ) ! End Pick UV ============== Rocket Software's UniVerse ============== ! Beg Pick VU ================ ViaSystems' UniVision ================= HEADLESS = @USER.TYPE EQ 'PHANTOM' ! End Pick VU ================ ViaSystems' UniVision ================= ! Beg Pick JB ==================== Zumasys' jBase ==================== HEADLESS = SYSTEM( 25 ) ! End Pick JB ==================== Zumasys' jBase ==================== ! Beg Pick QM =================== Zumasys' OpenQM ==================== HEADLESS = SYSTEM( 25 ) ! End Pick QM =================== Zumasys' OpenQM ==================== IF HEADLESS THEN EMU_TYPE = 'ZZZ' KEYB_TYP = 'ZZZ' END ELSE EMU_TYPE = '???' KEYB_TYP = '' END RETURN CHECK.FOR.ACCUTERM: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' CHECK.FOR.ACCUTERM' ! AccuTerm is a special case, so we test for it first, and separately. QUESTION = '{027}{002}I' GOSUB QUERY.THE.TERMINAL IF RESPONSE[ 1, 8 ] EQ 'ACCUTERM' THEN GOSUB SETUP.FOR.ACCUTERM END RETURN SETUP.FOR.ACCUTERM: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' SETUP.FOR.ACCUTERM' SLEEP 1 ;! To give AccuTerm time to figure some things out. EMU_TYPE = 'ATW' QUESTION = '{027}{002}1' ;! Enable mouse reporting. GOSUB NCODE.THE.QUESTION CRT QUESTION : ! We could let Pick tell AccuTerm which terminal to emulate, but it ! works better the other way around, so let's find out what terminal ! AccuTerm thinks we should be emulating. QUESTION = '{027}{002}P dim s as accutermclasses.session{025}set s=a' QUESTION := 'ctivesession{025}accuterm.activate{025}s.activate{025}s.' QUESTION := 'output cstr(s.termtype)&"~"&cstr(s.ScrMode)&"~"&cstr(s.e' QUESTION := 'xtcols)&"~"&cstr(s.extrows)&vbCr{013}' ! AccuTerm sometimes answers incorrectly when run by ANY_KEY_INI from ! a login script, so we need to keep trying until we get a sensible ! answer, and than means an emulation number from 0 to 19. ALLSWELL = @FALSE LOOP SLEEP 1 GOSUB QUERY.THE.TERMINAL RESPONSE = CHANGE( RESPONSE, '~', @AM ) FOR TERM_IDX = 0 TO 19 ;! Must match AccuTerm's terminal numbers. IF RESPONSE< 1 > EQ TERM_IDX THEN ALLSWELL = @TRUE END NEXT TERM_IDX QUESTION = TEXT_QRY UNTIL ALLSWELL DO REPEAT GOSUB BUILD.TRM.LIST TERM_IDX = RESPONSE< 1 > + 1 ;! Because ATW returns 0-19 EXT_MODE = RESPONSE< 2 > * -1 EXT_COLS = RESPONSE< 3 > EXT_ROWS = RESPONSE< 4 > TERM_TYP = TERM_TBL< 1, TERM_IDX > KEYB_TYP = TERM_TBL< 2, TERM_IDX > IF EXT_MODE THEN EXECUTE 'TERM ' : EXT_COLS : ',' : EXT_ROWS ;! CAPTURING RESPONSE END EXECUTE 'TERM ' : TERM_TYP CAPTURING RESPONSE IF RESPONSE EQ '' THEN CALL ANY_KEY_TBL GOSUB SETUP.UNX.TERM END ELSE ! The system doesn't recognize that terminal, so we'll advise the ! user, and work with what Pick already thinks it should be. RESPONSE := ' (' : TERM_TYP : ').' QUESTION = '{027}{002}P dim s as accutermclasses.session{025}set ' QUESTION := 's=activesession{025}MsgBox "' : RESPONSE : '",0,"ATTE' QUESTION := 'NTION!"{013}' GOSUB NCODE.THE.QUESTION CRT QUESTION : ! Ok, now we take Pick's word for it. GOSUB FETCH.THE.DEFAULT END CALL ANY_KEY_ATW RETURN BUILD.TRM.LIST: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' BUILD.TRM.LIST' ! Because OpenQM apparently uses a different list of terminals than ! other flavors. HOST_LST = 'AIX' HOST_LST< -1 > = 'FREEBSD' HOST_LST< -1 > = 'LINUX' HOST_LST< -1 > = 'MAC' HOST_LST< -1 > = 'PDA' HOST_LST< -1 > = 'RPI' HOST_LST< -1 > = 'SOLARIS' HOST_LST< -1 > = 'WINDOWS' OUR_HOST = OCONV( SYSTEM( 1010 ), 'MCU' ) LOCATE OUR_HOST IN HOST_LST SETTING ANYTHING THEN ! ... use the OpenQM list of terminals, ... TERM_TBL = 'dumb' ; TERM_TBL< 2, 1 > = 'TTY' ;! TTY TERM_TBL< 1, 2 > = 'viewpoint-at' ; TERM_TBL< 2, 2 > = 'VPT' ;! ADDS Viewpoint A2 TERM_TBL< 1, 3 > = 'viewpoint60-at' ; TERM_TBL< 2, 3 > = 'VP6' ;! ADDS Viewpoint 60 TERM_TBL< 1, 4 > = 'viewpoint60-at' ; TERM_TBL< 2, 4 > = 'PV6' ;! Procomm Viewpoint 60 TERM_TBL< 1, 5 > = 'adds4000-at' ; TERM_TBL< 2, 5 > = 'VPT' ;! ADDS Viewpoint A2 Enhanced TERM_TBL< 1, 6 > = 'wyse50-at' ; TERM_TBL< 2, 6 > = 'WYS' ;! Wyse 50 TERM_TBL< 1, 7 > = 'wyse60-at' ; TERM_TBL< 2, 7 > = 'WYS' ;! Wyse 60 TERM_TBL< 1, 8 > = 'vt52' ; TERM_TBL< 2, 8 > = 'VT0' ;! VT52 TERM_TBL< 1, 9 > = 'vt220-at' ; TERM_TBL< 2, 9 > = 'VT2' ;! VT220 TERM_TBL< 1, 10 > = 'ansi' ; TERM_TBL< 2, 10 > = 'BBS' ;! ANSI BBS TERM_TBL< 1, 11 > = 'pcmon-at' ; TERM_TBL< 2, 11 > = 'PCK' ;! Pick PC Monitor TERM_TBL< 1, 12 > = 'tektronix4014' ; TERM_TBL< 2, 12 > = 'TEX' ;! Tektronix 4014 TERM_TBL< 1, 13 > = 'vt100-at' ; TERM_TBL< 2, 13 > = 'VT1' ;! VT100 TERM_TBL< 1, 14 > = 'vt320-at' ; TERM_TBL< 2, 14 > = 'VT3' ;! VT320 TERM_TBL< 1, 15 > = 'vt420-at' ; TERM_TBL< 2, 15 > = 'VT4' ;! VT420 TERM_TBL< 1, 16 > = 'ansi' ; TERM_TBL< 2, 16 > = 'SCO' ;! SCO Console TERM_TBL< 1, 17 > = 'linux' ; TERM_TBL< 2, 17 > = 'LNX' ;! Linux Console TERM_TBL< 1, 18 > = 'tektronix4100' ; TERM_TBL< 2, 18 > = 'TEX' ;! Tektronix 4100 TERM_TBL< 1, 19 > = 'prism30' ; TERM_TBL< 2, 19 > = 'MDS' ;! MDIS Prism P30 TERM_TBL< 1, 20 > = 'prism8' ; TERM_TBL< 2, 20 > = 'MDS' ;! MDIS Prism P8 END ELSE ! ... use the standard list of terminals. TERM_TBL = 'tty' ; TERM_TBL< 2, 1 > = 'TTY' ;! TTY TERM_TBL< 1, 2 > = 'viewpoint' ; TERM_TBL< 2, 2 > = 'VPT' ;! ADDS Viewpoint A2 TERM_TBL< 1, 3 > = 'viewpoint60' ; TERM_TBL< 2, 3 > = 'VP6' ;! ADDS Viewpoint 60 TERM_TBL< 1, 4 > = 'viewpoint60' ; TERM_TBL< 2, 4 > = 'PV6' ;! Procomm Viewpoint 60 TERM_TBL< 1, 5 > = 'viewpoint' ; TERM_TBL< 2, 5 > = 'VPT' ;! ADDS Viewpoint A2 Enhanced TERM_TBL< 1, 6 > = 'wyse50' ; TERM_TBL< 2, 6 > = 'WYS' ;! Wyse 50 TERM_TBL< 1, 7 > = 'wyse60' ; TERM_TBL< 2, 7 > = 'WYS' ;! Wyse 60 TERM_TBL< 1, 8 > = 'vt52' ; TERM_TBL< 2, 8 > = 'VT0' ;! VT52 TERM_TBL< 1, 9 > = 'vt220' ; TERM_TBL< 2, 9 > = 'VT2' ;! VT220 TERM_TBL< 1, 10 > = 'ansi' ; TERM_TBL< 2, 10 > = 'ANS' ;! ANSI BBS TERM_TBL< 1, 11 > = 'pickmon' ; TERM_TBL< 2, 11 > = 'PCK' ;! Pick PC Monitor TERM_TBL< 1, 12 > = 'tektronix4014' ; TERM_TBL< 2, 12 > = 'TEX' ;! Tektronix 4014 TERM_TBL< 1, 13 > = 'vt100' ; TERM_TBL< 2, 13 > = 'VT1' ;! VT100 TERM_TBL< 1, 14 > = 'vt320' ; TERM_TBL< 2, 14 > = 'VT3' ;! VT320 TERM_TBL< 1, 15 > = 'vt420' ; TERM_TBL< 2, 15 > = 'VT4' ;! VT420 TERM_TBL< 1, 16 > = 'ansi' ; TERM_TBL< 2, 16 > = 'SCO' ;! SCO Console TERM_TBL< 1, 17 > = 'linux' ; TERM_TBL< 2, 17 > = 'LNX' ;! Linux Console TERM_TBL< 1, 18 > = 'tektronix4100' ; TERM_TBL< 2, 18 > = 'TEX' ;! Tektronix 4100 TERM_TBL< 1, 19 > = 'prism30' ; TERM_TBL< 2, 19 > = 'MDS' ;! MDIS Prism P30 TERM_TBL< 1, 20 > = 'prism8' ; TERM_TBL< 2, 20 > = 'MDS' ;! MDIS Prism P8 END RETURN CHECK.FOR.PUTTY: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' CHECK.FOR.PUTTY' ! PuTTY is another special case because, by default, it's installed ! with an answerback string of PuTTY, which means that odds are pretty ! good that it's still set to PuTTY, which means that, if it answers ! PuTTY, then it is PuTTY. (If it quacks like a duck, ...) QUESTION = '{005}' GOSUB QUERY.THE.TERMINAL IF RESPONSE EQ 'PuTTY' THEN EMU_TYPE = 'PTY' TERM_TYP = 'PTY' KEYB_TYP = 'PTY' EXECUTE 'TERM VT220' CAPTURING RESPONSE CALL ANY_KEY_TBL END RETURN CHECK.FOR.OTHERS: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' CHECK.FOR.OTHERS' ! Things to ask the terminal, from longer to shorter: QSTN_LST = '{027}[>c' QSTN_LST< -1 > = '{027}[0c' ! QSTN_LST< -1 > = '{027}{002}I' ;! AccuTerm only QSTN_LST< -1 > = '{027}[c' QSTN_LST< -1 > = '{027}{032}' QSTN_LST< -1 > = '{027}Z' QSTN_LST< -1 > = '{027}{005}' QSTN_LST< -1 > = '{005}' QSTN_MAX = DCOUNT( QSTN_LST, @AM ) ! This is one of those points where you, too, can help. How? Test ! your terminal/emulator. Does it respond to some query that I don't ! have listed above? Does it reply with something that I don't have ! listed below? If so, e-mail me the details at the address in the ! header at the top, and I'll add it to the list, send you the latest ! version, with an honorable mention as a contributor. ! This (TERM_TBL<2,n>) is the terminal list on Debian Linux. It may ! differ on other distros/Unixes. If yours differs, again, please e- ! mail me the particulars for an updated version and an honorable ! mention. ! What the terminal replies, meaning ... TERM_TYP = ... , and KEYB_TYP = ... TERM_TBL = '{194}{155}?64;1;2;6;9;15;18;21;22c' ; TERM_TBL< 2 > = 'vt420' ; TERM_TBL< 3 > = 'VT4' ;! Win AccuTerm vt420 8-bit TERM_TBL< 1, 2 > = '{027}[?64;1;2;6;9;15;18;21;22c' ; TERM_TBL< 2, 2 > = 'linux' ; TERM_TBL< 3, 2 > = 'XTM' ;! *nx xterm linux TERM_TBL< 1, 3 > = '{027}?64;1;2;6;9;15;18;21;22c' ; TERM_TBL< 2, 3 > = 'xterm' ; TERM_TBL< 3, 3 > = 'UXT' ;! *nx uxterm linux TERM_TBL< 1, 4 > = '{027}[{027}[>67;201102;0c' ; TERM_TBL< 2, 4 > = 'linux' ; TERM_TBL< 3, 4 > = 'NTC' ;! Win 07 CMD.EXE linux {027}[>c TERM_TBL< 1, 5 > = '[?6c{027}[>67;201102;0c' ; TERM_TBL< 2, 5 > = 'linux' ; TERM_TBL< 3, 5 > = 'NTC' ;! Win ?? CMD.EXE linux {027}[>c TERM_TBL< 1, 6 > = '[?6{027}[>67;201102;0c' ; TERM_TBL< 2, 6 > = 'linux' ; TERM_TBL< 3, 6 > = 'NTC' ;! Win ?? CMD.EXE linux {027}[>c TERM_TBL< 1, 7 > = '{194}{155}?62;1;2;6;8c' ; TERM_TBL< 2, 7 > = 'vt220' ; TERM_TBL< 3, 7 > = 'VT2' ;! Win AccuTerm vt220 8-bit {027}[c, {027}[0c TERM_TBL< 1, 8 > = '{194}{155}?63;1;2;6;8c' ; TERM_TBL< 2, 8 > = 'vt320' ; TERM_TBL< 3, 8 > = 'VT3' ;! Win AccuTerm vt320 8-bit {027}[0c, {027}[c TERM_TBL< 1, 9 > = '{194}{155}?64;1;2;6;8c' ; TERM_TBL< 2, 9 > = 'vt420' ; TERM_TBL< 3, 9 > = 'VT4' ;! Win AccuTerm vt420 8-bit {027}[0c, {027}[c TERM_TBL< 1, 10 > = '[>1;10;0c{027}[?62;2c' ; TERM_TBL< 2, 10 > = 'vt220' ; TERM_TBL< 3, 10 > = 'CUQ' ;! Win Co*Star vt220 8-bit {027}[c TERM_TBL< 1, 11 > = '[COSTARc{027}[COSTARc' ; TERM_TBL< 2, 11 > = 'vt101' ; TERM_TBL< 3, 11 > = 'CUO' ;! Win Co*Star vt102 {027}[0c TERM_TBL< 1, 12 > = '[?62;2c{027}[?62;2c' ; TERM_TBL< 2, 12 > = 'vt220' ; TERM_TBL< 3, 12 > = 'CUQ' ;! Win Co*Star vt220 8-bit {027}[0c TERM_TBL< 1, 13 > = '{027}[>67;201102;0c' ; TERM_TBL< 2, 13 > = 'linux' ; TERM_TBL< 3, 13 > = 'NTC' ;! Win ?? CMD.EXE linux {027}[>c TERM_TBL< 1, 14 > = '[?6c{027}[?6c{013}' ; TERM_TBL< 2, 14 > = 'linux' ; TERM_TBL< 3, 14 > = 'NTC' ;! Win ?? CMD.EXE linux TERM_TBL< 1, 15 > = '{027}[?62;1;2;6;8c' ; TERM_TBL< 2, 15 > = 'vt220' ; TERM_TBL< 3, 15 > = 'VT2' ;! *nx xterm vt220 7-bit {027}[0c TERM_TBL< 1, 16 > = '{027}[?63;1;2;6;8c' ; TERM_TBL< 2, 16 > = 'vt320' ; TERM_TBL< 3, 16 > = 'VT3' ;! Win AccuTerm vt320 7-bit {027}[0c TERM_TBL< 1, 17 > = '{027}[?64;1;2;6;8c' ; TERM_TBL< 2, 17 > = 'vt420' ; TERM_TBL< 3, 17 > = 'VT4' ;! Win AccuTerm vt420 7-bit {027}[0c TERM_TBL< 1, 18 > = '{194}{155}>41;7;1c' ; TERM_TBL< 2, 18 > = 'vt220' ; TERM_TBL< 3, 18 > = 'VT2' ;! Win AccuTerm vtx20 8-bit {027}[>c TERM_TBL< 1, 19 > = '{027}[>65;6800;1c' ; TERM_TBL< 2, 19 > = 'linux' ; TERM_TBL< 3, 19 > = 'GTM' ;! *nx mate-terminal linux {027}[>c TERM_TBL< 1, 20 > = '{027}[>65;6003;1c' ; TERM_TBL< 2, 20 > = 'linux' ; TERM_TBL< 3, 20 > = 'GTM' ;! *nx mate-terminal linux {027}[>c TERM_TBL< 1, 21 > = '{155}?63;1;2;6;8c' ; TERM_TBL< 2, 21 > = 'vt220' ; TERM_TBL< 3, 21 > = 'VT3' ;! Win AccuTerm vt320 8-bit {027}[0c, {027}[c TERM_TBL< 1, 22 > = '{027}[>1;2802;0c' ; TERM_TBL< 2, 22 > = 'linux' ; TERM_TBL< 3, 22 > = 'GTM' ;! *nx gnome-terminal linux TERM_TBL< 1, 23 > = '{027}[>1;3409;0c' ; TERM_TBL< 2, 23 > = 'linux' ; TERM_TBL< 3, 23 > = 'GTM' ;! *nx gnome-terminal linux TERM_TBL< 1, 24 > = '{027}[>1;4205;0c' ; TERM_TBL< 2, 24 > = 'linux' ; TERM_TBL< 3, 24 > = 'GTM' ;! *nx mate-terminal linux TERM_TBL< 1, 25 > = '{027}[>1;5202;0c' ; TERM_TBL< 2, 25 > = 'linux' ; TERM_TBL< 3, 25 > = 'GTM' ;! *nx gnome-terminal linux {027}[>c TERM_TBL< 1, 26 > = '{027}[>41;322;0c' ; TERM_TBL< 2, 26 > = 'linux' ; TERM_TBL< 3, 26 > = 'XTM' ;! *nx xterm linux TERM_TBL< 1, 27 > = '{027}[>41;330;0c' ; TERM_TBL< 2, 27 > = 'linux' ; TERM_TBL< 3, 27 > = 'XTM' ;! *nx xterm linux TERM_TBL< 1, 28 > = '[c{027}[COSTARc' ; TERM_TBL< 2, 28 > = 'vt101' ; TERM_TBL< 3, 28 > = 'CUO' ;! Win Co*Star vt102 {027}[c TERM_TBL< 1, 29 > = '{027}[{027}[?6c' ; TERM_TBL< 2, 29 > = 'linux' ; TERM_TBL< 3, 29 > = 'NTC' ;! Win ?? CMD.EXE linux TERM_TBL< 1, 30 > = '{027}[>0;136;0c' ; TERM_TBL< 2, 30 > = 'vt220' ; TERM_TBL< 3, 30 > = 'PTY' ;! Win PuTTY vt220 {027}[>c TERM_TBL< 1, 31 > = '{027}>41;330;0c' ; TERM_TBL< 2, 31 > = 'linux' ; TERM_TBL< 3, 31 > = 'VT2' ;! Win AccuTerm linux TERM_TBL< 1, 32 > = 'v{027}[>1;10;0c' ; TERM_TBL< 2, 32 > = 'vt220' ; TERM_TBL< 3, 32 > = 'CUQ' ;! Win Co*Star vt220 8-bit {027}[>c TERM_TBL< 1, 33 > = '[>67;{027}[?6c' ; TERM_TBL< 2, 33 > = 'linux' ; TERM_TBL< 3, 33 > = 'NTC' ;! Win ?? CMD.EXE linux TERM_TBL< 1, 34 > = '[>67;201102;0c' ; TERM_TBL< 2, 34 > = 'linux' ; TERM_TBL< 3, 34 > = 'NTC' ;! Win ?? CMD.EXE linux TERM_TBL< 1, 35 > = '{027}[?65;1;9c' ; TERM_TBL< 2, 35 > = 'linux' ; TERM_TBL< 3, 35 > = 'GTM' ;! *nx mate-terminal linux {027}[0c, {027}[c TERM_TBL< 1, 36 > = '{027}[>1;10;0c' ; TERM_TBL< 2, 36 > = 'vt220' ; TERM_TBL< 3, 36 > = 'CUQ' ;! Win Co*Star vt220 8-bit {027}[>c TERM_TBL< 1, 37 > = '{027}[>41;5;1c' ; TERM_TBL< 2, 37 > = 'vt220' ; TERM_TBL< 3, 37 > = 'VT2' ;! *nx xterm vt220 TERM_TBL< 1, 38 > = '{027}[>41;7;1c' ; TERM_TBL< 2, 38 > = 'vt220' ; TERM_TBL< 3, 38 > = 'VT2' ;! Win AccuTerm vt220 7-bit TERM_TBL< 1, 39 > = '{027}[>84;0;0c' ; TERM_TBL< 2, 39 > = 'linux' ; TERM_TBL< 3, 39 > = 'GTM' ;! *nx byobu linux {027}[>c TERM_TBL< 1, 40 > = '[?6c{027}[?6c' ; TERM_TBL< 2, 40 > = 'linux' ; TERM_TBL< 3, 40 > = 'NTC' ;! Win ?? CMD.EXE linux TERM_TBL< 1, 41 > = '{027}[?62;9;c' ; TERM_TBL< 2, 41 > = 'linux' ; TERM_TBL< 3, 41 > = 'GTM' ;! *nx gnome-terminal linux TERM_TBL< 1, 42 > = '{155}>41;7;1c' ; TERM_TBL< 2, 42 > = 'vt320' ; TERM_TBL< 3, 42 > = 'VT3' ;! Win AccuTerm vt320 8-bit {027}[>c TERM_TBL< 1, 43 > = '{194}{155}?6c' ; TERM_TBL< 2, 43 > = 'linux' ; TERM_TBL< 3, 43 > = 'LNX' ;! Win AccuTerm linux 8-bit {027}Z, {027}[0c, {027}[c TERM_TBL< 1, 44 > = 'v{027}[?62;2c' ; TERM_TBL< 2, 44 > = 'vt220' ; TERM_TBL< 3, 44 > = 'CUQ' ;! Win Co*Star vt220 8-bit {027}[0c, {027}[c TERM_TBL< 1, 45 > = '?63;1;2;6;8c' ; TERM_TBL< 2, 45 > = 'linux' ; TERM_TBL< 3, 45 > = 'LNX' ;! Win AccuTerm (Wine) linux {027}[c / {027}[0c TERM_TBL< 1, 46 > = '[?6{027}[?6c' ; TERM_TBL< 2, 46 > = 'linux' ; TERM_TBL< 3, 46 > = 'NTC' ;! Win ?? CMD.EXE linux TERM_TBL< 1, 47 > = '[?62;2cvt220' ; TERM_TBL< 2, 47 > = 'vt220' ; TERM_TBL< 3, 47 > = 'CUQ' ;! Win Co*Star vt220 8-bit {005} TERM_TBL< 1, 48 > = '[>6{027}[?6c' ; TERM_TBL< 2, 48 > = 'linux' ; TERM_TBL< 3, 48 > = 'NTC' ;! Win ?? CMD.EXE linux {027}[c TERM_TBL< 1, 49 > = '{027}[?62;2c' ; TERM_TBL< 2, 49 > = 'vt220' ; TERM_TBL< 3, 49 > = 'CUQ' ;! Win Co*Star vt220 8-bit {027}Z TERM_TBL< 1, 50 > = '{027}[VT105c' ; TERM_TBL< 2, 50 > = 'vt102' ; TERM_TBL< 3, 50 > = 'W2K' ;! Win Co*Star vt102 TERM_TBL< 1, 51 > = '{027}[?1;0c' ; TERM_TBL< 2, 51 > = 'linux' ; TERM_TBL< 3, 51 > = 'NTC' ;! Win 10 CMD.EXE linux TERM_TBL< 1, 52 > = '{027}[?1;2c' ; TERM_TBL< 2, 52 > = 'vt220' ; TERM_TBL< 3, 52 > = 'VT2' ;! *nx xterm linux {027}Z TERM_TBL< 1, 53 > = '{027}[?62;c' ; TERM_TBL< 2, 53 > = 'linux' ; TERM_TBL< 3, 53 > = 'GTM' ;! *nx gnome-terminal linux {027}Z, {027}[0c, {027}[c TERM_TBL< 1, 54 > = '[COSTARcp9' ; TERM_TBL< 2, 54 > = 'p9' ; TERM_TBL< 3, 54 > = 'CUI' ;! Win Co*Star vt102 {005} TERM_TBL< 1, 55 > = '{027}[?6c' ; TERM_TBL< 2, 55 > = 'linux' ; TERM_TBL< 3, 55 > = 'LVT' ;! Win ?? CMD.EXE/Putty/ATW linux {027}[0c, {027}Z, {027}[0c, {027}[>c, {027}[c TERM_TBL< 1, 56 > = '>41;7;1c' ; TERM_TBL< 2, 56 > = 'linux' ; TERM_TBL< 3, 56 > = 'LNX' ;! Win AccuTerm (Wine) linux {027}[>c TERM_TBL< 1, 57 > = '[?62;2c' ; TERM_TBL< 2, 57 > = 'vt220' ; TERM_TBL< 3, 57 > = 'CUQ' ;! Win Co*Star vt220 8-bit {027}{002}I TERM_TBL< 1, 58 > = '{027}[c' ; TERM_TBL< 2, 58 > = 'vt101' ; TERM_TBL< 3, 58 > = 'CUO' ;! Win Co*Star vt102 {027}[>c TERM_TBL< 1, 59 > = '{027}\Z' ; TERM_TBL< 2, 59 > = 'vt52' ; TERM_TBL< 3, 59 > = 'VT0' ;! Win AccuTerm vt52 TERM_TBL< 1, 60 > = '50{013}' ; TERM_TBL< 2, 60 > = 'viewpoint' ; TERM_TBL< 3, 60 > = 'VPT' ;! Win AccuTerm Wyse50/Vpnt A2 Enh TERM_TBL< 1, 61 > = '60{013}' ; TERM_TBL< 2, 61 > = 'wyse60' ; TERM_TBL< 3, 61 > = 'WYS' ;! Win AccuTerm Wyse60 TERM_TBL< 1, 62 > = ';;;;c' ; TERM_TBL< 2, 62 > = 'vt220' ; TERM_TBL< 3, 62 > = 'PPT' ;! Win PassPort vt220 {027}[c, {027}[0c TERM_TBL< 1, 63 > = '{000}' ; TERM_TBL< 2, 63 > = 'linux' ; TERM_TBL< 3, 63 > = 'NTC' ;! Win 10 CMD.EXE linux {027}[>c TERM_TBL< 1, 64 > = 'PuTTY' ; TERM_TBL< 2, 64 > = 'vt220' ; TERM_TBL< 3, 64 > = 'PTY' ;! Win PuTTY vt220 {005} TERM_TBL< 1, 65 > = 'vt100' ; TERM_TBL< 2, 65 > = 'vt101' ; TERM_TBL< 3, 65 > = 'CUO' ;! Win Co*Star vt100 {005} TERM_TBL< 1, 66 > = 'vt220' ; TERM_TBL< 2, 66 > = 'vt220' ; TERM_TBL< 3, 66 > = 'COP' ;! Win Co*Star vt220 {005}, {027}{032} TERM_TBL< 1, 67 > = '[?6c' ; TERM_TBL< 2, 67 > = 'linux' ; TERM_TBL< 3, 67 > = 'NTC' ;! Win ?? CMD.EXE linux {027}[c TERM_TBL< 1, 68 > = '50' ; TERM_TBL< 2, 68 > = 'wyse50' ; TERM_TBL< 3, 68 > = 'WYS' ;! Win Co*Star Wyse50 {005}, {027}{005}, {027}{032} TERM_TBL< 1, 69 > = 'p9' ; TERM_TBL< 2, 69 > = 'p9' ; TERM_TBL< 3, 69 > = 'CUI' ;! Win Co*Star Prism9 {005}, {027}{005} FOR QSTN_NUM = 1 TO QSTN_MAX QUESTION = QSTN_LST< QSTN_NUM > GOSUB QUERY.THE.TERMINAL ! IF KEYB_DBG THEN ! CRT @( 0 ) : IDENTITY : ' -> `' : QSTN_LST< QSTN_NUM > : '` -> `' : RESPONSE : '`' : ;! ' => ' : TERM_TYP : '/' : KEYB_TYP ! END IF RESPONSE EQ '' ELSE LOCATE RESPONSE IN TERM_TBL< 1 > SETTING TERM_NUM THEN TERM_TYP = TERM_TBL< 2, TERM_NUM > KEYB_TYP = TERM_TBL< 3, TERM_NUM > EMU_TYPE = TERM_TBL< 3, TERM_NUM > QSTN_NUM = QSTN_MAX IF EMU_TYPE[ 1, 2 ] EQ 'CU' THEN EMU_TYPE = 'CUE' ;! Columbia Ultimate Emulator (Co*Star) END ! CRT @( 0 ) : 'TEXT_QRY = `' : TEXT_QRY : '` -> RESPONSE = `' : RESPONSE : '` -> KEYB_TYP = `' : KEYB_TYP : '`' : ; INPUT WHATEVER, 1 ! IF KEYB_DBG THEN ! CRT ' => `' : TERM_TYP : '`/`' : KEYB_TYP : '`' ! END EXECUTE 'TERM ' : TERM_TYP CAPTURING SUMPTHIN CALL ANY_KEY_TBL END ELSE CRT @( 0 ) : IDENTITY : ' got an unknown answer (' : RESPONSE : ') to its question (' : TEXT_QRY : ').' ! CRT ! CRT 'Press any key to continue. ' : ! INPUT WHATEVER, 1 END END ! IF KEYB_DBG THEN ! CRT @( 0 ) : IDENTITY : ' -> ' : QSTN_LST< QSTN_NUM > : ' -> ' : RESPONSE ;! : ' => ' : TERM_TYP : '/' : KEYB_TYP ! CRT ! CRT 'Press Enter to continue: ' : ! INPUT WHATEVER, 1 ! END NEXT QSTN_NUM RETURN QUERY.THE.TERMINAL: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' QUERY.THE.TERMINAL' GOSUB NCODE.THE.QUESTION RESPONSE = '' CHAR_NUM = '' ECHO OFF CRT QUESTION : ! Beg Pick UV ============== Rocket Software's UniVerse ============== TIME_BEG = TIME() ! End Pick UV ============== Rocket Software's UniVerse ============== LOOP ! Beg Pick AP =================== Generic Pick ==================== IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick AP =================== Generic Pick ==================== ! Beg Pick D3 =============== Rocket Software's D3 ================ IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick D3 =============== Rocket Software's D3 ================ ! Beg Pick IC ================ InsterSytems' Cache ================ IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick IC ================ InsterSytems' Cache ================ ! Beg Pick NR ================ Northgate's Reality ================ IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick NR ================ Northgate's Reality ================ ! Beg Pick ON ======= Onware Software Corporations's Onware ======= IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick ON ======= Onware Software Corporations's Onware ======= ! Beg Pick UD ============= Rocket Software's UniData ============= INPUTIF THE_CHAR, 1 : THEN IF THE_CHAR EQ '' THEN CHAR_NUM = 13 END ELSE CHAR_NUM = SEQ( THE_CHAR ) END EXIT END ELSE IF ( TIME() - TIME_BEG ) LT 3 THEN ;! Don't repeat it much. SLEEP 1 ;! Don't repeat it fast. END ELSE EXIT END END ! End Pick UD ============= Rocket Software's UniData ============= ! Beg Pick UV ============ Rocket Software's UniVerse ============= INPUTIF THE_CHAR, 1 : THEN IF THE_CHAR EQ '' THEN CHAR_NUM = 13 END ELSE CHAR_NUM = SEQ( THE_CHAR ) END EXIT END ELSE IF ( TIME() - TIME_BEG ) LT 3 THEN ;! Don't repeat it much. SLEEP 1 ;! Don't repeat it fast. END ELSE EXIT END END ! End Pick UV ============ Rocket Software's UniVerse ============= ! Beg Pick VU ============== ViaSystems' UniVision ================ IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick VU ============== ViaSystems' UniVision ================ ! Beg Pick JB ================== Zumasys' jBase =================== IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick JB ================== Zumasys' jBase =================== ! Beg Pick QM ================== Zumasys' OpenQM ================== IN CHAR_NUM FOR 10 THEN ! No need to do anything here. END EXIT ! End Pick QM ================== Zumasys' OpenQM ================== REPEAT IF CHAR_NUM NE '' THEN RESPONSE := CHAR( CHAR_NUM ) END LOOP ! Beg Pick AP =================== Generic Pick ==================== IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick AP =================== Generic Pick ==================== ! Beg Pick D3 =============== Rocket Software's D3 ================ IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick D3 =============== Rocket Software's D3 ================ ! Beg Pick IC ================ InsterSytems' Cache ================ IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick IC ================ InsterSytems' Cache ================ ! Beg Pick NR ================ Northgate's Reality ================ IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick NR ================ Northgate's Reality ================ ! Beg Pick ON ======= Onware Software Corporations's Onware ======= IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick ON ======= Onware Software Corporations's Onware ======= ! Beg Pick UD ============= Rocket Software's UniData ============= INPUTIF THE_CHAR, 1 : THEN IF THE_CHAR EQ '' THEN CHAR_NUM = 13 END ELSE CHAR_NUM = SEQ( THE_CHAR ) END END ELSE EXIT END ! End Pick UD ============= Rocket Software's UniData ============= ! Beg Pick UV ============ Rocket Software's UniVerse ============= INPUTIF THE_CHAR, 1 : THEN IF THE_CHAR EQ '' THEN CHAR_NUM = 13 END ELSE CHAR_NUM = SEQ( THE_CHAR ) END END ELSE EXIT END ! End Pick UV ============ Rocket Software's UniVerse ============= ! Beg Pick VU =============== ViaSystems' UniVision =============== IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick VU =============== ViaSystems' UniVision =============== ! Beg Pick JB ================== Zumasys' jBase =================== IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick JB ================== Zumasys' jBase =================== ! Beg Pick QM ================== Zumasys' OpenQM ================== IN CHAR_NUM FOR 1 ELSE EXIT END ! End Pick QM ================== Zumasys' OpenQM ================== RESPONSE := CHAR( CHAR_NUM ) REPEAT ECHO ON GOSUB DCODE.THE.RESPONSE ! CRT 'RESPONSE = `' : RESPONSE : '`' : ; INPUT WHATEVER, 1 RETURN NCODE.THE.QUESTION: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' NCODE.THE.QUESTION' ! Replace any {###}s in QUESTION with CHAR(###)s. ! CRT 'QUESTION = `' : QUESTION : '`' : ; INPUT WHATEVER, 1 TEXT_QRY = QUESTION QSTN_LEN = LEN( QUESTION ) FOR QSTN_POS = QSTN_LEN TO 5 STEP -1 IF QUESTION[ QSTN_POS, 1 ] EQ '}' THEN IF QUESTION[ QSTN_POS - 4, 1 ] EQ '{' THEN THE_CHAR = QUESTION[ QSTN_POS - 3, 3 ] IF NUM( THE_CHAR ) THEN QUESTION = QUESTION[ 1, QSTN_POS - 5 ] : CHAR( THE_CHAR ) : QUESTION[ QSTN_POS + 1, QSTN_LEN ] QSTN_POS -= 4 END END END NEXT QSTN_POS RETURN DCODE.THE.RESPONSE: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' DCODE.THE.RESPONSE' ! Replace any 'special' characters in RESPONSE with {###}s. RESPONSE = TRIM( RESPONSE, CHAR( 13 ), 'T' ) RESP_LEN = LEN( RESPONSE ) FOR RESP_IDX = RESP_LEN TO 1 STEP -1 CHAR_NUM = SEQ( RESPONSE[ RESP_IDX, 1 ] ) IF CHAR_NUM LT 32 OR 126 LT CHAR_NUM THEN RESP_LEN += 4 RESPONSE = RESPONSE[ 1, RESP_IDX - 1 ] : '{' : CHAR_NUM 'R%3}' : RESPONSE[ RESP_IDX + 1, RESP_LEN ] END NEXT RESP_IDX RETURN FETCH.THE.DEFAULT: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' FETCH.THE.DEFAULT' ! The terminal hasn't responded to anything we've asked it, so, now, ! we'll take Pick's word for what it thinks its terminal should be. TERM_TYP = SYSTEM( 7 ) ;! Same on all flavors. TERM_TMP = OCONV( TERM_TYP, 'MCL' ) LOCATE TERM_TMP IN TERM_TBL< 2 > SETTING TERM_NUM THEN EMU_TYPE = '???' KEYB_TYP = TERM_TBL< 3, TERM_NUM > END ELSE ! Something not found in AccuTerm's lists?! BEGIN CASE CASE TERM_TMP[ 1, 4 ] EQ 'adds' ; KEYB_TYP = 'VPT' ;! ADDS Viewpoint A2 Enhanced CASE TERM_TMP[ 1, 4 ] EQ 'ansi' ; KEYB_TYP = 'ANS' ;! ANSI BBS/SCO Console CASE TERM_TMP[ 1, 4 ] EQ 'dumb' ; KEYB_TYP = 'TTY' ;! TTY CASE TERM_TMP[ 1, 5 ] EQ 'linux' ; KEYB_TYP = 'LNX' ;! Linux Console CASE TERM_TMP[ 1, 5 ] EQ 'ntcon' ; KEYB_TYP = 'NTC' ;! jBase/Windows jShell/CMD.EXE CASE TERM_TMP[ 1, 5 ] EQ 'pcmon' ; KEYB_TYP = 'PCK' ;! Pick PC Monitor CASE TERM_TMP[ 1, 7 ] EQ 'pickmon' ; KEYB_TYP = 'PCK' ;! Pick PC Monitor CASE TERM_TMP[ 1, 5 ] EQ 'prism' ; KEYB_TYP = 'MDS' ;! MDIS Prism P8/30 CASE TERM_TMP[ 1, 9 ] EQ 'tektronix' ; KEYB_TYP = 'TEX' ;! Tektronix 4014/4100 CASE TERM_TMP[ 1, 3 ] EQ 'tty' ; KEYB_TYP = 'TTY' ;! TTY CASE TERM_TMP[ 1, 11 ] EQ 'viewpoint60' ; KEYB_TYP = 'VP6' ;! ADDS Viewpoint 60/ProComm CASE TERM_TMP[ 1, 9 ] EQ 'viewpoint' ; KEYB_TYP = 'VPT' ;! ADDS Viewpoint A2 CASE TERM_TMP[ 1, 4 ] EQ 'vt52' ; KEYB_TYP = 'VT0' ;! VT52 CASE TERM_TMP[ 1, 3 ] EQ 'vt1' ; KEYB_TYP = 'VT1' ;! VT100/102 CASE TERM_TMP[ 1, 3 ] EQ 'vt2' ; KEYB_TYP = 'VT2' ;! VT220 CASE TERM_TMP[ 1, 3 ] EQ 'vt3' ; KEYB_TYP = 'VT3' ;! VT320 CASE TERM_TMP[ 1, 3 ] EQ 'vt4' ; KEYB_TYP = 'VT4' ;! VT420 CASE TERM_TMP[ 1, 4 ] EQ 'wyse' ; KEYB_TYP = 'WYS' ;! Wyse 50/60 CASE TERM_TMP[ 1, 5 ] EQ 'xterm' ; KEYB_TYP = 'XTM' ;! XTerm CASE 1 ; KEYB_TYP = 'ANS' ;! ANSI END CASE END ! IF KEYB_DBG THEN ! CRT 'KEYB_TYP = `' : KEYB_TYP : '`' : ; INPUT DUMMY ! END CALL ANY_KEY_TBL GOSUB SETUP.UNX.TERM RETURN SETUP.UNX.TERM: ! IF KEYB_DBG THEN CRT @( 0 ) : IDENTITY : ' SETUP.UNX.TERM' ! EXECUTE 'TERM ' : TRM_TYPE BEGIN CASE CASE SYSTEM( 9010 ) EQ 'UV' ; OSCMDPFX = \SH -c '\ ; OSCMDSFX = \'\ CASE SYSTEM( 9010 ) EQ 'UD' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'AIX' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'FreeBSD' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'Linux' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'Mac' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'PDA' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'Rpi' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'Solaris' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 1010 ) EQ 'Windows' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 100 )[ 1, 2 ] EQ 'D3' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 22 )< 13 > EQ '3' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 44 ) EQ '3' ; OSCMDPFX = '!' ; OSCMDSFX = '' ;! 0,1,2=proprietary Reality, 3=Reality on UNIX/Windows CASE SYSTEM( 44 ) EQ '2' ; OSCMDPFX = '!' ; OSCMDSFX = '' ;! 0,1,2=proprietary Reality, 3=Reality on UNIX/Windows CASE SYSTEM( 44 ) EQ '99' ; OSCMDPFX = CHAR( 255 ) : 'k' ; OSCMDSFX = '' CASE SYSTEM( 44 ) EQ '1' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 44 ) EQ '0' ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE SYSTEM( 254 )[ 1, LEN( DATE() ) ] EQ DATE() ; OSCMDPFX = '!' ; OSCMDSFX = '' ! CASE ??? EQ ??? ; OSCMDPFX = '!' ; OSCMDSFX = '' CASE 1 ; OSCMDPFX = '!' ; OSCMDSFX = '' END CASE EXECUTE OSCMDPFX : 'set' : OSCMDSFX CAPTURING ENV_VARS UNX_HOST = NOT( INDEX( ENV_VARS, 'SystemDrive', 1 ) OR INDEX( 'SystemDrive', ENV_VARS, 1 ) ) IF UNX_HOST THEN EXECUTE OSCMDPFX : 'export TERM=' : TERM_TYP : OSCMDSFX EXECUTE OSCMDPFX : 'stty sane' : OSCMDSFX END RETURN