我目前正在玩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并定义新的命令来满足我的需求?
对于o
和O
,这里有一些我多年前写的函数:
(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
的源代码,了解它如何实现等效的dd
,o
和O
命令。
C+e C+j
根据the emacs manual docs。这会让你有一个新的界限和缩进。
对于dd,使用“kill-whole-line”,默认情况下,在最新版本的Emacs中绑定到“C-S-backspace”。
我应该补充一点,我自己更频繁地使用whole-line-or-region.el,因为C-w
比C-S-backspace
更容易打字。
你可以创建一个macro和bind it to a key sequence。无需学习任何emacslisp。
以下是我如何解决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一次删除9行。
我知道,这个响应并不是直截了当的,但是像vim用户一样,我发现Spacemacs是从vim转移到emacs的功能最强大的emacs初学者包。您可以将其配置为vim,emacs like或hybrid。
试试看。
只需使用Viper-mode,Vimpulse或Vim Mode,Emacs键绑定就不符合人体工程学。
这个问题在这里已经存在多年了,但我想在dd上加上我的2美分:
使用kill-whole-line和键绑定C-S-backspace
。行为与dd相同。