Reputation: 366
I was watching a online class of Django and the teacher did a nice trick in Sublime Text with two values of a list, it transpose each to the position of the other, for instance:
list = ("foo", "bar", "hello")
marked foo
and bar
with the mouse and then did the transpose, getting the following:
list = ("bar", "foo", "hello")
How that can be achieve in Emacs?
Upvotes: 3
Views: 2111
Reputation: 28541
I think you're looking for transpose-sexp
(rather than transpose-words
), bound to M-C-t
. In some modes it understands enough of the syntax to be able to transpose (foo (1, 2), a + b)
to (a + b, foo (1, 2))
. In C-mode, sadly, it would result in (foo a, (1, 2) + b)
which is not nearly as useful.
Upvotes: 2
Reputation: 5280
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)
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)
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
Upvotes: 6