Comment sélectionner des régions non contiguës dans Emacs?

31

Supposons que j'ai déjà sélectionné du texte dans le tampon actuel. Est-il possible de sélectionner une autre partie du texte, tout en conservant la sélection précédente (et ainsi de suite)?

Ajouté : Une motivation pour cette fonctionnalité est la suivante: Supposons que j'ai du texte qui ressemble à ceci:

paragraph 1 ...

paragraph 2 ...

paragraph 3 ...

paragraph 4 ...

paragraph 5 ...

Je voudrais supprimer certains paragraphes (par exemple 2, 4 et 6) et les insérer avant le paragraphe 1.

prénom
la source
1
Il y a une sélection secondaire .
wasamasa
2
Il existe un package multiselect: skamphausen.de/cgi-bin/ska/multiselect Il ressemble un peu à un hack rapide.
Tobias
Selon la taille de ce que vous sélectionnez et pourquoi, cela multiple-cursorspeut vous donner une solution.
Jordon Biondo
@wasamasa J'ai suivi les instructions données dans le lien que vous avez fourni. Après la première sélection, j'ai sélectionné la deuxième région en gardant la touche Meta. Il a été sélectionné, mais il y a deux problèmes: (1) la deuxième sélection ne semble pas être une vraie sélection, car la copie ou la suppression ne fonctionne pas. (2) il n'est pas possible de sélectionner une troisième sélection de cette manière.
Nom
1
Le Wiki Emacs a une bonne section sur la sélection secondaire . Diverses améliorations le rendent plus utilisable à partir du clavier, par exemple.
Drew

Réponses:

43

Vous pouvez utiliser append-next-kill(lié C-M-wpar défaut) pour accumuler le texte que vous souhaitez insérer ci paragraph 1- dessus :

  1. Tuez paragraph 2comme vous le feriez normalement.

  2. Marquez paragraph 4et appuyez C-M-wavant de le tuer. Répétez cette étape pour tous les paragraphes que vous souhaitez déplacer auparavant paragraph 1.

Lorsque vous avez terminé, vous pouvez retirer le texte accumulé avant paragraph 1.

itsjeyd
la source
5
Même avec les trucs de base, il y a toujours de nouvelles choses à apprendre! C'est assez utile, car je perds généralement beaucoup de pression sur les touches en parcourant le kill ring quand je dois le faire. J'aimerais pouvoir voter un peu plus ...
Nom d'utilisateur significatif
9

Vous pouvez utiliser des registres combinés avec l'anneau de marque. Poussez les marques actuelles avec C-<SPC> C-<SPC>, récupérez-les plus tard avec C-u C-<SPC>ou enregistrez-les dans un registre, disons bvia C-x r <SPC> b, et revenez plus tard avec C-x r j b.

Marquez maintenant une autre région. C-u C-x r s acopiera la région marquée pour vous enregistrer aet supprimer le texte. Marquez ensuite la région suivante et C-u C-x r + aajoutera une autre sélection à ce registre aet supprimez-la.

Vous pouvez ensuite insérer le contenu avec C-x r i a.

Consultez la section «Enregistrement de texte dans les registres» du manuel Emacs.

Andrew Swann
la source
5

La nouvelle prise en charge des régions rectangulaires dans Emacs-24.4 a en fait introduit (une grande partie de) l'infrastructure nécessaire à cette fonctionnalité [après tout, une région rectangulaire est une région non contiguë].

Ainsi, il devrait être possible maintenant d'implémenter un package "split-region" qui fournit juste la fonctionnalité que vous demandez.

Certes, de nombreuses commandes Emacs n'ont toujours pas été adaptées pour utiliser la nouvelle infrastructure (par exemple, des commandes comme upcase-region, ou undo-in-region, query-replace, ...) et ne fonctionnent donc pas encore correctement sur les rectangles (donc ils ne fonctionneraient pas correctement sur une "région divisée" non plus), mais ce sont des bogues qui devraient être corrigés avec le temps.

Stefan
la source
4

Installez Browse-Kill-Ring.el

copier et tuer toutes les régions d'intérêt.

Arrivé au point où la réinsertion doit commencer.

M-x browse-kill-ring RET ouvrira un tampon et y placera le curseur.

Tapez npour voyager des morceaux.

RET il insérera le morceau au point dans le tampon original / autre.

Andreas Röhler
la source
3

Si les lignes que vous souhaitez manipuler peuvent être distinguées via une correspondance d'expression régulière, vous pouvez utiliser le mode occurrence pour les afficher dans une nouvelle fenêtre. Vous pouvez ensuite utiliser le mode occurrence-edit pour les modifier, le tampon d'origine reflétant les modifications que vous apportez dans le tampon Occur.

