Emacs: как удалить текст без kill ring?

Я хотел бы просто удалить какой-то текст, чтобы вместо него можно было нажать другой. Как я могу это сделать? Cw обрезает выделенный текст, чтобы убить кольцо, и я в конечном итоге без текста, который я хотел восстановить.

Кроме того, возможно ли дергать текст непосредственно вместо некоторого текста, даже не нажимая кнопки, чтобы убить его?

14 ответов

Я печатаю M-x delete-region довольно часто, но вы можете связать его с ключом.

С помощью Delete Selection Mode в более новых версиях Emacs вам не нужно вводить команду, просто начните вводить:

По умолчанию вставка текста происходит нормально, даже если метка активна - например, при вводе вставки вставляется символ "а", а затем деактивируется метка. Режим "Удалить выделение", второстепенный режим, изменяет это поведение: если вы включите этот режим, то вставка текста, когда метка активна, приводит к тому, что текст в области будет удален первым. Кроме того, команды, которые обычно удаляют только один символ, например, Cd или DEL, удаляют весь регион. Чтобы включить или отключить режим удаления выделения, введите M-x delete-selection-mode.

Ты можешь использовать M-y после C-y чтобы вставить предыдущий элемент из списка уничтожений, или используйте пакет browse-kill-ring.

Что касается второго вопроса, см. DeleteSelectionMode.

У меня была такая же проблема. Самое близкое, что у меня есть, это сделать небольшую функцию, которая по сути:

(defun ruthlessly-kill-line ()
  "Deletes a line, but does not put it in the kill-ring. (kinda)"
  (interactive)
  (move-beginning-of-line 1)
  (kill-line 1)
  (setq kill-ring (cdr kill-ring)))

Взято из EmacsWiki:

Эквивалент ‘kill-line’ (‘C-k’) но без побочных эффектов:

(delete-region (point) (line-end-position))

Mx eval-expression (setq kill-ring (cdr kill-ring)) - удаляет последний элемент из kill-ring

Для вашего второго вопроса, в качестве альтернативы DeleteSelectionMode, вы можете включить режим CUA, который дополнительно дает вам хороший режим выбора прямоугольника, включенный C-Return. Режим CUA является частью Emacs с 22.1.

Большинство функций уничтожения используют kill-region сделать фактическую работу по убийству текста. Я использую макрос lisp для создания функций удаления из функций уничтожения.

(defmacro jpk/delete-instead-of-kill (&rest body)
  "Replaces `kill-region' with `delete-region' in BODY."
  `(cl-letf (((symbol-function 'kill-region)
              (lambda (beg end &optional yank-handler)
                (delete-region beg end))))
     ,@body))

(defun jpk/delete-word (arg)
  "Like `kill-word', but does not save to the `kill-ring'."
  (interactive "*p")
  (jpk/delete-instead-of-kill (kill-word arg)))

Нашел ответ на это.

Разместил это сначала здесь.

;; Ctrl-K with no kill
(defun delete-line-no-kill ()
  (interactive)
  (delete-region
   (point)
   (save-excursion (move-end-of-line 1) (point)))
 (delete-char 1)
)
(global-set-key (kbd "C-k") 'delete-line-no-kill)

Технически, другие ответы неверны в первой части.

Вот моя реализация и мотивация:

(defun delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (backward-word arg) (point))))

Я адаптировал код здесь отkill-word" в simple.el, Я переключился kill-region с delete-region а также forward-word за backward-word, Таким образом, это НАСТОЯТЕЛЬНО не влияет на kill-ringВ отличие от других ситуаций, когда вне emacs я заметил, что kill-ring был под влиянием.

В качестве дополнения ко всем ответам. Если вы пишете код elisp для удаления, вы можете вызывать функции, которые убивают, пока вы используете локальный объект kill-ring, например:

(defun delete-something()
  "Delete something without storing in kill ring."
  (let (kill-ring)
     (kill-something)))

