arthur.bebou

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