Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/10/2016, à 16:24

DonutMan75

[RESOLU] Macro Vim

Bonjour à tous,
j'ai décidé récemment de me lancer dans Vim pour éditer mes scripts et mes codes (après plusieurs années de gedit et de nano l'apprentissage est un peu laborieux mais très enrichissant).

Et je me suis posé la question suivante : est-il possible de définir une fonction ou une macro qui "encapsulerait" une ligne donnée dans un cadre de commentaire ?

Par exemple :

Section 1

deviendrait :

############################
#         SECTION 1        #
############################

J'ai cru comprendre dans la doc que cela serait possible avec :map dans mon .vimrc mais je n'arrive pas à trouver la syntaxe exacte.....
Et puis, il faudrait calculer le nombre de caractères de la ligne (ici 9 caractères dans "Section 1") afin d'ajouter le nombre de # adéquats en haut et en bas...

Enfin bref, ça dépasse de loin mes compétences rudimentaires en vim mais je souhaitais savoir si ce genre de choses étaient envisageables wink

Merci d'avance,

Bonne soirée,

Donut

Dernière modification par DonutMan75 (Le 22/06/2017, à 13:58)

Hors ligne

#2 Le 08/10/2016, à 09:34

DonutMan75

Re : [RESOLU] Macro Vim

Petit up' ? smile
Je ne cherche pas forcément une solution clef en main, mais j'aimerais avoir un retour de la part d'un utilisateur averti de Vim pour savoir si c'est envisageable ou pas.

Bonne journée et à bientôt !

Donut

Hors ligne

#3 Le 22/06/2017, à 13:54

DonutMan75

Re : [RESOLU] Macro Vim

Bonjour DonutMan75,
je suis ton toi du futur et je t'apporte la solution que tu attendais fébrilement.
Alors sache que oui, jeune impétueux, il est tout à fait possible de créer une telle fonction.

Voici comment faire :

:map g k21i#^[j:s/.*/#     &     */^Mj21i#^[

C'est une ligne peu compliquée, je te propose de la décortiquer ensemble.

: map g [...]

Ici on définit une macro et on lui associe la touche g du clavier
Ce qui se passe dans [...] c'est la suite séquentielle de touche qui sera virtuellement effectuée chaque fois qu'on appuiera sur g

k21i#^[

k remonte d'une ligne (on sera donc au-dessus de "Section k")
21i# insère 21 caractères '#'
^[ simule l'appui sur 'ECHAP', il faut pour l'enregistrer dans la macro faire Ctrl-V puis 'ECHAP'
j on redescend d'une ligne (on est donc de nouveau sur "Section k")

:/.*/#     &     #/^M

Cette fois-ci on passe une commande à ex via la séquence ':'
On fait un substitution de toute la ligne par la même ligne (&) encadrée des '#'
On termine cette partie en simulant l'appuie sur 'ENTREE' (^M)

j21i#^[

Comme au tout début de la macro, on descend ici d'une ligne et on insère 21 caractères '#'

Tu constateras qu'on alterne ici les commandes purement vi (déplacement via k et j, passage en mode insertion via i) et les commandes ex qui commencent toutes par ":"

Ca marche très bien avec les lignes de la forme "Section k" sans rien ni avant ni après.
Ca marche moins bien si la ligne à commenter compte plus ou moins de caractères que "Section k"
Je ne sais pas comment calculer le nombre de caractère de la ligne via vi...
Mais il est tout à fait possible d'écrire un petit script plus évolué avec sed ou awk et de l'invoquer ensuite sur ta ligne !

:. ! ./mon_super_programme_shell

Voilà je te souhaite une bonne continuation dans tes recherches !

Bonne aprem

Donut

P.S : tes clefs étaient égarées sur l'étagère à droite quand tu entres dans ton salon. De rien.

Dernière modification par DonutMan75 (Le 22/06/2017, à 13:57)

Hors ligne