web-dev-qa-db-fra.com

dans Emacs, modifiez plusieurs lignes à la fois

Je crois que textmate a un mode où si vous commencez à taper, la même chose sera entrée sur toutes les lignes que vous avez sélectionnées. Y a-t-il quelque chose de similaire dans emacs? Je suppose qu'il y a une façon dont les rectangles peuvent m'aider, mais je ne sais pas comment ...

63
allyourcode

C'est aussi simple que cela: C-x r t

87
allyourcode

Vous devez absolument essayer d'installer plusieurs curseurs:

https://github.com/magnars/multiple-cursors.el

C'est en marmelade et melpa donc juste:

 Curseurs multiples d'installation de packages M-x 
51
nic ferrier

L'une des solutions utilise le mode CUA. Activez le mode cua avec M-x cua-mode, sélectionnez le rectangle commence: appuyez d'abord sur C-Enter puis déplacez le curseur avec les commandes de mouvement standard pour effectuer la sélection. Appuyez maintenant sur à tout moment pour faire défiler le curseur dans les coins du rectangle, ce qui vous permet d'ajouter ou d'ajouter du texte à la sélection.

22
boskom

Vous pouvez utiliser les commandes (et clés) suivantes pour ce faire:

  • rectangle ouvert (C-x, r, o) ajouter des espaces
  • kill-rectangle (C-x, r, k) supprimer
  • rectangle clair (C-x, r, c) remplacer par des espaces
  • M-x string-insert-rectangle fill avec le texte spécifié

Voici une description complète de ces fonctionnalités: http://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html

19
paweloque

Pour ceux d'entre vous qui veulent faire cela pour des scénarios plus compliqués et qui veulent le faire sans installer de nouveau module, veuillez lire. (Ceci est possible dans Emacs sans installer MarkMultiple, bien que j'utilise et aime personnellement MarkMultiple)

J'ai récemment dû SORTIR une requête SQL dans un fichier, puis la formater en une requête MYSQL INSERT. Voici comment Emacs m'a facilité la vie ....

Le fichier ressemble à:

1   I am a random text
2   I am not
3   G, you've gone mad
4   Click on this link
5   Transfer in progress (we've started the transfer process)
6   But transfer happend yesterday
7   No you are
8   Oh please! this is getting too much!
9   I love emacs
10  I cant be bothered with this any more
11  its time to raise the bar
12  show me how to expand my territory

Et je veux que ça ressemble à ceci:

(1,   ,'I am a random text'),
(2,   ,'I am not'),
(3,   ,'G, youve gone mad'),
(4,   ,'Click on this link'),
(5,   ,'Transfer in progress (weve started the transfer process)'),
(6,   ,'But transfer happend yesterday'),
(7,   ,'No you are'),
(8,   ,'Oh please! this is getting too much!'),
(9,   ,'I love emacs'),
(10,  ,'I cant be bothered with this any more'),
(11,  ,'its time to raise the bar'),
(12,  ,'show me how to expand my territory'),
  1. Placer le curseur sur la première ligne
  2. Presse C-x ( pour commencer l'enregistrement de la macro [À ce stade, toutes vos entrées clés sont enregistrées, veuillez donc suivre attentivement les instructions]
  3. Presse C-a pour aller au début de la ligne
  4. Tapez "(" suivi de M-f pour avancer un mot, puis tapez ","
  5. C-n pour passer à la ligne suivante, suivi de C-x ) pour terminer la macro
  6. C-u 11 C-x e répéter la macro n (11 dans ce cas) fois

Eureka! Maintenant, si vous n'avez pas échoué, vous obtiendrez quelque chose qui ressemble à ceci:

(1,   I am a random text
(2,   I am not
(3,   G, youve gone mad
(4,   Click on this link
(5,   Transfer in progress (weve started the transfer process)
(6,   But transfer happend yesterday
(7,   No you are
(8,   Oh please! this is getting too much!
(9,   I love emacs
(10,  I cant be bothered with this any more
(11,  its time to raise the bar
(12,  show me how to expand my territory

À ce stade, je vais vous laisser pour comprendre le reste. Mais avant de partir, j'aime mentionner qu'il existe plusieurs façons de réaliser ce genre de chose. Ce n'est qu'une de ces façons et il se trouve que c'est ma façon préférée.

J'espère que vous l'avez trouvé utile;)

16
Hamster

Je pense que vous recherchez le mode cua proposé par boskom. http://www.vimeo.com/1168225?pg=embed&sec=1168225 ce screencast peut vous donner une idée de la façon de l'utiliser.

4
Amjith

Les rectangles sont destinés à des choses simples comme la suppression de la même quantité d'espaces dans les lignes adjacentes.

Sinon, les macros de clavier sont la voie à suivre.

3
starblue

Les réponses ci-dessus concernent l'insertion de texte dans les colonnes. "Modifier chaque ligne dans la sélection" de TextMate insère le même texte dans chaque ligne, quelle que soit la longueur de chaque ligne. J'apprends LISP maintenant, donc comme exercice j'ai écrit une fonction pour faire ceci:

(defun append-to-lines (text-to-be-inserted)
  ;;Appends text to each line in region
  (interactive "sEnter text to append: ")
  (save-excursion
    (let (point-ln mark-ln initial-ln final-ln count)
      (barf-if-buffer-read-only)
      (setq point-ln (line-number-at-pos))
      (exchange-point-and-mark)
      (setq mark-ln (line-number-at-pos))
      (if (< point-ln mark-ln)
          (progn (setq initial-ln point-ln final-ln mark-ln)
                 (exchange-point-and-mark))
        (setq initial-ln mark-ln final-ln point-ln))
      (setq count initial-ln)
      (while (<= count final-ln)
        (progn (move-end-of-line 1)
               (insert text-to-be-inserted)
               (next-line)
               (setq count (1+ count))))
      (message "From line %d to line %d." initial-ln final-ln ))))

Vous effectuez d'abord une sélection qui inclut toutes les lignes que vous souhaitez affecter, puis exécutez la fonction avec M-x à ajouter aux lignes.

2
gdelfino