¿Cómo puedo borrar la línea actual en Emacs?

122

¿Cuál es el equivalente emacs de vi dd? Quiero borrar la línea actual. Intenté CTRL+ kpero solo borra de la posición actual.

Manoj Govindan
fuente

Respuestas:

212
C-a # Go to beginning of line
C-k # Kill line from current point

También hay

C-S-backspace   # Ctrl-Shift-Backspace

que invoca M-x kill-whole-line.

Si desea establecer un enlace de clave global diferente, lo pondría en ~ / .emacs:

(global-set-key "\C-cd" 'kill-whole-line)     # Sets `C-c d` to `M-x kill-whole-line`

Si desea eliminar varias líneas completas, puede prefijar el comando con un número:

C-u 5 C-S-backspace    # deletes 5 whole lines
M-5 C-S-backspace      # deletes 5 whole lines

C-u C-S-backspace      # delete 4 whole lines. C-u without a number defaults to 4

C-u -5 C-S-backspace   # deletes previous 5 whole lines
M--5 C-S-backspace     # deletes previous 5 whole lines

A veces también encuentro C-x zútil:

C-S-backspace         # delete 1 whole line
C-x z                 # repeat last command
z                     # repeat last command again. 
                      # Press z as many times as you wish. 
                      # Any other key acts normally, and ends the repeat command.
unutbu
fuente
Esto funciona. ¿Hay alguna forma de hacer esto usando un comando? ¿Tendré que crear un enlace de clave personalizado para hacer esto?
Manoj Govindan
14
No lo sabía C-x z, eso es realmente genial. Y una respuesta agradable y precisa por cierto.
slu
2
También hay C-k C-kalgo que funciona como un d$ S-jin vim, pero esto puede eliminar líneas hacia adelante bastante bien.
Theo Belaire
¿Por qué no hay espacio dentro C-cd?
Elliot Gorokhovsky
@ RenéG: El espacio es opcional.
unutbu
11

En caso de que no desee eliminar la línea (lo que la colocaría en el portapapeles del sistema operativo y el anillo de eliminación), simplemente elimínela:

(defun delete-current-line ()
  "Delete (not kill) the current line."
  (interactive)
  (save-excursion
    (delete-region
     (progn (forward-visible-line 0) (point))
     (progn (forward-visible-line 1) (point)))))
Vladimir Panteleev
fuente
3

Otro método para eliminar la línea sin colocarla en el kill ring:

(defun delete-current-line ()
  "Deletes the current line"
  (interactive)
  (delete-region
   (line-beginning-position)
   (line-end-position)))

Esto dejará el punto al comienzo de una línea en blanco. Para deshacerse de esto también, es posible que desee agregar algo como (delete-blank-lines)al final de la función, como en este ejemplo, que quizás sea un poco menos intuitivo:

(defun delete-current-line ()
 "Deletes the current line"
 (interactive)
 (forward-line 0)
 (delete-char (- (line-end-position) (point)))
 (delete-blank-lines))
dardisco
fuente
1

La forma más rápida / sencilla de eliminar (matar) una línea completa, desde cualquier punto de la línea, sin seleccionar nada, es:

C-w  ; kill-region

Es versátil para eliminar lo que esté seleccionado, o una línea por defecto si no se selecciona nada.

Dada la pregunta, probablemente también esté interesado en replicar el "tirón" de Vim, yy(aunque en el lenguaje de Emacs un "tirón" es confusamente el "poner" de Vim p). Esto es:

M-w  ; kill-ring-save

Agradable y congruente, y bastante fácil de recordar. Incluso un poco similar al de Vim i_CTRL-W.

Una vez que haya puesto algo en el anillo de la muerte con cualquiera de los anteriores, es probable que desee "tirar" (pegar):

M-y  ; yank-pop

(Tenga en cuenta que es posible que CS-backspace no funcione en la terminal Emacs).

Micah Elliott
fuente
1

En lugar de tener una clave separada para eliminar la línea, o tener que invocar prefijo-argumento. Puede usar crux-smart-kill-line que "matará hasta el final de la línea y matará toda la línea en la próxima llamada". Pero si prefieres en deletelugar dekill , puede usar el siguiente código.

Para la operación punto a cadena (matar / eliminar) recomiendo usar zop-to-char

(defun aza-delete-line ()
  "Delete from current position to end of line without pushing to `kill-ring'."
  (interactive)
  (delete-region (point) (line-end-position)))

(defun aza-delete-whole-line ()
  "Delete whole line without pushing to kill-ring."
  (interactive)
  (delete-region (line-beginning-position) (line-end-position)))

(defun crux-smart-delete-line ()
  "Kill to the end of the line and kill whole line on the next call."
  (interactive)
  (let ((orig-point (point)))
    (move-end-of-line 1)
    (if (= orig-point (point))
        (aza-delete-whole-line)
      (goto-char orig-point)
      (aza-delete-line))))

fuente

azzamsa
fuente