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.