Команда выполнения Vim пропускает каждую вторую замену - PullRequest
0 голосов
/ 11 мая 2019

Я режу зубы на функциях, чтобы узнать больше о сценариях. Почему скрипт заменяет только каждое второе найденное слово? Я знаю, что есть лучшие способы заменить слово под курсором, например nnoremap <F6> :%s/<C-r><C-w>/, но вопрос остается. Я пытался использовать функцию замены (), но это не сработало вообще.

function! FReplace(rep)
    let f = expand("<cword>")
    echo "Find:" f "      Replace with:" a:rep
    execute "%s/"f"/"a:rep"/g"
endfunction

command! -nargs=1 Replace call FReplace(<f-args>)

Строка в фиктивном тексте изменяется только с

xxx xxx xxx xxx xxx xxx xxx xxx 

до

yyy xxx yyy xxx yyy xxx yyy xxx

но все они должны быть yyy.

1 Ответ

1 голос
/ 11 мая 2019

С :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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...