Vim的dd,o,O的Emacs等效项

bihw5rsg  于 2022-11-11  发布在  Mac
关注(0)|答案(8)|浏览(191)

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

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

我找到了类似的东西来做这个把戏:
C-a C-k C-k
C-a将光标移动到行首时,第一个C-k删除文本,第二个删除换行符。唯一的问题是,这在空行上不起作用,我只需要键入C-k,这是相当不方便的,因为我必须对同一任务使用不同的命令:删除一行。

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

C-a C-oO非常相似,只是缺少标识。C-e C-o在当前行下方创建一个空行,但不移动光标。
有没有更好的解决方案来解决我的问题,或者我必须学习Lisp并定义新的命令来满足我的需要?

thigvfpy

thigvfpy1#

对于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,如果您希望删除的行进入删除环,可以使用以下函数 Package 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命令。

jq6vz3qz

jq6vz3qz2#

C+e C+j

根据the emacs manual docs。这会得到一个新行和缩进。

zu0ti5jz

zu0ti5jz3#

对于dd,请使用“kill-whole-line”,在Emacs的最新版本中,默认情况下它绑定到“C-S-backspace”。
我应该补充一点,我自己更经常使用whole-line-or-region.el,因为C-wC-S-backspace更容易键入。

jgzswidk

jgzswidk4#

你可以创建一个macrobind it to a key sequence。还不需要学习任何emacslisp。

mzmfm0qo

mzmfm0qo5#

下面是我如何解决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”命令的相应版本了。
至于“dd”命令,一开始有点刺耳,但我最终还是采用了Emacs的方法。(C-a C-SPC,转到我想删除的文本的另一端,C-w)。或者,如果我能看到我想删除的行数,我将用M-9 C-k一次删除九行。

ioekq8ef

ioekq8ef6#

我知道,这个回答并不是直接的,但是像一个Vim用户一样,我发现Spacemacs是从Vim迁移到emacs的功能最强的emacs入门包。你可以将它配置为类似Vim、类似emacs或混合。
http://spacemacs.org/
给予看。

1cklez4t

1cklez4t7#

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

yjghlzjz

yjghlzjz8#

经过几次搜索和实验,我根据其他答案得出了以下结论:

  • Vim上的dd命令:Emacs上的C-S-backspace
  • Vim上的o命令:Emacs上的C-e C-j
  • Vim上的O命令:Emacs上的C-a C-j C-p

是的,emacs有时候有一些“富有表现力的”命令组合来做一些事情,但是它们有时候确实很有意义!
如果你想一想,emacs有时也会简化一些事情,而vim没有。当你想选择一个文件中的整个文本时,你在Vim上做ggVG,而在Emacs上只是C-x h

相关问题