Comment agir sur des rectangles au-delà de la fin de ligne?

16

Voici ce que la documentation de Vim a à dire à ce sujet:

L'édition virtuelle signifie que le curseur peut être positionné là où il n'y a pas de caractère réel. Cela peut être à mi-chemin dans un onglet ou au-delà de la fin de la ligne. Utile pour sélectionner un rectangle en mode visuel et modifier un tableau.

J'aimerais de préférence voir cela implémenté comme un mode mineur ou un paramètre intégré.

nounou
la source
Voulez-vous cela pour sélectionner un rectangle? Si tel est le cas, c'est la valeur par défaut dans la version de développement actuelle.
Malabarba
Non, je pense plus à tirer / remplacer des rectangles. J'utilise le mode de marque rectangle et bien que ce soit une fonctionnalité intéressante, ce n'est pas ce que je recherche.
nounou
En effet, pour tirer / remplacer des rectangles, ce serait un compagnon naturel de la fonctionnalité existante en mode rectangle-marque. Je ne sais pas ce que l'interface utilisateur devrait être, tho.
Stefan
Merci pour la réponse, Stefan. Cette fonctionnalité serait très utile dans le cas des rectangles, donc peut-être qu'en mode de marquage rectangle, une commande pourrait basculer un type de mode d'édition virtuel. En ce moment, en mode rectangle, le point ressemble à un mode d'édition virtuel: il peut dépasser la fin d'une ligne avec C-f. Mais lorsque vous tirez sur un rectangle après avoir fait cela, le rectangle apparaît à la marque au lieu du point. Si cela apparaissait à ce point, cela résoudrait ce problème.
nounou

Réponses:

10

La extend-rectangle-to-endfonction dans le rectangle-utilspackage est ce que vous voulez. C'est allumé melpa.

Il insère des espaces pour étendre la sélection de rectangle actuelle pour couvrir la ligne la plus longue de la région.

Pour obtenir ce comportement, je l'ai dans mon init.el. C-x r en'est lié à rien d'autre dans la vanille emacs

(require 'rectangle-utils)
(global-set-key (kbd "C-x r e") 'extend-rectangle-to-end)
Squidly
la source
1
Pour clarifier, avec ce package, vous sélectionnez la région, puis faites M-x extend-rectangle-to-endet puis C-x r M-wou C-x r k.
Kaushal Modi
18

Autre réponse: utiliser M-x picture-mode. Vous pouvez tuer ou copier des rectangles au milieu des tabulations, etc., les envoyer aux registres, etc.

A dessiné
la source
3
Un avantage de l'utilisation de cette méthode est que vous pouvez contrôler exactement la largeur souhaitée de votre sélection de rectangle. Si j'ai la ligne 1 avec 30 caractères et la ligne 2 avec 5 caractères, je peux choisir que le rectangle ait 15 caractères de large et 2 lignes de haut; ne peut pas faire cela avec extend-rectangle-to-endcomme la sélection de rectangle avec qui sera toujours 30x2.
Kaushal Modi
1
picture-modeest vieux et peu connu. Parmi les autres fonctionnalités peu connues, il a: exiting ( C-c C-c) supprime les espaces de fin.
Drew
1
C'est génial, Drew! Question: y a-t-il une raison pour ne pas conseiller rectangle-minor-modede «s'envelopper» picture-mode? (conseil car je ne vois aucun crochet dans la source de rectangle-minor-mode).
rasmus
1
Voici mon conseil, btw. Cela ne dépouille pas les espaces car c'est un peu inutile ici:(defun rectangle-mark-mode-wrapped-in-picture-mode (orig-fun &rest args) (if rectangle-mark-mode (picture-mode) (and (eq major-mode 'picture-mode) (picture-mode-exit t)))) (advice-add 'rectangle-mark-mode :around #'rectangle-mark-mode-wrapped-in-picture-mode)
rasmus