问题
i wanted to search and replace, implement after the thread here, unfortunately it does not work. gVim find/replace with counter
Can anyone help me?
Working
:let n=[0] | %s/|-\n|/\=map(n,'v:val+1')/g
Not working
:let n=[0] | %s/|-\n|/BLABLA\=map(n,'v:val+1')/g
Why? how do I mask the functionon?
Example
{| class="wikitable"
! Number
! Name
! Type
! Default Value
! Duration
! Activation
! Status
! EDIT
|-
|
| Adobe-Dummy-Cart-Total
| Custom Script
|
| Pageview
| Active
| Approved
| Edit
|-
|
| basePrice
I wana replace
|-
|
with
|-
| 1
|-
| 2
回答1:
When you use :help sub-replace-expression, the entire replacement must be a Vimscript expression (that starts with \=
). You cannot just prepend replacement text (as in BLABLA\=map(n,'v:val+1')
. Use string concatentation instead. A complication with your map
approach is that this returns a List, not a String, so we need to select the only (counter) element of the List. To refer to the existing matched text, use submatch(0)
instead of \0
or &
(or avoid the need for a reference by using \zs
at the end of the pattern instead).
:let n=[0] | %s/|-\n|/\=submatch(0) . " " . map(n,'v:val+1')[0]/g
回答2:
:help sub-replace-expression
(emphasis mine)
When the substitute string starts with "\=" the remainder is interpreted as an expression.
You cannot do what you want; the replacement string is either a subexpression (when it starts with \=
), or a literal (when it does not).
Instead, you need to rewrite the subexpression to concatenate the string programmatically (:help expr-.
):
:let n=[0] | %s/|-\n|/\="BLABLA".map(n,'v:val+1')[0]/g
[0]
to take the content of the array produced by map
is necessary for two reasons: replacing with an array will introduce an unwanted newline, and make concatenation with a string impossible.
For your example though, it may not necessary, if you are not introducing any string besides the number - i.e. if you don't need that space (:help /\zs
):
:let n=[0] | %s/|-\n|\zs/\=map(n,'v:val+1')[0]/g
Of course, you can combine the two, for a perfect demoisturised solution to your specific situation:
:let n=[0] | %s/|-\n|\zs/\=" ".map(n,'v:val+1')[0]/g
回答3:
Using \zs
we can make the solution easier
:let c=1 | g/^|-\n|\zs/ s//\=' '.c/g | let c+=1
^ ............ start of line
\n ........... line break
| ........... vertical bar
We are concatenating a space \=' '
with the counter c
来源:https://stackoverflow.com/questions/54398235/vim-let-search-and-replace-with-increment