home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / vmsnet / tpu / 476 < prev    next >
Encoding:
Internet Message Format  |  1992-11-06  |  10.8 KB

  1. Path: sparky!uunet!ukma!darwin.sura.net!zaphod.mps.ohio-state.edu!moe.ksu.ksu.edu!mccall!info-tpu-newsgate!list
  2. Newsgroups: vmsnet.tpu
  3. Subject: Re: Control keys and EDIT/TPU
  4. Message-ID: <01GQR6CUB6WI001P4J@AC.DAL.CA>
  5. From: Peter Galbraith <galbrth@ac.dal.ca>
  6. Date: 04 Nov 1992 12:59:41 -0400
  7. Reply-To: Peter Galbraith <GALBRTH@AC.DAL.CA>
  8. Organization: The Internet
  9. Return-Path: <TPU-Mgr@SHSU.edu>
  10. Errors-To: TPU-Mgr@SHSU.edu
  11. X-Listname: Text Processing Utility (TPU) Language Discussion List
  12. CC: ritley@uimrl7.mrl.uiuc.edu
  13. X-Vms-To: INFO-TPU
  14. X-Vms-Cc: IN%"ritley@uimrl7.mrl.uiuc.edu",GALBRTH
  15. Mime-Version: 1.0
  16. Content-Transfer-Encoding: 7BIT
  17. Lines: 262
  18.  
  19. In a message of 29 Oct 1992 23:22:16 +0000 (GMT)
  20. Received on Wed, 4 Nov 1992 08:07:14 -0400
  21.  
  22. Dave Cantor <cantor@star.enet.dec.com> wrote
  23. to: Text Processing Utility (TPU) Language Discussion List <INFO-TPU@SHSU.edu>
  24. Subj: RE: Control keys and EDIT/TPU
  25.  
  26. >In article <1992Oct29.101456.1@slacvx.slac.stanford.edu>, fairfield@slacvx.slac
  27.    .stanford.edu writes...
  28.  
  29. >>    The alternative (dirty!) is to write a TPU procedure that gets bound
  30. >>to ctrl-k.  When that procedure is executed, have it read the next key and
  31. >>determine which procedure is to be executed for that 2nd key.
  32. >
  33. >Another way, less dirty, but more complicated, would be to write a TPU
  34. >procedure, bound to control-k, which will activate new bindings for
  35. >some or all the keys.  In general, all procedures invoked by the new
  36. >bindings must eventually restore the old bindings which were in effect
  37. >before control-k was struck.
  38. >
  39.  
  40.  
  41. History repeats itself.  Follows is one of my post from March 91.
  42. It deals with both cases mentionned above.
  43.  
  44.     #34          7-MAR-1991 17:51:59.14                                 INFO-TPU
  45. From: Peter Galbraith, Dalhousie Oceanography <GALBRTH@AC.DAL.CA>
  46. To:   info-tpu@SHSU
  47. Subj: Skeleton Procedures for Embedded CTRL Keymaps
  48.  
  49. Date sent: Thu, 7 Mar 91 13:26 AST
  50. Received:  Thu, 7 Mar 91 17:51 AST
  51.  
  52. !I thought about the embedded CTRL keymaps last night while waiting for
  53. !Quantum Leap on TV.  I came up with two alternatives.
  54. !
  55. !I have quoted my comments to allow you to strip out the mail header and
  56. !EXTEND ALL.
  57. !
  58. !RULES
  59. !~~~~~
  60. !   There is a tree of CTRL keymaps.  When you press a valid CTRL prefix,
  61. !   the editor then waits for further keys to be pressed.  You can then:
  62. !
  63. !   o Press a defined key -> function executed, exit CTRL prefix tree
  64. !   o Press an undefined key -> editor says so, stays at that tree level
  65. !   o Press an embedded CTRL prefix -> Go deeper in CTRL prefix tree
  66. !   o Press CTRL-G to escape CTRL prefix tree
  67. !
  68. !As an example, I show a simple branch of a tree
  69. !
  70. !  Main        level 1       level 2
  71. !  ~~~~        ~~~~~~~       ~~~~~~~
  72. !o CTRL-\  ->  CTRL-\   ->   CTRL-G
  73. !              CTRL-G          to esacpe
  74. !                to escape   M
  75. !              L               defined
  76. !                defined
  77. !
  78. !VERSION 1
  79. !~~~~~~~~~
  80. !In this version, you stay within a procedure until a proper sequence leads
  81. !to completion (either a defined function or CTRL-G).
  82. !
  83. !o Define a keymap for TPU$KEY_MAP_LIST to put keys that invoke first layer
  84. !  of CTRL prefixes
  85. !o Add it to TPU$KEY_MAP_LIST
  86. !o For each CTRL prefix:
  87. !  o Create a unique keymap
  88. !  o Define function keys (L and M in this example) to do stuff
  89. !  o Define a key (or many) to escape the prefix tree (CTRL-G in this example)
  90. !  o Define keys to call embedded CTRL prefixes
  91. !    (an extra CTRL-\ in this example)
  92. !o A single recursive procedure is called to go deeper into the prefix tree.
  93. !  Keys that call it pass the keymap to go to as an argument:
  94. !   for ex:        peve$ctrl_keymap_prefix('eve$fs_keys_2')
  95. !
  96. !! Global variables:
  97. !!  o various keymaps
  98. !!  o peve$x_message - message displayed i.e. "CTRL-\ CTRL-\"
  99. !
  100. !Note that the eve_build_ex1 procedure would NOT normally exist.  this code
  101. !would be found at the end of a module and executed once at build time.
  102. !(or give it a name which doesn't start in "eve_", use it once and SAVE your
  103. !section file).
  104.  
  105. ! To try both versions:
  106. ! o EXTEND ALL
  107. ! o BUILD EX1
  108. ! o try the first with CTRL-\ (see above for possible scenarios)
  109. ! o BUILD EX2 (you must have done BUILD EX1 first!)
  110. ! o try the second the same way (the message may be wrong the first time
  111. !   because I use the same variable as in the first example!)
  112.  
  113. procedure eve_build_ex1
  114.  ! Define a keymap to put the CTRL prefixes in for TPU$KEY_MAP_LIST
  115.  eve$ctrl_prefix_keys := create_key_map("eve$ctrl_prefix_keys");
  116.  
  117.  ! Put it into TPU$KEY_MAP_LIST.  This will put USER keys back on top
  118.  remove_key_map("TPU$KEY_MAP_LIST","eve$user_keys");
  119.  add_key_map("TPU$KEY_MAP_LIST","first","eve$ctrl_prefix_keys");
  120.  add_key_map("TPU$KEY_MAP_LIST","first","eve$user_keys");
  121.  
  122.  ! Give CTRL-\ a good name, instead of FS
  123.  ! See my post of last week about this...
  124.  define_key("eve$null",key_name("\",ctrl_modified),"CTRL-\",
  125.              eve$x_current_language_keymap);
  126.  
  127.  ! Create CTRL-\ keymap (layer 1)
  128.  eve$fs_keys_1 := create_key_map("eve$fs_keys_1");
  129.  
  130.  ! Define CTRL-\ key in TPU$KEY_MAP_LIST to go to it and initialize message
  131.  define_key("peve$x_message := '';peve$ctrl_keymap_prefix('eve$fs_keys_1')",
  132.            key_name("\",ctrl_modified),"CTRL_PREFIX_\","eve$ctrl_prefix_keys");
  133.  ! I'll use comment to ID it -----------^^^^^^^^^^^^^
  134.  
  135.  ! Define CTRL-G to exit CTRL prefix tree
  136.  define_key("eve$null",key_name("G",ctrl_modified),"CTRL_BACK","eve$fs_keys_1");
  137.  ! I'll use comment to ID it -----------------------^^^^^^^^^
  138.  ! No actual procedure defined
  139.  
  140.  ! Define a test key in layer 1 of CTRL-\
  141.  define_key("message('Pressed L')",key_name("l"),"test","eve$fs_keys_1");
  142.  
  143.  ! Create a second layer CTRL-\
  144.  eve$fs_keys_2 := create_key_map("eve$fs_keys_2");
  145.  define_key("peve$ctrl_keymap_prefix('eve$fs_keys_2')",
  146.            key_name("\",ctrl_modified),"CTRL_PREFIX_\","eve$fs_keys_1");
  147.  ! Define CTRL-G to exit CTRL prefix tree
  148.  define_key("eve$null",key_name("G",ctrl_modified),"CTRL_BACK","eve$fs_keys_2");
  149.  ! Define a test key in layer 2 of CTRL-\
  150.  define_key("message('Pressed M')",key_name("m"),"test","eve$fs_keys_2");
  151. endprocedure;
  152.  
  153. procedure peve$ctrl_keymap_prefix(peve$arg1)
  154. local pkey, lcomment;
  155.  
  156. ! Display key sequence pressed; store in peve$x_message
  157.     if (peve$x_message = "") then
  158.       peve$x_message := eve$key_name(last_key);
  159.     else
  160.       peve$x_message := peve$x_message + " " + eve$key_name(last_key);
  161.     endif;
  162.     message(peve$x_message);
  163.  
  164.     loop
  165.       pkey := read_key;
  166.       lcomment := lookup_key (PKEY, comment, peve$arg1);
  167.       if lcomment = "" then
  168.         message(peve$x_message + " " + eve$key_name(pkey) + " Not defined");
  169.       else
  170. ! Check if a CTRL_BACK key
  171.         if substr(lcomment,1,9) = "CTRL_BACK" then
  172.           message("");
  173.         else
  174.           execute(lookup_key (pkey, program, peve$arg1));
  175.         endif;
  176.         exitif (1);
  177.       endif;
  178.     endloop;
  179.     return;
  180. endprocedure;
  181.  
  182.  
  183. !VERSION 2
  184. !~~~~~~~~~
  185. !
  186. !This (more elegant?) version actually changes the KEY MAP LIST of the current
  187. !buffer to one associated with the CTRL prefix typed.  It then exits the
  188. !procedure and let eve do the work.  It is very easy to add-on to.
  189. !
  190. !I'll assume eve_build_ex1 was executed to:
  191. !  o Create `eve$ctrl_prefix_keys' keymap to hold first layer CTRL prefixes
  192. !  o Add it to TPU$KEY_MAP_LIST
  193. !  o Give CTRL-\ a good name, instead of FS
  194. !  o Create CTRL-\ keymap (layer 1)
  195. !  o Create a second CTRL-\ keymap (layer 2)
  196. !  o Define test keys for each keymap ("L" and "M" keys)
  197. !
  198. !o For each CTRL prefix:
  199. !  o Create a keymap for each CTRL prefix (done above)
  200. !  o Create a unique key map list and assign prefix keymap to it
  201. !  o Define a (or many) key to escape prefix tree (CTRL-G in this example)
  202. !  o Define keys to call embedded CTRL prefixes
  203. !   (an extra CTRL-\ in this example)
  204. !
  205. !o The key map list of the buffer will actually be changed from
  206. !  TPU$KEY_MAP_LIST to a prefix key map list.
  207. !o A SET(UNDEFINED_KEY) call sets a distinct message to be dsiplay when you
  208. !  then press undefined keys.
  209. !o A SET(POST_KEY_PROCEDURE) call sets a procedure to execute after each
  210. !  defined key is preesed to go back to TPU$KEY_MAP_LIST, except when you
  211. !  go deeper into the CTRL prefix tree.
  212. !o A SET(SELF_INSERT) call prevents eve from typing-in regular typing keys
  213. !  in CTRL prefix key map lists.
  214.  
  215.  
  216. procedure eve_build_ex2
  217.  
  218. ! create both key map lists, with their initial CTRL prefix keymaps.
  219.  eve$fs_keymap_list_1 :=
  220.    create_key_map_list("eve$fs_keymap_list_1","eve$fs_keys_1");
  221.  eve$fs_keymap_list_2 :=
  222.    create_key_map_list("eve$fs_keymap_list_2","eve$fs_keys_2");
  223.  
  224.  ! Define CTRL-\ key in TPU$KEY_MAP_LIST to change KEY MAP LIST
  225.  define_key("peve$ctrl_keymaplist_prefix('eve$fs_keymap_list_1')",
  226.            key_name("\",ctrl_modified),"CTRL-\ Prefix","eve$ctrl_prefix_keys");
  227.  
  228.  ! Define CTRL-\ key in layer 1 (eve$fs_keys_1) to go to layer 2
  229.  define_key("peve$ctrl_keymaplist_prefix('eve$fs_keymap_list_2')",
  230.            key_name("\",ctrl_modified),"CTRL-\ Prefix","eve$fs_keys_1");
  231.  
  232.  ! Define CTRL-G to exit CTRL prefix tree (for each layer)
  233.  define_key("peve$ctrl_post_key;message('');",key_name("G",ctrl_modified),
  234.             "Escape CTRL prefix","eve$fs_keys_1");
  235.  define_key("peve$ctrl_post_key;message('');",key_name("G",ctrl_modified),
  236.             "Escape CTRL prefix","eve$fs_keys_2");
  237.  
  238.  ! Set what_do_to on undefined keys in CTRL prefix key map lists
  239.  set(undefined_key,"eve$fs_keymap_list_1",
  240.     "message(peve$x_message + ' ' + eve$key_name(last_key) + ' Not defined')");
  241.  set(undefined_key,"eve$fs_keymap_list_2",
  242.     "message(peve$x_message + ' ' + eve$key_name(last_key) + ' Not defined')");
  243.  
  244.  ! Set post-key procedures in CTRL prefix key map lists to go back to
  245.  ! TPU$KEY_MAP_LIST
  246.  set(post_key_procedure,"eve$fs_keymap_list_1","peve$ctrl_post_key");
  247.  set(post_key_procedure,"eve$fs_keymap_list_2","peve$ctrl_post_key");
  248.  
  249.  ! Set SELF_INSERT to off to avoid typing-in regular typing keys
  250.  set(self_insert,"eve$fs_keymap_list_1",off);
  251.  set(self_insert,"eve$fs_keymap_list_2",off);
  252. endprocedure;
  253.  
  254. procedure peve$ctrl_keymaplist_prefix(peve$arg1)
  255.     if (get_info(peve$x_message,"type") = UNSPECIFIED) or
  256.        (peve$x_message = "") then
  257.       peve$x_message := eve$key_name(last_key);
  258.     else
  259.       peve$x_message := peve$x_message + " " + eve$key_name(last_key);
  260.     endif;
  261.     message(peve$x_message);
  262.     if get_info(current_buffer, "key_map_list") <> "TPU$KEY_MAP_LIST" then
  263.        peve$x_no_exit := TRUE;  !Inhibit peve$ctrl_post_key from exiting now
  264.     endif;
  265.     set (key_map_list, peve$arg1, current_buffer);
  266. endprocedure;
  267.  
  268. procedure peve$ctrl_post_key
  269.     if peve$x_no_exit then peve$x_no_exit := FALSE; return; endif;
  270.     set (key_map_list, "TPU$KEY_MAP_LIST", current_buffer);
  271.     peve$x_message := "";
  272. endprocedure;
  273.  
  274. ! Hope this will be useful for someone!
  275. ! Peter
  276.  
  277.  _____________________________________________________________________________
  278.  Peter Galbraith       [Phone: (902) 494-7007] |  GALBRTH@AC.DAL.CA (InterNet)
  279.  Dept. of Oceanography,  Dalhousie University  |  GALBRTH@DALAC     (BitNet)
  280.  Halifax, Nova Scotia, Canada, B3H 4J1         |  rhogee@dalcs      (UUCP)
  281.