4

在 Vim 中,我经常通过删除它们来移动行(使用dd或可视行模式),将光标移动到新位置,然后p将它们放入:

first
second
third

如果我的光标在第二行,我可以用ddp它来向下移动它:

first
third
second

但是在 Emacs + Evil 模式下,将行放回不能按预期工作:例如,如果我的光标在我点击时位于第三个i上,我最终会得到:p

first
thisecondrd

放置整条拉线时,如何使 Emacs + Evil 模式插入新行?

4

3 回答 3

1

如果我发现我的光标在我想移动的行上,我的自然反应是首先使用C-a C-k C-kor删除该行到 kill ring 中(其中任何一个也可以通过复制or或前缀withC-a C-space C-n C-w来获取多行序列一个数字参数),然后移动到我要粘贴的行的开头并进行拉动。C-kC-nC-nC-y

请注意,Emacs 将文件视为一系列字符,其中换行符或回车符并不特殊。与 vi 不同,您可以C-f在换行符上直接前进,就好像它是一个普通字符一样;在它上面退格;或将其包含在已删除和拉动的缓冲区中。它与任何其他角色完全一样。也许 Emacs 适合那些将文件视为字符序列的人——其中一些恰好是换行符——而 vi 适合那些将文件视为行的人,这些行被谁知道是神奇的分隔,但它肯定不是像任何其他角色一样。

于 2014-04-25T02:15:59.473 回答
1

如果我想要这种行为,我会在猛拉之前使用 Ca 转到行首(可能是邪恶模式下的 ^)。如果你经常这样做,你可能会想出你自己的东西来做 yank,尽管你必须在 kill 部分弄清楚你是否这样做。(或者你可以检查被拉出的东西是否有换行符,我猜?)

顺便说一句,有一个 transpose-lines 命令(常规 Emacs 绑定中的 Cx Ct - 有人建议将其绑定到 xtl - https://github.com/syl20bnr/spacemacs/blob/master/my-keybindings.el)。

于 2014-04-25T01:29:28.640 回答
0

如果您要解决的主要用例是向上或向下移动行(与如何“使 Emacs + Evil 模式在放置整个拉动行时插入新行”的更普遍的问题相反),我建议您尝试一下move-text.

它是一个非常小的附加包,提供了两个命令(move-text-upmove-text-down)分别用于上下移动线条。您可以在线上的任何地方拨打这些电话;不需要杀死或拉扯任何东西,它们也适用于区域。

例如,move-line-down在这种情况下调用(点在 之后second):

first line
second| line
third line

会产生

first line
third line
second| line

n如您所料,通过调用带有数字前缀的适当命令来向上或向下移动当前行(或区域) 。

这些命令默认绑定到M-upM-down但您应该能够通过以下方式将它们重新绑定到您喜欢的键序列

(define-key evil-normal-state-map "mu" 'move-line-up)
(define-key evil-normal-state-map "md" 'move-line-down)

move-text可以package-install从 MELPA 获得。

于 2014-04-25T07:36:28.087 回答