Emacs: как удалить текст без kill ring? - PullRequest
77 голосов
/ 12 марта 2009

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

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

Ответы [ 14 ]

45 голосов
/ 12 марта 2009

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

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

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

35 голосов
/ 12 марта 2009

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

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

20 голосов
/ 17 января 2012

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

(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)))
10 голосов
/ 14 февраля 2014

Взято из EmacsWiki :

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

(delete-region (point) (line-end-position))
5 голосов
/ 08 ноября 2009

M-x Eval-выражение (setq kill-ring (cdr kill-ring)) - удаляет последний элемент из kill-ring

4 голосов
/ 12 марта 2009

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

3 голосов
/ 11 июня 2014

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

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

;; 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)
2 голосов
/ 20 октября 2012

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

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

(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 оказали влияние

1 голос
/ 22 декабря 2015

Большинство функций уничтожения используют 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)))
1 голос
/ 10 июля 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...