As @artscan says, the command you are looking for is transpose-words
. It is bound to M-t
by default. It works without a region (i.e., you don't have to "mark" anything for it to work). To transpose foo
and bar
, point can be on any of the following characters:
oo", "b
Putting point before them will transpose list
and foo
; putting it after them will transpose bar
and hello
.
Related commands for transposing other units of text, along with their default key bindings (if any):
transpose-chars
(C-t)transpose-lines
(C-x C-t)transpose-paragraphs
transpose-sentences
transpose-sexps
(C-M-t)
Going Beyond Built-Ins
If you want to transpose words that are not adjacent (e.g., foo
and hello
) with a single keystroke, you can define a keyboard macro or a custom command and bind it to a key:
(defun hop-one-transpose ()
"Transpose words that are separated by a single word."
(interactive)
(transpose-words 2)
(backward-word 3)
(forward-char)
(transpose-words 1))
(global-set-key (kbd "C-x M-t") 'hop-one-transpose)
Appendix: Let Emacs Help You Discover Emacs
If you find yourself wondering whether Emacs has a command for some type of action, try using command-apropos
to find it:
C-h a <action>
RET