首页 > 解决方案 > Vim 脚本执行命令每隔一秒替换一次

问题描述

我正在研究函数以了解有关脚本的更多信息。为什么脚本只替换找到的第二个单词?我知道有更好的方法来替换光标下的单词,例如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

标签: vim

解决方案


来自: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"

推荐阅读