Qual è l'equivalente emacs di vi dd? Voglio eliminare la riga corrente. Ho provato CTRL+ kma elimina solo dalla posizione corrente.
Qual è l'equivalente emacs di vi dd? Voglio eliminare la riga corrente. Ho provato CTRL+ kma elimina solo dalla posizione corrente.
Risposte:
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 z
utile 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.
C-x z
, è davvero fantastico. E bella e precisa risposta btw.
C-k C-k
qualcosa che funziona come un d$ S-j
in vim, ma questo può eliminare le righe in avanti abbastanza bene.
C-cd
?
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)))))
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))
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.)
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 delete
invece 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))))