如何在Emacs中删除当前行?

145

Emacs中与vi的 dd 类似的命令是什么?我想要删除当前行。尝试过 CTRL + k 但它只会从光标位置开始删除。

6个回答

244
C-a # Go to beginning of line
C-k # Kill line from current point

还有一种方法

C-S-backspace   # Ctrl-Shift-Backspace

调用M-x kill-whole-line命令。

如果您想设置不同的全局键绑定,则将此放置在~/.emacs中:

(global-set-key "\C-cd" 'kill-whole-line)     # Sets `C-c d` to `M-x kill-whole-line`
如果您想删除多行文本内容,可以在命令前加上一个数字:
C-u 5 C-S-backspace    # deletes 5 whole lines
M-5 C-S-backspace      # deletes 5 whole lines

C-u C-S-backspace      # delete 4 whole lines. C-u without a number defaults to 4

C-u -5 C-S-backspace   # deletes previous 5 whole lines
M--5 C-S-backspace     # deletes previous 5 whole lines

有时我也发现C-x z很有用:

C-S-backspace         # delete 1 whole line
C-x z                 # repeat last command
z                     # repeat last command again. 
                      # Press z as many times as you wish. 
                      # Any other key acts normally, and ends the repeat command.

这个可以工作。有没有一种方法可以使用一个命令来完成这个操作?我需要创建一个自定义键绑定来实现这个吗? - Manoj Govindan
15
不知道 C-x z,真的很酷。顺便说一句,你的回答非常好而且准确。 - slu
2
还有C-k C-k,它有点像vim中的d$ S-j,但是它可以很好地向前删除行。 - Theo Belaire
为什么C-cd中没有空格? - Elliot Gorokhovsky
@RenéG:空格是可选的。 - unutbu
你也可以考虑使用 smart-kill-whole-line 命令来处理缩进:http://emacsredux.com/blog/2013/04/09/kill-whole-line/ - m33lky

11

如果你不想杀掉这一行(这将把它放入操作系统的剪贴板和删除环中),而只是想删除它:

(defun delete-current-line ()
  "Delete (not kill) the current line."
  (interactive)
  (save-excursion
    (delete-region
     (progn (forward-visible-line 0) (point))
     (progn (forward-visible-line 1) (point)))))

4
另一种不将行放入kill ring中删除该行的方法如下:
(defun delete-current-line ()
  "Deletes the current line"
  (interactive)
  (delete-region
   (line-beginning-position)
   (line-end-position)))

这将使得该点位于一个空白行的开头。为了解决这个问题,您可以在函数结尾加上类似于 (delete-blank-lines) 的内容,例如下面这个例子,也许不太直观:
(defun delete-current-line ()
 "Deletes the current line"
 (interactive)
 (forward-line 0)
 (delete-char (- (line-end-position) (point)))
 (delete-blank-lines))

3
与其拥有单独的删除行键或者必须调用前缀参数,你可以使用crux-smart-kill-line,它会“清除至行尾并在下一次调用时清除整行”。但如果你更喜欢使用delete而不是kill,则可以使用下面的代码。
对于点到字符串操作(kill/delete),我建议使用zop-to-char
(defun aza-delete-line ()
  "Delete from current position to end of line without pushing to `kill-ring'."
  (interactive)
  (delete-region (point) (line-end-position)))

(defun aza-delete-whole-line ()
  "Delete whole line without pushing to kill-ring."
  (interactive)
  (delete-region (line-beginning-position) (line-end-position)))

(defun crux-smart-delete-line ()
  "Kill to the end of the line and kill whole line on the next call."
  (interactive)
  (let ((orig-point (point)))
    (move-end-of-line 1)
    (if (= orig-point (point))
        (aza-delete-whole-line)
      (goto-char orig-point)
      (aza-delete-line))))

source


0

安装whole-line-or-region软件包,然后运行(whole-line-or-region-global-mode)。这将使C-w在没有激活区域(选择)的情况下删除整行。

查看软件包的GitHub页面https://github.com/purcell/whole-line-or-region


0

最快且最简单的删除(杀死)整行的方式,无需选择任何内容,从任意位置开始删除一整行:

C-w  ; kill-region

它可以灵活地删除所选内容,或者默认情况下删除一行(如果没有选择任何内容)。

考虑到问题,您可能还想复制Vim的“yank”,yy(尽管在Emacs术语中,“yank”令人困惑地是Vim的“put”,p)。这是:

M-w  ; kill-ring-save

既美观又协调,而且很容易记忆。甚至略微类似于Vim的i_CTRL-W

一旦你使用上述任何一种方法将某些内容放入了剪贴板,你可能想要“粘贴”(即黏贴)它:

M-y  ; yank-pop

(请注意,在终端Emacs中,C-S-backspace可能无法正常工作。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接