Vim: Comment gérer les sauts de ligne lors de l'enregistrement de plusieurs commandes dans les registres?

StackOverflow https://stackoverflow.com/questions/2730922

  •  02-10-2019
  •  | 
  •  

Question

J'ai un fichier où je stocke des extraits de commandes vim. Quand je besoin d'un extrait, je Yank, puis l'exécuter avec @". Les extraits sont stockés sous forme d'un script, une ligne par commande, comme ceci:

:s/foo/bar/g
:echo "hello"
:s/1/2/g

Edit: Je retire les commandes en mode normal de l'exemple, car ils ne faisaient pas partie du problème

.

Maintenant que cette procédure ne fonctionne plus: lors de l'exécution de l'extrait, il arrête juste à la première ligne comme si elle attendait un retour à la ligne.

Y at-il une option quelque part qui affecte la façon dont @ est exécutée? Je suis assez sûr que cela fonctionnait il y a quelque temps ...

Substituer la nouvelle ligne avec des œuvres de caractère M ^ mais rend le fichier plus difficile à gérer.


Informations complémentaires:

Voici un autre symptôme: quand je Yank un extrait, si je l'exécute avec @" il arrête à la première ligne que je viens d'expliquer. Mais si je l'exécute avec :@ cela fonctionne. Mais le fichier d'aide ne semble pas impliquer une différence dans la façon dont les deux commandes traitent le contenu du registre ...

Était-ce utile?

La solution 2

Je trouve enfin le coupable. D'une certaine façon, j'ai eu un mappage de commande sur <C-J> dans mon fichier vimrc. Lors de la lecture avec le cpoptions par défaut, se transforma en une cartographie sur <NL>.

Comment j'ai découvert: j'ai remarqué que lors du démarrage vim avec -u ~/.vimrc, il serait en effet d'exécuter des extraits Yanked. Je généré un fichier de session avec et sans cette option de ligne de commande et les a comparés. De cette façon, j'ai découvert qu'un autre ensemble de cpoptions où utilisé pour lire le même fichier vimrc, de sorte que dans un cas, la cartographie était en effet sur <C-J>, dans l'autre, il a été transformé en une mise en correspondance sur <NL>!

Si quelqu'un a un problème similaire, je suggère de regarder attentivement les applications de commande actuellement définies, avec :cmap.

Autres conseils

Je ne pense pas que le problème est ^M contre ^J. macros vim traiteront l'un comme caractère valide en fin de ligne pour les macros enregistrées. Je pense que le problème est des sauts de ligne supplémentaires.

Dans votre exemple, il y a au moins un saut de ligne parasite après 2j, et à moins que vous êtes particulièrement prudent lors de la copie de l'extrait, il y a probablement un autre après 10k aussi bien. Ces nouvelles lignes supplémentaires sont comme appuyer sur <Enter> en mode normal -. Ils se déplacent le curseur vers le bas une ligne

Voici ce que je pense que vous voulez que l'extrait de ressembler à:

:s/foo/bar/g
2j:s/1/2/g
10k

(Même c'est un peu trompeur. - vous auriez encore faire attention de ne pas copier le saut de ligne après la 10k)

Pourquoi ces nouvelles lignes supplémentaires font une telle différence? Eh bien, pour une chose, ils vous amener à être au moins une ligne loin de là où vous vous attendez à être, qui jette tout ce que vous voulez faire sur une ligne particulière (comme exécuter la commande :s//).

Plus important encore, cependant - et ce que je pense qui se passe dans votre exemple - est que la lecture macro arrête Vim si la macro tente utilisation <Enter> sur la dernière ligne d'un tampon. (Je devine Vim considère qu'il est une erreur, et toute erreur provoque une macro pour arrêter de courir.)

Voici un exemple. Supposons que vous avez cet extrait stocké dans le registre x:

4j
:echo "Done"

(Notez que le saut de ligne après 4j.)

En outre, supposons que vous avez les cinq lignes suivantes (et seulement ces cinq lignes) dans un tampon:

line 1
line 2
line 3
line 4
line 5

Si vous appuyez maintenant sur @x sur line 1, le :echo "Done" exécute jamais. Vim déplace le curseur vers le bas 4 lignes à line 5, puis tente de se déplacer vers le bas une ligne de plus à cause de la nouvelle ligne de plus, mais il ne peut pas. Les arrêts macro exécuter à ce moment-là, avant que la commande :echo obtient une chance de courir.

Cependant, cela fonctionne si vous modifiez les x s'inscrire à ceci:

4j:echo "Done"

Donc, pour revenir à votre exemple original, je parie que ce qui se passe est que la nouvelle ligne supplémentaire après 2j tente de déplacer votre curseur quelque part de ne peut pas aller, et qui provoque la macro à arrêter. La ligne du bas de l'écran contient la dernière commande exécutée (:s/foo/bar/g), ce qui le fait ressembler à Vim vous attend à appuyer sur Retour.

Enfin, je vous recommande fortement d'utiliser une autre méthode pour stocker et exécuter des séquences de commandes Vim. La technique que vous utilisez est tolérable pour les cas simples, mais il est fragile et n'échelle pas bien. Vim a un langage de script complet qui inclut des fonctions et des commandes personnalisées, et il peut être utilisé pour faire toutes les choses que vous faites maintenant, mais de façon beaucoup plus robuste. script vim est un grand sujet, mais je commencerais ici:

:help script

Assurez-vous de lire sur la commande :normal, qui vous permet d'exécuter des commandes en mode normal (comme 2j et 10k) dans les scripts.

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top