Emacs相当于Vim的dd,o,O

时间:2010-01-31 21:06:04

标签: vim emacs editor editing

我目前正在玩emacs并对大多数概念感到满意。但我真的很喜欢三个vim命令的便利性:dd,o,O 希望你能告诉我如何在emacs中镜像它们:)

  

dd - 无论光标在哪里,都会删除整行,包括换行符。

我找到了类似的技巧:

  

C-a C-k C-k

C-a将光标移动到行的开头时,第一个C-k会杀死文本,第二个会杀死换行符。唯一的问题是,这不是空行,我只需要键入C-k这非常不方便,因为我必须为同一任务使用不同的命令:查杀一行。

  

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

嗯,C-a C-o几乎就像O,只是缺少了标识。 C-e C-o在当前下方创建一个空行,但不移动光标。

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

8 个答案:

答案 0 :(得分:27)

对于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-insert ,如下所示:

(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的来源,了解它如何实现等效的ddoO命令。

答案 1 :(得分:24)

C+e C+j

根据the emacs manual docs。这会让你有一个新的界限和缩进。

答案 2 :(得分:23)

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

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

答案 3 :(得分:2)

您可以创建macrobind it to a key sequence。无需学习任何emacslisp。

答案 4 :(得分: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))

有了这个,我从来没有真正感觉到需要相应版本的vi的“o”命令。 C-n C-o可以解决问题。

至于“dd”命令,起初稍微有点开始,但我最终选择了Emacs的做事方式。无论如何,当我想一次删除几行时(通常是这种情况),我只是使用该区域(C-a C-SPC,转到我要删除的文本的另一端,C-w)。或者,如果我可以关注我想要删除的行数,我会做例如。 M-9 C-k一次删除九行。

答案 5 :(得分:1)

我知道,这个回答并不是直截了当的,但是像vim用户一样,我发现Spacemacs是功能最强大的emacs入门包,可以从vim转移到emacs。您可以将其配置为像vim,emacs或者hybrid。

http://spacemacs.org/

试一试。

答案 6 :(得分:0)

只需使用Viper-modeVimpulseVim Mode,Emacs键绑定就不符合人体工程学。

答案 7 :(得分:0)

这个问题已经存在多年了,但是我想加上2美分有关dd的信息:

kill-whole-line与键绑定C-S-backspace一起使用。行为与dd相同。