diff options
| -rw-r--r-- | lisp/bindings.el | 131 |
1 files changed, 129 insertions, 2 deletions
diff --git a/lisp/bindings.el b/lisp/bindings.el index f8aba633eea..e3844b64760 100644 --- a/lisp/bindings.el +++ b/lisp/bindings.el | |||
| @@ -78,7 +78,21 @@ Normally nil in most modes, since there is no process to display.") | |||
| 78 | 78 | ||
| 79 | (make-variable-buffer-local 'mode-line-process) | 79 | (make-variable-buffer-local 'mode-line-process) |
| 80 | 80 | ||
| 81 | (defvar mode-line-modified (purecopy '("%1*%1+")) | 81 | (defconst mode-line-modified |
| 82 | (let ((s "%1*%1+") | ||
| 83 | (map (make-sparse-keymap))) | ||
| 84 | (define-key map [mode-line mouse-2] | ||
| 85 | (lambda (event) | ||
| 86 | (interactive "e") | ||
| 87 | (save-selected-window | ||
| 88 | (select-window (posn-window (event-start event))) | ||
| 89 | (toggle-read-only)))) | ||
| 90 | (set-text-properties 0 (length s) | ||
| 91 | (list 'help-echo | ||
| 92 | "Read-only status: mouse-2 toggles it" | ||
| 93 | 'local-map map) | ||
| 94 | s) | ||
| 95 | (list s)) | ||
| 82 | "Mode-line control for displaying whether current buffer is modified.") | 96 | "Mode-line control for displaying whether current buffer is modified.") |
| 83 | 97 | ||
| 84 | (make-variable-buffer-local 'mode-line-modified) | 98 | (make-variable-buffer-local 'mode-line-modified) |
| @@ -92,7 +106,7 @@ Normally nil in most modes, since there is no process to display.") | |||
| 92 | (purecopy " ") | 106 | (purecopy " ") |
| 93 | 'global-mode-string | 107 | 'global-mode-string |
| 94 | (purecopy " %[(") | 108 | (purecopy " %[(") |
| 95 | 'mode-name 'mode-line-process 'minor-mode-alist | 109 | '(:eval (mode-line-mode-name)) 'mode-line-process 'minor-mode-alist |
| 96 | (purecopy "%n") | 110 | (purecopy "%n") |
| 97 | (purecopy ")%]--") | 111 | (purecopy ")%]--") |
| 98 | '(which-func-mode ("" which-func-format "--")) | 112 | '(which-func-mode ("" which-func-format "--")) |
| @@ -115,6 +129,119 @@ is okay. See `mode-line-format'.") | |||
| 115 | ;; not really a minor mode... | 129 | ;; not really a minor mode... |
| 116 | (defining-kbd-macro " Def"))) | 130 | (defining-kbd-macro " Def"))) |
| 117 | 131 | ||
| 132 | (defvar mode-line-buffer-identification-keymap nil | ||
| 133 | "Keymap for what is displayed by `mode-line-buffer-identification'.") | ||
| 134 | |||
| 135 | (defvar mode-line-minor-mode-keymap nil | ||
| 136 | "Keymap for what is displayed by `mode-line-mode-name'.") | ||
| 137 | |||
| 138 | (defvar mode-line-mode-menu-keymap nil | ||
| 139 | "Keymap for mode operations menu in the mode line.") | ||
| 140 | |||
| 141 | (defun mode-line-unbury-buffer () | ||
| 142 | "Switch to the last buffer in the buffer list that is not hidden." | ||
| 143 | (interactive) | ||
| 144 | (let ((list (reverse (buffer-list)))) | ||
| 145 | (while (eq (sref (buffer-name (car list)) 0) ? ) | ||
| 146 | (setq list (cdr list))) | ||
| 147 | (switch-to-buffer (car list)))) | ||
| 148 | |||
| 149 | (defun mode-line-other-buffer () | ||
| 150 | "Switch to the most recently selected buffer other than the current one." | ||
| 151 | (interactive) | ||
| 152 | (switch-to-buffer (other-buffer))) | ||
| 153 | |||
| 154 | (defun mode-line-mode-menu-1 (event) | ||
| 155 | (interactive "e") | ||
| 156 | (save-selected-window | ||
| 157 | (select-window (posn-window (event-start event))) | ||
| 158 | (let* ((selection (mode-line-mode-menu event)) | ||
| 159 | (binding (and selection (lookup-key mode-line-mode-menu | ||
| 160 | (vector (car selection)))))) | ||
| 161 | (if binding | ||
| 162 | (call-interactively binding))))) | ||
| 163 | |||
| 164 | (defun mode-line-mode-name () | ||
| 165 | "Return a string to display in the mode line for the current mode name." | ||
| 166 | (let (length (result mode-name)) | ||
| 167 | (when mode-line-mouse-sensitive-p | ||
| 168 | (let ((local-map (get-text-property 0 'local-map result)) | ||
| 169 | (help-echo (get-text-property 0 'help-echo result))) | ||
| 170 | (setq result (copy-sequence result)) | ||
| 171 | ;; Add `local-map' property if there isn't already one. | ||
| 172 | (when (and (null local-map) | ||
| 173 | (null (next-single-property-change 0 'local-map result))) | ||
| 174 | (put-text-property 0 (length result) | ||
| 175 | 'local-map mode-line-minor-mode-keymap result)) | ||
| 176 | ;; Add `help-echo' property if there isn't already one. | ||
| 177 | (when (and (null help-echo) | ||
| 178 | (null (next-single-property-change 0 'help-echo result))) | ||
| 179 | (put-text-property 0 (length result) | ||
| 180 | 'help-echo "mouse-3: minor mode menu" result)))) | ||
| 181 | result)) | ||
| 182 | |||
| 183 | (defvar mode-line-mouse-sensitive-p nil | ||
| 184 | "Non-nil means mode line has been made mouse-sensitive.") | ||
| 185 | |||
| 186 | (defun make-mode-line-mouse-sensitive () | ||
| 187 | (when (and window-system | ||
| 188 | (not mode-line-mouse-sensitive-p)) | ||
| 189 | (setq mode-line-mouse-sensitive-p t) | ||
| 190 | (require 'easymenu) | ||
| 191 | (easy-menu-define mode-line-mode-menu mode-line-mode-menu-keymap | ||
| 192 | "Menu of mode operations in the mode line." | ||
| 193 | '("Minor Modes" | ||
| 194 | ["Abbrev" abbrev-mode :active t :style toggle | ||
| 195 | :selected abbrev-mode] | ||
| 196 | ["Auto revert" auto-revert-mode :active t :style toggle | ||
| 197 | :selected auto-revert-mode] | ||
| 198 | ["Auto-fill" auto-fill-mode :active t :style toggle | ||
| 199 | :selected auto-fill-function] | ||
| 200 | ["Column number" column-number-mode :active t :style toggle | ||
| 201 | :selected column-number-mode] | ||
| 202 | ["Flyspell" flyspell-mode :active t :style toggle | ||
| 203 | :selected flyspell-mode] | ||
| 204 | ["Font-lock" font-lock-mode :active t :style toggle | ||
| 205 | :selected font-lock-mode] | ||
| 206 | ["Hide ifdef" hide-ifdef-mode :active t :style toggle | ||
| 207 | :selected hide-ifdef-mode] | ||
| 208 | ["Highlight changes" highlight-changes-mode :active t :style toggle | ||
| 209 | :selected highlight-changes-mode] | ||
| 210 | ["Line number" line-number-mode :active t :style toggle | ||
| 211 | :selected line-number-mode] | ||
| 212 | ["Outline" outline-minor-mode :active t :style toggle | ||
| 213 | :selected outline-minor-mode] | ||
| 214 | ["Overwrite" overwrite-mode :active t :style toggle | ||
| 215 | :selected overwrite-mode])) | ||
| 216 | |||
| 217 | ;; Add menu of buffer operations to the buffer identification part | ||
| 218 | ;; of the mode line. | ||
| 219 | (let ((map (make-sparse-keymap)) | ||
| 220 | (s (copy-sequence "%12b"))) | ||
| 221 | (define-key map [mode-line mouse-1] 'mode-line-other-buffer) | ||
| 222 | (define-key map [top-line mouse-1] 'mode-line-other-buffer) | ||
| 223 | (define-key map [mode-line M-mouse-2] 'mode-line-unbury-buffer) | ||
| 224 | (define-key map [top-line M-mouse-2] 'mode-line-unbury-buffer) | ||
| 225 | (define-key map [mode-line mouse-2] 'bury-buffer) | ||
| 226 | (define-key map [top-line mouse-2] 'bury-buffer) | ||
| 227 | (define-key map [mode-line down-mouse-3] 'mouse-buffer-menu) | ||
| 228 | (define-key map [top-line down-mouse-3] 'mouse-buffer-menu) | ||
| 229 | (setq mode-line-buffer-identification-keymap map) | ||
| 230 | (setq-default mode-line-buffer-identification (list s)) | ||
| 231 | (put-text-property 0 (length s) 'face '(:weight bold) s) | ||
| 232 | (put-text-property 0 (length s) 'help-echo | ||
| 233 | "mouse-1: other buffer, mouse-2: prev, M-mouse-2: next, mouse-3: buffer menu" s) | ||
| 234 | (put-text-property 0 (length s) 'local-map map s)) | ||
| 235 | |||
| 236 | ;; Menu of minor modes. | ||
| 237 | (let ((map (make-sparse-keymap))) | ||
| 238 | (define-key map [mode-line down-mouse-3] 'mode-line-mode-menu-1) | ||
| 239 | (define-key map [top-line down-mouse-3] 'mode-line-mode-menu-1) | ||
| 240 | (setq mode-line-minor-mode-keymap map)) | ||
| 241 | |||
| 242 | (force-mode-line-update))) | ||
| 243 | |||
| 244 | |||
| 118 | ;; These variables are used by autoloadable packages. | 245 | ;; These variables are used by autoloadable packages. |
| 119 | ;; They are defined here so that they do not get overridden | 246 | ;; They are defined here so that they do not get overridden |
| 120 | ;; by the loading of those packages. | 247 | ;; by the loading of those packages. |