`mowie' let's you define smart commands that cycle through the result of point-moving commands by consecutive repetitions. The package also offers a few point-moving commands. While repeating the command that you defined using `mowie', it will skip those point-moving commands that do not provide a point which has not been visited in the running repetition so far. In a similar manner, it currently also avoids the point as it was right before the repetition started. `mowie' strives to be minimalistic rather than being generalizable. If you want something different, consider copying and modifying the code to your liking, or using an alternative package. `mowie' differs from Alex Kost's `mwim' package and from Adam Porter's `mosey' package by being minimalistic rather than complex; by being opinionated rather than maximizing flexibility; and by not providing any (rather opaque) macros. ;; Examples: Cycle through alternatives of `beginning-of-line' and `end-of-line'! (defun my-beginning-of-line () (interactive "^") (mowie #'beginning-of-line #'beginning-of-visual-line #'mowie-beginning-of-code #'mowie-beginning-of-comment #'mowie-beginning-of-comment-text)) (defun my-end-of-line () (interactive "^") (mowie #'end-of-line #'end-of-visual-line #'mowie-end-of-code)) (keymap-substitute (current-global-map) #'move-beginning-of-line #'my-beginning-of-line) (keymap-substitute (current-global-map) #'move-end-of-line #'my-end-of-line) Cycle through alternatives of `beginning-of-buffer' and `end-of-buffer', e.g. in `message-mode'! (defun my-beginning-of-message () (interactive "^") (mowie #'message-goto-body #'beginning-of-buffer)) (defun my-end-of-message () (interactive "^") (mowie #'message-goto-eoh #'end-of-buffer)) (keymap-set message-mode-map "M-<" #'my-beginning-of-message) (keymap-set message-mode-map "M->" #'my-end-of-message) ;; Roadmap: Consider introducing a user option determining if last-position should be avoided while repeating. Make this package work with `multiple-cursors'.