如Sublime Text中那样转置两个单词

时间:2014-05-15 04:16:49

标签: emacs sublimetext2 emacs24

我正在观看Django的在线课程,老师在Sublime Text中用一个列表的两个值做了一个很好的技巧,它将每个值转换到另一个的位置,例如:

list = ("foo", "bar", "hello")

用鼠标标记foobar然后进行转置,获得以下内容:

list = ("bar", "foo", "hello")

如何在Emacs中实现?

2 个答案:

答案 0 :(得分:7)

正如@artscan所说,您要查找的命令是transpose-words。默认情况下它绑定到M-t。它在没有区域的情况下工作(即,您不必“标记”任何东西以使其工作)。要转置foobar,请点可以是以下任何字符:

oo", "b

在之前放置点将转置listfoo;在之后将它们转换为barhello

用于转置其他文本单元的相关命令及其默认键绑定(如果有):

  • transpose-chars C-t

  • transpose-lines C-x C-t

  • transpose-paragraphs

  • transpose-sentences

  • transpose-sexps C-M-t

超越内置插件

如果您想通过一次击键转换不相邻的单词(例如foohello),您可以定义keyboard macro或自定义命令并将其绑定到一把钥匙:

(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)

附录:让Emacs帮助您发现Emacs

如果您发现自己想知道Emacs是否有某种类型的操作命令,请尝试使用command-apropos找到它:

C-h a <action> RET

答案 1 :(得分:2)

我认为您正在寻找transpose-sexp(而不是transpose-words),绑定到M-C-t。在某些模式下,它能够理解足够的语法,以便能够将(foo (1, 2), a + b)转换为(a + b, foo (1, 2))。在C模式中,遗憾的是,它会导致(foo a, (1, 2) + b)几乎没有用处。