175 votes

Comment dupliquer une ligne entière dans Emacs ?

J'ai vu cette même question pour VIM et c'est quelque chose que je voulais moi-même savoir comment faire pour Emacs. Dans ReSharper, j'utilise CTRL-D pour cette action. Quel est le plus petit nombre de commandes pour effectuer cette action dans Emacs ?

2 votes

Bien sûr, c'est emacs donc TMTOWTDI - il y en a 22 ! (et ce n'est pas fini) c2.com/cgi/wiki?ilyaplusd'unefaçond'agir

160voto

Chris Conway Points 24671

Yo uso

C-a C-SPACE C-n M-w C-y

qui se décompose en

  • C-a : déplacer le curseur au début de la ligne
  • C-SPACE : commencer une sélection ("set mark")
  • C-n : déplacer le curseur à la ligne suivante
  • M-w : copier la région
  • C-y : coller ("yank")

Le projet susmentionné

C-a C-k C-k C-y C-y

revient au même (TMTOWTDI)

  • C-a : déplacer le curseur au début de la ligne
  • C-k : couper ("tuer") la ligne
  • C-k : couper la nouvelle ligne
  • C-y : coller ("yank") (nous sommes de retour à la case départ)
  • C-y : coller à nouveau (nous avons maintenant deux copies de la ligne)

Elles sont toutes deux très verbeuses comparées à C-d dans votre éditeur, mais dans Emacs il y a toujours une personnalisation. C-d est lié à delete-char par défaut, alors pourquoi pas C-c C-d ? Il suffit d'ajouter les éléments suivants à votre .emacs :

(global-set-key "\C-c\C-d" "\C-a\C- \C-n\M-w\C-y")

(La version elisp de @Nathan est probablement préférable, car elle ne se brisera pas si l'une des liaisons de touches est modifiée).

Attention : certains modes Emacs peuvent récupérer C-c C-d pour faire autre chose.

6 votes

Sachez que si vous avez '(setq kill-whole-line t)', vous n'aurez besoin que d'un seul 'C-k' (solution 2) car il tue déjà le saut de ligne en même temps que le contenu de la ligne. C'est l'utilisation que je préfère de 'C-k'. Au revoir, Daniel

202 votes

C'est vraiment embarrassant.

22 votes

Qu'en est-il C-S-backspace C-y C-y ?

104voto

Nate Points 1986

En plus des réponses précédentes, vous pouvez également définir votre propre fonction pour dupliquer une ligne. Par exemple, en plaçant la fonction suivante dans votre fichier .emacs, C-d dupliquera la ligne en cours.

(defun duplicate-line()
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (open-line 1)
  (next-line 1)
  (yank)
)
(global-set-key (kbd "C-d") 'duplicate-line)

0 votes

J'obtiens l'erreur suivante avec ceci : Symbol's function definition is void: move-beginning-of-line

7 votes

Le problème est que la touche "Del" est également liée à la duplication de la ligne...

0 votes

Donc, des idées sur la façon de délier Del de cette fonction ?

79voto

epatel Points 32451

Placez le curseur sur la ligne, si ce n'est pas au début, faites un CTRL - A alors :

CTRL - K

CTRL - K

CTRL - Y

CTRL - Y

0 votes

Je ne pense pas que le deuxième C-Y soit nécessaire.

4 votes

Il ne s'agira pas d'un doublon sans

21 votes

Utilisez C-S-Backspace (kill-whole-line) au lieu de C-k. Vous n'avez pas à vous soucier de la position du curseur ou de la suppression de la nouvelle ligne.

55voto

pesche Points 882

Ma version d'une fonction pour dupliquer une ligne qui fonctionne bien avec l'annulation et qui ne perturbe pas la position du curseur. C'était le résultat d'un discussion dans gnu.emacs.sources de novembre 1997 .

(defun duplicate-line (arg)
  "Duplicate current line, leaving point in lower line."
  (interactive "*p")

  ;; save the point for undo
  (setq buffer-undo-list (cons (point) buffer-undo-list))

  ;; local variables for start and end of line
  (let ((bol (save-excursion (beginning-of-line) (point)))
        eol)
    (save-excursion

      ;; don't use forward-line for this, because you would have
      ;; to check whether you are at the end of the buffer
      (end-of-line)
      (setq eol (point))

      ;; store the line and disable the recording of undo information
      (let ((line (buffer-substring bol eol))
            (buffer-undo-list t)
            (count arg))
        ;; insert the line arg times
        (while (> count 0)
          (newline)         ;; because there is no newline in 'line'
          (insert line)
          (setq count (1- count)))
        )

      ;; create the undo information
      (setq buffer-undo-list (cons (cons eol (point)) buffer-undo-list)))
    ) ; end-of-let

  ;; put the point in the lowest line and return
  (next-line arg))

Vous pouvez ensuite définir CTRL-D pour appeler cette fonction :

(global-set-key (kbd "C-d") 'duplicate-line)

0 votes

Excellent ! La fonction d'annulation et la position du curseur font de ce logiciel le meilleur. Merci !

0 votes

Également, sur le lien il y a un code pour les régions aussi !

0 votes

Très bonne solution. Thx

53voto

Ray Vega Points 30187

Au lieu de kill-line ( C-k ) comme dans C-a C-k C-k C-y C-y utiliser le kill-whole-line commandement :

C-S-Backspace
C-y
C-y

Les avantages par rapport à C-k comprennent que l'endroit où se trouve le point sur la ligne n'a pas d'importance (contrairement à C-k ce qui nécessite d'être en début de ligne) et il tue également la nouvelle ligne (encore une fois quelque chose C-k ne le fait pas).

2 votes

Bravo @RayVega ! J'ai essayé cette solution et elle fonctionne comme un champion (dans mon GNU Emacs 23.3.1, en tout cas). Cette solution ne fonctionne-t-elle pas pour certaines personnes ? C'est la meilleure réponse à votre (propre) question.

1 votes

Vous devriez accepter cette réponse comme étant la bonne. Elle fait exactement ce que vous avez demandé, et en "un minimum de commandes".

0 votes

C'est probablement l'approche que je préfère, car elle nécessite le moins de frappes au clavier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X