4
votes

vim laisse rechercher et remplacer par incrément

je voulais rechercher et remplacer, mettre en œuvre après le fil ici, malheureusement cela ne fonctionne pas. gVim trouver / remplacer par un compteur

Quelqu'un peut-il m'aider?

Travail

|-
| 1

|-
| 2

Ca ne fonctionne pas

|-
|

Pourquoi? comment masquer la fonction?

Exemple

{| class="wikitable"
! Number
! Name
! Type
! Default Value
! Duration
! Activation
! Status
! EDIT
|-
| 
| Adobe-Dummy-Cart-Total
| Custom Script
| 
| Pageview
| Active
| Approved
| Edit
|-
| 
| basePrice

Je veux remplacer

:let n=[0] | %s/|-\n|/BLABLA\=map(n,'v:val+1')/g

avec

:let n=[0] | %s/|-\n|/\=map(n,'v:val+1')/g


0 commentaires

3 Réponses :


2
votes

:help sub-replace-expression (c'est moi qui souligne)

Lorsque la chaîne de remplacement commence par "\ =", le reste est interprété comme une expression.

Vous ne pouvez pas faire ce que vous voulez; la chaîne de remplacement est soit une sous-expression (lorsqu'elle commence par \= ), soit un littéral (lorsqu'elle ne le fait pas).

Au lieu de cela, vous devez réécrire la sous-expression pour concaténer la chaîne par programme ( :help expr-. ):

:let n=[0] | %s/|-\n|\zs/\=" ".map(n,'v:val+1')[0]/g

[0] prendre le contenu du tableau produit par map est nécessaire pour deux raisons: le remplacement par un tableau introduira un saut de ligne indésirable, et rendra la concaténation avec une chaîne impossible.

Pour votre exemple cependant, cela peut ne pas être nécessaire, si vous n'introduisez aucune chaîne en plus du nombre - c'est-à-dire si vous n'avez pas besoin de cet espace ( :help /\zs ):

:let n=[0] | %s/|-\n|\zs/\=map(n,'v:val+1')[0]/g

Bien sûr, vous pouvez combiner les deux, pour une solution démoisturisée parfaite à votre situation spécifique:

:let n=[0] | %s/|-\n|/\="BLABLA".map(n,'v:val+1')[0]/g


4 commentaires

+1, excellente réponse! Merci! une très bonne explication. Cela m'a beaucoup aidé. Merci. J'ai fait quelques recherches par la suite et je suis tombé sur l'explication ici. jeffkreeftmeijer.com/vim-reformat-dates


Vous êtes parvenu aux bonnes conclusions, mais la mention de /\= regexp multi au début est juste déroutante et fausse, car c'est dans la partie de remplacement , pas dans la partie de motif .


@IngoKarkat Oh dieux tu as raison ... Je dois être surmené pour confondre ces deux lol ... Merci pour la mise en garde


Surmené un lundi matin ... oh c'est mauvais! Mieux vaut prendre toute la semaine ;-)



2
votes

Lorsque vous utilisez :help sub-replace-expression , le remplacement entier doit être une expression Vimscript (qui commence par \= ). Vous ne pouvez pas simplement ajouter du texte de remplacement (comme dans BLABLA\=map(n,'v:val+1') . Utilisez plutôt la concatentation de chaînes. Une complication avec votre approche de map est que cela renvoie une liste, pas une chaîne, nous avons donc besoin pour sélectionner le seul élément (compteur) de la liste. Pour faire référence au texte correspondant existant, utilisez submatch(0) au lieu de \0 ou & (ou évitez d'avoir besoin d'une référence en utilisant à la place \zs à la fin du modèle ).

:let n=[0] | %s/|-\n|/\=submatch(0) . " " . map(n,'v:val+1')[0]/g


2 commentaires

+1 pour une explication exacte! Bonjour Ingo, merci pour la bonne réponse et une explication détaillée. Maintenant je comprends ce que cela veut dire. Traitera certainement plus le sujet.


Ah, content de pouvoir aider! Veuillez accepter une réponse (celle que vous préférez) en cliquant sur la coche indiquée. De cette façon, la question est marquée comme fermée et vous augmentez vos chances d'obtenir des réponses aux questions futures, car cela montre que vous vous souciez des réponses.



0
votes

En utilisant \zs nous pouvons faciliter la solution

:let c=1 | g/^|-\n|\zs/ s//\=' '.c/g | let c+=1

^ ............ start of line
\n ........... line break
|  ........... vertical bar

Nous concaténons un espace \=' ' avec le compteur c


0 commentaires