aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/bindings.el131
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.