web-dev-qa-db-fra.com

Comment puis-je supprimer la ligne actuelle dans Emacs?

Quel est l'équivalent emacs de vi dd? Je veux supprimer la ligne actuelle. A tenté CTRL + k mais il supprime seulement de la position actuelle.

115
Manoj Govindan
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 mettre 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 aussi C-x z utile:

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.
200
unutbu

Dans le cas où vous ne voulez 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)))))
10
Vladimir Panteleev

Plutôt que d'avoir une clé distincte pour supprimer la ligne, ou d'avoir à invoquer un préfixe-argument. 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 delete au 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))))

source

1
azzamsa

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é à répliquer le "yank" de Vim, yy (bien que dans le langage Emacs un "yank" soit confusément le "put" de Vim, p). C'est:

M-w  ; kill-ring-save

Agréable et congruent, et assez facile à retenir. Même légèrement similaire à Vim's i_CTRL-W.

Une fois que vous avez mis quelque chose dans le kill ring avec l'un des éléments ci-dessus, vous voudrez probablement le "tirer" (coller):

M-y  ; yank-pop

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

1
Micah Elliott

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 vierge. 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))
1
dardisco