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.
相关产品推荐
相关产品推荐

