Mercurial > emacs
changeset 44586:2776503d098e
(pop-to-mark-command, push-mark-command): New commands.
(set-mark-command): Use them.
Enhanced functionality when command is repeated:
- If first command set the mark (no prefix arg), repeat temporarily
enables transient-mark-mode.
- If first command jumped to mark off ring (with argument),
repeat (with or without arg) jump to next mark off ring.
- Use C-u C-u prefix to set mark after jump.
(exchange-point-and-mark): Temporarily enable transient-mark-mode
if prefix arg.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Sun, 14 Apr 2002 17:27:55 +0000 |
parents | 015615bc779b |
children | c333c8d7faad |
files | lisp/simple.el |
diffstat | 1 files changed, 64 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/simple.el Sun Apr 14 16:22:57 2002 +0000 +++ b/lisp/simple.el Sun Apr 14 17:27:55 2002 +0000 @@ -2233,10 +2233,12 @@ "Deactivate the mark by setting `mark-active' to nil. \(That makes a difference only in Transient Mark mode.) Also runs the hook `deactivate-mark-hook'." - (if transient-mark-mode - (progn - (setq mark-active nil) - (run-hooks 'deactivate-mark-hook)))) + (cond + ((eq transient-mark-mode 'lambda) + (setq transient-mark-mode nil)) + (transient-mark-mode + (setq mark-active nil) + (run-hooks 'deactivate-mark-hook)))) (defun set-mark (pos) "Set this buffer's mark to POS. Don't use this function! @@ -2286,23 +2288,56 @@ :type 'integer :group 'editing-basics) +(defun pop-to-mark-command () + "Jump to mark, and pop a new position for mark off the ring +\(does not affect global mark ring\)." + (interactive) + (if (null (mark t)) + (error "No mark set in this buffer") + (setq this-command 'pop-to-mark-command) + (goto-char (mark t)) + (pop-mark))) + +(defun push-mark-command (arg) + "Set mark at where point is. +If no prefix arg and mark is already set there, just activate it." + (interactive "P") + (let ((mark (marker-position (mark-marker)))) + (if (or arg (null mark) (/= mark (point))) + (push-mark nil nil t) + (setq mark-active t) + (message "Mark activated")))) + (defun set-mark-command (arg) "Set mark at where point is, or jump to mark. With no prefix argument, set mark, push old mark position on local mark -ring, and push mark on global mark ring. +ring, and push mark on global mark ring. Immediately repeating the +command activates `transient-mark-mode' temporarily. + With argument, jump to mark, and pop a new position for mark off the ring -\(does not affect global mark ring\). +\(does not affect global mark ring\). Repeating the command without +an argument jumps to the next position off the mark ring. Novice Emacs Lisp programmers often try to use the mark for the wrong purposes. See the documentation of `set-mark' for more information." (interactive "P") - (if (null arg) - (progn - (push-mark nil nil t)) - (if (null (mark t)) - (error "No mark set in this buffer") - (goto-char (mark t)) - (pop-mark)))) + (if (eq transient-mark-mode 'lambda) + (setq transient-mark-mode nil)) + (cond + ((not (eq this-command 'set-mark-command)) + (push-mark-command t)) + ((eq last-command 'pop-to-mark-command) + (if (and (consp arg) (> (prefix-numeric-value arg) 4)) + (push-mark-command nil) + (pop-to-mark-command))) + (arg + (pop-to-mark-command)) + ((and (eq last-command 'set-mark-command) + mark-active (null transient-mark-mode)) + (setq transient-mark-mode 'lambda) + (message "Transient-mark-mode temporarily enabled")) + (t + (push-mark-command nil)))) (defun push-mark (&optional location nomsg activate) "Set mark at LOCATION (point, by default) and push old mark on mark ring. @@ -2354,17 +2389,24 @@ (setq mark-ring (cdr mark-ring))))) (defalias 'exchange-dot-and-mark 'exchange-point-and-mark) -(defun exchange-point-and-mark () +(defun exchange-point-and-mark (&optional arg) "Put the mark where point is now, and point where the mark is now. This command works even when the mark is not active, -and it reactivates the mark." - (interactive nil) - (let ((omark (mark t))) - (if (null omark) - (error "No mark set in this buffer")) - (set-mark (point)) - (goto-char omark) - nil)) +and it reactivates the mark. +With prefix arg, `transient-mark-mode' is enabled temporarily." + (interactive "P") + (if arg + (if mark-active + (if (null transient-mark-mode) + (setq transient-mark-mode 'lambda)) + (setq arg nil))) + (unless arg + (let ((omark (mark t))) + (if (null omark) + (error "No mark set in this buffer")) + (set-mark (point)) + (goto-char omark) + nil))) (defun transient-mark-mode (arg) "Toggle Transient Mark mode.