home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / templates / part05 / symbol.el < prev    next >
Lisp/Scheme  |  1987-10-04  |  25KB  |  804 lines

  1. ;;; symbol.el -- Identifier completion facilities
  2. ;;; Copyright (C) 1987 Mark A. Ardis.
  3.  
  4. (provide 'symbol)
  5.  
  6. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  7.  
  8. (defvar sym-completion-buffer nil
  9.   "Buffer containing user-entered symbols for identifier completion."
  10. ) ; sym-completion-buffer
  11. (make-variable-buffer-local 'sym-completion-buffer)
  12.  
  13. (defvar sym-end-display "<<"
  14.   "*Display marker after string to be created in symbol mode."
  15. ) ; sym-end-display
  16.  
  17. (defvar sym-end-marker (make-marker)
  18.   "Marker at end of symbol."
  19. ) ; sym-end-marker
  20. (make-variable-buffer-local 'sym-end-marker)
  21. (setq-default sym-end-marker (make-marker))
  22.  
  23. (defvar sym-original nil
  24.   "Text string originally present, to be replaced in symbol-mode."
  25. ) ; sym-original
  26. (make-variable-buffer-local 'sym-original)
  27.  
  28. (defvar sym-start-display ">>"
  29.   "*Display marker before string to be created in symbol mode."
  30. ) ; sym-start-display
  31.  
  32. (defvar sym-start nil
  33.   "Position of start of symbol in buffer."
  34. ) ; sym-start
  35. (make-variable-buffer-local 'sym-start)
  36.  
  37. (defvar symbol-mode-map nil
  38.   "Key-map for Symbol Mode."
  39. ) ; symbol-mode-map
  40.  
  41. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  42.  
  43. (defun symbol-mode ()
  44.   "Major mode for inserting symbols in place.  Like any other mode,
  45.     except that newline terminates it, and the following commands
  46.     are available:
  47.       TAB  attempt to complete last identifier typed
  48.     Meant to be called from sym-read-string, which initializes."
  49.   (interactive)
  50.                     ; Local Variables
  51.   (let ()
  52.                     ; Body
  53.     (or symbol-mode-map
  54.       (sym-set-local-keys))
  55.     (use-local-map symbol-mode-map)
  56.     (setq major-mode 'symbol-mode)
  57.     (setq mode-name "Symbol")
  58.   ) ; let
  59. ) ; defun symbol-mode
  60.  
  61. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  62.  
  63. (defun add-symbol ()
  64.   "Add the symbol before point to the template-mode completion list."
  65.   (interactive)
  66.                     ; Local Variables
  67.   (let (start)
  68.                     ; Body
  69.     (forward-word -1)
  70.     (setq start (point))
  71.     (forward-word 1)
  72.     (sym-enter-id (buffer-substring start (point)))
  73.   ) ; let
  74. ) ; defun add-symbol
  75.  
  76. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  77.  
  78. (defun expand-symbol ()
  79.   "Expand the symbol before point using the template-mode completion list."
  80.   (interactive)
  81.                     ; Local Variables
  82.   (let (start result)
  83.                     ; Body
  84.     (forward-word -1)
  85.     (setq start (point))
  86.     (forward-word 1)
  87.     (setq result (sym-complete-id (buffer-substring start (point))))
  88.     (backward-kill-word 1)
  89.     (insert-before-markers result)
  90.   ) ; let
  91. ) ; defun expand-symbol
  92.  
  93. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  94.  
  95. (defun sym-abort-recursive-edit ()
  96.   "Catch abort and repair entry."
  97.   (interactive)
  98.                     ; Local Variables
  99.   (let ()
  100.                     ; Body
  101.     (sym-reposition-point)
  102.     (if (< sym-start (marker-position sym-end-marker))
  103.       (progn
  104.     (delete-region sym-start (marker-position sym-end-marker))
  105.     (sym-reset-display)
  106.       ) ; progn
  107.     ) ; if
  108.     (abort-recursive-edit)
  109.   ) ; let
  110. ) ; defun sym-illegal-command
  111.  
  112. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  113.  
  114. (defun sym-backward-char ()
  115.   "Move point left one character, if possible."
  116.                     ; Local Variables
  117.   (interactive)
  118.   (let ()
  119.                     ; Body
  120.     (sym-reposition-point)
  121.     (if (> (point) sym-start)
  122.       (backward-char 1)
  123.                     ; else cannot advance
  124.       (ding)
  125.     ) ; if
  126.   ) ; let
  127. ) ; defun sym-backward-char
  128.  
  129. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  130.  
  131. (defun sym-backward-kill-word ()
  132.   "Delete the previous word in symbol-mode."
  133.                     ; Local Variables
  134.   (interactive)
  135.   (let ()
  136.                     ; Body
  137.     (sym-reposition-point)
  138.     (if (> (point) sym-start)
  139.       (progn
  140.     (backward-kill-word 1)
  141.                     ; If empty input, restore original
  142.     (sym-reset-display)
  143.       ) ; progn
  144.                     ; else cannot delete
  145.       (ding)
  146.     ) ; if
  147.   ) ; let
  148. ) ; defun sym-backward-kill-word
  149.  
  150. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  151.  
  152. (defun sym-backward-word ()
  153.   "Move point left one word, if possible."
  154.                     ; Local Variables
  155.   (interactive)
  156.   (let ()
  157.                     ; Body
  158.     (sym-reposition-point)
  159.     (if (> (point) sym-start)
  160.       (backward-word 1)
  161.                     ; else cannot advance
  162.       (ding)
  163.     ) ; if
  164.   ) ; let
  165. ) ; defun sym-backward-word
  166.  
  167. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  168.  
  169. (defun sym-complete-id (string)
  170.   "Expand the identifier STRING using the completion table."
  171.                     ; Local Variables
  172.   (let (start text-buffer)
  173.                     ; Body
  174.     (message "Expanding %s..." string)
  175.     (setq text-buffer (buffer-name))
  176.     (set-buffer sym-completion-buffer)
  177.                     ; Search for match
  178.     (goto-char (point-min))
  179.     (if (re-search-forward (concat "^" string) (point-max) t)
  180.       (progn
  181.     (beginning-of-line)
  182.     (setq start (point))
  183.     (end-of-line)
  184.     (setq string (buffer-substring start (point)))
  185.       ) ; progn
  186.     ) ; if
  187.     (set-buffer text-buffer)
  188.     (bury-buffer sym-completion-buffer)
  189.     (message "Expanding done.")
  190.                     ; Return expanded string
  191.     string
  192.   ) ; let
  193. ) ; defun sym-complete-id
  194.  
  195. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  196.  
  197. (defun sym-create-display ()
  198.   "Create the displayed string (if necessary) in symbol-mode."
  199.                     ; Local Variables
  200.   (let ()
  201.                     ; Body
  202.     (if (= sym-start (marker-position sym-end-marker))
  203.       (progn
  204.                     ; Remove the original string
  205.     (delete-char (length sym-original))
  206.                     ; Insert display
  207.     (insert-before-markers sym-start-display)
  208.     (insert-before-markers sym-end-display)
  209.     (search-backward sym-end-display)
  210.                     ; Reset the markers to empty
  211.     (set-marker sym-end-marker (point))
  212.     (setq sym-start (point))
  213.       ) ; progn
  214.     ) ; if
  215.   ) ; let
  216. ) ; defun sym-create-display
  217.  
  218. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  219.  
  220. (defun sym-delete-backward-char ()
  221.   "Delete the previous character created in symbol-mode."
  222.                     ; Local Variables
  223.   (interactive)
  224.   (let ()
  225.                     ; Body
  226.     (sym-reposition-point)
  227.     (if (> (point) sym-start)
  228.       (progn
  229.     (delete-backward-char 1)
  230.                     ; If empty input, restore original
  231.     (sym-reset-display)
  232.       ) ; progn
  233.                     ; else cannot delete
  234.       (ding)
  235.     ) ; if
  236.   ) ; let
  237. ) ; defun sym-delete-backward-char
  238.  
  239. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  240.  
  241. (defun sym-delete-char ()
  242.   "Delete the following character created in symbol-mode."
  243.                     ; Local Variables
  244.   (interactive)
  245.   (let ()
  246.                     ; Body
  247.     (sym-reposition-point)
  248.     (if (< (point) (marker-position sym-end-marker))
  249.       (progn
  250.     (delete-char 1)
  251.                     ; If empty input, restore original
  252.     (sym-reset-display)
  253.       ) ; progn
  254.                     ; else cannot delete
  255.       (ding)
  256.     ) ; if
  257.   ) ; let
  258. ) ; defun sym-delete-char
  259.  
  260. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  261.  
  262. (defun sym-enter-id (string)
  263.   "Enter STRING into the identifier completion table."
  264.   (interactive)
  265.                     ; Local Variables
  266.   (let (text-buffer prefix suffix found end-line)
  267.                     ; Body
  268.     (message "Adding %s..." string)
  269.     (setq text-buffer (buffer-name))
  270.     (set-buffer sym-completion-buffer)
  271.     (beginning-of-buffer)
  272.     (setq start (point))
  273.     (end-of-line nil)
  274.     (setq found (buffer-substring start (point)))
  275.     (setq more t)
  276.     (while (and more (string-lessp found string))
  277.       (if (not (eobp))
  278.     (progn
  279.       (beginning-of-line 2)
  280.       (setq start (point))
  281.       (end-of-line nil)
  282.       (setq found (buffer-substring start (point)))
  283.     ) ; progn
  284.       ; else
  285.     (progn
  286.       (setq more nil)
  287.       (if (not (bobp))
  288.         (newline)
  289.       ) ; if
  290.     ) ; progn
  291.       ) ; if
  292.     ) ; while
  293.     (if more
  294.       (if (not (string-equal found string))
  295.     (progn
  296.       (beginning-of-line nil)
  297.       (insert string "\n")
  298.     ) ; progn
  299.       ) ; if not equal
  300.     ; else
  301.       (insert string)
  302.     ) ; if more
  303.     (set-buffer text-buffer)
  304.     (bury-buffer sym-completion-buffer)
  305.     (message "Adding Done." string)
  306.   ) ; let
  307. ) ; defun sym-enter-id
  308.  
  309. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  310.  
  311. (defun sym-expand-last-id ()
  312.   "Try to expand last identifier created in symbol-mode."
  313.   (interactive)
  314.                     ; Local Variables
  315.   (let (end-id string)
  316.                     ; Body
  317.     (sym-reposition-point)
  318.     (if (> (point) sym-start)
  319.       (progn
  320.     (setq end-id (point))
  321.     (re-search-backward "\\W")
  322.     (if (< (point) end-id)
  323.       (forward-char 1)
  324.     ) ; if
  325.     (if (< (point) sym-start)
  326.       (goto-char sym-start)
  327.     ) ; if
  328.     (setq string (buffer-substring (point) end-id))
  329.     (if (> (length string) 0)
  330.       (progn
  331.         (delete-char (length string))
  332.         (setq string (sym-complete-id string))
  333.         (insert-before-markers string)
  334.       ) ; progn
  335.     ) ; if
  336.       ) ; progn
  337.                     ; else cannot expand empty string
  338.       (ding)
  339.     ) ; if
  340.   ) ; let
  341. ) ; defun sym-expand-last-id
  342.  
  343. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  344.  
  345. (defun sym-forward-char ()
  346.   "Move point right one character, if possible."
  347.                     ; Local Variables
  348.   (interactive)
  349.   (let ()
  350.                     ; Body
  351.     (sym-reposition-point)
  352.     (if (< (point) (marker-position sym-end-marker))
  353.       (forward-char 1)
  354.                     ; else cannot advance
  355.       (ding)
  356.     ) ; if
  357.   ) ; let
  358. ) ; defun sym-forward-char
  359.  
  360. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  361.  
  362. (defun sym-forward-word ()
  363.   "Move point right one word, if possible."
  364.                     ; Local Variables
  365.   (interactive)
  366.   (let ()
  367.                     ; Body
  368.     (sym-reposition-point)
  369.     (if (< (point) (marker-position sym-end-marker))
  370.       (forward-word 1)
  371.                     ; else cannot advance
  372.       (ding)
  373.     ) ; if
  374.   ) ; let
  375. ) ; defun sym-forward-word
  376.  
  377. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  378.  
  379. (defun sym-illegal-command ()
  380.   "Catch all illegal symbol-mode commands."
  381.   (interactive)
  382.                     ; Local Variables
  383.   (let ()
  384.                     ; Body
  385.     (ding)
  386.     (message "That command is not allowed in symbol-mode.")
  387.   ) ; let
  388. ) ; defun sym-illegal-command
  389.  
  390. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  391.  
  392. (defun sym-kill-line ()
  393.   "Kill the current symbol line in symbol-mode"
  394.                     ; Local Variables
  395.   (interactive)
  396.   (let ()
  397.                     ; Body
  398.     (sym-reposition-point)
  399.     (if (< (point) (marker-position sym-end-marker))
  400.       (progn
  401.     (delete-region (point) (marker-position sym-end-marker))
  402.                     ; If empty input, restore original
  403.     (sym-reset-display)
  404.       ) ; progn
  405.                     ; else cannot delete
  406.       (ding)
  407.     ) ; if
  408.   ) ; let
  409. ) ; defun sym-kill-line
  410.  
  411. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  412.  
  413. (defun sym-kill-word ()
  414.   "Delete the following word in symbol-mode."
  415.                     ; Local Variables
  416.   (interactive)
  417.   (let ()
  418.                     ; Body
  419.     (sym-reposition-point)
  420.     (if (< (point) (marker-position sym-end-marker))
  421.       (progn
  422.     (kill-word 1)
  423.                     ; If empty input, restore original
  424.     (sym-reset-display)
  425.       ) ; progn
  426.                     ; else cannot delete
  427.       (ding)
  428.     ) ; if
  429.   ) ; let
  430. ) ; defun sym-kill-word
  431.  
  432. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  433.  
  434. (defun sym-position-end ()
  435.   "Position point at end of symbol line."
  436.   (interactive)
  437.                     ; Local Variables
  438.   (let ()
  439.                     ; Body
  440.     (goto-char (marker-position sym-end-marker))
  441.   ) ; let
  442. ) ; defun sym-position-end
  443.  
  444. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  445.  
  446. (defun sym-position-start ()
  447.   "Position point at start of symbol line."
  448.   (interactive)
  449.                     ; Local Variables
  450.   (let ()
  451.                     ; Body
  452.     (goto-char sym-start)
  453.   ) ; let
  454. ) ; defun sym-position-start
  455.  
  456. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  457.  
  458. (defun sym-read-string (prompt original)
  459.   "Read characters and insert them at point.  First arg PROMPT is a
  460.     message to prompt the user.  Second arg ORIGINAL is an initial
  461.     string to use if all input is deleted."
  462.                     ; Local Variables
  463.   (let (save-mode save-name save-keymap sym-input sym-valid-response)
  464.                     ; Body
  465.                     ; Initialize state
  466.     (setq sym-start (point))
  467.     (setq sym-end-marker (make-marker))
  468.     (set-marker sym-end-marker (point))
  469.     (setq sym-original original)
  470.                     ; Save mode variables
  471.     (setq save-mode major-mode)
  472.     (setq save-name mode-name)
  473.     (setq save-keymap (current-local-map))
  474.     (symbol-mode)
  475.     (message "%s" prompt)
  476.                     ; Wait for user's creation
  477.     (setq sym-input original)
  478.     (unwind-protect
  479.  
  480.   (progn
  481. (setq sym-valid-response nil)
  482. (while (not sym-valid-response)
  483.   (recursive-edit)
  484.                     ; Pick up created string
  485.   (setq sym-input
  486.     (buffer-substring sym-start (marker-position sym-end-marker)))
  487.   (sym-reposition-point)
  488.                     ; If invalid try again
  489.   (if (and (boundp 'sym-check-validity-hook)
  490.     sym-check-validity-hook)
  491.   (progn
  492.     (setq sym-valid-response
  493.       (funcall sym-check-validity-hook sym-input))
  494.     ) ; progn
  495.   ; else
  496.     (setq sym-valid-response t)
  497.   ) ; if
  498. ) ; while
  499.   ) ; progn
  500.                     ; Restore display string
  501. (if (< sym-start (marker-position sym-end-marker))
  502.   (progn
  503.     (goto-char sym-start)
  504.     (delete-backward-char (length sym-start-display))
  505.     (goto-char (marker-position sym-end-marker))
  506.     (delete-char (length sym-end-display))
  507.   ) ; progn
  508. ) ; if
  509.                     ; Restore mode variables
  510. (setq major-mode save-mode)
  511. (setq mode-name save-name)
  512. (use-local-map save-keymap)
  513. ) ; unwind-protect
  514.                     ; Return string entered
  515. sym-input
  516. ) ; let
  517. ) ; defun sym-read-string
  518.  
  519. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  520.  
  521. (defun sym-reposition-point ()
  522.   "Reposition point within the symbol line, if necessary."
  523.   (interactive)
  524.                     ; Local Variables
  525.   (let ()
  526.                     ; Body
  527.     (if (or (< (point) sym-start)
  528.       (> (point) (marker-position sym-end-marker)))
  529.     (goto-char (marker-position sym-end-marker))
  530.   ) ; if
  531. ) ; let
  532. ) ; defun sym-reposition-point
  533.  
  534. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  535.  
  536. (defun sym-reset-display ()
  537.   "Reset the displayed string in symbol-mode."
  538.                     ; Local Variables
  539.   (let ()
  540.                     ; Body
  541.     (if (= sym-start (marker-position sym-end-marker))
  542.       (progn
  543.                     ; Remove the display markers
  544.     (delete-backward-char (length sym-start-display))
  545.     (delete-char (length sym-end-display))
  546.                     ; Insert original string
  547.     (insert-before-markers sym-original)
  548.     (search-backward sym-original)
  549.                     ; Reset the markers to empty
  550.     (set-marker sym-end-marker (point))
  551.     (setq sym-start (point))
  552.       ) ; progn
  553.     ) ; if
  554.   ) ; let
  555. ) ; defun sym-reset-display
  556.  
  557. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  558.  
  559. (defun sym-self-insert-command ()
  560.   "Insert this character in symbol-mode."
  561.   (interactive)
  562.                     ; Local Variables
  563.   (let (sym-char)
  564.                     ; Body
  565.     (setq sym-char (char-to-string last-input-char))
  566.     (sym-reposition-point)
  567.     (sym-create-display)
  568.     (insert-before-markers sym-char)
  569.     (if (and (= ?\) (char-syntax last-input-char))
  570.       blink-matching-paren)
  571.     (blink-matching-open)
  572.   ) ; if
  573. ) ; let
  574. ) ; defun sym-self-insert-command
  575.  
  576. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  577.  
  578. (defun sym-set-local-keys ()
  579.   "Create key-map for Symbol Mode."
  580.                     ; Local Variables
  581.   (let (empty-keymap)
  582.                     ; Body
  583.     (setq empty-keymap (make-keymap))
  584.     (setq symbol-mode-map empty-keymap)
  585.     (suppress-keymap symbol-mode-map t)
  586.  
  587.   (define-key symbol-mode-map "\177" 'sym-delete-backward-char) ; DEL
  588.  
  589.                     ; Control keys
  590.   (define-key symbol-mode-map "\C-a" 'sym-position-start)
  591.   (define-key symbol-mode-map "\C-b" 'sym-backward-char)
  592.                     ; ^C is a prefix
  593.   (define-key symbol-mode-map "\C-d" 'sym-delete-char)
  594.   (define-key symbol-mode-map "\C-e" 'sym-position-end)
  595.   (define-key symbol-mode-map "\C-f" 'sym-forward-char)
  596.   (define-key symbol-mode-map "\C-g" 'sym-abort-recursive-edit)
  597.                     ; ^H is okay
  598.   (define-key symbol-mode-map "\C-i" 'sym-expand-last-id) ; TAB
  599.   (define-key symbol-mode-map "\C-j" 'exit-recursive-edit) ; LFD
  600.   (define-key symbol-mode-map "\C-k" 'sym-kill-line)
  601.                     ; ^L is okay
  602.   (define-key symbol-mode-map "\C-m" 'exit-recursive-edit) ; CR
  603.                     ; ^N is okay
  604.   (define-key symbol-mode-map "\C-o" 'sym-illegal-command)
  605.                     ; ^P is okay
  606.   (define-key symbol-mode-map "\C-q" 'sym-illegal-command)
  607.   (define-key symbol-mode-map "\C-r" 'sym-illegal-command)
  608.   (define-key symbol-mode-map "\C-s" 'sym-illegal-command)
  609.   (define-key symbol-mode-map "\C-t" 'sym-transpose-chars)
  610.  
  611.  
  612.   (define-key symbol-mode-map "\C-u" 'sym-illegal-command)
  613.                     ; ^V is okay
  614.   (define-key symbol-mode-map "\C-w" 'sym-illegal-command)
  615.                     ; ^X is a prefix
  616.   (define-key symbol-mode-map "\C-y" 'sym-illegal-command)
  617.                     ; ^Z is okay
  618.  
  619.                     ; ^X prefix keys
  620.   (define-key symbol-mode-map "\C-x\t" 'sym-illegal-command)
  621.   (define-key symbol-mode-map "\C-x\C-l" 'sym-illegal-command)
  622.   (define-key symbol-mode-map "\C-x\C-o" 'sym-illegal-command)
  623.   (define-key symbol-mode-map "\C-x\C-t" 'sym-illegal-command)
  624.   (define-key symbol-mode-map "\C-x\C-u" 'sym-illegal-command)
  625.   (define-key symbol-mode-map "\C-xg" 'sym-illegal-command)
  626.   (define-key symbol-mode-map "\C-xi" 'sym-illegal-command)
  627.   (define-key symbol-mode-map "\C-xk" 'sym-illegal-command)
  628.   (define-key symbol-mode-map "\C-x\177" 'sym-illegal-command) ; ^X DEL
  629.  
  630.                     ; ESC prefix keys
  631.   (define-key symbol-mode-map "\e\C-b" 'sym-backward-word)
  632.   (define-key symbol-mode-map "\e\C-c" 'exit-recursive-edit)
  633.   (define-key symbol-mode-map "\e\C-f" 'sym-forward-word)
  634.   (define-key symbol-mode-map "\e\C-k" 'sym-illegal-command)
  635.   (define-key symbol-mode-map "\e\C-o" 'sym-illegal-command)
  636.   (define-key symbol-mode-map "\e\C-s" 'sym-illegal-command)
  637.   (define-key symbol-mode-map "\e\C-t" 'sym-illegal-command)
  638.   (define-key symbol-mode-map "\e\C-w" 'sym-illegal-command)
  639.   (define-key symbol-mode-map "\e\C-\\" 'sym-illegal-command)
  640.   (define-key symbol-mode-map "\e " 'sym-illegal-command) ; ESC SPACE
  641.   (define-key symbol-mode-map "\e%" 'sym-illegal-command)
  642.   (define-key symbol-mode-map "\e(" 'sym-illegal-command)
  643.   (define-key symbol-mode-map "\e)" 'sym-illegal-command)
  644.   (define-key symbol-mode-map "\e;" 'sym-illegal-command)
  645.   (define-key symbol-mode-map "\e<" 'sym-position-start)
  646.   (define-key symbol-mode-map "\e>" 'sym-position-end)
  647.   (define-key symbol-mode-map "\e^" 'sym-illegal-command)
  648.   (define-key symbol-mode-map "\eb" 'sym-backward-word)
  649.   (define-key symbol-mode-map "\ed" 'sym-kill-word)
  650.   (define-key symbol-mode-map "\ef" 'sym-forward-word)
  651.   (define-key symbol-mode-map "\eg" 'sym-illegal-command)
  652.   (define-key symbol-mode-map "\ei" 'sym-illegal-command)
  653.   (define-key symbol-mode-map "\ej" 'sym-illegal-command)
  654.   (define-key symbol-mode-map "\ek" 'sym-illegal-command)
  655.   (define-key symbol-mode-map "\eq" 'sym-illegal-command)
  656.   (define-key symbol-mode-map "\et" 'sym-illegal-command)
  657.   (define-key symbol-mode-map "\ey" 'sym-illegal-command)
  658.   (define-key symbol-mode-map "\ez" 'sym-illegal-command)
  659.   (define-key symbol-mode-map "\e\177" 'sym-backward-kill-word) ; ESC DEL
  660.  
  661.                     ; Self-inserting keys
  662.  
  663.   (define-key symbol-mode-map " " 'sym-self-insert-command) ; SPACE
  664.   (define-key symbol-mode-map "!" 'sym-self-insert-command)
  665.   (define-key symbol-mode-map "\042" 'sym-self-insert-command) ; DOUBLE QUOTE
  666.   (define-key symbol-mode-map "#" 'sym-self-insert-command)
  667.   (define-key symbol-mode-map "$" 'sym-self-insert-command)
  668.   (define-key symbol-mode-map "%" 'sym-self-insert-command)
  669.   (define-key symbol-mode-map "&" 'sym-self-insert-command)
  670.   (define-key symbol-mode-map "\047" 'sym-self-insert-command) ; SINGLE QUOTE
  671.   (define-key symbol-mode-map "(" 'sym-self-insert-command)
  672.   (define-key symbol-mode-map ")" 'sym-self-insert-command)
  673.   (define-key symbol-mode-map "*" 'sym-self-insert-command)
  674.   (define-key symbol-mode-map "+" 'sym-self-insert-command)
  675.   (define-key symbol-mode-map "," 'sym-self-insert-command)
  676.   (define-key symbol-mode-map "-" 'sym-self-insert-command)
  677.   (define-key symbol-mode-map "." 'sym-self-insert-command)
  678.   (define-key symbol-mode-map "/" 'sym-self-insert-command)
  679.  
  680.   (define-key symbol-mode-map "0" 'sym-self-insert-command)
  681.   (define-key symbol-mode-map "1" 'sym-self-insert-command)
  682.   (define-key symbol-mode-map "2" 'sym-self-insert-command)
  683.   (define-key symbol-mode-map "3" 'sym-self-insert-command)
  684.   (define-key symbol-mode-map "4" 'sym-self-insert-command)
  685.   (define-key symbol-mode-map "5" 'sym-self-insert-command)
  686.   (define-key symbol-mode-map "6" 'sym-self-insert-command)
  687.   (define-key symbol-mode-map "7" 'sym-self-insert-command)
  688.   (define-key symbol-mode-map "8" 'sym-self-insert-command)
  689.   (define-key symbol-mode-map "9" 'sym-self-insert-command)
  690.  
  691.   (define-key symbol-mode-map ":" 'sym-self-insert-command)
  692.   (define-key symbol-mode-map ";" 'sym-self-insert-command)
  693.   (define-key symbol-mode-map "<" 'sym-self-insert-command)
  694.   (define-key symbol-mode-map "=" 'sym-self-insert-command)
  695.   (define-key symbol-mode-map ">" 'sym-self-insert-command)
  696.   (define-key symbol-mode-map "?" 'sym-self-insert-command)
  697.   (define-key symbol-mode-map "@" 'sym-self-insert-command)
  698.  
  699.   (define-key symbol-mode-map "A" 'sym-self-insert-command)
  700.   (define-key symbol-mode-map "B" 'sym-self-insert-command)
  701.   (define-key symbol-mode-map "C" 'sym-self-insert-command)
  702.   (define-key symbol-mode-map "D" 'sym-self-insert-command)
  703.   (define-key symbol-mode-map "E" 'sym-self-insert-command)
  704.   (define-key symbol-mode-map "F" 'sym-self-insert-command)
  705.   (define-key symbol-mode-map "G" 'sym-self-insert-command)
  706.   (define-key symbol-mode-map "H" 'sym-self-insert-command)
  707.   (define-key symbol-mode-map "I" 'sym-self-insert-command)
  708.   (define-key symbol-mode-map "J" 'sym-self-insert-command)
  709.   (define-key symbol-mode-map "K" 'sym-self-insert-command)
  710.   (define-key symbol-mode-map "L" 'sym-self-insert-command)
  711.   (define-key symbol-mode-map "M" 'sym-self-insert-command)
  712.   (define-key symbol-mode-map "N" 'sym-self-insert-command)
  713.   (define-key symbol-mode-map "O" 'sym-self-insert-command)
  714.   (define-key symbol-mode-map "P" 'sym-self-insert-command)
  715.   (define-key symbol-mode-map "Q" 'sym-self-insert-command)
  716.   (define-key symbol-mode-map "R" 'sym-self-insert-command)
  717.   (define-key symbol-mode-map "S" 'sym-self-insert-command)
  718.   (define-key symbol-mode-map "T" 'sym-self-insert-command)
  719.   (define-key symbol-mode-map "U" 'sym-self-insert-command)
  720.   (define-key symbol-mode-map "V" 'sym-self-insert-command)
  721.   (define-key symbol-mode-map "W" 'sym-self-insert-command)
  722.   (define-key symbol-mode-map "X" 'sym-self-insert-command)
  723.   (define-key symbol-mode-map "Y" 'sym-self-insert-command)
  724.   (define-key symbol-mode-map "Z" 'sym-self-insert-command)
  725.  
  726.   (define-key symbol-mode-map "[" 'sym-self-insert-command)
  727.   (define-key symbol-mode-map "\134" 'sym-self-insert-command) ; BACKSLASH
  728.   (define-key symbol-mode-map "]" 'sym-self-insert-command)
  729.   (define-key symbol-mode-map "^" 'sym-self-insert-command)
  730.   (define-key symbol-mode-map "_" 'sym-self-insert-command)
  731.   (define-key symbol-mode-map "`" 'sym-self-insert-command)
  732.  
  733.   (define-key symbol-mode-map "a" 'sym-self-insert-command)
  734.   (define-key symbol-mode-map "b" 'sym-self-insert-command)
  735.   (define-key symbol-mode-map "c" 'sym-self-insert-command)
  736.   (define-key symbol-mode-map "d" 'sym-self-insert-command)
  737.   (define-key symbol-mode-map "e" 'sym-self-insert-command)
  738.   (define-key symbol-mode-map "f" 'sym-self-insert-command)
  739.   (define-key symbol-mode-map "g" 'sym-self-insert-command)
  740.   (define-key symbol-mode-map "h" 'sym-self-insert-command)
  741.   (define-key symbol-mode-map "i" 'sym-self-insert-command)
  742.   (define-key symbol-mode-map "j" 'sym-self-insert-command)
  743.   (define-key symbol-mode-map "k" 'sym-self-insert-command)
  744.   (define-key symbol-mode-map "l" 'sym-self-insert-command)
  745.   (define-key symbol-mode-map "m" 'sym-self-insert-command)
  746.   (define-key symbol-mode-map "n" 'sym-self-insert-command)
  747.   (define-key symbol-mode-map "o" 'sym-self-insert-command)
  748.   (define-key symbol-mode-map "p" 'sym-self-insert-command)
  749.   (define-key symbol-mode-map "q" 'sym-self-insert-command)
  750.   (define-key symbol-mode-map "r" 'sym-self-insert-command)
  751.   (define-key symbol-mode-map "s" 'sym-self-insert-command)
  752.   (define-key symbol-mode-map "t" 'sym-self-insert-command)
  753.   (define-key symbol-mode-map "u" 'sym-self-insert-command)
  754.   (define-key symbol-mode-map "v" 'sym-self-insert-command)
  755.   (define-key symbol-mode-map "w" 'sym-self-insert-command)
  756.   (define-key symbol-mode-map "x" 'sym-self-insert-command)
  757.   (define-key symbol-mode-map "y" 'sym-self-insert-command)
  758.   (define-key symbol-mode-map "z" 'sym-self-insert-command)
  759.  
  760.   (define-key symbol-mode-map "{" 'sym-self-insert-command)
  761.   (define-key symbol-mode-map "|" 'sym-self-insert-command)
  762.   (define-key symbol-mode-map "}" 'sym-self-insert-command)
  763.   (define-key symbol-mode-map "~" 'sym-self-insert-command)
  764.  
  765.   ) ; let
  766. ) ; defun sym-set-local-keys
  767.  
  768. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  769.  
  770. (defun sym-transpose-chars ()
  771.   "Interchange characters arond point, moving forward one character.
  772.     If at end of symbol line, the previous two characters are exchanged."
  773.   (interactive)
  774.                     ; Local Variables
  775.   (let (save-position)
  776.                     ; Body
  777.     (sym-reposition-point)
  778.     (if (> (point) sym-start)
  779.       (if (< (point) (marker-position sym-end-marker))
  780.     (transpose-chars 1)
  781.       ; else
  782.     (if (> (point) (1+ sym-start))
  783.       (progn
  784.                     ; transpose does not
  785.                     ;   insert-before-markers
  786.         (setq save-position (marker-position sym-end-marker))
  787.         (backward-char 1)
  788.         (transpose-chars 1)
  789.         (set-marker sym-end-marker save-position)
  790.       ) ; progn
  791.     ; else
  792.       (ding)
  793.     ) ; if
  794.       ) ; if
  795.     ; else
  796.       (ding)
  797.     ) ; if
  798.   ) ; let
  799. ) ; defun sym-transpose-chars
  800.  
  801. ;;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  802.  
  803. ;;; end of symbol.el
  804.