home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / me34src.zip / me3 / mutt / builtin / modeline.mut < prev    next >
Text File  |  1995-01-14  |  7KB  |  255 lines

  1. ;; modeline.mut :  Modeline central.  Control what the mode line looks
  2. ;;   like and other mode related stuff.
  3.  
  4. ;; Modeline format:
  5. ;;   Change_flag Buffer-name (major-mode : minor-mode) File: File-name
  6. ;;     Change_flag : -- or **
  7. ;;     major_mode  : "", C, Mutt, Picture, etc
  8. ;;     minor_mode  : comment, etc
  9.  
  10. ;; Routines:
  11. ;;   (local-modeline-hook
  12. ;;     name-of-the-routine-to-call-instead-of-modeline-hook)
  13. ;;     If the buffer has a local modeline-hook, it is called instead of the
  14. ;;       global (modeline-hook).
  15. ;;   (major-mode name-of-major-mode) : (major-mode "foo") sets the major
  16. ;;     mode name to foo (displayed on the modeline) and (major-mode)
  17. ;;     returns the current major mode name.
  18. ;;   (minor-mode name-of-minor-mode)
  19. ;;   (clear-modes) : Remove all the local key bindings, mode names and
  20. ;;     reset the buffer local sysvars.
  21.  
  22. ;; Uses:
  23. ;;   Buffer variables:
  24. ;;     major-mode
  25. ;;     minor-mode
  26. ;;     local-modeline-hook
  27.  
  28. ;; C Durland 10/89    Public Domain
  29.  
  30. (include me.mh)
  31.  
  32. (defun
  33.   local-modeline-hook (string hook-name)
  34.     { (buffer-var "local-modeline-hook" hook-name) }
  35.   major-mode (string name) { (mode-name "major-mode" (push-args 0)) }
  36.   minor-mode (string name) { (mode-name "minor-mode" (push-args 0)) }
  37.   clear-modes
  38.   {
  39. ;    (install-keymap NULL-KEYMAP LOCAL-KEYMAP)
  40.  
  41.     (major-mode "")(minor-mode "")
  42.     (tab-stops 0)(word-wrap 0)
  43.   }
  44.   biff-all-modelines
  45.   {
  46.     (int j)
  47.  
  48.     (for (j 0) (< j (windows)) (+= j 1)
  49.       (buffer-flags (attached-buffer j) BFMode))   ;; force update of modeline
  50.   }
  51. )
  52.  
  53. (string ml-message ml-time)
  54. (defun
  55.   modeline-time (string time)
  56.   {
  57.     (if (== (nargs) 1)        ;; got time
  58.       (if (== "" time)
  59.         (modeline-show-time "")
  60.     (if (!= ml-time (concat time " "))
  61.       (modeline-show-time (concat time " ")))))
  62.  
  63.     ml-time    ;; return the current time
  64.   }
  65.   modeline-show-time (time) HIDDEN
  66.   {
  67.     (ml-time time) (biff-all-modelines) (update)
  68.   }
  69.   modeline-message (string text)
  70.   {
  71.     (if (== (nargs) 1)        ;; got text
  72.     {
  73.       (ml-message text)
  74.       (biff-all-modelines)
  75.     })
  76.     ml-message    ;; return the message
  77.   }
  78. )
  79.  
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81. ;;;;;;;;;;;;;;;;;;;;;;;;;; System Variables ;;;;;;;;;;;;;;;;;;;;;;;;;;
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  83.  
  84.    ;; Since these are global (and apply to all buffers), only have to do
  85.    ;;   anything when they change state - otherwise the message is the same
  86.    ;;   for all buffers.
  87.  
  88. (string SV-message)
  89. (bool McState)
  90.  
  91. (defun
  92.   McModeline (bool on)    ;; Called when keyboard macro changes state
  93.              { (McState on)(make-SV-message) }
  94.   overstrike-toggle-hook {           (make-SV-message) }
  95.   make-SV-message HIDDEN
  96.   {
  97.     (SV-message "")
  98.     (sv-pack (!= 0 (overstrike))  "Ovwrt") ;; over strike
  99.     (sv-pack McState          "McDef") ;; keyboard macro
  100.  
  101.     (if (!= "" SV-message) (SV-message (concat " [" SV-message "]")))
  102.  
  103.     (biff-all-modelines)
  104.   }
  105.   sv-pack (bool yes)(string text) HIDDEN
  106.   {
  107.     (if yes
  108.       (SV-message (concat SV-message (if (== "" SV-message) "" " ") text)))
  109.   }
  110. )
  111.  
  112. (string modeline-who-am-i modeline-name)
  113. (defun
  114.   modeline-title (string name)
  115.   {
  116.     (if (== 1 (nargs))        ;; got name
  117.     {
  118.       (modeline-who-am-i name)
  119.       (modeline-name
  120.         (if (!= "" name)
  121.       (concat " " name " -- ")
  122.       " "))
  123.       (biff-all-modelines)
  124.     })
  125.     (modeline-who-am-i)
  126.   })
  127.  
  128. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  129. ;;;;;;;;;;;;;;;;;;;;;;; Modeline Hook ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  130. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  131.  
  132.    ;; Global routine to format a modeline for the current buffer.
  133.    ;; If the buffer has its own modeline hook, that is called instead.
  134.    ;; Returns:  A string to be used as the modeline.
  135. (defun
  136.   modeline-hook
  137.   {
  138.     (if (!= "" (buffer-var "local-modeline-hook"))
  139.     {
  140.       (floc (buffer-var "local-modeline-hook")())
  141.       (done)
  142.     })
  143.  
  144.     (concat
  145. ml-message
  146.       (cond
  147.         (!= 0 (bit-and BFNoCare    (buffer-flags -1)))    "  "
  148.     (buffer-modified -1)                "**"
  149.     (!= 0 (bit-and BFRead_only (buffer-flags -1)))    "%%"
  150.     TRUE                        "--")
  151.  
  152.       modeline-name        ;; Something like " ME -- "
  153.       (buffer-name -1) " "
  154.       ml-time            ;; "" or "12:34 "
  155.       (modes)            ;; "(modes)" or "--"
  156.       SV-message        ;; "" or " [text]"
  157.       (if (!= "" (file-name -1))
  158.         (concat " File:" (sub~ (file-name -1)) " ")
  159.     "")
  160.       "-")            ;; repeat this to the end of the modeline
  161.   }
  162.   modes        HIDDEN        ;; spit out the major and minor mode names
  163.   {
  164.     (concat
  165.       (if (!= "" (buffer-var "major-mode"))
  166.     {
  167.       (concat
  168.         "("
  169.         (buffer-var "major-mode")
  170.         (if (!= "" (buffer-var "minor-mode"))
  171.           (concat " : " (buffer-var "minor-mode"))
  172.           "")
  173.         ")" )
  174.     }
  175.     "--"))
  176.   }
  177.   toads        HIDDEN        ;; spit out the sys var states
  178.   {
  179. ;;!!! this should be done ONLY when one of these changes!
  180.     (string text)
  181.  
  182.     (text
  183.       (concat
  184.     (if (!= 0 (overstrike)) "Ovwrt" "")    ;; over strike
  185.     (kbd-macro-msg)))            ;; keyboard macro
  186.     (if (!= "" text)
  187.       (concat " [" text "]")
  188.       "")
  189.   }
  190. )
  191.  
  192. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  193. ;;;;;;;;;;;; Gory details ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  194. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  195.  
  196. (defun
  197.   init-mline-bvars
  198.   {
  199.     (create-buffer-var STRING "local-modeline-hook" "major-mode" "minor-mode")
  200.   }
  201.   !1 MAIN HIDDEN    ;; do this WAY early, before mode-line-hook is called
  202.   {
  203.     (init-mline-bvars)        ;; make sure *scratch* is updated
  204.     (register-hook BUFFER-CREATED-HOOK "init-mline-bvars")
  205.   }
  206.   mode-name (string mode-var mode-name) HIDDEN
  207.   {
  208.     (if (== (nargs) 2)        ;; got mode-name
  209.     {
  210.       (buffer-var mode-var mode-name)
  211.       (buffer-flags -1 BFMode)        ;; force update of modeline
  212.     })
  213.     (buffer-var mode-var)    ;; return the mode name
  214.   }
  215. )
  216.  
  217.  
  218.     ;; Convert a file name to ~ format.  For example, "/users/craig/..."
  219.     ;;   is converted to "~/..."  if $HOME is "/users/craig".
  220.     ;; Notes:
  221.     ;;   OS dependent.
  222.     ;;   If $HOME ends with a "/" (eg root on Unix or "C:/" on MS-DOS),
  223.     ;;     don't convert "/etc/passwd" to "~etc/passwd".  Should it be
  224.     ;;     "/etc/passwd" or "~/etc/passwd"?  The latter would be nice if
  225.     ;;     $HOME is "C:/foo/bar/".  (cannonize-file-name) strips off the
  226.     ;;     trailing "/".
  227.     ;;   $HOME can't change while ME is running (even on MS-DOS) - unless
  228.     ;;     ME does an putenv() (which it doesn't).
  229.     ;;   On MS-DOS, $HOME may contain "\"s but none of the ME generated
  230.     ;;     filenames will.  (cannonize-file-name) converts the "\"s to "/"s.
  231. (bool sub~-able)
  232. (int length-of-$HOME)
  233. (string sub~:$HOME)
  234.  
  235. (defun
  236.   MAIN
  237.   {
  238.     (sub~:$HOME (getenv "HOME"))
  239.     (sub~-able
  240.       (and
  241.     (cannonize-file-name sub~:$HOME)
  242.     (!= "/" (extract-elements sub~:$HOME -1 1))))
  243.     (length-of-$HOME (length-of sub~:$HOME))
  244.   }
  245.   sub~ (string dir-name)
  246.   {
  247.     (if (and
  248.       sub~-able
  249.       (== sub~:$HOME (extract-elements dir-name 0 length-of-$HOME)))
  250.     (concat "~" (extract-elements dir-name length-of-$HOME 1000))
  251.     dir-name
  252.     )
  253.   }
  254. )
  255.