Question

Comment puis-je copier une ligne 10 fois facilement dans Emacs? Je ne trouve pas de raccourci ou de fonction de copie. Je peux utiliser C-aC-spcC-eM-w pour copier laborieusement la ligne, mais comment puis-je la coller plusieurs fois?

Toutes les idées avant d’aller écrire mes propres fonctions.

Était-ce utile?

La solution

Copie :

Si vous travaillez fréquemment avec des lignes, vous souhaiterez peut-être copier ( kill-ring-save ) et couper ( kill-region ) sur des lignes sans région. est sélectionné:

(defadvice kill-ring-save (before slickcopy activate compile)
  "When called interactively with no active region, copy a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (list (line-beginning-position)
           (line-beginning-position 2)))))
(defadvice kill-region (before slickcut activate compile)
  "When called interactively with no active region, kill a single line instead."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
     (list (line-beginning-position)
           (line-beginning-position 2)))))

Ensuite, vous pouvez copier la ligne avec juste M-w.

Coller :

Souvent, un argument de préfixe exécute une action plusieurs fois. Vous vous attendez donc à ce que C-u 10 C-y fonctionne, mais dans ce cas, C-y utilise son argument pour indiquer l'élément de l'anneau de mise à mort à utiliser pour "yank". (coller). La seule solution à laquelle je puisse penser est ce que dit kronoz: enregistrez une macro avec Cx (Cy Cx) puis laissez l'argument de Cu aller dans macro-km-end-and-call-macro (c'est Cu 9 Cx e ou même simplement C-9 Cx e ou M-9 Cx e).

Autre méthode : Vous pouvez également rester en M-x viper-mode et utiliser yy10p:)

Autres conseils

vous pouvez utiliser une macro de clavier pour cela: -

C-a C-k C-x (C-y C-j C-x) C-u 9 C-x e

Explication: -

  • C-a: aller au début de la ligne
  • C-k: ligne de mise à mort
  • C-x (: lance l'enregistrement de la macro du clavier
  • C-y: Yank a tué la ligne
  • C-j: passer à la ligne suivante
  • C-x): arrêtez l'enregistrement de la macro de clavier
  • C-u 9: répétez 9 fois
  • C-x e: Exécuter une macro de clavier

Vous le savez peut-être, mais pour de nombreuses commandes, un "C-u 10" préfixe fera l'affaire. Malheureusement pour la commande C-y yank, "C-u" est redéfini pour signifier "revenir en arrière autant d'éléments dans l'anneau de mise à mort et tirer cet objet".

Je pensais que vous seriez peut-être en mesure d'utiliser les commandes copy-to-register et insert-register avec la commande C-u prefix, mais apparemment cela ne fonctionne pas non plus.

Également C-x z, "répéter la dernière commande". semble être immunisé contre le c-u.

Une autre idée serait d’utiliser M-: pour obtenir une invite Eval et taper un peu d’elisp. Je pensais que quelque chose comme (dotimes '10 'yank) pourrait le faire, mais cela ne semble pas.

Il semble donc que l’utilisation de C-u sur une macro est peut-être la meilleure solution, à moins d’écrire votre propre petite fonction.

Si j'avais un vote, je voterais pour la réponse de Kronoz.

Vous n'avez pas besoin des deux C-x) et C-x e dans cet exemple.

Vous pouvez simplement donner l’argument de répétition directement à C-x). Cela arrête l'enregistrement et répète la macro, en une étape. Ou vous pouvez sauter C-x) et aller directement à C-x e, car C-x e mettra fin à l'enregistrement avant d'effectuer les répétitions.

Le choix dépend de la manière dont vous souhaitez que votre nombre de répétitions fonctionne. Pour C-x), vous indiquez le nombre total de répétitions souhaitées (donc 10 dans ce cas). Pour C-x e, vous devez indiquer le nombre de répétitions restantes (c.-à-d. 9).

C-a-k-k C'est plus rapide que d'utiliser la marque et vous n'avez pas besoin de changer les variables.

Encore mieux (sauf si vous êtes dans un terminal), vous pouvez utiliser C-S-Backspace * pour supprimer toute la ligne, où que vous vous trouviez.

[* Si vous utilisez X Windows, veillez à taper shift ( pas alt) ou vous pourrez mettre fin à votre session!]

En parlant de terminaux, M-9 est une bonne alternative si vous ne savez pas taper C-9.

Dans Emacs 22 et supérieur, par défaut, F3 lance une macro et F4 termine / répète une macro. Vous appuyez simplement sur F3 pour commencer l'enregistrement, appuyez sur F4 lorsque vous avez terminé et appuyez de nouveau sur F4 pour répéter la macro. (F4 prend également un argument.)

