我正在全力以赴地学习有关脚本的更多信息。为什么脚本只替换找到的第二个单词?
我知道有更好的方法来替换光标下的单词,例如nnoremap <F6> :%s/<C-r><C-w>/
,但问题仍然存在。
我尝试使用了replace()函数,但是那根本不起作用。
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
。
答案 0 :(得分:1)
来自: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"