Используйте любую функцию, которая убивает что-то вместо kill-something. Затем функция удалит, и в реальном списке уничтожений ничего не запомнится.

Мой ответ на первый вопрос: пометить текст в Emacs (используя мышь или установить метку C-SPC) и нажмите кнопку "<- Backspace" на клавиатуре вместо C-w, Таким образом, вы все равно можете вставить текст в системный буфер обмена, не беспокоясь о том, что буфер обмена был переопределен текстом, убитым C-w

Предыстория этого ответа: иногда, когда я получал текст вне emacs, который я хочу использовать для замены региона в emacs, я часто совершал ошибку, сначала копируя этот текст в системный буфер обмена (т.е. в Windows Ctrl + C), то делаю C-w в emacs "удалить" область текста, которую я хочу заменить, с надеждой, что позже M-w мог восстановить мой текст в буфере обмена из kill-ring. К сожалению, буфер обмена будет просто переопределен текстом, убитым C-wи оригинальное сообщение в буфере обмена никогда не будет отображаться в kill-ring.

По второму вопросу: да, вы всегда можете сначала пометить текст в emacs, а затем напрямую C-y

Добавьте эквивалент удаления kill-region и kill-line ключей Cw и Ck следующим образом. Связано с клавишами Cv и Cz.

;; Привязка клавиш к delete-region дает хороший "Windows CUT Ctrl-x эквивалент".;; Какую привязку клавиш использовать неудобно выбрать.;; использование Cv "Windows PASTE Ctrl-v" - довольно разрушительный вариант.;;  Cv = прокрутить вверх в emacs, который мне не нужен.
(global-set-key (kbd "Cv") 'delete-region);; Чтобы иметь также альтернативу "Windows CUT" Ck (kill-line), это можно сделать:
(defun delete-line () "удалить строку, вынуть ее из списка уничтожений. привязать эту функцию к Cz"
 (Интерактивный)
 (setq last-command 'delete-line)
 (Стропа)
 (setq kill-ring (cdr kill-ring))
 (setq kill-ring-yank-указатель kill-ring)
 (setq last-command 'delete-line))
(global-set-key (kbd "Cz") 'delete-line);; без установки последней команды 2+ C-zs испортить kill-ring

как удалить текст без уничтожить кольцо?

delete-region функция удалит выбранный регион, не добавляя его в список уничтожений

Кроме того, возможно ли дергать текст непосредственно вместо некоторого текста, даже не нажимая кнопки, чтобы убить его?

Я думаю, что вы спрашиваете, как заменить текст в выбранной области чем-то, что вы уже положили в список уничтожений.

настройка (delete-selection-mode 1) позволит вам дергать / вставлять в выбранный регион. Это также позволяет вам просто ввести и заменить выбранный регион.

На версии 25.1.1 на OS X I также пришлось добавить (setq select-enable-primary nil) чтобы предотвратить копирование выбранного региона в список уничтожений

(defun copy-to-register-z (p1 p2)
  "Copy text selection to register named “z”."
  (interactive "r")
  (copy-to-register ?z p1 p2))
(defun replace-register-content-z (p1 p2)
  "Replace register named “z”'s content."
  (interactive "r")
  (delete-region p1 p2)
  (insert-register ?z))
(global-set-key (kbd "C-c c") 'copy-to-register-z)
(global-set-key (kbd "C-c v") 'replace-register-content-z)

Вот версия kill-region это не навязывает ценности в список убийств.

(defun kill-or-delete-region (beg end prefix)
  "Delete the region, storing it in the kill-ring.
If a prefix argument is given, don't change the kill-ring."
  (interactive "r\nP")
  (if prefix
      (delete-region beg end)
    (kill-region beg end)))

(global-set-key (kbd "C-w") 'kill-or-delete-region)

Это позволяет вам сделать C-w как и раньше, но C-u C-w теперь удаляет текст без изменения kill-ring.

Другие вопросы по тегам