插入带有Emacs和x2B的完整行;邪恶的

插入带有Emacs和x2B的完整行;邪恶的,emacs,evil-mode,Emacs,Evil Mode,在Vim中,我经常通过删除行来移动行(使用dd或可视行模式),将光标移动到新位置,然后p将行放入: first second third 如果光标位于第二行,我可以使用ddp向下移动光标: first third second 但是,在Emacs+邪恶模式下,将行放回并不能像预期的那样工作:例如,如果我在点击p时光标位于第三行的i上,我会得到: first thisecondrd 我如何让Emacs+邪恶模式在放置整个被拉扯的线条时插入新线?如果我想要这种行为,我会在拉扯之前使用C-a转到

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

first
second
third
如果光标位于第二行,我可以使用
ddp
向下移动光标:

first
third
second
但是,在Emacs+邪恶模式下,将行放回并不能像预期的那样工作:例如,如果我在点击
p
时光标位于第三行的i上,我会得到:

first
thisecondrd

我如何让Emacs+邪恶模式在放置整个被拉扯的线条时插入新线?

如果我想要这种行为,我会在拉扯之前使用C-a转到线条的开头(^可能处于邪恶模式)。如果你经常这样做,你可能会想出你自己的东西给美国佬,尽管你必须在杀戮的时候弄清楚你是否这样做。(或者你可以检查一下被拉扯的东西是否有新线,我猜?)


顺便说一下,这里有一个转置行命令(常规Emacs绑定中的C-x C-t-有人建议将其绑定到xtl-)。

如果我在要移动的行上找到光标,我的自然反应是首先用
C-a
C-k
C-k
C-a
C-space
C-n
C-w
(其中任何一个都可以通过复制
C-k
C-n
或在
C-n
前面加上一个数字参数来获取多个行序列),然后移动到要粘贴的行的开头,并执行
C-y
yank


请注意,Emacs将文件视为一系列字符,其中换行符或回车符并不特殊。与vi不同,您可以
C-f
在换行符上直接向前移动,就像它是一个普通字符一样;在它上面退格;或者将它包含在一个已删除并被拉长的缓冲区中。它与任何其他字符都完全相同。也许Emacs is适用于那些认为文件是字符序列的人——其中一些恰好是换行符——而vi则适用于那些认为文件是行的人,行之间用谁知道的东西神奇地隔开,但它肯定不同于任何其他字符。

如果您试图解决的主要用例是上移或下移行(与如何“让Emacs+邪恶模式在放置整个被拉下的线条时插入新线”这一更一般的问题相反),我建议您尝试一下

这是一个非常小的附加程序包,提供了两个命令(
向上移动文本
向下移动文本
),分别用于向上和向下移动行。您可以在行上的任何位置调用这些命令;无需杀死或拖动任何东西,它们也适用于区域

例如,在这种情况下,调用
将行向下移动
(指向第二个
之后):

将产生

first line
third line
second| line
正如您所期望的那样,通过调用带有数字前缀的相应命令,可以上下移动当前行(或区域)

默认情况下,这些命令绑定到M-up和M-down,但是您应该能够通过

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

move text
可以从MELPA安装
package

问题似乎是我还需要在插入的行的开头…是否有“插入新行”?或者这是我需要写的东西吗?我无法用邪恶版本1.0-dev重现这个问题。当我只删除一个单词而不是一行时,我认识到这种情况。如果可以,考虑使用移动文本。我也无法重现这个问题(同一邪恶版本)。我添加了同样的问题,这是因为我的emacs init文件中有一个自定义复制粘贴函数。
(define-key evil-normal-state-map "mu" 'move-line-up)
(define-key evil-normal-state-map "md" 'move-line-down)