You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Vim使用:redir重定向外部命令输出时\n转\r\n的解决方法咨询

解决Vim :redir捕获外部命令输出时\n转\r\n的问题

这个问题我之前在Linux环境下折腾Vim时踩过坑!本质是Vim处理外部命令和内部命令输出的逻辑不一样:内部命令的输出直接遵循Vim当前环境的换行规则(Linux下是LF),但执行外部命令时,Vim会默认把外部命令的输出换行符从LF(\n)转换成CRLF(\r\n),导致插入缓冲区后出现讨厌的^M。

给你几个实用的解决办法,按简单到进阶排序:

方法1:捕获后手动清除\r字符

这是最直接的临时解决方案,在捕获到变量后,用Vim的字符串替换函数把所有多余的\r去掉:

redir => m
silent !echo -e "Hallo\nCiao"
redir END
let m = substitute(m, '\r', '', 'g')  " 移除所有回车符
put =m

这种方式不需要修改任何全局设置,适合单次临时使用的场景。

方法2:使用system()函数替代:redir

Vim内置的system()函数专门用来执行外部命令并捕获输出,它在Linux环境下默认会返回LF格式的字符串,不会自动添加\r,完美避开这个问题:

let m = system('echo -e "Hallo\nCiao"')
put =m

这个方法比:redir更简洁,而且天生适配Linux的换行规则,我个人日常用得最多。

方法3:修改Vim的shell相关选项

如果经常需要用:redir捕获外部命令输出,可以调整Vim的shellredir选项,强制外部命令输出直接以原生格式写入,不进行换行符转换。在你的~/.vimrc里添加一行:

set shellredir=>%s 2>&1

这个设置会改变Vim重定向外部命令输出的方式,让输出直接以Linux原生的LF格式被捕获,后续再用:redir就不会出现^M了。如果只是临时测试,也可以在Vim里直接执行:set shellredir=>%s 2>&1,只在当前会话生效。

内容的提问来源于stack exchange,提问作者DaviD.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:39:19