Вопрос

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?

Это было полезно?

Решение

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

Другие советы

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top