如何使用Vim substitute()和&;注释字符串

如何使用Vim substitute()和&;注释字符串,vim,plugins,string-substitution,Vim,Plugins,String Substitution,我一直在尝试编写一个vimscript,它读取shell命令(figlet)的输出,并注释其中的每一行。我想使用&commentstring变量,因为我想让这个脚本处理任何文件类型 到目前为止,我只取得了前后不一致的结果。下面是一个示例: 提示用户输入其姓名首字母,并将其传递给shell命令figlet,以便在文件顶部打印ascii艺术: 输出如下(例如:缩写=JT): 获取输出的行数: 使用vim函数substitute()注释每一行: 正如你所看到的,它在最后一行之前运行良好,我不明白为什么

我一直在尝试编写一个vimscript,它读取shell命令(
figlet
)的输出,并注释其中的每一行。我想使用
&commentstring
变量,因为我想让这个脚本处理任何文件类型

到目前为止,我只取得了前后不一致的结果。下面是一个示例:

  • 提示用户输入其姓名首字母,并将其传递给shell命令
    figlet
    ,以便在文件顶部打印ascii艺术:
  • 输出如下(例如:缩写=JT):

  • 获取输出的行数:
  • 使用vim函数
    substitute()
    注释每一行:
  • 正如你所看到的,它在最后一行之前运行良好,我不明白为什么。也许有更好的方法来解决这个问题。不管怎样,如果有人能帮我解决这个小问题,我会非常感激的

    它在最后一行之前一直运行良好,我不明白为什么

    最后一行包含反斜杠。并根据
    :h sub replace special
    对其进行修改。所以,至少,你必须用另一个来逃避它。有点像
    转义(getline('.'),'\')
    。然而,对于这种特殊情况,我更愿意使用
    printf
    ,因为它看起来更简单、更自然:
    printf(&cms,“\t”。.getline(“.”…\t”)

    此外,也不需要“while”循环,因为许多命令和函数都接受行范围:它更有效,更易于编写

    也许有更好的方法来解决这个问题

    这看起来更好:

    call append(0, map(systemlist("figlet -W "..toupper(g:initials)),
        \ {_, v -> printf(&cms, "\t" .. v .. "\t")}))
    

    Printf工作完美!非常感谢。尽管如此,我还是想试试你建议的解决方案。通过列表映射似乎更有效。但是,我不明白最后一行:
    \{uuv,v->printf(&cms,“\t”.v..“\t”))
    你能解释一下吗?@johannesthysen See
    :h lambda
    明白了!谢谢最后一个问题:为什么用两个点来连接而不是一个点?@johannesthysen这两种方法都有效。但是一个点可能是不明确的。这就是为什么
    x。y
    比x.y更受欢迎。有了两个点,您可以在
    x..y
    x。。y
    。另请参见
    :h expr5
          _   _____ 
         | | |_   _|
      _  | |   | |  
     | |_| |   | |  
      \___/    |_|  
    
    let s:line_count = system("figlet -W " . g:signit_initials . "| wc -l")
    
    let s:i = 1
    while s:i < s:line_count
    execute 'silent' . s:i . 's/^.*$/\=substitute(&commentstring, "%s", "\t" . getline(".") . "\t", "")'
    let s:i += 1
    endwhile
    
    /*      _   _____ */
    /*     | | |_   _|*/
    /*  _  | |   | |  */
    /* | |_| |   | |  */
    /*  ___/    |_|  */
    
    call append(0, map(systemlist("figlet -W "..toupper(g:initials)),
        \ {_, v -> printf(&cms, "\t" .. v .. "\t")}))