J'essaie de définir une macro qui génère rapidement une liste de mots aléatoires.
Je veux que la macro transforme cela en une liste comme
a
b
c
d
e
dans ce
arezzo
bywords
czars
détente
eyrie
Ce que j'ai jusqu'à présent:
- mettre le curseur sur la lettre
a
- démarrer l'enregistrement macro
qq
a
entrer en mode insertion<C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letter
a`<C-p>
sélectionnez le dernier élément de la liste d'achèvement qui apparaît, sur mon système, c'est le motarezzo
. (NB j'ailongest
inclus dans mon'completeopt'
cadre, ce qui est nécessaire pour<C-p>
travailler de cette façon lors de l'achèvement:)'set completeopt=longest,menuone,preview'
.<C-y>
accepter l'achèvement^[^[
quitter le mode d'insertionj
passer à la ligne suivante, prêt à faire la même opération sur la ligne suivanteq
arrête d'enregistrer
lorsque je crée la macro et que j'exécute les étapes manuellement, tout fonctionne bien, mais lorsque j'exécute la macro, je vois un message clignotant dans la ligne de commande quelque chose comme:
analyse du fichier du dictionnaire
et rien ne se passe, des commandes de la macro uniquement j
sont exécutées, c'est-à-dire que le curseur se déplace le long de la ligne, mais aucune des commandes de fin n'est exécutée.
Est-il possible d'utiliser des compléments de mode d'insertion dans une macro, et si oui, comment faire?
autocompletion
macro
the_velour_fog
la source
la source
<C-p>
étape ... quand je fais ça dans mon vim, ça donne juste le messageback at original
- ne sélectionne pas le dernier élément .. J'ai utilisé la touche fléchée vers le haut deux fois pour sélectionner le dernier mot (mon casazures
), j'ai appuyé sur enter et alorsEsc+j+q
.. cela fonctionne très bien sur l'exécution de la macroset completeopt=longest,menuone,preview
sonlongest
option qui provoque<C-p>
l'insertion immédiate. Si je retirelongest
de lacompleteopt
chaîne, j'obtiens le même comportement que vous. De plus, oui, les touches fléchées ont fonctionné! merci (j'ai oublié que vous pouvez les utiliser pour naviguer dans la liste d'achèvement):set completeopt=
eta<c-x><c-k><esc>j
comme macro.Réponses:
EDIT : vous êtes vraiment après l'achèvement du dictionnaire; vous n'avez pas nécessairement besoin du mode d'insertion (mode Ctrl + X) pour ce faire. Comme vous l'avez découvert, cela rend le travail avec les macros très difficile. Le script ci-dessous peut être utilisé pour compléter le dictionnaire sans mode d'insertion, de sorte que vous pouvez facilement le répéter à l'intérieur d'une macro.
Ajoutez le code ci-dessous à votre
.vimrc
fichier, fermez et rouvrez toutes les fenêtres vim pour générer la nouvelle fonction, puis enregistrez-vous en appuyant alternativement sur<C-k>
pour terminer etj
sur la ligne suivante. J'ai ajouté une vérification pour l'longest
option et si elle est désactivée, elle choisit une entrée aléatoire en utilisant l'heure aléatoire du système. S'il trouve l'longest
option, il recherche manuellement l'entrée la plus longue dans le dictionnaire et l'insère.Si vous n'aimez pas la
<C-k>
cartographie, n'hésitez pas à la modifier comme bon vous semble. Cela devrait fonctionner avec n'importe quel mappage que vous aimez.En outre, la commande pour renvoyer l'expression pour le mappage à évaluer ajoute un
\<esc>
caractère à la fin afin que nous quittions le mode d'insertion automatiquement après chaque insertion, et un0cw
à l'avant pour entrer en mode d'insertion pour commencer et assurez-vous d'écraser le mot entier correctement. Selon le comportement exact que vous souhaitez (si vos mots ne sont pas bien aubcw
début de chaque ligne), vous pouvez utiliser à la place pour trouver le début du mot réel. Cependant, vous verrez alors des bizarreries en revenant aux mots qui commencent la ligne. Il y a probablement une commande plus avancée pour ignorer la fin de ligne et faire les deux à la fois, mais je n'ai pas pu en trouver une.De plus, il ne serait pas difficile d'étendre la logique ici pour créer des mappages alternatifs (en utilisant, par exemple, des paramètres de fonction) qui exécutent n'importe quelle fonction fournie par le mode d'insertion. Je serai heureux de répondre à ces exigences et de mettre à jour ce script lorsque j'en aurai le temps.
la source
sleep
commande?completeopt
manière décrite dans les commentaires (encore une fois, pas par moi). edit : Oups,'longest'
est requis pour l'ctrl-p
étape: nonctrl-y
. Toujours les étapes décrites par le travail question pour moi-asker envim -Nu NONE
aveccompleteopt
modifiées.