我正在观看Django的在线课程,老师在Sublime Text中用一个列表的两个值做了一个很好的技巧,它将每个值转换到另一个的位置,例如:
list = ("foo", "bar", "hello")
用鼠标标记foo
和bar
然后进行转置,获得以下内容:
list = ("bar", "foo", "hello")
如何在Emacs中实现?
答案 0 :(得分:7)
正如@artscan所说,您要查找的命令是transpose-words
。默认情况下它绑定到M-t
。它在没有区域的情况下工作(即,您不必“标记”任何东西以使其工作)。要转置foo
和bar
,请点可以是以下任何字符:
oo", "b
在之前放置点将转置list
和foo
;在之后将它们转换为bar
和hello
。
用于转置其他文本单元的相关命令及其默认键绑定(如果有):
transpose-chars
( C-t )
transpose-lines
( C-x C-t )
transpose-paragraphs
transpose-sentences
transpose-sexps
( C-M-t )
如果您想通过一次击键转换不相邻的单词(例如foo
和hello
),您可以定义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是否有某种类型的操作命令,请尝试使用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)
几乎没有用处。