Come posso eliminare la riga corrente in Emacs?


122

Qual è l'equivalente emacs di vi dd? Voglio eliminare la riga corrente. Ho provato CTRL+ kma elimina solo dalla posizione corrente.

Risposte:


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

C'è anche

C-S-backspace   # Ctrl-Shift-Backspace

che invoca M-x kill-whole-line.

Se desideri impostare un'associazione di tasti globale diversa, inseriscila in ~ / .emacs:

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

Se desideri eliminare un numero di righe intere, puoi anteporre al comando un numero:

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 volte trovo C-x zutile anche:

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.

Funziona. C'è un modo per farlo usando un comando? Dovrò creare un'associazione chiave personalizzata per farlo?
Manoj Govindan

14
Non sapevo C-x z, è davvero fantastico. E bella e precisa risposta btw.
slu

2
C'è anche C-k C-kqualcosa che funziona come un d$ S-jin vim, ma questo può eliminare le righe in avanti abbastanza bene.
Theo Belaire

Perché non c'è uno spazio C-cd?
Elliot Gorokhovsky,

@ RenéG: Lo spazio è opzionale.
unutbu

11

Nel caso in cui non si desideri eliminare la riga (che la metterebbe negli appunti del sistema operativo e uccidere l'anello) ma eliminarla semplicemente:

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

3

Un altro metodo per eliminare la riga senza posizionarla nel kill ring:

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

Questo lascerà il punto all'inizio di una riga vuota. Per sbarazzarti anche di questo, potresti voler aggiungere qualcosa di simile (delete-blank-lines)alla fine della funzione, come in questo esempio, che è forse un po 'meno intuitivo:

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

1

Il modo più veloce / più semplice per eliminare (uccidere) un'intera linea, da qualsiasi punto della linea, senza selezionare nulla, è:

C-w  ; kill-region

È versatile nell'eliminare tutto ciò che è selezionato o una riga per impostazione predefinita se non è selezionato nulla.

Data la domanda, probabilmente sei anche interessato a replicare lo "strattone" di Vim, yy(sebbene nel gergo di Emacs uno "strattone" sia il "put" di Vim, in modo confuso p). Questo è:

M-w  ; kill-ring-save

Bello e congruente e abbastanza facile da ricordare. Anche leggermente simile a quello di Vim i_CTRL-W.

Dopo aver inserito qualcosa nel kill ring con uno dei precedenti, probabilmente vorrai "strapparlo" (incollarlo):

M-y  ; yank-pop

(Nota che CS-backspace potrebbe non funzionare nel terminale Emacs.)


1

Piuttosto che avere una chiave separata per cancellare la riga, o dover invocare prefisso-argomento. Puoi usare crux-smart-kill-line che "ucciderà fino alla fine della riga e ucciderà l'intera linea alla chiamata successiva". Ma se preferisci deleteinvece di kill, puoi usare il codice qui sotto.

Per l'operazione point-to-string (kill / delete) consiglio di usare 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))))

fonte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.