Удалять только один символ, когда область выделена

Я не могу найти параметр, который предотвращает удаление целого региона, когда вы его выделили, и вы нажмете backspace... (Я просто хочу, чтобы он удалял один символ, даже если область выделена.) У меня уже есть

(delete-selection-mode 0)

и в настраиваемых переменных (у меня включен режим cua-mode для его функций прямоугольника),

'(cua-delete-selection nil)

но это поведение, которое я получаю. Я что-то пропустил?

Ответ 1

Найдено:

(setq delete-active-region nil)

- ответ. Спасибо всем за то, что он со мной справился!

Ответ 2

Emacs имеет другое поведение в зависимости от того, было ли выделение сделано с помощью мыши или клавиатуры.

Даже в transient-mark-mode, если вы установите метку и переместите точку, использование backspace не удалит область. delete-selection-mode - это второстепенный режим, который изменяет это поведение.

При использовании мыши, чтобы выделить регион, независимо от delete-selection-mode, использование backspace удалит область, выделенную мышью. Из раздела 25.1.1 руководства:

"Пока регион остается активным, введите или удалите текст в этом область и деактивирует знак; это поведение следует за конвенцией, установленной другими графические программы, и это не применяется, когда вы устанавливаете регион любым другим способом, включая сдвиг-выбор (* note Shift Selection::).

Исходя из этого, похоже, что вы выбираете регион с помощью мыши. Это верно? Возникает ли такое же поведение при использовании shift-select-mode или просто с использованием метки и точки?

Ответ 3

В ELisp 0 считается истинным.

Попробуйте установить

(setq delete-selection-mode nil)

Ответ 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))

Ответ 5

По-видимому, это заставляет работать отлично для backspace. Даже в режиме 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)

Этот код был найден здесь.

Ответ 6

Добавьте (delete-selection-mode nil) в свой файл конфигурации.

Из документации внутри Emacs:

delete-selection-mode - это интерактивная скомпилированная функция Lisp в `Delsel.el ".

(режим удаления-выбора и дополнительный ARG)

Переключить режим удаления. С префиксом ARG, выберите Delete Selection режим включен, если ARG положительный, выключен, если ARG не является положительным.

Когда включен режим" Удалить выделение", режим Transient Mark также Включенный и напечатанный текст заменяет выделение, если выбор активный. В противном случае введенный текст просто вставлен в точку независимо от любой выбор.