重装Windows Terminal和WSL后Vim出现^M及缩进异常求助
解决Vim中^M字符与缩进异常问题
问题根源
你遇到的M是Windows换行符(CRLF)中的CR字符,重装WSL和Terminal后,剪贴板同步或文件格式识别逻辑变化,导致Vim未自动转换换行格式;而缩进异常是因为文件处于dos格式时,Vim的默认缩进规则会覆盖`.vimrc`里的设置,移除M后文件回到unix格式,缩进才恢复正常。
一、彻底清除已有^M字符
set ff=unix仅设置文件的格式标记,不会自动删除已存在的^M,必须手动全局替换:
- 在Vim中执行:
:%s/\r//g,回车确认后执行:w保存。该命令会批量删除所有行尾的CR字符,将文件转为纯LF换行。
二、强制Vim默认使用Unix格式
修改.vimrc,添加以下配置,从根源避免CRLF格式的文件出现:
" 优先使用Unix文件格式,兼容dos格式 set fileformats=unix,dos " 强制保存时转换为Unix格式 autocmd BufWritePre * :set fileformat=unix " 默认打开文件时使用Unix格式 set fileformat=unix
这样不管你从Windows剪贴板粘贴内容,还是打开旧的CRLF格式文件,保存时都会自动转为Unix换行。
三、锁定缩进配置,避免被格式默认值覆盖
在.vimrc中明确缩进规则,确保优先级高于Vim针对dos格式的默认设置:
" 基础缩进设置(2空格) set tabstop=2 set shiftwidth=2 set softtabstop=2 set expandtab " 自动继承缩进 set autoindent set smartindent
把这些配置放在.vimrc的末尾,避免被其他插件或系统配置覆盖。
四、检查Windows Terminal的WSL配置
打开Windows Terminal的设置,找到你的WSL分发版配置:
- 进入「高级」选项,将「换行符转换」设置为「自动」或「Unix」,避免Terminal在剪贴板同步时强制插入Windows换行符。
五、排查配置冲突(如果以上无效)
如果问题仍存在,先排除.vimrc的冲突:
- 启动Vim时跳过本地配置:
vim -u NONE - 手动设置缩进和文件格式:
set tabstop=2 shiftwidth=2 fileformat=unix - 测试
o/Shift+o的缩进是否正常,粘贴内容是否有^M
如果此时正常,说明你的.vimrc中有冗余配置,逐步注释掉部分内容排查冲突点。
内容的提问来源于stack exchange,提问作者Nicolas Pardo
相关产品推荐
相关产品推荐

