Comment coller un bloc visuel commençant par une autre ligne

10

Il m'a fallu beaucoup de temps pour réaliser que mettre (coller) quelque chose avec pou avec Plequel le bloc visuel sélectionne ctrl+vet tirait (copiait) avec y, conservait la manière dont il était auparavant, de sorte que, lorsque le texte copié était au milieu des lignes, il sera ensuite copié au milieu d'un autre texte chaque fois que possible. Au contraire, select-line with Vne colle pas la ligne copiée parmi d'autres textes, mais en commençant sur une autre ligne.

Par exemple, supposons que j'ai maintenant:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

Quand je veux couper Avocadoet Beanet Cherry, en sélectionnant (sélection représentée comme _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

et en appuyant sur y, et déplacez le curseur sur la ligne suivante (curseur représenté par _),

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

et appuyez sur P. Il en résulte:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

Mais ce que je souhaitais c'était:

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

Cela me déroutait à chaque fois, jusqu'à ce que je réalise que parce qu'ils étaient copiés au milieu de la ligne, ils étaient donc collés au milieu de la ligne, imitant la façon dont ils étaient.

Il semble que la meilleure façon de coller quelque chose en commençant sur une autre ligne, c'est de déplacer le curseur au début avec 0, et en bas de 3 lignes, vers le nouvel endroit; et entrer en mode d'insertion avec i, et en appuyant <return>3 fois, et déplacer le curseur en arrière de 6 lignes, et à droite, revenir à l'emplacement d'origine; et copier, puis déplacer à nouveau vers le nouvel endroit, et coller, comme je l'ai fait ci-dessus.

Puis-je enregistrer quelques coups? Ou que faites-vous habituellement?

(Edit: Ce qui a été dit ci-dessus, c'est comment je l'ai compris au moment où j'ai posé cette question. Voir ces réponses pour une explication correcte:)

Violapterin
la source

Réponses:

11

Lorsque vous copiez du texte, il est enregistré dans un registre. Le texte à l' intérieur d' un registre a un type: characterwise, linewiseou blockwise.

Ce type détermine de quelle manière le texte sera placé.

Dans votre exemple, vous avez copié du texte du mode bloc visuel. Ainsi, le texte avait le type blockwiseet était stocké dans le registre sans nom ".
En raison de ce type, lorsque vous le collerez à nouveau dans votre tampon, il sera collé en tant que bloc.


Si vous voulez le coller comme une séquence de lignes, au lieu d'un bloc, il y a 3 façons.

  1. Depuis le mode insertion, vous pouvez l'insérer en appuyant sur C-r ".
    Il doit insérer le contenu du registre sans nom comme si son type était linéaire.

  1. Depuis la ligne de commande, vous pouvez utiliser la :putcommande.
    :putdevrait coller le texte dans un registre comme si son type était linéaire, quel que soit son type d'origine. Notez que vous pouvez passer le nom d'un registre comme argument, ainsi qu'une adresse de ligne pour spécifier en dessous de quelle ligne vous voulez que le registre soit collé.

Par exemple:

:42put a

... devrait mettre le contenu du registre asous la 42ligne e.

Sans nom de registre, Vim supposera que vous souhaitez coller le registre sans nom (ou le +registre si vous avez modifié 'clipboard').
Et sans adresse, Vim supposera que vous souhaitez la coller sous la ligne actuelle.


  1. À partir de la ligne de commande, vous pouvez modifier le type du registre sans nom avec la setreg()fonction:

    :call setreg('"', '', 'al')

Ici, setreg()devrait ajouter une chaîne vide au registre sans nom (grâce au adrapeau passé comme troisième argument) et changer son type en ligne (grâce au ldrapeau).

Ensuite, à partir du mode normal, vous devriez pouvoir coller le registre, avec la pcommande normale, comme si son type était linéaire.


Ce n'est pas directement lié à votre problème, mais lorsque vous copiez du texte, il va également dans le 0registre. Et si vous avez ajouté la valeur unnamedplusà l'option 'clipboard', elle va également dans le +registre.

Vous pouvez vérifier quel est le type d'un registre, en utilisant la getregtype()fonction:

:echo getregtype('"')

S'il renvoie un minuscule v, cela signifie que le type est en caractères.
S'il retourne une majuscule V, cela signifie que le type est en ligne.
S'il revient ^V{some number}, cela signifie que le type est en bloc et que la largeur du bloc est {some number}.

user9433424
la source
3

J'avais besoin de "cast" le contenu du registre dans un certain mode (caractère / ligne / bloc) si souvent, j'ai écrit le plugin UnconditionalPaste pour cela. Il fournit gcp, glpetc. des alternatives aux commandes intégrées de collage qui forcent un certain mode (et maintenant plusieurs autres variations sur ce thème, comme le collage avec des virgules jointes ou des caractères interrogés).

Avec lui, vous pouvez simplement utiliser glp/ glPpour coller après / avant la ligne actuelle (comme de nouvelles lignes), quelle que soit la façon dont vous avez tiré le texte.

Ingo Karkat
la source
Je vous envie que vous ayez le temps d'écrire une telle chose QQ Mais j'en suis satisfait :put. (Vous avez également voté)
Violapterin
@Aminopterin: J'ai répondu que si souvent, j'ai en fait un extrait de snipMate pour le premier paragraphe. J'ai donc juste besoin de personnaliser un peu. Merci d'avoir apprécié ma réponse et le vote positif!
Ingo Karkat
Oh, j'ai dit que j'envie que vous ayez le temps d'écrire un plugin à lui seul, comme ça, comme s'il était fait avec légèreté. et ai-je commencé à utiliser vim ~~
Violapterin
2
@Aminopterin Ah bien, le plugin a commencé comme un petit extrait copié à partir de Vimtips, et s'est lentement développé au fil du temps. Comme cela m'a été si utile, je l'ai progressivement amélioré considérablement. Beaucoup de petits pas sont plus puissants qu'un gros effort!
Ingo Karkat