En résumé, pour obtenir 10 copies de la ligne actuelle:

  • C-S-Backspace: élimine cette ligne
  • F3: démarrer la macro
  • C-y: tirez la ligne
  • C-1 C-0 F4: faire que 10 coups vif

Pas aussi court que le y y 10 p, mais assez proche. :)

Voici une fonction que j'ai extraite d'un portage Emacs sous OS / 2. (Oui, j'utilise Emacs depuis un moment.)

;; Author: Eberhard Mattes <mattes@azu.informatik.uni-stuttgart.de>
(defun emx-dup-line (arg)
  "Duplicate current line.
Set mark to the beginning of the new line.
With argument, do this that many times."
  (interactive "*p")
  (setq last-command 'identity) ; Don't append to kill ring
  (let ((s (point)))
    (beginning-of-line)
    (let ((b (point)))
      (forward-line)
      (if (not (eq (preceding-char) ?\n)) (insert ?\n))
      (copy-region-as-kill b (point))
    (while (> arg 0)
      (yank)
      (setq arg (1- arg)))
    (goto-char s))))

J'ai ce lié à F9 d:

(global-set-key [f9 ?d]    'emx-dup-line)

Ensuite, j'utiliserais C-u 10 F9 d pour dupliquer une ligne 10 fois.

Le seul moyen que je connaisse pour répéter des commandes arbitraires est d'utiliser le paramètre "répéter par argument". fonctionnalité des macros du clavier.

C-un espace C vers le bas de M-w C-x (C-y C-x) C-9 C-x e

  • C-a: aller au début de la ligne
  • C-space: marque de repère
  • down: aller au début de la ligne suivante
  • M-w: région de copie
  • C-x (: macro de clavier de démarrage
  • C-y: ligne copiée Yank
  • C-x): macro de fin de clavier
  • C-9 C-x e: exécutez la macro de clavier neuf fois.

C'est un peu faible comparé à vim. Mais seulement parce que vim est incroyablement efficace dans ce genre de choses.

Si vous êtes à la recherche d'une interaction modale de type vi, vous pouvez utiliser l'un des modes d'émulation vi, tels que le mode vipère. Vérifiez dans la section "Émulation". du manuel en ligne d'emacs.

Vous voudrez tuer la ligne: C-a C-k, puis C-y ou?

Je ne connais pas d’équivalent direct (C-y 10 fois, c’est le meilleur que je connaisse), mais vous pourriez être intéressé par Viper, qui est un paquet d’émulation vi pour emacs. Cela fait partie de la distribution standard d’Emacs.

Sur la base de la réponse de Baxissimo, j'ai corrigé ceci:

(defun yank-n-times (arg)
  "yank prefix-arg number of times. Not safe in any way."
  (interactive "*p")
  (dotimes 'arg (yank)))

Définissez-le sur une clé, appelez-le avec un argument de préfixe et c'est parti.

modifier (également modifié l'appel interactif ci-dessus pour qu'il soit moins nul)

Ou, voici une version qui peut en quelque sorte remplacer Yank-Pop:

(defun yank-n-times (&optional arg)
  "yank prefix-arg number of times. Call yank-pop if last command was yank."
  (interactive "*p")
  (if (or (string= last-command "yank")
      (string= last-command "yank-pop"))
      (yank-pop arg)
    (if (> arg 1)
    (dotimes 'arg (yank))
      (message "Previous arg was not a yank, and called without a prefix."))))

le message est une sorte de mensonge, mais vous ne devriez pas l'appeler sans un préfixe supérieur à 1 de toute façon, donc.

Je ne sais pas si c'est une bonne idée, mais j'ai remplacé M-y par ceci, je vais voir comment ça se passe.

Vous pouvez tirer une ligne (ou une région) dix fois avec moins de frappes au clavier:

  • marquer une ligne (ou une région)
  • supprimez le texte sélectionné 10 fois:

C-w C-x (C-y C-1 C-0 C-x)

Vous pouvez également utiliser les touches de fonction F3 et F4 pour commencer et terminer la macro du clavier:

C-w F3 C-y C-1 C-0 F4

Vous obtenez la ligne avec C-k, vous exécutez la commande suivante dix fois avec C-u 10, puis vous collez la ligne avec C-y. Assez simple.

Si vous voulez toujours que C-k fasse toute la ligne, vous pouvez définir kill-whole-line sur t. Plus besoin de jouer avec C-a ou C-e.

Il y a beaucoup de choses que vous pouvez faire avec des anneaux de coupe fantaisie, des registres et des macros, et je vous encourage à les apprendre, mais tirer une ligne dix fois ne doit pas nécessairement être dur ou étrange.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top