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