Comment afficher le résultat des commandes vim dans le shell

11

Disons que je suis dans le shell ( bash) et que je veux voir la sortie qui :scriptnamesdonnerait, mais je ne veux pas démarrer vim ou peut-être que je veux faire écho dans un autre fichier.

Alors j'exécute

vim +scriptnames

Ce qui me montre tous les scripts, mais comment puis-je répercuter cela dans la sortie standard du shell?

hgiesel
la source

Réponses:

10

Cela se produit, car généralement Vim bascule vers l'écran alternatif et y travaille. En quittant, Vim reviendra et donc vous ne verrez plus rien de votre session Vim, mais le résultat de la commande exécutée avant même de démarrer Vim.

Cette fonctionnalité est expliquée sur :h xterm-screens (lien)

Donc, fondamentalement, vous ne voulez pas cela et souhaitez donc désactiver cela. Vous pouvez le faire en définissant :set t_ti= t_te=les codes de terminal qui effectuent cette opération sur vide.

En mettant tout cela ensemble, vous voudriez démarrer Vim comme ceci:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Nous réinitialisons l' 'more'option, de sorte que vous ne voyez pas l'invite hit-enter.

Christian Brabandt
la source
1
C'est génial, merci beaucoup! En fait, je doutais que cela soit possible.
hgiesel
Cela permet-il d'utiliser VimL en tant que langage de script système à part entière en le laissant écrire sur stdout (pour les particulièrement masochistes)?
shadowtalker
1
Un problème avec ceci est que je ne peux pas faire défiler le terminal. (Si le texte est plus long que la hauteur de mon terminal, je ne peux pas voir le haut) Le texte disparaît également si j'ouvre vim puis quitte.
FDinoff
@FDinoff C'est à cela que servent les téléavertisseurs less. Il suffit de le canaliser en moins comme ça vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. La mise en page a peut-être été vissée au début (c'est dans mon terminal), mais après avoir appuyé sur <CL>, tout est beau et dandy.
hgiesel
Je ne vois aucune sortie lors de l'exécution vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', il n'y a qu'un "flash rapide", la commande exit avec le code 0, pas de sortie. Suis-je en train de manquer quelque chose?
TrungDQ
3

Nous pouvons également utiliser la :redircommande pour rediriger les résultats des commandes vim dans un fichier

Par exemple,

vim -c "redir! > vimout | scriptnames | redir END | q"

Cela redirige la sortie de scriptnamesdans le fichier "vimout"

MS.Kim
la source
1

J'apprécie la réponse fournie par Christian Brabandt mais je pense qu'une meilleure réponse serait de séparer la commande quit en utilisant une autre commande -c comme ceci:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

L'utilisation de cette méthode signifie que vous pouvez enchaîner un certain nombre de commandes différentes ensemble, puis utiliser le «q!» Final pour sortir de vim.

Benjamin Frazier
la source
0

Pour les situations où vous avez besoin que vim soit complètement chargé comme si vous l'aviez démarré manuellement, cela fonctionne:

vim -c "autocmd! CursorHold * <commands to run>"

Par exemple, je voulais rediriger la sortie de :mapvers un fichier à partir du shell, mais je voulais capturer le mappage que vim- airlines crée uniquement après avoir affiché sa tabline (ligne en haut montrant tous les noms de buffers ouverts.) Parce que cela semble faire ceci de manière asynchrone, l'exécution d'une -credirection vers un fichier ne lui donnait pas le temps de faire les mappages. Il pourrait y avoir une meilleure façon, mais cela fonctionne pour moi, d'autant plus que j'ai déjà updatetimeréglé sur 100(0,1 seconde), ce qui affecte la durée avant le CursorHolddéclenchement de l' événement. Par défaut, vim la définit sur 4 secondes.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
user1902689
la source