Défis de rapidité avec Vim

a marqué ce sujet comme résolu.

Bonjour bonjour !

Je propose ici de se lancer des défis avec Vim : vous avez tel texte, devez faire telles modifications, et ce en le moins de commandes possibles (ou, plus précisément, en la suite de commandes la plus pratique à effectuer). Cela permettra aux débutants de découvrir des commandes et des combinaisons, et aux experts de partager leurs connaissances.

L'idée vous plait-elle ?

Les défis

Pour chaque défi, votre curseur se situe, avant de faire votre/vos commande(s), à la colonne 0 de la ligne 0.

1. Supprimer la fin d'une phrase

Vous disposez du texte suivant :

1
Au début, je suis une phrase. Je suis une phrase au milieu, dont la fin souhaiterait être effacée. Une phrase à la fin, et munie d'une virgule.

Comment obtenez-vous le texte suivant ?

1
Au début, je suis une phrase. Je suis une phrase au milieu. Une phrase à la fin, et munie d'une virgule.

2. 80 colonnes, pas une de plus !

Comment faire en sorte que la longueur des lignes du texte suivant ne dépasse pas la 80è colonne et s'en rapproche le plus possible, sachant qu'il s'agit de Markdown et qu'un retour à la ligne n'affecte pas le rendu autrement qu'en ajoutant une espace entre le dernier mot d'une ligne et le premier de la suivante (on ne conservera donc pas de trailing whitespaces, c'est-à-dire que notre ligne ne doit pas se terminer par une espace) ?

1
2
3
4
5
Honnêtement, j'ignore quoi écrire comme texte ici, donc je vais mettre **n'importe quoi**. Vous ne m'en voulez pas j'espère ?

Le cas échéant, je vous invite cordialement à rager dans votre coin : les cacas nerveux, c'est pas pour les zesteux !

Une phrase courte.

Le rendu doit être le suivant, si je ne me suis pas trompé.

1
2
3
4
5
6
7
Honnêtement, j'ignore quoi écrire comme texte ici, donc je vais mettre
**n'importe quoi**. Vous ne m'en voulez pas j'espère ?

Le cas échéant, je vous invite cordialement à rager dans votre coin : les cacas
nerveux, c'est pas pour les zesteux !

Une phrase courte.
+5 -0

Si tu ne connais pas, cherche vimgolf. Il y avait des défis avec collecte des réponses sur twitter si mes souvenirs sont justes – c'est cause de ça que j'ai fini par ouvrir un compte sur twitter … que je n'ai jamais utilisé finalement.

Sinon, il y a une grosse différence entre court et pratique avec vim.

Je jetterai un coup d'oeil, merci.

J'ai ajouté deux défis au premier message. N'hésitez pas à poster vos solution en balise cachée, avec si possible des explications. :)

+0 -0

1.

Réponse pourrie:

1
s/u,.*ée./u./

ou pire:

1
f,;dt.

Pour les actions génériques, cela sera (qui va virer de la virgule (inclue) au point (exclu) de la seconde phrase).

1
s/^.\{-}\..\{-}\zs,.\{-}\ze\.//

Comme quoi, court ne veut dire ni clair, ni réutilisable.

2.

En positionnant &tw à 80, puis en appliquant un reformatage sur tout le texte. gggqG. Soit

1
2
3
4
5
" à mettre dans ftplugin/markdown.vim, voire juste set tw=80 dans le .vimrc
setlocal tw=80

" puis en mode édition
gggqG

Bonne idée de topic ! Avec Emacs, car je n'utilise pas vi(m).

Défi 1

1
C-M-% [Enter],[^\.]*\. [Enter] .  [n] [y] [n]

Avec C-M-% = query-replace-regexp et [X] = signifie presser la touche X. Si jamais y'avait plus de 3 occurrences, un C-g pour arrêter la commande après.

Mais ca reste typiquement le genre de chose que je fais en déplaçant la marque pour une phrase. Si j'ai 15 phrases à éditer, alors oui je vais chercher la commande.

Défi 2

1
C-space M-> M-q

Pose la marque, va à la fin du buffer, et un coup de fill-paragraph pour justifier le texte.

+1 -0

Y pas à dire. vim est moins verbeux pour ce genre de choses. Moins puissants pour d'autres, mais moins verbeux pour ça

lmghs

Il n'y aucune garantie d'optimalité dans ma réponse : c'est le mieux auquel j'ai pensé. Après quand je regarde tes réponses, je trouve que c'est quand même vachement abscons.

Pas tant que ça. Si on mets de côté le ';' qui dit de recommencer un mouvement 't'ill ou 'f'orward. On peut aussi dire '2'twice 'F'orward to ',' and 'd'elete 't'ill '.' – solution de olzd. Pratiquement la moitié des commandes ont une origine mnémotechnique.

Quand on fait du substitute, la syntaxe est pratiquement la même que celle de sed, mais avec des trucs sympas en plus comme 'z'one 's'tart et 'z'one 'end, et \{-} pour dire le moins possible.

Pour le reformattage, là, pas grand chose à par savoir que doubler certaines actions a toujours des effets particulier. doubler 'g' est un goto beginning. Et grand 'G' un goto end. Choses que l'on retrouve aussi sous less, IIRC

Pour le premier, il est probable que la deuxième proposition de lmghs soit la meilleur possible.

Pour le deuxième, j'ai une solution qui ne fonctionne que sur l'exemple, mais qui ne nécessite pas de redéfinir quoi que ce soit :

t*r[Enter]25Wh.

  • t* pour aller jusqu'au caractère précédent la première étoile
  • r[Enter] pour remplacer le caractère par un retour à la ligne
  • 25W pour avancer de 25 mots (on arrive sur le premier caractère de nerveux
  • h pour reculer d'un caractère
  • . pour répéter la dernière action (remplacer par un retour à la ligne)

Au passage, pour appuyer lmghs, il y a d'autres commandes qui sont les mêmes avec less que celle de vim. Je pense par exemple à la recherche via / ou ? et l'utilisation de n et N pour aller au résultat précédent et suivant. Au passage, le fait d'utiliser v pour éditer le fichier courant fait quand même fortement penser au v de vim.

Déso, je déterre une vieille discussion pour apporter mon zeste.

Salut,

Pour le deuxième défi :

:%!fmt -s -w 80

Bon, cela fait appel à une commande externe, mais ça marche. :-°

Taurre

Attention que -s de l’implémentation GNU n’est pas la même que celle de l’implémentation BSD…
Sinon, c’est la solution à laquelle j’ai pensé …parce-que utilisant souvent d’autres clones de Vi que Vim. Si fmt n’est pas disponible (j’ai eu le cas sur des NAS que je ne nommerai pas), on peut se rabattre sur fold qui est une commande POSIX et est présent dans BusyBox ^^

:%!fold -s -w 80

Je ne classe pas le positionnement de tw à 80 pour le markdown (ou autre) comme une redéfinition, mais un réglage correct de l’outil à notre disposition.

lmghs

Je ne sais pas pourquoi ce réglage serait plus correct que d’autres, chacun devant avoir un réglage qui maximise son confort… Sinon, pour un truc purement Vim, je pense que quelque chose comme ceci devrait faire l’affaire :

:set textwidth=80
gg
gqG
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte