Emacs: Jump to Previous Position
Often, you need to go to a previous position in a buffer. For example, you are editing a big source code that's few hundred lines. You want to look at some function's definition, but then you want to return to the current position.
Emacs has a buffer mark ring and global mark ring that records mark positions and lets you jump to it.
First, press 【Ctrl+Space Ctrl+Space】 to push current position into mark ring.
There are 3 ways to jump cursor to a previous position.
- Press 【Ctrl+u Ctrl+Space】 → Move cursor to previous marked position in current buffer.
pop-global-mark【Ctrl+x Ctrl+Space】 → Move cursor to previous marked position. (may be in another buffer)
exchange-point-and-mark【Ctrl+x Ctrl+x】 → Move cursor to the other end of selection.
Call any one of the above repeatedly will return cursor to the position you began.
Following are details.
Move Cursor to Previous Mark in Current Buffer
- First, mark the position you want to jump to later, by
set-mark-command【Ctrl+Space】. (press 【Ctrl+Space】 a second time to remove the highlight (or press 【Ctrl+g】).)
- Scroll down a few times.
- Press 【Ctrl+u Ctrl+Space】 to jump to previous mark in current buffer.
Move Cursor to Previous Mark, Any Buffer
pop-global-mark 【Ctrl+x Ctrl+Space】. This one cycles global-mark-ring.
exchange-point-and-mark 【Ctrl+x Ctrl+x】
This moves cursor to previously marked position, and activate selection (highlight it)
This is most useful when you already have a selection, and want to extend or shrink the other end.
mark-ring, global-mark-ring, pop-global-mark
Emacs store cursor positions and let you jump to it quickly.
There are 2 mark rings:
- mark-ring. Each buffer has its own copy.
- global-mark-ring. This is global.
by default, each mark ring keep 16 positions. As new mark is set, oldest is removed.
you can make it store less positions for better use of jump.
(setq mark-ring-max 6) (setq global-mark-ring-max 6)
Tip: Single Key to Cycle Thru Marks
You can set single key to cycle thru marks, such as F7.
But you need to define a wrapper command first.
(defun xah-pop-local-mark-ring () "Move cursor to last mark position of current buffer. Call this repeatedly will cycle all positions in `mark-ring'. URL `http://ergoemacs.org/emacs/emacs_jump_to_previous_position.html' Version 2016-04-04" (interactive) (set-mark-command t))
(global-set-key (kbd "<f7>") 'pop-global-mark) (global-set-key (kbd "<f8>") 'xah-pop-local-mark-ring)
[see Emacs: How to Define Keys]