Emacs: как удалить текст без звонка?

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

(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)))

Ответ 4

Взято из EmacsWiki:

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

(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. Таким образом, TRUELY не влияет на kill-ring, в отличие от других ситуаций, где вне emacs я заметил, что на kill-ring оказали влияние.

Ответ 8

Нашел ответ на этот вопрос.

Отправлено первым здесь.

;; 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)

Ответ 9

(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" 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)

Ответ 10

Добавить эквивалент удаления ключей kill-region и kill-line C-w и C-k следующим образом. Связан с ключами C-v и C-z.

;; A keybinding to delete-region gives a good "Windows CUT Ctrl-x equivalent".
;; What keybinding to use is awkward to choose.
;; using C-v "Windows PASTE Ctrl-v" is quite a subversive option.
;;  C-v = scroll up in emacs which I have no use for.
(global-set-key (kbd "C-v") 'delete-region)

;; To have also a "Windows CUT" alternative to C-k (kill-line) this can be done:
(defun delete-line () "delete line, take it out of kill ring. bind this func to C-z"
 (interactive)
 (setq last-command 'delete-line)
 (kill-line)
 (setq kill-ring (cdr kill-ring))
 (setq kill-ring-yank-pointer kill-ring)
 (setq last-command 'delete-line)
)
(global-set-key (kbd "C-z") 'delete-line)
;; without setting of last-command 2+ C-zs mess up kill-ring

Ответ 11

Мой ответ на первый вопрос: пометьте текст в 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

Ответ 12

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

(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)))

Ответ 13

Здесь версия kill-region, которая не заставляет значения в kill-ring.

(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.

Ответ 14

как удалить текст без звонка?

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

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

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

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

В версии 25.1.1 на OS X мне также пришлось добавить (setq select-enable-primary nil), чтобы он не копировал выбранную область в кольцо kill