我正在摆弄 .vimrc,我有这样的想法:具有如下功能:
function Fill_line ()
execute "! printf '=%.0s' {1..10}"
endfunction
我的输出是:
Hello =test.cpp.0s
我希望它是:
==========
我也尝试过这个:
function Fill_line ()
execute "! printf '=\%.0s' {1..10}"
endfunction
我的问题是如何转义%
字符,以便它不会用文件名替换它。请记住,这是其他复杂功能的简化示例。
答案1
您应该使用两个反斜杠或使用单引号:
execute "! printf '=\\%.0s' {1..10}"
execute '! printf "=\%.0s" {1..10}'
你需要这个,因为当解析双引号字符串 ( "..."
) 时,vim 将删除任何不启动它知道的转义符的反斜杠(例如\n
或\x0a
),因此传递给命令的字符串execute
最终将是! printf '=%.0s' {1..10}
,并且将%
是替换为当前文件名。
答案2
作为替代方案,请考虑地图。我有这张地图,它强调了当前行:
map <Leader>= "ayy"ap:s/./=/g<CR>:nohlsearch<CR>
我的地图领导者是=
,所以我可以在正常模式下为当前行添加下划线==。
答案3
由于尚不清楚您要做什么:
将当前行填充
=
到第 80 列map _= :execute 'normal A' . repeat("=", (80-col("$")+1))<cr>
在当前行下划线:
map _= :co.<cr>Vr=
添加分隔符(80 个字符)
map _= :call append(line('.'), repeat("=", 80))<cr>
答案4
正如其他人已经正确回答的那样,%
需要转义,以便 Vim 不会将其替换为当前文件名(根据:help cmdline-special
),并且在双引号字符串内,反斜杠需要加倍。
然而,Vim 提供了:help shellescape()
为您完成工作的函数(并考虑全部特殊字符!):
execute "! printf " . shellescape("=%.0s",1) . " {1..10}"
在这里,你需要分别转义每个参数;对于裸机来说,printf
这是没有必要的,并且{1..10}
不得在 shell 中引用以进行扩展。
请注意,无需专门为printf
;付费。 Vim 有printf()
内置。