如何删除 Emacs 中的当前行?

Emacs 等价于 vi 的 dd是什么?我想删除当前行。尝试 CTRL + k,但它只删除 来自当前位置。

61527 次浏览
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.

如果你不想删除这行代码(这样就会把它放到 OS 剪贴板上,形成一个 kill ring) ,只要删除它就可以了:

(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)))))

从任何点删除(终止)整行的最快/最简单的方法 在没有任何选择的情况下:

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

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

另一种删除该行而不将其放入死循环的方法:

(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))

而不是使用单独的键来删除行,或者必须调用 前缀参数。可以使用 关键智能杀伤线 它会“杀到行的尽头,杀到下一行的整个行。” 但是,如果您更喜欢使用 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))))

来源

安装程序包 whole-line-or-region,然后运行 (whole-line-or-region-global-mode)。如果没有区域(选择)处于活动状态,这将使 C-w终止整个行。

请参见包的 GitHub 页面 https://github.com/purcell/whole-line-or-region