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

重装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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:27:52