Comment faire pour sélectionner la colonne puis faire l'édition dans GNU Emacs?

15

J'utilise ViM, TextMate et GNU Emacs depuis des années.

Par exemple, voici le texte que je souhaite modifier

foo
foo
foo

Et voici le résultat du texte que je veux avoir

bar foo
bar foo
bar foo

Quand je suis sur Vim, je peux faire "Ctrl v" sur la toute première ligne et la première colonne, puis appuyer sur "2 j", puis appuyer sur "i", puis taper "bar", c'est fait.

Lorsque je suis sur Textmate, je peux appuyer sur "Apple Command Option" à la fois tout en sélectionnant vers le bas (par ma souris), puis tapez "bar", c'est fait.

Mais quand je suis sur GNU Emacs 23.1, je ne sais pas comment le faire. : ((

J'ai recherché EmacsWiki et googlé, mais je n'ai pas trouvé la solution. Veuillez me guider si vous connaissez ma solution. Serait reconnaissant pour cela.

Arie
la source
@Trey Jackson et @humble coffee, résolus, merci beaucoup !!
Arie

Réponses:

16

Deux options viennent à l'esprit. Le premier est des rectangles (comme mentionné dans une autre réponse). Les directions explicites pour cela sont:

  1. goto première ligne, première colonne
  2. C-SPC
  3. aller à la dernière ligne (première colonne)
  4. C-x r t bar SPC RET

Une autre option, qui fournit de très belles commandes d'édition de rectangle / colonne est le mode CUA . Voici un article de blog (divulgation: mon blog) qui décrit comment l'utiliser. Pour voir la puissance du mode CUA, il vaut vraiment la peine de regarder cette vidéo de trois minutes .

J'intègre le mode CUA avec les éléments suivants (car je préfère ne pas avoir de mode de marque transitoire):

(setq cua-enable-cua-keys nil)
(setq cua-highlight-region-shift-only t) ;; no transient mark mode
(setq cua-toggle-set-mark nil) ;; original set-mark behavior, i.e. no transient-mark-mode
(cua-mode)
Trey Jackson
la source
11

Dans Emacs-24.4, le support de base pour les rectangles a été légèrement amélioré, donc au lieu d'utiliser C-SPCsuivi C-x r t, vous pouvez faire:

C-x SPC
down down
C-t bar RET

Par rapport à la C-SPCméthode, l'une des bonnes choses à ce sujet est que vous obtiendrez des commentaires visuels sur le rectangle que vous sélectionnez. Bien sûr, la cua-modeméthode fonctionne également (et fonctionne de manière similaire).

Stefan
la source
malheureusement, il me semble que les améliorations ne suffisent pas du tout: cua-modesi c'était plus juste ... Juste pour mentionner une chose: dans cua-mode, alors qu'un rectangle est mis en surbrillance, je peux taper et ajouter du texte. Dans le support de base emacs intégré actuel, la surbrillance disparaît (la sélection est "annulée") et l'entrée est insérée au point du curseur. C'est contre-intuitif et ce n'est pas ce que je veux habituellement (et je m'habitue à comment cua-modeça se passe)
ShinTakezou
@ShinTakezou: tandis que vous trouvez le compteur de mode rectangle-marque intuitif, je trouve le compteur de comportement de cua intuitif. Heureusement, vous avez le choix. Si vous préférez le support de cua, vous pouvez activer le mode cua ou (si vous ne voulez que son support rectangle) (global-set-key [?\C-x ?\s] 'cua-rectangle-mark-mode).
Stefan
en fait, c'est ce que je fais: m'en tenir au mode cua. Cela fonctionne comme: mettre en évidence une colonne, taper du texte, c'est fait. Sinon: mettez une colonne en surbrillance, dites que vous voulez ajouter du texte, tapez du texte dans le mini-tampon (vous ne le verrez pas apparaître dans le tampon pendant que vous tapez ...), ... terminé. Vous verrez plus tard une faute de frappe dans le dernier caractère ... en mode cua, je peux le voir pendant que je tape, le supprimer (pas annuler l'insertion entière), repenser, insérer un autre caractère ... et le rectangle reste en surbrillance comme j'ai besoin, btw, et je peux le réduire, l'agrandir, taper un peu plus de texte, ou "couper" ce nouveau rectangle ... donc, pour moi, c'est plus intuitif et confortable.
ShinTakezou
Je suis content que vous l'aimiez ;-)
Stefan
BTW, dans Emacs-25, l' C-topération de rectangle non-CUA (aka C-x r t) vous montre également un aperçu du texte nouvellement inséré lorsque vous le tapez.
Stefan
2

Dans emacs, ce type de colonnes est appelé «rectangles». Donc , c'est la page de la documentation pertinente.

Toutes ces commandes nécessitent que la région contienne le rectangle sur lequel vous opérez. Vous devez donc définir la marque sur le caractère en haut à gauche dans le rectangle et étendre la région au caractère en bas à droite dans le rectangle. La commande que vous recherchez est celle M-x string-insert-rectanglequi vous invite à insérer la chaîne.

nedned
la source
1

Réponse la plus courte: activez le mode rectangle CUA via C-RET.

Donc, pour votre cas, ce serait

  1. Allez à la première ligne, à la première colonne et appuyez sur C-RETpour entrer en mode CUA
  2. Aller à la dernière ligne, à la première colonne et tapez simplement barSPC
  3. Quitter le mode CUA via ESCou CG

Voir la réponse de @Trey pour une solution plus élaborée et des liens vers CUA.

Martin
la source
2
Oui, j'ai trop peu de réputation pour commenter. Je ne veux pas répéter sa réponse, mais j'ajouterai quelques informations supplémentaires du document de l'AUC.
Martin
0

Vous pouvez utiliser replace-regexp pour cela:

  1. mettre la marque à la dernière ligne -> C SPC et aller à la dernière ligne
  2. tapez Mx replace-regexp RET dans le mini-tampon (j'ai une liaison de clé pour ce Mr)
  3. Donner ^ RET
  4. tapez la barre et appuyez sur RET

Cela ajoutera une barre au début de la ligne.

Neelesh
la source