2010-01-31 36 views
25

我目前正在使用emacs,并且对大多数概念很满意。但我真的崇拜三个VIM命令的方便:DD,O,O- 希望你能告诉我如何反映他们在Emacs :)Emacs等效于Vim的dd,o,O

DD - 删除整条生产线,包括换行,不管光标在哪里。

我发现了类似这样的伎俩东西:

钙CK CK

虽然C-a将光标移动到行的开头,第一C-k杀死文本中,第二个杀死换行符。唯一的问题是,这不适用于空行,我只需要键入C-k这是非常不方便的,因为我必须使用不同的命令来完成相同的任务:杀死一条线。

Ø/ O - 创建上方光标下方一个新的空行/和将光标移动到新行,缩进正确

好,C-a C-o几乎是一样O,只是idention丢失。 C-e C-o在当前下方创建一个空行但不移动光标。

有没有更好的解决方案来解决我的问题,还是需要学习Lisp并定义新的命令来满足我的需求?

+0

我认为最好的新方法是http://superuser.com/a/331661(C-e C-j) – 2014-01-09 07:08:48

回答

26

对于oO,这里有我很多年前写了几个功能:

(defun vi-open-line-above() 
    "Insert a newline above the current line and put point at beginning." 
    (interactive) 
    (unless (bolp) 
    (beginning-of-line)) 
    (newline) 
    (forward-line -1) 
    (indent-according-to-mode)) 

(defun vi-open-line-below() 
    "Insert a newline below the current line and put point at beginning." 
    (interactive) 
    (unless (eolp) 
    (end-of-line)) 
    (newline-and-indent)) 

(defun vi-open-line (&optional abovep) 
    "Insert a newline below the current line and put point at beginning. 
With a prefix argument, insert a newline above the current line." 
    (interactive "P") 
    (if abovep 
     (vi-open-line-above) 
    (vi-open-line-below))) 

可以绑定vi-open-line,比方说,M-插入如下:

(define-key global-map [(meta insert)] 'vi-open-line) 

对于dd,如果您想让杀死的线路进入杀手环,您可以使用此功能来包装kill-line

(defun kill-current-line (&optional n) 
    (interactive "p") 
    (save-excursion 
    (beginning-of-line) 
    (let ((kill-whole-line t)) 
     (kill-line n)))) 

为了完整性,它接受一个前缀参数并将其应用于kill-line,这样它可以杀死比“当前”行更多的内容。

您也可以查看viper-mode的来源,了解它如何实现等效的dd,oO命令。

+0

太好了,谢谢。工程就像一个魅力:)只是'vi-open-line-above'不缩进。有任何想法吗? – ericteubert 2010-01-31 21:59:41

+1

我在'(前行-1)'下面的'vi-open-line-above'中添加了'(indent-to-mode-mode)'。这是诀窍:) – ericteubert 2010-01-31 22:11:42

+0

有趣的是,当你注意到你找到了解决方案时,我正在编辑它。你可以知道,这是我不经常使用的旧代码。当我第一次学习Emacs Lisp时,我写了它。这个问题给了我一个弄清楚的借口。 – seh 2010-01-31 22:14:02

1

下面是如何解决的Emacs中缺少一个类似vi的“O”命令的问题:

(defadvice open-line (around vi-style-open-line activate) 
    "Make open-line behave more like vi." 
    (beginning-of-line) 
    ad-do-it 
    (indent-according-to-mode)) 

有了这个地方,我从来没有真正感到六世的相应版本的需要“ o“命令。 C-n C-o可以做到这一点。

至于“dd”命令,开始时稍微磨合了一些,但我最终转向了Emacs的做事方式。无论如何,当我想要一次删除多行时,通常情况下,我只是使用区域(C-C-SPC,转到要删除的文本的另一端,C-w)来执行此操作。或者,如果我能看到我想要删除的行数,我会做例如。 M-9 C-k一次删除九行。

1

只要使用Viper-mode,VimpulseVim Mode,Emacs的按键绑定只是不符合人体工程学。

+4

这听起来很尴尬。如果我想使用vim,那么我使用vim而不是emacs。 – ericteubert 2010-01-31 22:01:20

+1

Emacs的键盘绑定可能()不符合人体工程学,但至少对我来说,vi的模态****在我的脑中闪烁着。 – 2010-03-06 08:55:28

+1

@eteubert根本不尴尬。只要将emacs看作第三(或第四)模式即可。一旦你选择了emacs,并且所有东西都驻留在emacs中,它实际上感觉很自然。 – mt3 2010-10-25 15:47:44

22

对于dd,使用“kill-whole-line”,在最新版本的Emacs中默认绑定到“C-S-backspace”。

我应该补充一点,我自己更常使用whole-line-or-region.el,因为C-wC-S-backspace更容易输入。

+0

这确实有帮助。 – CantGetANick 2012-03-30 09:13:45

23
C+e C+j 

根据the emacs manual docs。这让你有了新的路线和缩进。

+0

我只读了旧的'C-j'。在我的机器上运行(Emacs 24)。 – Droogans 2013-08-29 02:02:28

+1

如果你在句子或行的中间,并且'c + j'它会将行的其余部分放在新行中。这就像在线路中间的“返回”。我们希望在当前光标位置下方添加一个空行。 – pjammer 2013-08-29 13:16:52

1

我知道,这个回应并不是直截了当,但是和vim用户一样,我发现Spacemacs是从vim移动到emacs的功能最强大的emacs入门套件。你可以将它配置为vim,像emacs或混合。

http://spacemacs.org/

试试看。