Comment puis-je supprimer la ligne actuelle dans Emacs?

122

Quel est l'équivalent emacs de vi dd? Je souhaite supprimer la ligne actuelle. Essayé CTRL+ kmais il ne supprime que de la position actuelle.

Manoj Govindan
la source

Réponses:

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

Il y a aussi

C-S-backspace   # Ctrl-Shift-Backspace

qui invoque M-x kill-whole-line.

Si vous souhaitez définir une liaison de clé globale différente, vous devez la placer dans ~ / .emacs:

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

Si vous souhaitez supprimer un certain nombre de lignes entières, vous pouvez préfixer la commande avec un nombre:

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

Parfois, je trouve également C-x zutile:

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
la source
Cela marche. Existe-t-il un moyen de le faire en utilisant une seule commande? Dois-je créer une liaison de clé personnalisée pour ce faire?
Manoj Govindan
14
Je ne savais pas C-x z, c'est vraiment cool. Et réponse agréable et précise btw.
slu
2
Il y a aussi C-k C-kqui fonctionne un peu comme d$ S-jdans vim, mais cela peut assez bien supprimer les lignes en avant.
Theo Belaire
Pourquoi n'y a-t-il pas d'espace C-cd?
Elliot Gorokhovsky
@ RenéG: L'espace est facultatif.
unutbu
11

Au cas où vous ne voudriez pas tuer la ligne (ce qui la mettrait dans le presse-papiers du système d'exploitation et le kill ring), mais supprimez-la simplement:

(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
la source
3

Une autre méthode pour supprimer la ligne sans la placer dans le kill ring:

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

Cela laissera le point au début d'une ligne vide. Pour vous en débarrasser également, vous pouvez ajouter quelque chose comme (delete-blank-lines)à la fin de la fonction, comme dans cet exemple, qui est peut-être un peu moins intuitif:

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

Le moyen le plus rapide / le plus simple de supprimer (tuer) une ligne complète, à partir de n'importe quel point de la ligne, sans rien sélectionner, est:

C-w  ; kill-region

Il est polyvalent pour supprimer tout ce qui est sélectionné, ou une ligne par défaut si rien n'est sélectionné.

Compte tenu de la question, vous êtes probablement également intéressé par la réplication du "yank" de Vim, yy(bien que dans le langage d'Emacs un "yank" soit déroutant "put" de Vim, p). C'est:

M-w  ; kill-ring-save

Sympa et cohérent, et assez facile à retenir. Même légèrement similaire à Vim i_CTRL-W.

Une fois que vous avez mis quelque chose dans l'anneau de destruction avec l'un ou l'autre des éléments ci-dessus, vous voudrez probablement le «copier» (coller):

M-y  ; yank-pop

(Notez que CS-backspace peut ne pas fonctionner dans le terminal Emacs.)

Micah Elliott
la source
1

Plutôt que d'avoir une clé séparée pour supprimer la ligne, ou d'avoir à appeler l'argument préfixe. Vous pouvez utiliser crux-smart-kill-line qui "tuera jusqu'à la fin de la ligne et tuera toute la ligne au prochain appel". Mais si vous préférez deleteau lieu de kill, vous pouvez utiliser le code ci-dessous.

Pour une opération point-à-chaîne (kill / delete), je recommande d'utiliser 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))))

la source

azzamsa
la source