27

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

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

我发现了类似的方法:

咔咔咔

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

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

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

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

4

7 回答 7

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-lineM-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以了解它如何实现等效ddo、 和O命令。

于 2010-01-31T21:20:32.117 回答
25
C+e C+j

根据emacs 手册文档。这会给你一个新的行和缩进。

于 2012-03-17T01:41:45.363 回答
24

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

我应该补充一点,我自己更频繁地使用whole-line-or-region.el,因为C-w它比C-S-backspace.

于 2010-02-01T13:52:17.220 回答
2

您可以创建一个并将其绑定到一个键序列。还不需要学习任何 emacslisp。

于 2010-01-31T21:15:25.967 回答
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”命令。Cn Co 做到了。

至于“dd”命令,一开始有点讨厌,但我最终还是习惯了 Emacs 的做事方式。无论如何,当我想一次删除几行时(通常是这种情况),我只是使用区域(Ca C-SPC,转到我要删除的文本的另一端,Cw)。或者,如果我可以看到我想删除的行数,我会这样做。M-9 Ck 一次删除九行。

于 2010-01-31T21:43:09.710 回答
1

我知道,这个回答并不直截了当,但是就像 vim 用户一样,我发现 Spacemacs 是从 vim 迁移到 emacs 的最实用的 emacs 入门包。您可以将其配置为类似 vim、类似 emacs 或混合。

http://spacemacs.org/

试试看。

于 2015-11-25T01:57:39.900 回答
0

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

于 2010-01-31T21:49:56.590 回答