aide vim 

créé le: 20190301
mis à jour le: 20191115
généré le:20191124_225042
Aide vim

Gvim

  vim_ ;https://www.vim.org;   vim_25_presentation_by_bram_moolenaar_on_2016_november_2_ ;https://www.youtube.com/watch?v=ayc_qpB-93o&feature=youtu.be;   mastering_the_vim_language_ ;https://www.youtube.com/watch?v=wlR5gYd6um0;

Demarrer avec vi

  • vi est l'éditeur standard sur toute distribution UNIX. vi n'a pas évolué depuis sa création ce qui en fait un éditeur rustique.
  • l'évolution de vi est l'éditeur vim, voir ci-après.
  • lancer l'éditeur avec le nom du fichier à traiter comme argument "vi toto.txt"
  • l'éditeur lance une fenêtre plein écran ou apparaisse les lignes du texte. Des lignes vides commençant par "~" sont visibles si le nombre de ligne du fichier est inférieur au nombre de ligne de la fenêtre.
  • par défaut on est dans le mode commande de l'éditeur, c'est à dire que toutes les touches du clavier sont une commande.
  • par exemple pour se déplacer on utilise les touches h,j,k,l touches de déplacement vi
  • pour insérer du texte on utilise par exemple la touche "i" pour "insert" , "a pour append", "R" pour replace
  • une fois la modification du texte terminée tapez sur la touche "esc" pour sortir du mode d'édition.
  • sous vi, il est nécessaire de sortir du mode d'édition pour changer de ligne: on doit repasser en mode commande pour faire un déplacement Heureusement sous vim cette contrainte est supprimée.
  • pour l'ensemble des commandes cf vimaz
  • il existe également un mode ligne de commande vi qui s'obtient en tapant la touche ":" et qui permet de lancer des commandes globale sur une selection de ligne du fichier.
  • pour conclure cette introduction, sous un abord rustique, voire archaïque, vi est un éditeur unique dans sa conception, un type d'éditeur à lui tout seul. C'est cette conception initiale qui fait que vim est reconnu comme l'éditeur le plus puissant existant.

    Demarrer avec vim

    Vous venez d'entrer sous l'éditeur vim. Vous pouvez utiliser les touches de déplacement (flèches et pagination) pour vous déplacer dans ce texte.

    La chose la plus importante à connaître et qui rend vim (vi) unique est le fait que vim (vi) est un éditeur multimode.

    La caractéristique majeure de l'éditeur vim (vi) est de fonctionner prioritairement dans le mode commande vi On peut dire qu'il y a deux sortes d'éditeur ceux qui fontionnent par défaut et principalement dans un mode d'édition (on tape au clavier et ça écrit du texte) et ceux qui fonctionnent par défaut et principalement dans un mode commande (on tape au clavier et ça fait des choses).

    Dans la première il y a tout les éditeurs sauf vi et vim (emacs, ultraedit, notepad, ...) dans la deuxième il y a vi et vim. vim est l'extension historique, le développement du vi originel du système unix qui n'a pas évolué sinon par vim.

     Les modes de vim sont:

  • le mode commande vi: c'est le mode par défaut de vim, dans ce mode les touches du clavier ne servent pas à la saisie de caractères mais sont autant de commandes. Ces commandes sont, cela parait étonnant à priori trés ergonomiques, cf vimaz En effet elles sont facilement mémorisable pour peu que l'on cherche le mot anglais à l'origine du choix de la lettre. Si on compare l'ergonomie de WORD, lié aux touches de fonctions avec la combinaison des touches de contrôle SHIFT,CTRL,ALT, on voit tout de suite qu'il sera trés difficile de devenir un utilisateur de WORD chevronné alors que devenir un utilisateur de vim chevronné demande peut-être un effort d'adaptation au départ mais devient ensuite assez facile, car il y a un ordre sous-jacent dans la nomenclature des commandes.

  • le mode ligne de commande vi: si on tape le caractère ":" on va sur la ligne de commande de vim où l'on peut taper des commandes. Pour sortir de ce mode on peut le faire soit par ENTER ce qui permet de valider la commande saisie, soit par ESCAPE qui fait sortir du mode commande sans rien exécuter.

  • le mode de saisie vi: c'est le mode qui permet de saisir le texte. Ce mode est présent dans tout les éditeurs. Pour rentrer dans ce mode, il faut saisir une commande commande de modification vi qui permet de faire de la saisie par exemple en tapant la touche "i" on rentre en insertion.
    la saisie de ESCAPE permet de sortir de ce mode pour revenir au mode de base le mode commande vi.

    Mode de saisie vi

    Dans vim le mode saisie est identique à un éditeur comme notepad.

    On rentre dans ce mode à partir du mode commande vi par saisie des commandes suivantes:

  • "a" pour ajouter du texte (ajoute aprés le caractère courant)
  • "i" pour insertion de texte (insére juste avant le caractère courant)
  • "R" pour remplacement de texte (remplace le texte à partir du caractère courant)
  • "o" pour ouvrir une nouvelle ligne ( "O" pour l'ouvrir au dessus de la courante)
  • "s" pour subsitute (équivalent à "R").

    On saisie le texte avec les touches habituelles, on se déplace avec les fléches, les touches de pagination, on peut changer de mode "insertion" "remplacement", supprimer un caractère par Suppr et utiliser les commandes des menus pour sauver les modifications, sortir faire des recherches, sélectionner avec la souris, utiliser le copier-coller.

    On peut donc considérer que vim est un sur-ensemble de notepad.

    Il n'y a donc aucune raison de continuer à utiliser notepad si on dispose de vim.

    On sort du mode de saisie par la touche d'échappement ESCAPE..

    Mode ligne de commande vi

    Il s'agit en fait des commandes de l'éditeur "télétype" précurseur de vi, l'éditeur "ed".
    Lorsque la saisie informatique à pu se visualiser sur écran plutôt que sur une télétype, "ed" a évolué pour devenir "vi" (qui est une abbréviation de "visual").
    Ce qui veut dire que "vi" contient les gènes de "ed".

    ed par ailleur à donné naissance à la commande "sed" qui pourrait signifier "stream ed" par exemple.

    On accéde à ce mode par la saisie du caractère ":" à partir du mode commande vi.

    Sous vim, il est possible de récupérer les commandes déjà saisie en naviguant avec les flèches hauts et bas.
    On peut même saisir le début d'une commande pour ensuite avec les flèches sélectionner seulement les commandes correspondant au préfixe saisi.

    commandenote action  
    :b nn  ++  rend courant le buffer (fichier) identifié sous le numéro "nn", pour la liste des buffers voir commande :ls  
    :e fichier  +  édite le fichier dont le chemin est saisie  
    :g/expr/  +++  global : sélectionne les lignes qui contiennent l'expression régulière "exp" et :  
    :g/expr/l  ++  - liste les lignes  
    :g/expr/d  ++  - détruit les lignes  
    :g/expr/s///  ++  - applique sur les lignes sélectionnées la commande de substitution "s"  
    :ls  +++  liste les buffers déjà édité durant la session et affiche leur numéro (cf commande :b nn)  
    :n  +  next - édite le buffer suivant si plusieurs fichiers ont été demandés  
    :q  +  quitte l'éditeur ":q!" force la sortie sans sauvegarde  
    :r  +  rewind - revient au premier buffer demandé lors de l'ouverture de vi ou lors de la commande ":n fichier"  
    :s  ++++  substitution de chaine  
    :w  ++++++enregistre le fichier en cours ":w!" force la réécriture en cas de warning  
    :x  +  eXit sauvegarde le buffer courant et quitte vi  
    :map  ++++  crée une nouvelle commande du mode commande vi par combinaison de commande de ce mode  
    !  ++++++shell vi, permet l'interaction avec l'environnement extérieur du programme vi, offre des possibilités sans limites  
    / ou :/  ++++  recherche d'une expression régulière (les cibles sont visualisée en jaune) la commande "n" permet naviguer sur la recherche
    spécifique vim
    :gf  ++++  go file,ouvre le fichier dont le path est sous le curseur  
    :sp  ++++  split ,sépare l'espace de travail en deux pour ouvrir un second buffer bascule par ctrl-W w  
    :tabnew  ++++  ajout d'un onglet espace de travail  

    Astuce mode ligne de commande vi

  • le caractère point d'exclamation "!" indique :

    Shell vi

    L'utilisation du caractère "!" dans différent contexte permet de lancer des commandes systèmes.

    Sur la ligne de commande vi par exemple taper ":!dir " pour ouvrir un shell et lancer la commande dir.
    ou en mode commande vi , "!" suivi d'une commande de déplacement (ne serait-ce que ENTER) affiche un prompt sur lequel on peut saisir une commande système. Le buffer selectionné par le déplacement est envoyé sur l'entrée standard de la commande (stdin) et la sortie standard de la commande (stdout) est récupérée et place le résultat dans le buffer délimité par le déplacement (l'ancien buffer est perdu).

    On peut ainsi lancer une requête SQL par la commande isql , transformer un texte via un script perl, écrire des programmes C pour créer de nouvelles commandes d'édition , ... Les possibilités sont sans limites.

    Map

    la commande :map permet de créer de nouvelle commande.
    Par exemple la commande :"map ² j." crée la commande "²" qui repéte la dernière commande sur la ligne suivante.

    Analogie vim mq

    
    
     Je ne puis m'empêcher ici de faire une analogie avec la mécanique_quantique_ et l'opérateur H hamiltonien
     responsable de l'évolution dans le temps. Cet opérateur est la combinaison des opérateurs de création et de destruction  
     d'états d'énergie.

    Si on considère donc sous vim la commande de destruction de caractère "x" , la commande d'insertion du contenu du buffer par défaut "p" et leur combinaison "xp" dans une commande ":map s xp" on aura crée la nouvelle commande "s" qui a curieusement le même effet que l'opérateur hamiltonien: l'évolution. Mais ici la flèche du temps doit être symbolisée par une ligne de underscore et par exemple le caractère o comme une particule en mouvement: en appliquant la commande "s" sur le caractère "o" de la ligne on fait se déplacer la particule.

    On peut aussi créer l'opérateur inverse par ":map S xhP"

    _______o______________________________________________________________________________________________

  • Une trajectoire peut être définie par :map #s ssssssssssssssssssssssssssssssssssssssssssssssssssssssssSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
  • Une trajectoire cyclique (oscillation) par la macro récursive ":map #S #s#S"
  • Attention cette macro résursive ne peut être interrompu que par CTRL-C
  • Dans Vim il existe une autre manière d'enregistrer une séquence de commande.
    Il s'agit de la commande "q" qui permet d'enregistrer la séquence des commandes qui seront ensuite tapé au clavier (la saisie d'un autre "q" arrête l'enregistrement) et de la commande "@" qui permet d'exécuter ces commandes.

    Les commandes sont stockées dans des buffers nommé par un caractère alphanumérique qui doit être précisé en conjonction avec les commandes "q" et "@". Par exemple q03dwj enregistre dans le buffer 0 la commande 3dwjbbb qui supprime 3 mots et passe à la ligne suivante en revenant de 3 mots en arrière tout en exécutant cette séquence. la commande @0 permet de répéter la séquence.

    Substitution de chaine

    La commande ":s/chaine1/chaine2/" de susbtitution de chaine1 par chaine2 offre de trés puissantes possibilités: Si l'on veut faire des changements sur le caractère "/" il faut utiliser "\/" pour spécifier ce caractère ou bien utiliser un autre caractère délimiteur de chaine ":s.chaine1.chaine2."

    :s/toto/titi/  remplace "toto" par "titi" sur la ligne  
    :s/toto/titi/g  remplace tous les "toto" par "titi" sur la ligne  
    :1,$/toto/titi/g  remplace tous les "toto" par "titi" sur le fichier entier  
    :.,+10/toto/titi/g  remplace tous les "toto" par "titi" à partir de la ligne courante sur dix lignes  
    :g/tata/s/toto/titi/g  remplace tous les "toto" par "titi" sur toutes les lignes qui contiennent la chaine "tata"  
    :'a,'bg/tata/s/toto/titi/gremplace tous les "toto" par "titi" sur toutes les lignes qui contiennent la chaine "tata" entre les lignes mémorisées par les index "a" et "b" 

    Expression régulière: regular expression

    Les expressions régulières permette de spécifier des chaines de recherche complexes.

    Le caractère "." sert pour spécifier n'importe quel caractère.
    Le caractère "*" sert pour spécifier n'importe quel suite de caractères.
    Le caractère "^" sert pour spécifier le début de la ligne Le caractère "$" sert pour spécifier la fin de la ligne

    Un bloc "" sert pour spécifier un jeu de caractère possible dans l'expression régulière.
    Par exemple :

  • a-zA-Z désigne un seul caractère alphabétique majuscule ou minuscule.
  • 0-9 désigne n'importe quel chiffre
  • 1-20-90-90-9 désigne une forme d'année de "1000" "2999"

    Par exemple "toto.*titi" désigne les portion de lignes qui commence par toto et finissent par titi.
    Par exemple ".*toto.*titi.*" désigne les lignes qui contiennent à la fois toto et titi dans cet ordre.
    Par exemple "^toto.*titi$" désigne les lignes qui commence par toto et finissent par titi.

    Vim permet de réaliser des "ou" logique sur les recherches avec l'opérateur "\|" (backslash-pipe) donc "toto.*titi\|titi.*toto" permet par exemple dans une commande g//s/// de réaliser la modification uniquement sur les lignes correspondant au critère.
    On n'est presque au niveau d'un requêteur en mode texte.

    Sous champs

    Il est possible de décomposer une ligne ou une portion de ligne en sous-champs dans une expression régulière dans la commande ":s".

  • Les sous-champs se définissent dans la chaine cible par des parenthèses "backslashés" : \(..\)\(...\)
  • Les sous-champs peuvent ensuite être utilisés dans la chaine de remplacement par \1 \2 \3 etc...

    Exemple: chaine cible: "Belle marquise vos beaux yeux me font mourrir d'amour" forme des sous champs "\(B.*se \)\(v.*x \)\(me font \)\(mourrir \)\(.*\)" qui se dénomme \1 \2 \3 \4 \5

    La commande ":s/\(B.*se \)\(v.*x \)\(me font\)\(mourrir \)\(.*\)/\5 \2\4\3\1/" avec toutes les permutations des sous-champs généres les formes moins belles de proses de la première phrase: d'amour vos beaux yeux mourrir me font Belle marquise

    Mode commande vi

    C'est ce mode qui explique la puissance de vim.
    Chaque touche est une commande.

    On trouve des grands types de commandes:

  • commande de déplacement vi
  • commande de modification vi
  • commande de recherche vi

    On peut combiner des commandes de type différent: modification*déplacement, par exemple :

    On peut créer des macro-commande par combinaison de commande de base grâce à la commande map du mode ligne de commande vi.

    Remarque: On peut considérer les commandes de ce mode comme des opérateurs pouvant être combinés.
    Ce mécanisme de combinaison d'opérateur (peut t'on parler d'algèbre d'opérateur ?) est trés puissant.

    Les opérateurs peuvent être associés à des cardinalités qui indique combien de fois on doit répéter la commande.
    par exemple "5dw" supprime les cinq prochains mots.

    Les macro-commandes peuvent être elle-même combinées et même récursivement (l'arrêt de la récursion doit être prévu: déclanché par l'impossibilité de réaliser une commande)

  • Un nouveau mode disponible uniquement sous vim est la sélection de texte avec "v"

    Commande de déplacement vi

    Les commandes de déplacement, cf type "d" dans la liste vimaz peuvent être combinées avec d'autres commandes de modification pour constituer une nouvelle commande de modification.

    Le clavier de déplacement avec les flèches est bien sur opérant et fonctionne en conjonction avec les altération SHIFT, CTRL.

    Commande de modification vi

    Les commandes de modification, cf type "m" dans la liste vimaz

    Commande de recherche vi

    Les commandes de recherche, cf type "r" dans la liste vimaz

    Commande de gestion de buffer vi

    Les commandes de buffer, cf type "g" dans la liste vimaz

    Vimaz:Vim de A à Z

    L'alphabet de vim. Lorque l'on est en mode commande vi chaque lettre est une commande :

    colonnedescription  
    Lettre  la lettre de la commande. Ce peut être une lettre seule, doublée , suivi d'une autre lettre, suivi encore du type d'une commande
     Lettre doublée mentionnée par ² qui lui n'est pas utilisé par vim  
     Lettre suivi d'une autre lettre quelconque ce dernier cas est signalé par la présence d'un "underscore" par exemple f_  
     Suivi encore du type d'une commande "d" pour déplacement par exemple, dans ce cas toutes commandes de déplacement est opérante  
    Commande type   type de commande : d Déplacement, m Modification, r Recherche, g gestion de buffer  
    Note vim  utilité ou puissance de la commande mentionné par une série de plus ... ou de moins  
    Mnemo  origine de l'utilisation de la lettre pour la commande, moyen mnénotechnique, en anglais forcément  

    lettre commande type  mnemo  note vim action  
           Caractère non alphabétique vi  
    .  m    +++  répète la dernière commande de modification  
    ~  m    +  inverse majuscule-minuscule. A utiliser avec "g" : g~d  
    ^  d    +  va au début de la ligne  
    $  d    +  va à la fin de la ligne  
    *  r    +++  vim recherche le mot sous le curseur : toutes les cibles sont colorées en jaune . Voir ici g*  
    '_  d    +++  "cote" suivi d'une lettre déplace le curseur à la ligne mémorisé par cette lettre voir m_  
             
    "_yd  g    +++  "double cote" suivi d'une lettre, suivi de "y" yank suivi d'une commande de déplacement mémorise dans un buffer nommé par cette lettre le texte concerné par le déplacement  
    "ayfo  g    +++  exemple: "afo mémorise dans le buffer "a" à partir du caractère courant jusqu'au prochain "o" présent sur la ligne courante  
    "byy  g      "byy mémorise la ligne courante dans le buffer b  
    "by'b  g      "b'b mémorise dans le buffer b depuis la ligne courante jusqu'à la ligne mémorisé par l'index b  
           Caractère alphabétique vi  
    a  m  append  +  ajoute du texte aprés le caractère courant bascule en mode de saisie vi  
    A  md  Append  +  ajoute du texte en fin de ligne bascule en mode de saisie vi  
    b  d  back  +  déplace le curseur d'un mot en arrière, si majuscule les mots sont juste séparé par des blancs et des espaces  
    B  d  Back  +  idem "b" si majuscule les mots définis par ce qui est séparé par des blancs et des espaces  
    c_  m  change  -  "c" suivi d'une commande de déplacement vi change le texte depuis le caractère courant jusqu'a la fin du déplacement  
    C  m  Change  -  change le texte depuis le caractère courant jusqu'à la fin de la ligne  
    dd  m  delete  ++  "d" suivi d'une commande de déplacement vi supprime le texte depuis le caractère courant jusqu'a la fin du déplacement  
    d²  m  delete  +  "d" doublé supprime la ligne courante  
    D  m  delete  +  supprime le texte depuis le caractère courant jusqu'à la fin de la ligne  
    e  d  end  +  déplace le curseur à la fin du mot courant  
    E  d  End  +  déplace le curseur à la fin du "mot large" courant  
    f_  r  find  ++  "f" suivi d'un caractère déplace le curseur sur la ligne jusqu'au caractère si il existe  
    F_  r  find  ++  "F" identique à "f" mais se déplace vers le début de la ligne  
    g²  d  go  +  déplace le curseur au début du fichier  
    G  d  go  +  déplace le curseur à la fin du fichier  
    g*  r  global  +++  (vim) identique à "*" mais ce n'est pas le mot mais la chaine qui est recherchée (si elle apparait dans un mot)  
    g~d  m  global    inverse les majuscules minuscules jusqu'au déplacement  
    gf  d  go file  +++++  édite le fichier dont le chemin se trouve sous le curseur  
    i  m  insert  +  inserre les caractères tapé ultérieurement avant le caractère courant bascule en mode de saisie vi  
    I  md  Insert  +  inserre les caractères tapé ultérieurement au début de la ligne bascule en mode de saisie vi  
             
    J  m  join  ++  concaténe la ligne courante avec la suivante (fusion de deux lignes) un blanc est inséré entre les deux lignes  
           clavier déplacement : hjkl jk:haut bas , hl gauche droite (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement  
    Touches de déplacement vi   
    h  d    +  flèche gauche  
    j  d    +  flèche haut  
    k  d    +  flèche bas  
    l  d    +  flèche droite  
             
    m_  d  memorise  +++  "m" suivi d'une lettre mémorise la ligne suivante avec cette lettre pour index, le rappel se fait avec le caractère "cote": '  
             
    o  m  open  ++  ouvre ou inserre une ligne aprés la ligne courante  
    O  m  Open  ++  ouvre ou inserre une ligne AVANT la ligne courante  
    p  m  put  +++  inserre le contenu du buffer courant  
    r_  m  replace  +  remplace le caractère courant bascule reste en mode commande vi  
    R  m  Replace  +  remplace le texte à partir de la position courante bascule en mode de saisie vi  
    s  m  subsitute+  remplace le texte à partir de la position courante bascule en mode de saisie vi  
    S  m  Subsitute-  substitue la ligne courante par les caractères tapés ultérieurement bascule en mode de saisie vi  
    t_  r  to  ++  "t" suivi d'un caractère déplace le curseur sur la ligne immédiatement avant le caractère si il existe  
    T_  r  To  ++  "T" identique à "t" mais se déplace vers le début de la ligne (utilité par combinaison avec commande double-cote  
    u  m  undo  +++  "undo" annulle la dernière modification. undo permet d'annuler toutes les modifications depuis le dernier changement de fichier édité . "redo" ctrl-r est l'inverse d'undo
    v  g      (vim) rentre en mode sélection de texte (vision linéraire du texte) ctrl-v en mode sélection de bloc rectangulaire (vision surfacique du texte)  
    w  d  end  +  déplace le curseur à la fin du mot courant  
    W  d  End  +  déplace le curseur à la fin du "mot large" courant  
    x  m    ++  supprime la lettre  
    yd  g  yank  +++  "y" suivi d'une commande de déplacement vi mémorise dans le buffer par défaut le texte concerné par le déplacement, utilisé en conjonction avec les buffer nommé cf "_  
    z²      +++  "z." ou "zz" centre la fenêtre sur la ligne courante  
    zENTER      +++  positionne la ligne courante en haut de la fenêtre  
    z-      +++  positionne la ligne courante en bas de la fenêtre  
           Commandes utilisant la touche CTRL  
    CTRL-R        "redo" inverse de "u" "undo"  
    CTRL-A        incrémente le nombre sous le curseur  
    CTRL-X        décrémente le nombre sous le curseur  

    Vim method

    Comment se déplacer facilement dans un fichier sur lequel on travaille.

  • Utilisation des points d'ancrages ("m a", "m b", ... "m z").
    Il faut se définir des points d'ancrages standard (lettre de l'alphabet) que l'on utilisera systèmatiquement pour un but précis. Donc on défini une sorte de nomenclature personnelle des points d'ancrage. Le premier point d'ancrage devrait être le point principal d'édition, les autres sont les autres points où l'on va chercher l'information que l'on récupère pour l'édition.
    Par exemple template de code similaire.

  • Utilisation de la chaîne de recherche (saisie ou commande *, alt-*) et des commandes n et N (next).

  • avec Utags :

    Mot large

    un mot défini par ce qui est séparé par des blancs et des espaces uniquement.

    exemple: "depuis,lundi-matin" est un seul "mot large"

    Majuscule

    Dans vi l'altération d'une touche par shift (majuscule) altére la commande correspondant à la minuscule. L'altération peut être de plusieurs type mais la commande résultante est voisine de l'initiale.

    altération possible:

  • changement de sens
  • action réalisée en fin ou début de ligne