tutorial - Emacs: ¿cómo eliminar texto sin matar el anillo?
emacs ubuntu (14)
cómo eliminar texto sin matar el anillo?
la función de delete-region
eliminará la región seleccionada sin agregarla al anillo de sacrificio
Además, ¿es posible tirar directamente el texto en lugar de texto sin siquiera presionar los botones para matarlo?
Creo que estás preguntando cómo reemplazar el texto en una región seleccionada con algo que ya has puesto en el anillo de matar.
La configuración (delete-selection-mode 1)
le permitirá arrastrar / pegar sobre una región seleccionada. También le permite simplemente escribir y reemplazar una región seleccionada.
En la versión 25.1.1 en OS XI también tenía que agregar (setq select-enable-primary nil)
para evitar que copiara la región seleccionada al kill ring
Me gustaría simplemente eliminar un texto para poder extraer otro texto en lugar de hacerlo. ¿Cómo puedo hacer eso? Cw corta el texto seleccionado para matar el anillo y termino sin el texto que quería tirar.
Además, ¿es posible tirar directamente el texto en lugar de texto sin siquiera presionar los botones para matarlo?
Técnicamente, las otras respuestas están equivocadas en la primera parte.
Aquí está mi implementación y motivación:
(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))))
simple.el
el código aquí de " kill-word
" en simple.el
. Cambié kill-region
con delete-region
y forward-word
para backward-word
. De esta forma, TRUELY no afecta el kill-ring
, a diferencia de las otras situaciones en las que, fuera de emacs, noté que el kill-ring
estaba influenciado.
Agregue un equivalente de eliminación de las claves kill-region y kill-line Cw y Ck de la siguiente manera. Encuadernado a las llaves Cv y Cz.
;; 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
Aquí hay una versión de kill-region
que no fuerza los valores en el 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)
Esto le permite hacer Cw
como antes, pero Cu Cw
ahora borra el texto sin cambiar el kill-ring.
Encontré una respuesta a esto.
Lo publicó primero here .
;; 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)
He tenido el mismo problema. Lo más parecido que tengo hasta ahora es solo hacer una pequeña función que es esencialmente:
(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)))
La mayoría de las funciones de matar utilizan kill-region
para hacer el trabajo real de matar texto. Uso una macro Lisp para crear funciones de eliminación de funciones de eliminación.
(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)))
Mi respuesta a la primera pregunta: marque el texto en emacs (utilizando el mouse o la marca de ajuste C-SPC
), y presione el botón "<- Retroceso" en el teclado en lugar de Cw
. De esta manera, aún puede pegar sobre el texto en el portapapeles del sistema, sin preocuparse de que el portapapeles quede anulado por el texto asesinado por Cw
Antecedentes de esta respuesta: a veces, cuando obtengo texto fuera de emacs que deseo usar para reemplazar una región en emacs, a menudo cometí un error copiando primero ese texto en el portapapeles del sistema (es decir, en Windows Ctrl + C
), y luego haciendo una Cw
en emacs para "borrar" la región de texto que quiero reemplazar, con la esperanza de que un Mw
posterior pueda recuperar mi texto en el portapapeles de kill-ring. Desafortunadamente, el portapapeles simplemente sería anulado por el mensaje de texto asesinado por Cw
, y el mensaje original en el portapapeles nunca aparecería en kill-ring.
Para la segunda pregunta, sí, siempre puedes marcar el texto en emacs primero y luego directamente en Cy
Mx eval-expression (setq kill-ring (cdr kill-ring)) - elimina el último elemento de kill-ring
Para su segunda pregunta, alternativamente a DeleteSelectionMode puede habilitar el modo CUA que además le brinda un agradable modo de selección de rectángulo habilitado por C-Return. El modo CUA es parte de emacs desde 22.1.
Puede usar My
después de Cy
para insertar el elemento anterior del anillo de matar, o usar el paquete browse-kill-ring .
En cuanto a la segunda pregunta, vea DeleteSelectionMode .
Tomado de EmacsWiki :
El equivalente de
''kill-line''
(''C-k''
) pero sin efectos secundarios de kill-ring:
(delete-region (point) (line-end-position))
Mx delete-region
bastante frecuencia, pero puede vincularlo a una clave.
Con Delete Selection Mode en las versiones más nuevas de Emacs, no tiene que escribir un comando, simplemente comience a escribir:
De manera predeterminada, la inserción de texto ocurre normalmente incluso si la marca está activa; por ejemplo, al escribir un inserta el carácter ''a'', entonces se desactiva la marca. El modo Eliminar selección, un modo menor, modifica este comportamiento: si habilita ese modo, insertar texto mientras la marca está activa hace que primero se elimine el texto en la región. Además, los comandos que normalmente eliminan solo un carácter, como Cd o DEL , eliminarán toda la región. Para alternar entre activar y desactivar el modo Eliminar selección, escriba
Mx delete-selection-mode.
(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)