]> code.delx.au - gnu-emacs/blobdiff - lisp/bindings.el
*** empty log message ***
[gnu-emacs] / lisp / bindings.el
index 380f9a7e69c85be760ca94ccfd41b3bac13faf0f..e8b92b54e88d3370ef7a3eb14d2f953f9e0fb86a 100644 (file)
@@ -1,6 +1,7 @@
 ;;; bindings.el --- define standard key bindings and some variables.
 
-;; Copyright (C) 1985,86,87,92,93,94,95,96,99 Free Software Foundation, Inc.
+;; Copyright (C) 1985,86,87,92,93,94,95,96,99,2000
+;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: internal
 
 ;;; Code:
 
-(defconst mode-line-mule-info
-  (purecopy '(""
-             (current-input-method ("" current-input-method-title))
-             "%Z"))
+(defun make-mode-line-mouse2-map (f) "\
+Return a keymap with single entry for mouse-2 on mode line.
+This is defined to run function F with no args in the buffer
+corresponding to the mode line clicked."
+  (let ((map (make-sparse-keymap)))
+    (define-key map [mode-line mouse-2]
+      `(lambda (e)
+        (interactive "e")
+        (save-selected-window
+          (select-window
+           (posn-window (event-start e)))
+          (,f)
+          (force-mode-line-update))))
+    map))
+
+(defvar mode-line-input-method-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [mode-line mouse-2]
+      (lambda (e)
+       (interactive "e")
+       (save-selected-window
+         (select-window
+          (posn-window (event-start e)))
+         (toggle-input-method)
+         (force-mode-line-update))))
+    (define-key map [mode-line mouse-3]
+      (lambda (e)
+       (interactive "e")
+       (save-selected-window
+         (select-window
+          (posn-window (event-start e)))
+         (describe-current-input-method))))
+    (purecopy map)))
+
+(defvar mode-line-mule-info
+  `(""
+    (current-input-method
+     (:eval
+      (propertize current-input-method-title
+                 'help-echo (concat ,(purecopy "Input method: ")
+                                    current-input-method
+                                    ,(purecopy ".  mouse-2 disables, \
+mouse-3 describes"))
+                 'local-map mode-line-input-method-map)))
+    ,(propertize "%Z"
+                'help-echo (purecopy "Coding system information: \
+see M-x describe-coding-system")))
   "Mode-line control for displaying information of multilingual environment.
 Normally it displays current input method (if any activated) and
 mnemonics of the following coding systems:
@@ -79,45 +123,42 @@ Normally nil in most modes, since there is no process to display.")
 
 (make-variable-buffer-local 'mode-line-process)
 
-(defconst mode-line-modified
-  (let ((s "%1*%1+")
-       (map (make-sparse-keymap)))
-    (define-key map [mode-line mouse-2]
-      (lambda (event)
-       (interactive "e")
-       (save-selected-window
-         (select-window (posn-window (event-start event)))
-         (let ((binding (key-binding "\C-x\C-q")))
-           (if binding
-               (funcall binding)
-             (toggle-read-only))))))
-    (set-text-properties 0 (length s)
-                        (list 'help-echo
-                              "Read-only status: mouse-2 toggles it"
-                              'local-map map)
-                        s)
-    (list s))
+(defvar mode-line-modified
+  (list (propertize
+        "%1*%1+"
+        'help-echo (purecopy "Read-only status: mouse-2 toggles it")
+        'local-map (purecopy (make-mode-line-mouse2-map #'toggle-read-only))))
   "Mode-line control for displaying whether current buffer is modified.")
 
 (make-variable-buffer-local 'mode-line-modified)
 
 (setq-default mode-line-format
-  (list (purecopy "-")
-   'mode-line-mule-info
-   'mode-line-modified
-   'mode-line-frame-identification
-   'mode-line-buffer-identification
-   (purecopy "   ")
-   'global-mode-string
-   (purecopy "   %[(")
-   '(:eval (mode-line-mode-name)) 'mode-line-process 'minor-mode-alist
-   (purecopy "%n")
-   (purecopy ")%]--")
-   '(which-func-mode ("" which-func-format "--"))
-   (purecopy '(line-number-mode "L%l--"))
-   (purecopy '(column-number-mode "C%c--"))
-   (purecopy '(-3 . "%p"))
-   (purecopy "-%-")))
+  (let* ((help-echo
+         ;; The multi-line message doesn't work terribly well on the
+         ;; bottom mode line...  Better ideas?
+;;;      "\
+;;; mouse-1: select window, mouse-2: delete others, mouse-3: delete,
+;;; drag-mouse-1: resize, C-mouse-2: split horizontally"
+         "mouse-1: select window, mouse-2: delete others, mouse-3: delete ...")
+        (dashes (propertize "--" 'help-echo help-echo)))
+    (list
+     (propertize "-" 'help-echo help-echo)
+     'mode-line-mule-info
+     'mode-line-modified
+     'mode-line-frame-identification
+     'mode-line-buffer-identification
+     (propertize "   " 'help-echo help-echo)
+     'global-mode-string
+     (propertize "   %[(" 'help-echo help-echo)
+     '(:eval (mode-line-mode-name)) 'mode-line-process 'minor-mode-alist
+     (propertize "%n" 'help-echo "mouse-2: widen"
+                'local-map (make-mode-line-mouse2-map #'widen))
+     (propertize ")%]--" 'help-echo help-echo)
+     `(which-func-mode ("" which-func-format ,dashes))
+     `(line-number-mode ("L%l" ,dashes))
+     `(column-number-mode ("C%c" ,dashes))
+     (purecopy '(-3 . "%p"))
+     (propertize "-%-" 'help-echo help-echo))))
 
 (defvar minor-mode-alist nil "\
 Alist saying how to show minor modes in the mode line.
@@ -127,11 +168,23 @@ STRING is included in the mode line iff VARIABLE's value is non-nil.
 Actually, STRING need not be a string; any possible mode-line element
 is okay.  See `mode-line-format'.")
 ;; Don't use purecopy here--some people want to change these strings.
-(setq minor-mode-alist '((abbrev-mode " Abbrev")
-                        (overwrite-mode overwrite-mode)
-                        (auto-fill-function " Fill")
-                        ;; not really a minor mode...
-                        (defining-kbd-macro " Def")))
+(setq minor-mode-alist
+      (list
+       (list 'abbrev-mode
+            (propertize " Abbrev"
+                        'help-echo (purecopy
+                                    "mouse-2: turn off Abbrev mode")
+                        'local-map (purecopy (make-mode-line-mouse2-map
+                                              #'abbrev-mode))))
+       '(overwrite-mode overwrite-mode)
+       (list 'auto-fill-function
+            (propertize " Fill"
+                        'help-echo (purecopy
+                                    "mouse-2: turn off Autofill mode")
+                        'local-map (purecopy (make-mode-line-mouse2-map
+                                              #'auto-fill-mode))))
+       ;; not really a minor mode...
+       '(defining-kbd-macro " Def")))
 
 (defvar mode-line-buffer-identification-keymap nil "\
 Keymap for what is displayed by `mode-line-buffer-identification'.")
@@ -155,6 +208,9 @@ Switch to the most recently selected buffer other than the current one."
   (interactive)
   (switch-to-buffer (other-buffer)))
 
+(defvar mode-line-mode-menu (make-sparse-keymap "Minor Modes") "\
+Menu of mode operations in the mode line.")
+
 (defun mode-line-mode-menu-1 (event)
   (interactive "e")
   (save-selected-window
@@ -168,107 +224,94 @@ Switch to the most recently selected buffer other than the current one."
 (defun mode-line-mode-name () "\
 Return a string to display in the mode line for the current mode name."
   (let (length (result mode-name))
-    (when mode-line-mouse-sensitive-p
-      (let ((local-map (get-text-property 0 'local-map result))
-           (help-echo (get-text-property 0 'help-echo result)))
-       (setq result (copy-sequence result))
-       ;; Add `local-map' property if there isn't already one.
-       (when (and (null local-map)
-                  (null (next-single-property-change 0 'local-map result)))
-         (put-text-property 0 (length result)
-                            'local-map mode-line-minor-mode-keymap result))
-       ;; Add `help-echo' property if there isn't already one.
-       (when (and (null help-echo)
-                  (null (next-single-property-change 0 'help-echo result)))
-         (put-text-property 0 (length result)
-                            'help-echo "mouse-3: minor mode menu" result))))
+    (let ((local-map (get-text-property 0 'local-map result))
+         (help-echo (get-text-property 0 'help-echo result)))
+      (setq result (copy-sequence result))
+      ;; Add `local-map' property if there isn't already one.
+      (when (and (null local-map)
+                (null (next-single-property-change 0 'local-map result)))
+       (put-text-property 0 (length result)
+                          'local-map mode-line-minor-mode-keymap result))
+      ;; Add `help-echo' property if there isn't already one.
+      (when (and (null help-echo)
+                (null (next-single-property-change 0 'help-echo result)))
+       (put-text-property 0 (length result)
+                          'help-echo "mouse-3: minor mode menu" result)))
     result))
 
 (defmacro bound-and-true-p (var)
   "Return the value of symbol VAR if it is bound, else nil."
   `(and (boundp (quote ,var)) ,var))
 
-(defvar mode-line-mouse-sensitive-p nil "\
-Non-nil means mode line has been made mouse-sensitive.")
-
-(defvar mode-line-mode-menu nil "\
-Menu of mode operations in the mode line.")
-
-(defun make-mode-line-mouse-sensitive ()
-  (when (and window-system
-            (not mode-line-mouse-sensitive-p))
-    (setq mode-line-mouse-sensitive-p t)
-    (let ((map (make-sparse-keymap "Minor Modes")))
-      (define-key map [abbrev-mode]
-       '(menu-item "Abbrev" abbrev-mode
-                   :active t :style toggle :selected abbrev-mode))
-      (define-key map [auto-revert-mode]
-       '(menu-item "Auto revert" auto-revert-mode
-                   :active t :style toggle
-                   :selected (bound-and-true-p auto-revert-mode)))
-      (define-key map [auto-fill-mode]
-       '(menu-item "Auto-fill" auto-fill-mode
-                   :active t :style toggle :selected auto-fill-function))
-      (define-key map [column-number-mode]
-       '(menu-item "Column number" column-number-mode
-                   :active t :style toggle :selected column-number-mode))
-      (define-key map [flyspell-mode]
-       '(menu-item "Flyspell" flyspell-mode
-                   :active t :style toggle
-                   :selected (bound-and-true-p flyspell-mode)))
-      (define-key map [font-lock-mode]
-       '(menu-item "Font-lock" font-lock-mode
-                   :active t :style toggle :selected font-lock-mode))
-      (define-key map [hide-ifdef-mode]
-       '(menu-item "Hide ifdef" hide-ifdef-mode
-                   :active t :style toggle
-                   :selected (bound-and-true-p hide-ifdef-mode)))
-      (define-key map [highlight-changes-mode]
-       '(menu-item "Highlight changes" highlight-changes-mode
-                   :active t :style toggle
-                   :selected (bound-and-true-p highlight-changes-mode)))
-      (define-key map [line-number-mode]
-       '(menu-item "Line number" line-number-mode
-                   :active t :style toggle :selected line-number-mode))
-      (define-key map [outline-minor-mode]
-       '(menu-item "Outline" outline-minor-mode
-                   :active t :style toggle
-                   :selected (bound-and-true-p outline-minor-mode)))
-      (define-key map [overwrite-mode]
-       '(menu-item "Overwrite" overwrite-mode
-                   :active t :style toggle :selected overwrite-mode))
-      (setq mode-line-mode-menu map)
-      (defun mode-line-mode-menu (event)
-       (interactive "@e")
-       (x-popup-menu event mode-line-mode-menu)))
-
-    ;; Add menu of buffer operations to the buffer identification part
-    ;; of the mode line.
-    (let ((map (make-sparse-keymap))
-         (s (copy-sequence "%12b")))
-      (define-key map [mode-line mouse-1] 'mode-line-other-buffer)
-      (define-key map [header-line mouse-1] 'mode-line-other-buffer)
-      (define-key map [mode-line M-mouse-2] 'mode-line-unbury-buffer)
-      (define-key map [header-line M-mouse-2] 'mode-line-unbury-buffer)
-      (define-key map [mode-line mouse-2] 'bury-buffer)
-      (define-key map [header-line mouse-2] 'bury-buffer)
-      (define-key map [mode-line down-mouse-3] 'mouse-buffer-menu)
-      (define-key map [header-line down-mouse-3] 'mouse-buffer-menu)
-      (setq mode-line-buffer-identification-keymap map)
-      (setq-default mode-line-buffer-identification (list s))
-      (put-text-property 0 (length s) 'face '(:weight bold) s)
-      (put-text-property 0 (length s) 'help-echo
-                        "mouse-1: other buffer, mouse-2: prev, M-mouse-2: next, mouse-3: buffer menu" s)
-      (put-text-property 0 (length s) 'local-map map s))
-
-    ;; Menu of minor modes.
-    (let ((map (make-sparse-keymap)))
-      (define-key map [mode-line down-mouse-3] 'mode-line-mode-menu-1)
-      (define-key map [header-line down-mouse-3] 'mode-line-mode-menu-1)
-      (setq mode-line-minor-mode-keymap map))
-    
-    (force-mode-line-update)))
-
+(define-key mode-line-mode-menu [abbrev-mode]
+  `(menu-item ,(purecopy "Abbrev") abbrev-mode
+             :button (:toggle . abbrev-mode)))
+(define-key mode-line-mode-menu [auto-revert-mode]
+  `(menu-item ,(purecopy "Auto revert") auto-revert-mode
+             :button (:toggle . auto-revert-mode)))
+(define-key mode-line-mode-menu [auto-fill-mode]
+  `(menu-item ,(purecopy "Auto-fill") auto-fill-mode
+             :button (:toggle . auto-fill-function)))
+(define-key mode-line-mode-menu [column-number-mode]
+  `(menu-item ,(purecopy "Column number") column-number-mode
+             :button (:toggle . column-number-mode)))
+(define-key mode-line-mode-menu [flyspell-mode]
+  `(menu-item ,(purecopy "Flyspell") flyspell-mode
+             :button (:toggle . (bound-and-true-p flyspell-mode))))
+(define-key mode-line-mode-menu [font-lock-mode]
+  `(menu-item ,(purecopy "Font-lock") font-lock-mode
+             :button (:toggle . font-lock-mode)))
+(define-key mode-line-mode-menu [hide-ifdef-mode]
+  `(menu-item ,(purecopy "Hide ifdef") hide-ifdef-mode
+             :button (:toggle . (bound-and-true-p hide-ifdef-mode))))
+(define-key mode-line-mode-menu [highlight-changes-mode]
+  `(menu-item ,(purecopy "Highlight changes") highlight-changes-mode
+             :button (:toggle . highlight-changes-mode)))
+(define-key mode-line-mode-menu [line-number-mode]
+  `(menu-item ,(purecopy "Line number") line-number-mode
+             :button (:toggle . line-number-mode)))
+(define-key mode-line-mode-menu [outline-minor-mode]
+  `(menu-item ,(purecopy "Outline") outline-minor-mode
+             :button (:toggle . (bound-and-true-p outline-minor-mode))))
+(define-key mode-line-mode-menu [overwrite-mode]
+  `(menu-item ,(purecopy "Overwrite") overwrite-mode
+             :button (:toggle . overwrite-mode)))
+
+(defun mode-line-mode-menu (event)
+  (interactive "@e")
+  (x-popup-menu event mode-line-mode-menu))
+
+;; Add menu of buffer operations to the buffer identification part
+;; of the mode line.
+(let ((map (make-sparse-keymap)))
+  (define-key map [mode-line mouse-1] 'mode-line-other-buffer)
+  (define-key map [header-line mouse-1] 'mode-line-other-buffer)
+  (define-key map [mode-line M-mouse-2] 'mode-line-unbury-buffer)
+  (define-key map [header-line M-mouse-2] 'mode-line-unbury-buffer)
+  (define-key map [mode-line mouse-2] 'bury-buffer)
+  (define-key map [header-line mouse-2] 'bury-buffer)
+  (define-key map [mode-line down-mouse-3] 'mouse-buffer-menu)
+  (define-key map [header-line down-mouse-3] 'mouse-buffer-menu)
+  (setq mode-line-buffer-identification-keymap map))
+
+(defun propertized-buffer-identification (fmt)
+  "Return a list suitable for `mode-line-buffer-identification'.
+FMT is a format specifier such as \"%12b\".  This function adds
+text properties for face, help-echo, and local-map to it."
+  (list (propertize fmt
+                   'face '(:weight bold)
+                   'help-echo (purecopy "mouse-1: other \
+buffer, mouse-2: prev, M-mouse-2: next, mouse-3: buffer menu")
+                   'local-map mode-line-buffer-identification-keymap)))
+  
+(setq-default mode-line-buffer-identification
+             (propertized-buffer-identification "%12b"))
+
+;; Menu of minor modes.
+(let ((map (make-sparse-keymap)))
+  (define-key map [mode-line down-mouse-3] 'mode-line-mode-menu-1)
+  (define-key map [header-line down-mouse-3] 'mode-line-mode-menu-1)
+  (setq mode-line-minor-mode-keymap map))
 
 ;; These variables are used by autoloadable packages.
 ;; They are defined here so that they do not get overridden
@@ -292,7 +335,7 @@ Menu of mode operations in the mode line.")
        '(".elc" ".lof"
         ".glo" ".idx" ".lot"
         ;; TeX-related
-        ".dvi" ".fmt"
+        ".dvi" ".fmt" ".tfm" ".pdf"
         ;; Java compiled
         ".class"
         ;; Clisp
@@ -304,6 +347,8 @@ Menu of mode operations in the mode line.")
         ".cp" ".fn" ".ky" ".pg" ".tp" ".vr"
         ".cps" ".fns" ".kys" ".pgs" ".tps" ".vrs")))
 
+;; Packages should add to this list appropriately when they are
+;; loaded, rather than listing everything here.
 (setq debug-ignored-errors
       '(beginning-of-line beginning-of-buffer end-of-line
        end-of-buffer end-of-file buffer-read-only