Comment puis-je trouver une sélection visuelle de vimscript?

11

Si j'ai quelques lignes de vimscript que je veux tester avant de mettre mon vimrc, est-il possible de les sélectionner visuellement, puis de les source?

j'ai essayé

  • faire une sélection visuelle v, puis des mouvements pour faire une sélection, etc., puis
  • :'<,'>so

Mais vim donne une erreur

aucune plage autorisée

également

:'<,'>w | so

donne

Utilisation ! écrire un tampon partiel

Comment puis-je me procurer un vimscript sélectionné visuellement?

the_velour_fog
la source

Réponses:

11

Sur la ligne de commande, <C-u>tapez puis tapez @*et entrez.

<C-u>supprimera la plage visuelle '<,'>qui a été automatiquement insérée si du texte est sélectionné visuellement.

:@*exécutera le contenu du *registre qui contient tout ce qui est actuellement sélectionné visuellement.

Même si le texte qui est sélectionné / mis en évidence se trouve dans votre navigateur web (firefox, chrome, ...), cela fonctionnera, le *registre vous permettra d'y accéder directement dans vim.


Si votre texte est sélectionné dans un tampon de vim, une autre solution est de le copier dans un registre nommé, par exemple un registre en tapant "ay.

Ensuite, sur la ligne de commande, tapez: <C-r>aet entrez.
Ctrl+ rvous donnera une sorte d'invite représentée par le caractère "(pour plus d'informations, lisez :h c_Ctrl-r).
À cette nouvelle invite, si vous donnez le nom d'un registre, son contenu sera inséré sur la ligne de commande, où vous pourrez le modifier avant l'exécution.


En outre, si vous copiez du texte sans spécifier de registre, il sera accessible depuis le registre sans nom " .

Supposons donc que vous ayez une ligne de vimscript dans un fichier et que vous vouliez la source rapidement, vous pouvez la copier avec Y, puis la source sur la ligne de commande avec: :<C-r>"et entrez.

Enfin, si vous utilisez cette dernière solution, il y a juste un problème dont vous devez être conscient.
Si vous voyez un caractère étrange sur la ligne de commande comme celui ^M-ci, c'est la notation caret du retour chariot. Vous devez le supprimer, sinon vous obtiendrez probablement une erreur.

En résumé, vous:

  1. copiez votre ligne de vimscript avec Y
  2. passer en mode commande avec :
  3. appuyez <C-r>pour entrer dans l'invite des registres
  4. tapez "pour appeler le registre sans nom
  5. appuyez sur retour arrière pour supprimer le ^Mcaractère
  6. et appuyez sur Entrée.
saginaw
la source
1
Doux! : D fonctionne bien - je n'avais jamais rencontré @*auparavant, merci!
the_velour_fog
Je suis content que ça t'ait aidé. J'ai édité la réponse pour proposer une autre solution.
saginaw
1
nice one, j'ai essayé votre suggestion sur l' utilisation de : <C-r>a ce fait a bien fonctionné aussi :) Je suppose que vim lire les ^M« s comme retours à la ligne - et exécuté chacun comme sa propre ligne individuelle / commande?
the_velour_fog
C'est une bonne question, honnêtement, je ne sais pas. Habituellement, si je ne supprime pas ce caractère, j'ai des erreurs. Je suis content que cela ait fonctionné pour vous sans erreurs. Peut-être que quelqu'un avec plus de connaissances sur le sujet nous expliquera comment vim traite ce genre de caractères spéciaux.
saginaw
2

En fait, je le fais un peu différemment, je fais juste les modifications dans mon vimrc et je le ressaisis chaque fois que je l'écris. (J'ai un ensemble de fichiers vimrc en cascade, ce qui me permet de modifier l'un d'eux.)

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif
dash-tom-bang
la source
2

Plus directement à la question que mon autre réponse, vous pouvez définir un mappage comme celui-ci ( nnoremappour aucune sélection, il suffit d'exécuter la ligne actuelle; vnoremaplorsque le mode visuel est actif):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

Dans les deux cas, la "ligne actuelle" est :executed, donc dans la version visuelle, vous :executegénérez une ligne après l'autre à travers la sélection visuelle.

Comme indiqué dans une autre réponse, le <C-u>supprime la spécification de plage qui apparaît dans la ligne de commande lors de la :frappe. Les |caractères doivent être échappés car sinon ils sont interprétés comme la fin de la vnoremapcommande.

Cela pourrait également être transformé en une fonction pour se débarrasser d'une partie de la gymnastique d'échappement, mais cela ne semble pas être une énorme victoire pour moi en ce moment. Ce serait essentiellement le vnoremap développé en plusieurs lignes et callédité avec une plage ou non selon le mode de mappage [nv].

dash-tom-bang
la source
Oh, le mappage du mode visuel exécute des lignes entières, donc si vous êtes par bloc ou par caractère, il ignorera les points de début et de fin dans les lignes.
dash-tom-bang