Bloquer l'édition * en direct * dans Emacs ou Vim

9

jEdit prend en charge l'édition de blocs, mais Emacs et Vim semblent avoir de sérieux problèmes d'utilisation sur le même sujet. Si quelqu'un pouvait remplir les inconnues ici, il serait beaucoup plus supportable d'utiliser l'un ou l'autre éditeur:

  • Sélection rectangulaire réelle : lorsque la sélection à l'écran est un rectangle, pas une sélection linéaire qui est ensuite utilisée pour calculer une région comme Emacs semble limité.
    • jEdit: Maintenez enfoncé Ctrlet sélectionnez.
    • Vim: cliquez Ctrl-vet sélectionnez.
    • Emacs: inconnu ; ressemble à un plugin de 400+ lignes est nécessaire.
  • Édition rectangulaire en direct : voyez à quoi ressemblera le résultat sur toutes les lignes lorsque vous éditerez après une sélection de bloc.
    • jEdit: Commencez simplement à taper et vous verrez le résultat final au fur et à mesure.
    • Vim: cliquez Shift-iet tapez. Affiche le résultat final uniquement sur la première ligne jusqu'à ce que vous appuyiez sur Escpour quitter le mode d'insertion. On ne sait pas s'il existe un moyen de voir immédiatement le résultat sur toutes les lignes.
    • Emacs: inconnu ; ressemble à la seule façon est de C-x r tdéfinir le texte à remplir après avoir appuyé sur Ret.
  • Début et fin de la sélection dans des positions en dehors du texte : Par exemple, je voudrais supprimer les N premiers caractères de chaque ligne, mais les première et dernière lignes contiennent moins de N caractères.
  • Coller le bloc en ligne : Collez le bloc copié comme si vous colliez plusieurs lignes, comme dans, poussez le texte déjà là- bas , pas à droite.
    • jEdit: la valeur par défaut. Pour coller un bloc en tant que bloc, vous devez d'abord effectuer une autre sélection de bloc.
    • Vim: OEscVp.
    • Emacs: inconnu .

La fonctionnalité générale de sélection de bloc Emacs peut être trouvée dans le cua-modeplugin .

l0b0
la source
Apparemment, le mode d'édition de colonne d'Emacs peut faire une sorte d'édition de rectangle en direct: youtube.com/watch?v=k-6BVjlBSVo
Tom
Juste une observation sur le "plugin" emacs 400+ lignes. Un addon quelque peu similaire pour gedit, appelé multi-edit a plus de 1000 lignes de code python. Pour moi, le pugin est si utile (comment ai-je survécu sans), la taille est académique ... et si l'emacs fonctionne comme annoncé, je serais plus qu'heureux de l'utiliser, mais j'ai eu une erreur de chargement quand je l'ai lancé "command-line-normalize-file-name: Args out of range:" ", 1" :( ... C'est exactement ce que je cherchais aussi ..
Peter.O
4
Pour ceux qui n'ont pas utilisé jEdit, veuillez expliquer votre terminologie. Je ne comprends pas ce que signifie «vivre» ici, ce qu'est «l'édition rectangulaire en direct» ou ce que signifie «coller le bloc en ligne».
Gilles 'SO- arrête d'être méchant'

Réponses:

7

Je peux répondre pour Vim, mais pas Emacs.

Début et fin de la sélection dans des positions en dehors du texte:

:set virtualedit=blockpermettra le comportement que vous souhaitez. Vous pouvez supprimer les deux points initiaux et les ajouter à votre .vimrc si vous le souhaitez. Pour plus d'informations, :help 'virtualedit'depuis Vim.

Coller le bloc en ligne:

Si vous venez de frapper pen mode Commande, Vim insérera le bloc, en poussant les caractères vers la droite sur chaque ligne. Si vous sélectionnez un autre bloc et appuyez sur p, Vim remplacera ce bloc par le bloc collé.

Vous pouvez coller un bloc "en ligne" avec la séquence de touches en mode commande OEscVp. Cela insère une ligne au-dessus de la ligne actuelle ( O Esc), la sélectionne linewise ( V), puis la colle dessus ( p). Vous pouvez raccourcir cela en (par exemple) ypavec un mappage tel que :nmap yp O<Esc>Vp- tapez littéralement; utilisez cinq touches <Esc>plutôt que d'appuyer sur la touche Échap.

Jander
la source
Bon conseil sur virtualedit; dois essayer cela. À propos du collage en ligne, veuillez consulter la question mise à jour pour une description des fonctionnalités attendues.
l0b0
J'ai mis à jour ma réponse avec une méthode pour coller des blocs en ligne.
Jander
5

Par exemple, je voudrais supprimer les N premiers caractères de chaque ligne, mais les première et dernière lignes contiennent moins de N caractères.

Emacs: commencez la sélection à la première ligne et ajoutez simplement le nombre manquant de caractères (par exemple des espaces) à la dernière ligne, puis utilisez kill-rectangle

Vous pouvez également voir artist-modeou picture-modequi vous permettent de vous déplacer librement dans la fenêtre quelles que soient les longueurs de ligne.

Coller le bloc en ligne

Emacs: enregistrez d'abord le bloc en supprimant le rectangle ou en l'enregistrant dans un registre, puis accédez au point d'insertion, utilisez delete-rectangle puis insérez le rectangle enregistré.

ressemble à un plugin de 400+ lignes est nécessaire

En cas d'Emacs, pourquoi est-ce un problème? Un plugin peut être compilé et la philosophie emacs est que vous ne mettez pas tout dans le noyau, mais utilisez des plugins pour étendre l'éditeur.

À M
la source
4

Il y a « mode cua- » qui vient avec Emacsen 22,1 et plus tard, ou suivez le lien pour télécharger les versions antérieures d'Emacs. Il y a une courte vidéo qui présente la fonctionnalité.

Pour les commandes rectangulaires générales, essayez de lire le manuel , qui fournit une introduction facile.

Trey Jackson
la source
emacs a l' cua-modeair bien! +1 .. Je n'ai pas trouvé la vidéo que vous avez mentionnée, voir le lien de Tom dans les commentaires juste en dessous de la question, pour un lien vers une vidéo d'information (différente?) ...
Peter.O
@fered Ooops, erreur de copier / coller, corrigé.
Trey Jackson du
0

Dans vim, la manière typique de supprimer les n premiers caractères est de faire quelque chose comme :%s/.\{0,6\}//.

%fera tout le document; vous pouvez remplacer cela par une sélection ou par les lignes réelles qui vous intéressent. La scommande est pour "substitut". Il remplacera une expression régulière par tout ce que vous lui donnerez, et il ne correspondra qu'une seule fois sur chaque ligne, sauf si vous ajoutez une option spécifique. Il /s'agit d'un délimiteur - il peut s'agir de n'importe quel caractère, mais il /est généralement utilisé à moins qu'il ne soit avantageux d'utiliser autre chose (vous n'avez donc pas à vous échapper /dans le reste de la commande). L'argument après le premier délimiteur est une expression régulière qui sera utilisée pour rechercher les chaînes correspondantes dans votre sélection. L'argument après le deuxième délimiteur est ce avec quoi la correspondance sera remplacée.

Cette commande indique donc de trouver 0 à 6 instances de n'importe quel caractère et de les remplacer par rien.

Shawn J. Goff
la source
Pas ce que j'ai demandé.
l0b0
Mais pensez-vous que ce n'est pas utile pour ceux qui trouvent cette question? Je pense que oui, et c'est pourquoi je le mets ici.
Shawn J. Goff,