Comment exécuter des commandes shell dans Vim comme le fait Gary Bernhardt dans ses captures d'écran?

Dec 13 2020

Je regarde les screencasts Destroy All Software de Gary Bernhardt , en particulier A Compiler from Scratch . Là, il exécute des commandes shell sans quitter Vim. Je suis presque sûr , il est tout simplement en utilisant la syntaxe normale Vim, par exemple sur la marque de 1 minute: :!chmod u+x compiler.rb. Si je fais cela sur mon ordinateur, la fenêtre basculera pour exécuter la commande shell, puis je devrai appuyer sur Entrée pour revenir à l'éditeur. C'est, je pense, le comportement normal de Vim, et d'autres personnes l'ont déjà demandé , mais je ne pense pas qu'une réponse fasse les choses comme Gary le fait.

J'ai regardé son .vimrcfichier, en particulier la dernière version avant le téléchargement du screencast, mais je n'ai pas pu comprendre ce qu'il aurait pu changer pour obtenir le comportement que je recherchais. Je l'ai téléchargé mais je n'obtiens toujours pas le bon comportement, donc il me manque évidemment quelque chose. Aucun de ses plug-ins ne semble être lié à cela, donc je les ai presque ignorés.

Je suis presque sûr que je ne suis pas à la recherche d'une solution qui utilise Tmux, ou des choses comme :split, :term, :below terminal, ou :silent. Je ne cherche pas non plus une réponse qui utilise autre chose que Vim, je crois que Gary utilise juste Vim et quelques plugins.

J'ai regardé les screencasts de Gary où il parle spécifiquement de Vim mais il n'a pas répondu à cette question (ou je ne l'ai pas compris), donc si quelqu'un a trouvé comment utiliser :! <shell command>sans quitter l'éditeur de texte, j'apprécierais vraiment si vous pouvez m'aider à résoudre ce problème. J'ai testé les options que j'ai mentionnées auparavant à la fois sur Mac et Linux, mais rien ne fonctionnait comme je le souhaite, et je serais heureux d'une solution qui fonctionne sur l'une ou l'autre des plates-formes.

Réponses

3 filbranden Dec 13 2020 at 12:02

La vidéo passe rapidement, mais je l'ai interrompue et il me semble l'avoir vu taper ce qui suit:

:!chmod u+x %

Ce qui produit alors cette sortie:

:!chmod u+x compiler.rb
[No write since last change]
"compiler.rb" 5L, 42C
Press ENTER or type command to continue

Donc, en fait, Vim ne invite « appuyez sur ENTRÉE » après la commande est terminée, mais il semble qu'il pressa si vite (peut - être qu'il attendait déjà? Ou peut - être il a commencé à appuyer sur les commandes suivantes?) Qu'il semble que ce message était ignoré.

Deux paramètres sont pertinents ici, le premier pour empêcher le passage de l'écran alternatif lors de l'exécution de la commande et le second pour recharger automatiquement le fichier une fois qu'il a été modifié par la commande externe (même si seules les autorisations ont changé.)

En regardant son référentiel GitHub dotfiles, nous pouvons en fait voir les deux paramètres dans le vimrc à partir du 2017-06-29 (qui correspond à la date de publication de cette vidéo.)

  1. Configurer Vim pour ne pas basculer de l'écran alternatif est configuré avec cet extrait de code :
" Prevent Vim from clobbering the scrollback buffer. See
" http://www.shallowsky.com/linux/noaltscreen.html
set t_ti= t_te=
  1. Configuration de Vim pour recharger automatiquement le fichier après une opération externe avec ce paramètre :
set autoread

Avec ces deux paramètres activés, je peux reproduire presque exactement le même effet, sauf que je ne reçois pas le [No write since last change]message. Je ne sais pas vraiment d'où cela vient, car pour autant que je sache, il venait d'écrire le fichier juste avant la chmodcommande. (Pour preuve, la ligne d'état n'affiche pas un à [+]côté du nom du fichier, ce qui indiquerait un tampon qui a été modifié.)

C'est peut-être autre chose de son vimrc ... En théorie, il devrait être possible de l'obtenir depuis GitHub et d'essayer la même chose. Il semble que la vidéo utilise Vim 7.4, donc cela pourrait aussi en faire partie.

Toujours en regardant son repo de fichiers dotfiles GitHub, il semble qu'il ait recommencé à autoriser Vim à écraser le tampon de défilement , il a donc changé d'avis sur cette partie.

Si cette partie vous intéresse toujours, vous pouvez jeter un œil au plug-in vim-altscreen , qui implémente ce comportement, avec quelques contrôles autour de lui. Voir aussi la discussion sur la question "Différence entre :!{cmd}et :w !{cmd}concernant l'écran alternatif" , en particulier la réponse exceptionnelle de @ user938271 .