Cela fonctionne à merveille, par exemple, en combinaison avec le mode à curseurs multiples : parce que les lignes que vous avez sélectionnées pour apparaître dans le tampon Occur sont affichées de manière contiguë, quelle que soit leur distance dans le tampon d'origine, vous pouvez les marquer toutes ou un sous - ensemble , puis les activer mc/edit-lineset les modifier tous en même temps. (Oui, je sais que plusieurs curseurs peuvent faire tout cela avec eux-mêmes mc/mark-all-like-this, mais c'est bien d'avoir des options.)

Toute autre opération d'édition qui serait plus facile à réaliser si vous ne voyiez que les lignes sur lesquelles vous vouliez travailler, comme la configuration d'une recherche et d'un remplacement d'expressions complexes, ou une macro qui doit s'exécuter à tour de rôle sur chaque ligne d'un tampon, peut également être fait de cette façon.

dodgethesteamroller
la source
3

Cela répond à votre question générale, mais pas particulièrement au cas d'utilisation que vous mentionnez (déplacer des morceaux de code).

Emacs a maintenant ce qu'il appelle une région non contiguë , c'est le type de sélection que vous demandez. Vanilla Emacs ne fournit aucun moyen spécial de créer une région non contiguë, sauf s'il s'agit d'un rectangle . Mais les zones de bibliothèque le font.

Les zones de bibliothèque vous permettent de définir plusieurs zones dans votre tampon. Une liste de zones est une région non contiguë . Vous pouvez également le considérer comme plusieurs régions, selon la façon dont vous souhaitez l'utiliser. Vous pouvez définir plusieurs listes de zones à tout moment, chacune étant affectée à une variable de zones différente, et vous pouvez basculer entre elles.

Si vous utilisez également la bibliothèque Bookmark +, vous pouvez enregistrer les listes de zones de manière persistante et les restaurer dans les sessions Emacs ultérieures. Bookmark + vous permet également d'attribuer des balises arbitraires à un signet. Cela signifie que vous pouvez baliser une liste de zones.

Les zones d'une liste de zones donnée sont généralement dans le même tampon, mais elles ne doivent pas nécessairement l'être. En cela, une liste de zones est plus générale qu'une région non contiguë. Il est également plus général en ce que chaque zone peut contenir des informations supplémentaires, en plus des limites de zone, et peut avoir un identifiant.

Il existe plusieurs façons de créer une zone. L' un des est plus facile à utiliser C-x n a: il définit une zone de la région active, et ajoute à l'ensemble actuel de la zone. ( C-x n n( narrow-to-region) fait également cela, en plus du rétrécissement.)

Voici certaines des choses que vous pouvez faire avec un ensemble (liste) de zones:

  • Triez-les.
  • Unir (fusionner) les zones adjacentes ou qui se chevauchent (ce qui inclut leur tri).
  • Les intersecter.
  • Limitez le tampon à une zone de la liste. Parcourez les rétrécissements. Voir plusieurs rétrécissements .
  • Sélectionnez une zone dans la liste comme région active. Parcourez les régions.
  • Recherchez-les (ils sont automatiquement réunis en premier). Pour cela, vous avez besoin de la bibliothèque Isearch + .
  • Remplacez-les par-dessus.
  • Mettez-les en surbrillance et désactivez-les. (Pour cela, vous avez besoin d'une bibliothèque Highlight ou d'une bibliothèque facemenu+.el.

Voir aussi Narrow Indirect , qui vous permet de créer des tampons indirects qui sont des clones d'un tampon donné et qui sont restreints à différentes parties de celui-ci.

A dessiné
la source
2

Autre option: transposer des paragraphes

Par souci d'exhaustivité, vous pouvez réaliser votre réorganisation des paragraphes (séquentiellement) avec des régions marquées et M-0 M-x transpose-paragraph(l'argument zéro fait tra-parpermuter les paragraphes où se trouvent le point et la marque, c'est-à-dire que la région commence et se termine)!

Par ailleurs, cela fonctionne pour toutes les transpose-.*commandes (-words, -sexp, -sentences, ...) et est extrêmement pratique dans de nombreuses situations.

Dieter.Wilhelm
la source
2

Une autre façon est d'utiliser le paquet objed (je suis l'auteur). Vous pouvez marquer n'importe quel objet texte avec mle point est déplacé automatiquement vers l'objet suivant de type actuel. Décochez tout objet en y accédant et appuyez à nouveau sur m. Voici un exemple de capture d'écran (montre les lignes de marquage mais fonctionne pour d'autres objets comme les paragraphes, les défuns ... aussi):

entrez la description de l'image ici

clemera
la source
Lorsque j'essaie d'installer ce package à partir de Melpa, j'obtiens l'erreur package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found.
Nom du
@Name Cela ressemble à la nécessité de mettre à jour votre liste de paquets. Essayez M-x package-refresh-contentset ensuite M-x package-install.
clemera
@Name Ça marche maintenant? Faites-moi savoir si vous avez d'autres questions.
clemera
J'ai pu installer le package. Semble bien fonctionner, je n'ai pas testé toutes ses fonctionnalités. Merci.
Nom du