Забой без добавления убить кольцо

12

Использование Crtl + Backspace или Ctrl + Del добавляет удаленный текст в список уничтожений.
Как я могу предотвратить это? Мне не нужно, чтобы каждый кусочек текста отправлялся в список уничтожений при его удалении.

Дополнительный вопрос: Какова цель этой настройки по умолчанию в любом случае? :)

Даниэль Хитцель
источник
О побочном вопросе: вероятно, иметь резервную копию того, что вы удаляете, не проходя undo. Хотя дикое предположение.
Мануэль Уберти

Ответы:

7

Согласно документации:

<C-delete>запускает команду kill-word (находится в global-map), которая является интерактивной скомпилированной функцией Lisp в ‘simple.el’.

Это связано с <C-delete>, M-d.

(убить слово ARG)

Убивайте персонажей вперед, пока не встретите конец слова. С аргументом ARG, делайте это много раз.

Теперь давайте просмотрим исходный код:

(defun kill-word (arg)                                                                                                     
  "Kill characters forward until encountering the end of a word.                                                           
With argument ARG, do this that many times."
  (interactive "p")
  (kill-region (point) (progn (forward-word arg) (point))))

Затем внутри документации по kill-regionфункции мы находим:

Убить («вырезать») текст между точкой и отметкой.
This deletes the text from the buffer and saves it in the kill ring, Команда [yank] может получить его оттуда. (Если вы хотите сохранить регион, не убивая его, используйте [kill-ring-save].)

[...]

Программы на Лиспе должны использовать эту функцию для уничтожения текста. (Чтобы удалить текст, используйте delete-region.)

Теперь, если вы хотите пойти дальше, вы можете использовать эту функцию для удаления без копирования в kill-ring:

(defun my-delete-word (arg)
  "Delete characters forward until encountering the end of a word.
With argument, do this that many times.
This command does not push text to `kill-ring'."
  (interactive "p")
  (delete-region
   (point)
   (progn
     (forward-word arg)
     (point))))

(defun my-backward-delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument, do this that many times.
This command does not push text to `kill-ring'."
  (interactive "p")
  (my-delete-word (- arg)))

(defun my-delete-line ()
  "Delete text from current position to end of line char.
This command does not push text to `kill-ring'."
  (interactive)
  (delete-region
   (point)
   (progn (end-of-line 1) (point)))
  (delete-char 1))

(defun my-delete-line-backward ()
  "Delete text between the beginning of the line to the cursor position.
This command does not push text to `kill-ring'."
  (interactive)
  (let (p1 p2)
    (setq p1 (point))
    (beginning-of-line 1)
    (setq p2 (point))
    (delete-region p1 p2)))

; bind them to emacs's default shortcut keys:
(global-set-key (kbd "C-S-k") 'my-delete-line-backward) ; Ctrl+Shift+k
(global-set-key (kbd "C-k") 'my-delete-line)
(global-set-key (kbd "M-d") 'my-delete-word)
(global-set-key (kbd "<M-backspace>") 'my-backward-delete-word)

Предоставлено ErgoEmacs

Нсуками _
источник
спасибо, что решил это. Как насчет побочного вопроса? : p
Даниэль Хитцель
3
@DanielHitzel Извините, у меня нет ответа на дополнительный вопрос :)
Nsukami _
Так что я не одинок: D
Даниэль Хитцель
4

Поскольку Emacs 24 без какой-либо конфигурации, вы можете удалить любой текст, не добавляя его в список уничтожений, выбрав его и нажав Backspaceили Delete. Когда метка активна, эти клавиши удаляют регион, а не просто удаляют символ перед / после курсора.

То есть перейдите к одному концу текста, который вы хотите удалить, нажмите Ctrl+ Space, перейдите к другому концу и нажмите Backspace(или Delete), чтобы удалить выделенную область. Или перейдите к одному концу, удерживайте, Shiftпока вы используете клавиши перемещения, чтобы перейти к другому концу, и нажмите Backspace.

Жиль "ТАК - прекрати быть злым"
источник
Ну, это не так для меня с Emacs 25.1 в MacOS.
NVaughan
0

У меня была та же проблема, и я решил ее проще:

(global-set-key (kbd "<backspace>")
          '(lambda () (interactive) (backward-delete-char-untabify 1 nil)))

Вызов (backward-delete-char-untabify 1 nil)говорит Emacs об удалении назад одного символа (это 1параметр) и о том, что он воздерживается от копирования в кольцо (это nilпараметр). Вам нужна лямбда (то есть анонимная) функция, потому что вы привязываете функцию с параметрами к ключу.

NVaughan
источник