С :help :execute
:
Несколько аргументов объединяются с пробелом в
между. Чтобы избежать лишних пробелов, используйте "."
оператор для объединения строк в один аргумент.
Это означает, что если f
равно 'xxx'
и a:rep
равно 'yyy'
,
execute "%s/"f"/"a:rep"/g"
эквивалентно
execute "%s/ xxx / yyy /g"
который просто запускается
%s/ xxx / yyy /g
Здесь (отмечены ^
) все совпадения в строке данных примера:
xxx xxx xxx xxx xxx xxx xxx xxx
^^^^^ ^^^^^ ^^^^^
Каждое второе слово не соответствует, потому что пробелы являются частью совпадения и совпадения не могут перекрываться.
Исправление - дать :execute
одну строку без лишних пробелов:
execute "%s/" . f . "/" . a:rep . "/g"