问题 区域突出显示时,仅删除一个字符


当你突出显示整个区域时,我找不到阻止整个区域删除的设置,你点击退格...(我只想删除一个字符,即使区域突出显示。)我已经有了

(delete-selection-mode 0)

在自定义变量中(我为其矩形函数启用了cua-mode),

'(cua-delete-selection nil)

但这就是我得到的行为。我错过了什么吗?


11460
2017-08-30 12:42


起源

我认为即使区域突出显示,emacs也会删除一个字符,这是标准行为。所以我会看看我的 .emacs 为了找到一些禁用它的东西。 - phimuemue
嗯。我以为也是这样。退格键绑定到 delete-backward-char 所以我不知道发生了什么。我在.emacs文件中找不到任何指向它的东西,但它发生在所有模式中,所以它必须是大的东西.. - hatmatrix
你试过通过启动emacs吗? emacs -Q(禁用加载 .emacs 所以你可以检查它是否确实是默认行为)? - phimuemue
啊,是的 - 好主意。删除该区域似乎是默认值。我在OS X上使用GNU Emacs 23.我想知道nextstep构建是否与此有关... - hatmatrix
据我所知,区域删除是在emacs-24中引入的。 emacs手册中记录了接受的解决方案(单词不是食谱) - gnu.org/software/emacs/manual/html_node/emacs/Using-Region.html - Randall Whitman


答案:


找到了:

(setq delete-active-region nil)

是答案。感谢所有人对我的强硬态度!


5
2017-08-30 15:22



为此我不得不关闭cua模式,因为当标记处于活动状态时 backspace 和 C-d 一定会 cua-delete-region。出乎意料,因为 cua-enable-cua-keys 被设定为 nil,但我想我没有cua模式... - hatmatrix
这并没有解决香草Emacs的问题(emacs -q)。 - Trey Jackson
有趣!我甚至没有那个变量...一个快速的谷歌搜索使它看起来只存在于delsel.el中,它包含在GNU Emacs中,但显然必须是 required使用前。我从来不知道它;对不起,我无法得到更多的帮助! - R. P. Dillon
适合我 emacs -q......非常奇怪,很奇怪......的确如此。 @rpdillon - 谢谢你的帮助! - hatmatrix


Emacs具有不同的行为,具体取决于突出显示是使用鼠标还是键盘完成的。

即使在 transient-mark-mode,如果设置标记并移动点,则使用退格键不会删除该区域。 delete-selection-mode 是一种改变此行为的次要模式。

使用鼠标突出显示某个区域时,无论如何 delete-selection-mode,使用退格键将删除用鼠标突出显示的区域。从手册的第25.1.1节:

“当该区域保持活动状态时,键入或删除该文本 区域并停用标记;此行为遵循其他人建立的约定 图形程序,它确实如此  以任何其他方式设置区域时应用, 包括换档选择(*注意换档选择::)。“

基于此,听起来您正在使用鼠标选择区域。那是对的吗?使用时是否会出现相同的行为 shift-select-mode 或者只是使用标记和点?


2
2017-08-30 13:33



嗨,实际上我只使用键盘,带点和标记(不移位)... shift-selection-mode为零。 - hatmatrix
那么,有些东西是歪斜的。我在OS X上使用GNU Emacs 23.2.1,当我以任何方式使用键盘突出显示某个区域时(transient-mark-mode 或者没有),并且当区域突出显示时我退格,我没有得到这种行为。如果我能找出一些可能导致您遇到问题的设置,我会再次发布。 - R. P. Dillon
谢谢。是的,非常奇怪。我现在发现了 delete-forward-char 也以同样的方式“破碎”! - hatmatrix
我刚刚进行了夜间构建(Emacs 24) - 即使我用“-Q”开始,同样的行为!也许我只是搞砸了...... - hatmatrix
出于兴趣。当你重新绑定 <delete> 某事(比方说, (insert "a")),按下时不调用该命令 <delete> 用鼠标选择区域时.... - Trey Jackson


在ELisp中, 0 被认为是真的。

尝试设置

(setq delete-selection-mode nil)

1
2017-08-30 12:59



我不知道delete-select-mode也是一个变量...但你的建议不起作用,不幸的是...... - hatmatrix
多么奇怪 - 关于零 - 谢谢你的提示。 - hatmatrix
从您当前的缓冲区,尝试 Control ESC ESC 并输入上面的Lisp (setq delete-selection-mode nil) (输入)。它应该改变当地的行为。然后尝试设置该行 .emacs (可能适用于所有缓冲区)。最后你可以用 M-x (ALT-x)的 describe-variable 并输入(完成) delete-selection-mode。菜单将首先为您提供 customization,您可以永久保存该值。 - Ring Ø
不......实际上我不知道 Control ESC ESC (不起作用)但是相同 M-:,是的 (eval-expression)?我不是全新的emacs,所以我尝试用两者来改变变量 setq 并在 custom-set-variables 在我的.emacs文件中并重新启动了emacs - 但是没有用。奇怪... - hatmatrix
对不起,是的 Control-x ESC ESC 快速编辑迷你缓冲区并评估 setq。你也可以做Alt-x eval-expression,'Alt'是Meta - 取决于你的键盘。它应该至少在本地工作。这是 M-x(Alt-x)而不是 M-:,使用 describe-variable。 - Ring Ø


如前所述, cua-mode 不能很好地处理这个问题。在没有这个问题的情况下保留该模式的最简单方法似乎是重新定义cua键映射(请参阅 cua--init-keymaps)初始化模式后,取消绑定各种删除键 cua-delete-region

(add-hook 'cua-mode-hook 'my-cua-mode-hook)
(defun my-cua-mode-hook ()
  (define-key cua--region-keymap [remap delete-backward-char] 'delete-backward-char)
  (define-key cua--region-keymap [remap backward-delete-char] 'backward-delete-char)
  (define-key cua--region-keymap [remap backward-delete-char-untabify] 'backward-delete-char-untabify)
  (define-key cua--region-keymap [remap delete-char] 'delete-char))

1
2017-08-30 21:29



这可以防止CUA在正常模式下踩踏<delete>,但实际上我无法让它仍然删除区域 在 CUA模式。 - mc_electron


显然,这使它适用于退格。即使在cua模式:

;; Let backspace and delete be defined as usual if
;; nothing is highlighted, otherwise the marked region is deleted
(defun kill-something() (interactive)
  (if (and mark-active transient-mark-mode)
      (kill-region (point) (mark)) 
    (backward-delete-char-untabify 1)))
;;(global-set-key [delete] 'kill-something)
(global-set-key [backspace] 'kill-something)

此代码在此处找到。


1
2018-04-14 07:47





(delete-selection-mode nil) 到您的配置文件。

从Emacs内部的文档:

delete-selection-mode是一个交互式编译的Lisp函数   `delsel.el”。

(删除选择模式和可选的ARG)

切换删除选择模式。使用前缀ARG,转动删除选择   如果ARG为正,则关闭模式,如果ARG不为正,则关闭。

启用“删除选择”模式时,也会启用“瞬态标记”模式   如果选择,则启用和键入的文本将替换选择   活性。否则,键入的文本只是插入点而不管   任何选择。


1
2017-10-31 10:46