Défis de rapidité avec Vim

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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.

Édité par Vayel

+4 -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.

+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

+0 -0

Bon je poste ma solution pour le premier défi, j'éditerai pour le second (ou pas).

2f,dt.

  1. On déplace le curseur sur la deuxième virgule avec 2f,
  2. On supprime jusqu'au point (non inclus) avec dt.
+0 -0

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.

Édité par Davidbrcz

+0 -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.

+0 -0

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

Édité par lmghs

+0 -0

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.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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