Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (3658B)
1 #! page 2 3 title: Des macros utiles pour faire du shell dans vim 4 author: Arthur Pons 5 publication: 2023-12-19 6 description: Quelques macros pour aider à l\'écriture de shell dans vim 7 sectionmd: main 8 9 ## Exécuter du code dans vim 10 11 J'écris souvent du shell dans vim et j'ai fréquemment envie de vérifier ce que 12 donnerait la commande que je suis en train d'écrire. 13 14 Admettons que j'ai le code suivant : 15 16 seq 5 | 17 sed 's/^/(/;s/$/+2)/' | 18 paste -s -d'*' | 19 bc 20 21 et que je veuille vérifier le résultat dans vim. Je peux faire dans vim 22 `!ip` puis taper `sh` et obtenir dans mon buffer le résultat `2520`. 23 24 Déconstruisons la commande : 25 26 * `!` : filtrer la sélection par la commande qui va suivre 27 * `i` : inner 28 * `p` : paragraphe 29 * `sh` : la commande par laquelle on va filtrer, ici dash 30 31 On pourrait dire qu'en français `!` est une sorte de verbe, ce que l'on veut 32 faire (filtrer) et `ip` une sorte de COD, ce sur qu'on on va le faire (le inner 33 paragraphe). 34 35 > "Inner" paragraphe veut dire ça : 36 > 37 > | azdazd 38 > | pokkpk 39 > 40 > Contrairement à l'inverse, qui serait la totalité d'un paragraphe, autrement 41 > dit "a paragraph" et dont le raccourci est `a` : 42 > 43 > | 44 > | azdazd 45 > | pokkpk 46 > | 47 48 ## La macro 49 50 Maintenant imaginons que l'on veuille conserver la commande sous les yeux et 51 avoir le résultat en dessous. Ça peut être utile pour écrire une regex un peu 52 complexe avec le texte sous les yeux ou ne pas avoir à faire `u` (ctrl+z) à 53 chaque fois pour éditer la commande. 54 55 Pour faire cela j'ai créé la macro suivante : 56 57 map <F2> mzyip}o<CR><ESC>P!ipsh<CR>`z 58 59 qui copie le paragraphe en dessous et l'exécute de façon à conserver la copie 60 originale et renvoyer le curseur à la ligne où l'on était en lançant la macro 61 de façon à pouvoir reprendre l'édition. Pour changer la touche sur laquelle 62 appuyer pour la lancer il faut modifier `<F2>`. Si vous voulez filtrer avec 63 autre chose vous pouvez modifier `sh` pour `python3` par exemple. Je pense que 64 cette macro est un peu cracra parce que je ne sais pas bien les écrire. Si vous 65 voulez me proposer la votre pour le même besoin c'est avec plaisir. 66 67 Une macro inspirée de celle-ci qui donne le résultat d'une commande jusqu'à la 68 ligne courante et non pas du paragraphe entier pourrait s'écrire comme ceci : 69 70 map <F5> mzV{y}o<CR><ESC>P}k$x!ipsh<CR>`z 71 72 Elle m'est utile quand je débug une longue commande avec beaucoup de pipe écrit 73 sur des lignes différentes. Utile aussi pour les enseigner et montrer 74 facilement la tête des données à chaque étape de la commande. 75 76 ## Limites 77 78 Les deux ne gèrent pas très bien (et pas de la même manière) l'existence ou non 79 d'une ligne vide suivant le paragraphe courant. Aussi, elles ne servent que 80 pour tester une ou des commandes qui se tiennent en un paragraphe. Pour tester 81 un ensemble plus large soit on le fait comme au début de l'article "à la main" 82 à l'aide des déplacements ou après une sélection visuelle, soit on ne saute pas 83 de ligne entre l'ensemble de commandes. Par exemple : 84 85 set machin bidule 86 greet () { 87 echo "Hello $1 $2" 88 } 89 greet $1 $2 90 91 donnera 92 93 Hello machin bidule 94 95 et on pourra ajouter les sauts de lignes entre la fonction et la commandes 96 au dessus et en dessous après le test. 97 98 Ces macros me sont souvent utiles parce que j'ai tendance à écrire de longues 99 commandes sous la forme : 100 101 cmd 1 | 102 cmd 2 | 103 cmd 3 | 104 cmd 4 | cmd 5 | 105 cmd 6 106 107 et à vouloir les tester indépendamment les une des autres au sein d'un script. 108 Si ce n'est pas votre façon de travailler elles vous seront d'une utilité 109 marginale. 110