Plusieurs commandes sur la même ligne

188

J'ai essayé de trouver quelque chose qui me permettrait d'exécuter plusieurs commandes sur la même ligne dans Vim, semblable à l'utilisation de points-virgules pour séparer les commandes dans les systèmes * nix ou &dans Windows. Y a-t-il un moyen de faire cela?

Bub Bradlee
la source
2
Wow, j'essayais d'en savoir plus sur vim à partir de votre question (ce que j'ai fait) et j'ai découvert que je pourrais utiliser ;au lieu de &&séparer les commandes shell Unix aussi!
8
@ebyrob Je pense qu'il est important de noter que &&c'est 'boolean and' dans les commandes shell, donc si vous l'avez fait command1 && command2, command2ne s'exécutera que s'il est command1exécuté avec succès. avec ;vous simplement spécifier manuellement la fin de cette ligne et démarrer une nouvelle. C'est la même chose que d'écrire chaque commande sur une ligne différente dans un script shell.
Sera le
... et commande1 || command2, command2 ne s'exécutera que si command1 échoue. C'est parce que dans la logique informatique, le || et && sont au niveau du bit, et même si "&&" implique que les deux command1 ET command2 doivent être évalués, command2 n'a PAS besoin d'être évalué si command1 échoue car peu importe ce que cmd2 retourne, il échouera toujours puisque le premier a renvoyé false ( 0), et 0 && 1 serait toujours zéro.De même, si command1 = true, il n'y a aucune raison pour la commande 2 dans une évaluation OR car à ce moment-là, c'est déjà vrai (1), car 1 || 0 est 1, et seulement si c'est 0, aurait besoin de 0 || 1 (qui est toujours 1)
osirisgothra
@osirisgothra, connue sous le nom d'évaluation de court-circuit / court-circuit.
speakingcode

Réponses:

241

Un bar |vous permettra de le faire. De:help :bar

'|'peut être utilisé pour séparer les commandes, vous pouvez donc donner plusieurs commandes sur une seule ligne. Si vous souhaitez utiliser '|'dans un argument, faites-le précéder de '\'.

Exemple:

:echo "hello" | echo "goodbye"

Production:

hello
goodbye

NB: Vous constaterez peut-être que votre ~/.vimrcne prend pas en charge la cartographie |, ou \|. Dans ces cas, essayez d'utiliser à la <bar>place.

Michaelmichael
la source
8
Faites juste attention aux quelques commandes qui ne fonctionnent pas |!
trop de php
31
Lorsque vous souhaitez utiliser plusieurs commandes dans une mapdéclaration (et croyez-moi, vous le ferez), vérifiez :help map_bar.
Bill Odom le
9
C'est vrai. J'ai posé cette question sur le superutilisateur il y a quelques mois. My .vimrcne prend pas en charge une barre d'échappement ( \|) pour les mappages. J'ai appris que je dois vraiment taper <bar>.
michaelmichael
Merci pour la solution de travail! :help barmontre motion.txt et rien sur les commandes multiples.
geekQ
1
@geekQ devrait être:help <bar>
Sri Kadimisetty
92

Mettez <CR>(Carriage Return / Enter) entre et après les commandes. Par exemple:

map <F5> :w<CR>:!make && ./run<CR>

Ne pas utiliser |parce que:

  • Certaines commandes ont des problèmes si vous les utilisez |après elles

  • | ne fonctionne pas de manière cohérente dans les fichiers de configuration, voir :help map_bar

Babken Vardanyan
la source
42

Vous pouvez définir une fonction qui exécute vos commandes.

function Func()
     :command
     :command2 
endfunction

Et placez-le, par exemple, dans votre vimrc. Exécutez la fonction avec

exec Func()
Jonatan
la source
1
Solution propre. Serait certainement pratique pour plus de deux ou simplement de longues commandes.
elimirks
1
Très utile également pour la possibilité de gérer les erreurs avec try / catch.
Immanuel Weihnachten
2
C'est plus conventionnel à utiliser :call Func()car cela :execute Func()signifie quelque chose de plus. Cela signifie exécuter la valeur de retour de la fonction sous forme de commande. La fonction décrite ici n'aura généralement pas de commande commençant par :return, donc sa valeur de retour sera le nombre zéro. L'exécution de cette commande déplacera le curseur sur la première ligne du tampon actuel, ce qui n'est pas toujours ce que vous aviez à l'esprit.
minopret
26

Le séparateur de commandes dans vim est |.

Daenyth
la source
16

J'ai toujours utilisé ^Jpour séparer plusieurs commandes en appuyant sur Ctrl+ v, Ctrl+ j.

éruciforme
la source
Cela semble être la seule solution qui fonctionne réellement. Qui dois-je spécifier cela si je veux l'utiliser dans une chaîne?
DerWeh
Vous ne pouvez pas utiliser ^Jcomme séparateur de commande dans une chaîne car il insère le caractère NULL terminant la chaîne. cependant vous pouvez utiliser <CR> = "\ n".
Tinmarino
exe "echo 'foo' \n echo 'bar'"
Tinmarino
exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Tinmarino
map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Tinmarino
12

Je pensais que cela pourrait aider quelqu'un essayant de faire des substitutions dans une chaîne et l'un échouait

à partir d'un commentaire

% s/word/newword/ge | % s/word2/newword2/ge

Vous pouvez utiliser l' eindicateur pour ignorer l'erreur lorsque la chaîne est introuvable.

Jerinaw
la source
2

Vous pouvez créer un nouveau fichier et y écrire vos commandes. Ensuite :so %, ce qui signifie le fichier courant source.

Chanson
la source