我想删除一些文本,以便可以复制其他文本而不是它。我该怎么做?使用C-w剪切所选文本到kill ring并且我最终没有想要复制的文本。
另外,有没有可能直接复制文本而不是按下按钮将其删除?
我想删除一些文本,以便可以复制其他文本而不是它。我该怎么做?使用C-w剪切所选文本到kill ring并且我最终没有想要复制的文本。
另外,有没有可能直接复制文本而不是按下按钮将其删除?
我经常使用 M-x delete-region
命令,但你也可以将其绑定到一个按键上。
在较新版本的Emacs中,使用Delete Selection Mode,你无需输入命令,只需开始输入:
默认情况下,即使标记处于活动状态,文本插入也会正常进行——例如,打字“a”会插入字符“a”,然后取消激活标记。删除选区模式是一种次要模式,可以修改此行为:如果启用该模式,那么在标记处于活动状态时插入文本会首先删除区域中的文本。此外,通常仅删除一个字符的命令(例如C-d或DEL)将删除整个区域。要切换打开或关闭删除选区模式,请键入
M-x delete-selection-mode.
delete-region
绑定到一个快捷键不再必要,因为现在可以使用 Backspace 键来完成该操作。换句话说,Backspace 键删除所选区域中的内容,而不是将其移动到 kill ring 中保存。这是因为 delete-active-region
的值默认为 t
,除非你自定义了它的值为其他值。 - Jisang Yoo在按下 C-y
后,你可以使用 M-y
插入剪贴板中的前一个项目,或使用 browse-kill-ring 包。
至于第二个问题,请参见DeleteSelectionMode。
我也遇到了同样的问题。目前我找到的最接近解决方案就是编写一个小函数,大致如下:
(defun ruthlessly-kill-line ()
"Deletes a line, but does not put it in the kill-ring. (kinda)"
(interactive)
(move-beginning-of-line 1)
(kill-line 1)
(setq kill-ring (cdr kill-ring)))
来源于EmacsWiki:
The equivalent of
‘kill-line’
(‘C-k’
) but without kill-ring side effects:
(delete-region (point) (line-end-position))
M-x eval-expression (setq kill-ring (cdr kill-ring)) - 从kill-ring中删除最后一个项目
大多数删除函数使用kill-region
来实际删除文本。我使用一个Lisp宏从杀死功能创建删除函数。
(defmacro jpk/delete-instead-of-kill (&rest body)
"Replaces `kill-region' with `delete-region' in BODY."
`(cl-letf (((symbol-function 'kill-region)
(lambda (beg end &optional yank-handler)
(delete-region beg end))))
,@body))
(defun jpk/delete-word (arg)
"Like `kill-word', but does not save to the `kill-ring'."
(interactive "*p")
(jpk/delete-instead-of-kill (kill-word arg)))
cl-letf
可以创建一个具有动态作用域的函数的本地绑定。这意味着它仅对 cl-letf
内部的代码有效,但它适用于整个调用树(例如,kill-region
不直接出现在 body
中,但 kill-word
调用 kill-region
并被替换为 delete-region
)。 - jpkottacl-letf
中将其绑定到不同的名称,则甚至可以从其替换中调用原始函数。 在这个意义上,cl-letf
的工作方式类似于 let*
。 - jpkotta对于您的第二个问题,除了使用DeleteSelectionMode,您还可以启用CUA Mode,它还提供了一个很好的矩形选择模式,通过按C-Return键启用。自22.1版本以来,CUA模式已成为Emacs的一部分。
;; Ctrl-K with no kill
(defun delete-line-no-kill ()
(interactive)
(delete-region
(point)
(save-excursion (move-end-of-line 1) (point)))
(delete-char 1)
)
(global-set-key (kbd "C-k") 'delete-line-no-kill)
这是我的实现和动机:
(defun delete-word (arg)
"Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
(interactive "p")
(delete-region (point) (progn (backward-word arg) (point))))
我从 simple.el
中的“kill-word
”代码进行了修改。我使用 delete-region
替换了 kill-region
,并将 forward-word
替换为 backward-word
。这样它就真正不会影响 kill-ring
,而在其他情况下,我注意到在 Emacs 之外,kill-ring
受到了影响。
(defun copy-to-register-z (p1 p2)
"Copy text selection to register named “z”."
(interactive "r")
(copy-to-register ?z p1 p2))
(defun replace-register-content-z (p1 p2)
"Replace register named “z”'s content."
(interactive "r")
(delete-region p1 p2)
(insert-register ?z))
(global-set-key (kbd "C-c c") 'copy-to-register-z)
(global-set-key (kbd "C-c v") 'replace-register-content-z)