Vi/Vim中如何映射v:val与字符串?能否用put+map+range实现指定输出?
Vim中结合put、map、range实现逐行拼接输出的方法
你直接执行:put=map(range(5), '"No" . v:val')无法正常工作的核心原因是:map()返回的是列表对象,:put命令默认会将整个列表作为单行内容插入,而非逐行输出列表中的每个元素。
要实现和:for i in range(5) | put="No ".i | endfor完全一致的输出效果,有两种实用方法:
方法1:用join()转换列表为换行分隔的字符串
通过join()把map()生成的每个拼接结果用换行符连接,再传给:put命令,就能逐行插入内容:
:put=join(map(range(5), '"No " . v:val'), "\n")
执行后会得到预期输出:
No 0 No 1 No 2 No 3 No 4
(注意表达式里的"No "带空格,避免拼接后出现No0这类无间隔的内容)
方法2:用execute批量执行put命令
通过map()生成每个元素对应的put命令字符串,再用execute执行这些命令:
:execute join(map(range(5), '":put=\"No " . v:val . "\""'), '|')
这种方式等价于把原for循环的逻辑用map批量生成命令后执行,效果和原命令完全一致。
内容的提问来源于stack exchange,提问作者Zachwhitman
相关产品推荐
相关产品推荐

