防止 vim 将 % 替换为文件名

防止 vim 将 % 替换为文件名

我正在摆弄 .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

由于尚不清楚您要做什么:

  1. 将当前行填充=到第 80 列

    map _= :execute 'normal A' . repeat("=", (80-col("$")+1))<cr>
    
  2. 在当前行下划线:

    map _= :co.<cr>Vr=
    
  3. 添加分隔符(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()内置。

相关内容