]> 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.
 
 ;;; 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
 
 ;; Maintainer: FSF
 ;; Keywords: internal
 
 ;;; Code:
 
 
 ;;; 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:
   "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)
 
 
 (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
   "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.
 
 (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.
 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'.")
 
 (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)))
 
   (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
 (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))
 (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))
 
     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
 
 ;; 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
        '(".elc" ".lof"
         ".glo" ".idx" ".lot"
         ;; TeX-related
-        ".dvi" ".fmt"
+        ".dvi" ".fmt" ".tfm" ".pdf"
         ;; Java compiled
         ".class"
         ;; Clisp
         ;; 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")))
 
         ".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
 (setq debug-ignored-errors
       '(beginning-of-line beginning-of-buffer end-of-line
        end-of-buffer end-of-file buffer-read-only