Comment supprimer le message «lecture depuis STDIN» depuis Vim?


18

Lorsque vous utilisez Vim pour lire à partir de stdin, il imprime un message informatif:

$ echo foo | vim -
Vim: Reading from stdin...

$

C'est juste un exemple. L'utilisation réelle ne permet pas les constructions shell. vim <(echo foo)n'est pas une option.

Puis-je supprimer cela en utilisant uniquement les options Vim et / ou les paramètres vimrc?


Au cas où vous auriez besoin de savoir à quoi cela sert, j'essaie d'utiliser Vim pour lire les pages de manuel (plug sans vergogne). GNU man n'autorise pas les constructions de shell dans MANPAGER, et en utilisant ftplugin/man.vimet d'autres choses, j'ai réussi à avoir une expérience confortable en utilisant juste MANPAGER="vim -". Le dernier ennui restant est le message disgracieux imprimé après chaque page de manuel que j'ai consultée.


Vous utilisez export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'ou export MANPAGER="vim -"je ne vois aucun problème? man lsouvre la page de manuel comme prévu.
Martin Tournoij

@Carpetsmoker et après l'avoir fermé?
muru le

Non, je ne vois rien ...
Martin Tournoij

@Carpetsmoker quelle version de Vim utilisez-vous? Qu'en est-ilecho foo | vim -Nu NONE -
muru

Dans vim, : help lessdonne quelques informations pour l'utiliser comme pager.
mtklr

Réponses:


8

À partir de Vim 8.0.1308 (novembre 2017), vous pouvez utiliser l' --not-a-termoption pour supprimer ce message; par exemple avec quit:

$ echo hello | vi - --not-a-term -esc '%p|q!'
hello

Ou avec exit:

$ echo hello | vi - --not-a-term -esc 'x!/dev/stdout'
hello

En l'état, ceci est équivalent à cat, mais il peut toujours être utile pour appliquer Vimscript à l'entrée, par exemple +'runtime! syntax/2html.vim'pour exporter du texte surligné en HTML stylisé (en supposant un type de fichier déduit ou spécifié). Il existe quelques options autres que celles mentionnées jusqu'à présent; le premier qui me vient à l'esprit est d'utiliser mktemppour stocker la sortie de la commande et de l'utiliser comme entrée de Vim. Vous pouvez ajouter les commandes de redirection et de shell de Vim pour «coller» le résultat de la commande dans le tampon, mais cela demande un peu plus de travail. (Les fichiers de script Vim peuvent automatiser de longues invocations au lieu d'utiliser des alias.)
John P

Il pourrait être possible d'éditer / coller la sortie d'un socket, ce qui pourrait être vraiment utile si c'était vrai. Je dis toujours que la meilleure option est un fichier temporaire, sauf s'il existe des mises en garde pires que celles de la réponse acceptée. Cependant, pour un shell donné, il peut exister un alias / builtin / syntaxe simplifiant une partie de ce processus, comme ceux répertoriés dans la page de manuel de zshmisc (redirections, etc.). Un de plus - vous pouvez peut-être échapper l'entrée et la fournir comme argument après un argument entrant en mode insertion, il est donc analysé comme s'il était tapé?
John P

Je vois --not-a-termdans Vim 7.4.1689 dans Ubuntu 16.04 (mais pas 7.4.8056 sur Mac), mais cela ne supprime pas le message.
pause jusqu'à nouvel ordre.

@DennisWilliamson Voir le changelog par :help version8.txt. --not-a-termL'option elle-même a été ajoutée 7.4.1419et son comportement a été modifié pour supprimer également le message Reading from stdin ... dans 8.0.1308. (Soit dit en passant, les fichiers N pour modifier le message doivent également être supprimés 8.1.1258)
ynn

12

La réponse à votre question exacte :

Puis-je supprimer cela en utilisant uniquement les options Vim et / ou les paramètres vimrc?

est: non, ce n'est pas possible à cause de la partie suivante du code

    if (read_stdin)
    {
#ifndef ALWAYS_USE_GUI
        mch_msg(_("Vim: Reading from stdin...\n"));
#endif

ce qui signifie que si vous donnez -comme argument à vim, il affichera mécaniquement ce message.

cependant, en guise de solution, si vous utilisez une redirection de fichier au lieu de l' -argument, vous vous débarrasserez du message:

echo "foo" | vim < /dev/tty

et voici un exemple de MANPAGEréglage qui fonctionne juste ™ (tiré des intertubes):

export MANPAGER='bash -c "vim -MRn -c \"set ft=man nomod nolist nospell nonu\" -c \"nm q :qa!<CR>\" -c \"nm <end> G\" -c \"nm <home> gg\"</dev/tty <(col -b)"'

2
Quand est ALWAYS_USE_GUI défini, savez-vous?
muru

2
voir feature.h (c'est fait quand ALWAYS_USE_GUI n'est pas défini, donc fondamentalement pour toutes les versions Unix).
Christian Brabandt,

2
Je ne peux pas obtenir le echo "foo" | vim < /dev/ttytravail de contournement . Le faire donne [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz

2
Comme @ LéoLéopoldHertz 준영, l'astuce tty n'a pas fonctionné pour moi (gvim donne un document vide, vim est vraiment confondu avec les entrées du clavier, mais au moins il ne reçoit pas de SIGSTOP). J'ai eu plus de chance avec echo "foo" | gvim /dev/stdin(bien que le vim non-GUI émettra toujours une plainte à ce sujet:) Vim: Warning: Input is not from a terminal.
Adam Katz

2
Eh bien, oubliez mon message précédent. L'astuce dans la réponse est en <(col -b)partie. C'est essentiellement une version sophistiquée de l' catimpression des pages de manuel, et vous pouvez enfin vous débarrasser du message du vim avececho test | vim < /dev/tty <(cat>
Alexander Solovets

1

Dans Vim, ce problème a été résolu dans 234d162commit (> = v8.0.1387).

Solution: ne pas afficher le message avec a --not-a-termété utilisé.

Le message ne s'affiche donc que lorsque l'utilisateur n'a pas redirigé le stdin.


Un problème similaire a été résolu dans la version récente de Neovim ( > = v0.2.2-dev ) que vous pourriez utiliser à la place de Vim.

Une fois NVim v0.2.2 publié, vous devriez pouvoir exécuter:

$ echo foo | nvim -

sans avoir le message.


0
  1. Avec vim de la version 8.0.1387 et plus récente, vous pouvez utiliser l' --not-a-termoption.

  2. Pour une version plus ancienne, utilisez l'astuce suivante: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

Le premier argument /dev/ttyincite en quelque sorte Vim à penser que l'entrée vient du clavier. Je suppose que c'est parce que isatty (3) renvoie True pour ce fichier. Et le deuxième argument passe tout simplement de son entrée standard à l'entrée standard de Vim. Enfin, un bash -cpréfixe est requis pour que la construction spéciale <(...)fonctionne si le shell ne la prend pas en charge. En bash, la solution originale peut être simplifiée pour $ echo foo | vim < /dev/tty <(cat)


Ces deux éléments sont traités dans les réponses existantes ou dans la question elle-même. Quoi de neuf ici?
muru

@muru Il n'a pas été expliqué comment fonctionnait le deuxième cas, et les gens se demandaient pourquoi cela ne fonctionnait que dans MANPAGE.
Alexander Solovets
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.