vim пусть ищет и заменяет с приращением - PullRequest
0 голосов
/ 28 января 2019

Я хотел найти и заменить, внедрить после темы здесь, к сожалению, это не работает. gVim найти / заменить счетчиком

Кто-нибудь может мне помочь?

Работает

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

Не работает

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

Почему?как мне замаскировать функцию?

Пример

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

Я хочу заменить

|-
|

на

|-
| 1

|-
| 2

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Когда вы используете :help sub-replace-expression, замена full должна быть выражением Vimscript (которое начинается с \=).Вы не можете просто добавить текст для замены (как в BLABLA\=map(n,'v:val+1'). Вместо этого используйте конкатенацию строк. Сложность вашего подхода map заключается в том, что он возвращает список, а не строку, поэтому нам нужно выбрать единственный (встречный) элементСписок. Чтобы обратиться к существующему сопоставленному тексту, используйте submatch(0) вместо \0 или & (или избегайте необходимости ссылки, используя вместо этого \zs в конце шаблона).

:let n=[0] | %s/|-\n|/\=submatch(0) . " " . map(n,'v:val+1')[0]/g
0 голосов
/ 28 января 2019

:help sub-replace-expression (выделено мной)

Когда замещающая строка начинается с "\ =", остаток интерпретируется как выражение.

Вы не можете делать то, что хотите;замещающая строка является либо подвыражением (когда оно начинается с \=), либо литералом (если это не так).

Вместо этого вам нужно переписать подвыражение, чтобы объединить строку программным путем (:help expr-.):

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

[0] для получения содержимого массива, созданного с помощью map, необходимо по двум причинам: замена на массив приведет к нежелательному переводу строки и сделает невозможной конкатенацию со строкой.

Для вашего примера, однако, это может не понадобиться, если вы не вводите какую-либо строку, кроме числа - то есть, если вам не нужно это пространство (:help /\zs):

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

Конечно, вы можете комбинировать их, чтобы получить идеальное демо-увлажненное решение для вашей конкретной ситуации:

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