Emacs:如何删除没有杀环的文本?

时间:2009-03-12 04:24:17

标签: emacs

我想删除一些文字,这样我就可以抽出其他文字而不是。我怎样才能做到这一点? C-w剪切选定的文本以杀死戒指,我最终没有我想要的文字。

另外,是否有可能直接用文字来取代某些文字而不按按钮来杀死它?

15 个答案:

答案 0 :(得分:45)

我经常输入M-x delete-region,但您可以将其绑定到密钥。

在较新版本的Emacs中使用Delete Selection Mode,您无需键入命令即可开始输入:

  

默认情况下,即使标记处于活动状态,也会正常进行文本插入 - 例如,键入插入字符“a”,然后停用标记。删除选择模式(次要模式)会修改此行为:如果启用该模式,则在标记处于活动状态时插入文本会导致首先删除区域中的文本。此外,通常只删除一个字符的命令,例如 C-d DEL ,将删除整个区域。要打开或关闭“删除选择”模式,请键入M-x delete-selection-mode.

答案 1 :(得分:35)

您可以在M-y之后使用C-y从kill ring中插入上一项,或使用browse-kill-ring包。

至于第二个问题,请参阅DeleteSelectionMode

答案 2 :(得分:20)

我遇到了同样的问题。到目前为止,我最接近的事情就是创建一个基本上不起作用的小功能:

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

答案 3 :(得分:10)

取自EmacsWiki

  

相当于‘kill-line’‘C-k’)但没有杀伤环的副作用:

(delete-region (point) (line-end-position))

答案 4 :(得分:5)

M-x eval-expression (setq kill-ring(cdr kill-ring)) - 从kill-ring中删除最后一项

答案 5 :(得分:4)

对于您的第二个问题,或者DeleteSelectionMode,您可以启用CUA Mode,这样您还可以通过C-Return启用一个漂亮的矩形选择模式。自22.1以来,CUA模式是emacs的一部分。

答案 6 :(得分:3)

找到答案。

首先发布here

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

答案 7 :(得分:2)

从技术上讲,第一部分的其他答案是错误的。

以下是我的实施和动机:

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

我在kill-word中的“simple.el”中修改了代码。我将kill-regiondelete-regionforward-word切换为backward-word。通过这种方式,它可以不会影响kill-ring,与其他情况不同,在emacs之外,我注意到kill-ring受到了影响。

答案 8 :(得分:1)

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

答案 9 :(得分:1)

添加删除等效的kill-region和kill-line键C-w和C-k,如下所示。 绑定到键C-v和C-z。

;; A keybinding to delete-region gives a good "Windows CUT Ctrl-x equivalent".
;; What keybinding to use is awkward to choose.
;; using C-v "Windows PASTE Ctrl-v" is quite a subversive option.
;;  C-v = scroll up in emacs which I have no use for.
(global-set-key (kbd "C-v") 'delete-region)

;; To have also a "Windows CUT" alternative to C-k (kill-line) this can be done:
(defun delete-line () "delete line, take it out of kill ring. bind this func to C-z"
 (interactive)
 (setq last-command 'delete-line)
 (kill-line)
 (setq kill-ring (cdr kill-ring))
 (setq kill-ring-yank-pointer kill-ring)
 (setq last-command 'delete-line)
)
(global-set-key (kbd "C-z") 'delete-line)
;; without setting of last-command 2+ C-zs mess up kill-ring

答案 10 :(得分:1)

我对第一个问题的回答:在emacs中标记文本(使用鼠标或设置标记C-SPC),然后按键盘上的“< - Backspace”按钮而不是C-w。这样您仍然可以粘贴系统剪贴板中的文本,而不必担心剪贴板被C-w杀死的文本覆盖

这个答案的背景:有时当我在emacs外面找到我想用来替换emacs中的区域的文本时,我经常犯这个错误,首先将该文本复制到系统剪贴板中(即在Windows Ctrl + C上) ,然后在emacs中执行C-w以“删除”我想要替换的文本区域,希望稍后的M-w可以从kill-ring恢复剪贴板中的文本。不幸的是,剪贴板只会被C-w杀死的文本覆盖,剪贴板中的原始邮件永远不会显示在kill-ring中。

对于第二个问题,是的,您始终可以先在emacs中标记文本,然后直接标记C-y

答案 11 :(得分:1)

大多数kill函数使用kill-region来执行杀死文本的实际工作。我使用lisp宏从kill函数创建删除函数。

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

答案 12 :(得分:0)

这是kill-region的一个版本,它不强制将值放入kill-ring。

(defun kill-or-delete-region (beg end prefix)
  "Delete the region, storing it in the kill-ring.
If a prefix argument is given, don't change the kill-ring."
  (interactive "r\nP")
  (if prefix
      (delete-region beg end)
    (kill-region beg end)))

(global-set-key (kbd "C-w") 'kill-or-delete-region)

这使您可以像以前一样C-w,但C-u C-w现在删除文本而不更改kill-ring。

答案 13 :(得分:0)

  

如何删除没有杀环的文本?

delete-region函数将删除所选区域而不将其添加到kill ring

  

此外,是否可以直接抽取文本而不是某些文本   甚至没有按下按钮来杀死它?

我想你问的是如何用你已放在杀戮戒指上的东西替换所选区域中的文字。

设置(delete-selection-mode 1)将允许您在选定区域上移动/粘贴。它还允许您只键入和替换选定的区域。

在OS X上的版本25.1.1上,我还必须添加(setq select-enable-primary nil)以防止它将所选区域复制到kill ring

答案 14 :(得分:0)

作为所有答案的补充。 如果您编写elisp代码删除,则可以调用杀死函数,只要您使用如下所示的本地kill-ring对象即可:

(defun delete-something()
  "Delete something without storing in kill ring."
  (let (kill-ring)
     (kill-something)))

使用任何杀死某物的功能代替杀死某物。然后,该函数将删除,并且在真正的kill-ring中不会记住任何内容。