【问题标题】:delete only one character when region is highlighted区域高亮时只删除一个字符
【发布时间】:2011-04-05 18:00:02
【问题描述】:

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

(delete-selection-mode 0)

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

'(cua-delete-selection nil)

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

【问题讨论】:

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

标签: emacs elisp


【解决方案1】:

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

设置试试

(setq delete-selection-mode nil)

【讨论】:

  • 我不知道 delete-select-mode 也是一个变量......但不幸的是你的建议没有奏效......
  • 从您当前的缓冲区中,尝试Control ESC ESC 并在(setq delete-selection-mode nil) 上方输入Lisp(回车)。它应该改变本地行为。然后尝试在.emacs 中设置行(可能适用于所有缓冲区)。最后,您可以使用M-x (Alt-x) describe-variable 并输入(完成)delete-selection-mode。菜单将首先为您提供customization,您可以在其中永久保存该值。
  • 不...实际上我不知道Control ESC ESC(不起作用)但与M-:相同,即(eval-expression)?我对 emacs 并不完全陌生,所以我确实尝试在我的 .emacs 文件中使用 setqcustom-set-variables 更改变量并重新启动 emacs - 但没有奏效。奇怪...
  • 抱歉是Control-x ESC ESC 快速编辑迷你缓冲区并评估setq。您也可以使用 Alt-x eval-expression,'Alt' 是 Meta - 取决于您的键盘。它至少应该在本地工作。这是M-x (Alt-x) 而不是M-:,使用describe-variable
  • 嗯,C-x ESC ESC 绑定到 repeat-complex-command。你确定eval-expression 不是M-: 吗?但无论如何,问题解决了!我认为...
【解决方案2】:

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

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

当使用鼠标高亮一个区域时,不管delete-selection-mode,使用退格键将删除用鼠标高亮的区域。来自手册的第 25.1.1 节:

“当该区域保持活动状态时,键入或删除该区域中的文本 区域并停用该标记;这种行为遵循其他人建立的约定 图形程序,当您以任何其他方式设置区域时,它确实适用, 包括 shift-selection (*note Shift Selection::)。"

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

【讨论】:

  • 嗨,其实我只是用键盘,用点和标记(不是移位)... shift-selection-mode 为 nil。
  • 好吧,那么有些东西是歪斜的。我在 OS X 上使用 GNU Emacs 23.2.1,当我以任何方式使用键盘突出显示一个区域(transient-mark-mode 或不)时,当区域突出显示时我退格,我没有得到这种行为。如果我能找出可能导致您遇到的问题的某些设置,我会再次发布。
  • 谢谢。是的,很奇怪。我现在发现delete-forward-char也同样“坏”了!
  • 我刚刚得到了夜间构建(Emacs 24)——即使我用“-Q”开始,同样的行为!也许我只是搞砸了......
  • 感兴趣。当您将<delete> 重新绑定到某个东西(例如(insert "a"))时,当您使用鼠标选择区域时按下<delete> 时不会调用该命令......
【解决方案3】:

找到了:

(setq delete-active-region nil)

就是答案。感谢大家和我一起努力!

【讨论】:

  • 为此,我还必须关闭 cua 模式,因为当标记处于活动状态时,backspaceC-d 绑定到 cua-delete-region。出乎意料,因为cua-enable-cua-keys 设置为nil,但我想我会不用cua-mode...
  • 这并不能解决 vanilla Emacs (emacs -q) 中的问题。
  • 有趣!我什至没有那个变量……快速的谷歌搜索使它看起来只存在于 delsel.el 中,它包含在 GNU Emacs 中,但显然必须是 required 才能使用。我从来不知道。抱歉,我无法提供更多帮助!
  • 对我有用emacs -q...非常奇怪,非常奇怪...确实。 @rpdillon - 感谢您的帮助!
【解决方案4】:

如前所述,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))

【讨论】:

  • 这可以防止 CUA 在正常模式下踩踏 ,但我无法让它在实际 CUA 模式下仍然删除区域。
【解决方案5】:

显然,这使得退格可以正常工作。即使在 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)

This code was found here.

【讨论】:

    【解决方案6】:

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

    来自 Emacs 内部的文档:

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

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

    切换删除选择模式。带前缀 ARG,转 Delete Selection 如果 ARG 为正,则模式打开,如果 ARG 不是正,则关闭。

    当启用删除选择模式时,瞬态标记模式也被启用 如果选择是启用和键入的文本替换选择 积极的。否则,键入的文本只是插入点,而不管 任何选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2016-12-26
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多