Emacs 区域高亮显示时仅删除一个字符

Emacs 区域高亮显示时仅删除一个字符,emacs,elisp,Emacs,Elisp,我找不到在突出显示整个区域并单击backspace时阻止删除该区域的设置。。。(我只想删除一个字符,即使区域高亮显示。)我已经有了 (delete-selection-mode 0) 在自定义设置变量中(我为其矩形函数启用了cua模式) 但这就是我的行为。我遗漏了什么吗?在ELisp中,0被认为是正确的 通过设置尝试 (setq delete-selection-mode nil) Emacs有不同的行为,这取决于高亮显示是用鼠标还是键盘完成的 即使在瞬态标记模式下,如果设置标记并移动点,使

我找不到在突出显示整个区域并单击backspace时阻止删除该区域的设置。。。(我只想删除一个字符,即使区域高亮显示。)我已经有了

(delete-selection-mode 0)
在自定义设置变量中(我为其矩形函数启用了cua模式)


但这就是我的行为。我遗漏了什么吗?

在ELisp中,
0
被认为是正确的

通过设置尝试

(setq delete-selection-mode nil)

Emacs有不同的行为,这取决于高亮显示是用鼠标还是键盘完成的

即使在
瞬态标记模式下
,如果设置标记并移动点,使用退格也不会删除区域<代码>删除选择模式是更改此行为的次要模式

当使用鼠标高亮显示某个区域时,无论
delete selection mode
,使用backspace都会删除鼠标高亮显示的区域。根据本手册第25.1.1节:

当区域保持活动状态时,键入或删除该区域中的文本 区域并停用标记;此行为遵循其他用户建立的约定 图形程序,并且在以任何其他方式设置区域时不适用, 包括班次选择(*注意班次选择::)。”

基于此,听起来像是在用鼠标选择区域。对吗?使用
shift select mode
或仅使用mark and point时是否会出现相同的行为?

发现:

(setq delete-active-region nil)

这就是答案。谢谢大家和我一起坚持到底

如前所述,
cua模式
无法很好地处理此问题。保持该模式而不出现此问题的最简单方法似乎是在初始化模式后重新定义cua键映射(请参见
cua--init keymap
),从
cua删除区域解除各种删除键的绑定:

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

显然,这使得它可以很好地用于退格。即使在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)

(删除选择模式nil)
添加到配置文件中

从Emacs内部的文档中:

删除选择模式是中的一个交互式编译Lisp函数 `德尔塞尔

(删除选择模式和可选参数)

切换删除选择模式。使用前缀ARG,打开“删除当前选择” 如果ARG为正,则模式打开;如果ARG为非正,则模式关闭

启用删除选择模式时,也会启用瞬态标记模式 如果所选内容不正确,则已启用并键入的文本将替换所选内容 活跃的。否则,键入的文本只会插入点,而不考虑 任何选择


我认为,即使区域高亮显示,emacs也只删除一个字符,这是标准行为。因此,我会查看我的
.emacs
,以找到禁用它的东西。我想情况也是如此。backspace键绑定到
删除向后字符
,因此我不知道发生了什么。我在我的.emacs文件中找不到任何指向它的东西,但它在所有模式下都会发生,所以它一定很重要。你是否尝试过通过
emacs-Q
启动emacs(这会禁用加载
.emacs
,这样你就可以检查它是否确实是默认行为)?啊,是的-好主意。删除区域似乎是默认设置。我在OS X上使用GNU Emacs 23。我想知道nextstep构建是否与此有关……据我所知,区域删除是在Emacs-24中引入的。被接受的解决方案记录在emacs手册中(文字不是配方)-我不知道删除选择模式也是一个变量。。。但不幸的是,您的建议没有起作用……从您当前的缓冲区中,尝试
控制ESC
,然后输入上面的Lisp
(setq delete selection mode nil)
(输入)。它应该改变当地的行为。然后尝试在
.emacs
中设置行(可能适用于所有缓冲区)。最后,您可以使用
M-x
(Alt-x)
描述变量
并进入(完成)
删除选择模式
。该菜单将首先为您提供
定制
,您可以在其中永久保存值。不。。。实际上,我不知道
控制ESC
(不工作),但与
M-:
相同,即
(eval表达式)
?我对emacs并不完全陌生,因此我尝试在.emacs文件中使用
setq
custom set variables
来更改变量,并重新启动了emacs,但没有成功。奇怪…很抱歉,快速编辑小缓冲区并评估
setq
Control-x ESC
。您还可以执行Alt-x
eval表达式
,“Alt”是元表达式,具体取决于您的键盘。它至少应该在本地起作用。这是
M-x
(Alt-x)而不是
M-:
,要使用
描述变量
。Hm,
C-x ESC
绑定到
重复复杂命令
。您确定它不是
eval表达式的
M-:
?但无论如何,问题解决了!我想…嗨,实际上我只是在用键盘,用点和标记(不是移位)。。。档位选择模式为零。那么,有些东西是歪斜的。我在OS X上使用GNU Emacs 23.2.1,当我以任何方式使用键盘高亮显示某个区域时(
瞬态标记模式
或不高亮显示),当该区域高亮显示时,我会退格,但我不理解这种行为。如果我能找出一些可能导致您出现问题的设置,我将再次发布。谢谢。是的,很奇怪。我现在发现,
delete forward char
也是以同样的方式“断开”的!我刚刚得到了夜间构建(Emacs24)-即使我以“-Q”开头,也是一样的行为!也许我只是被搞砸了…感兴趣。当您将
重新绑定到某个对象(例如,
(插入“a”)
)时,当您用鼠标选择区域时,按
时不会调用该命令……为此,我还必须关闭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)