通过Cygwin SSH连接Linux服务器使用vim时首字符被替换为g的问题
问题原因
该现象不属于Vim或Linux服务器的bug,是旧版本Cygwin终端的控制序列响应格式,和远程服务器上Vim的终端能力协商逻辑不匹配导致的:Vim启动时会向终端发送查询请求获取设备属性/光标位置/版本信息,Cygwin 3.1.7版本返回的响应序列不符合标准xterm的格式规范,Vim无法识别为控制指令,直接把序列内容当成普通键盘输入处理,就出现了首字符被替换为g、命令行出现:000/000/000^G这类异常内容的问题。
可行解决方案
- 修正TERM环境变量
你正常工作的Linux桌面使用的TERM类型为xterm-256color,而Cygwin默认使用xterm,终端能力集不匹配会加重协商异常。可以在Cygwin的~/.bashrc中添加以下配置永久生效:
临时测试可以在SSH连接时直接指定:export TERM=xterm-256colorTERM=xterm-256color ssh 你的用户名@服务器地址。 - 禁止Vim请求终端版本报告
在远程服务器的~/.vimrc中添加一行配置,直接跳过终端版本查询流程,从根源避免异常响应被当成输入:set t_RV= - 修正远程终端的UTF8属性
你登录服务器后stty输出显示没有开启iutf8属性,和Cygwin本地的终端配置不一致,登录服务器后执行stty iutf8即可临时修复,也可以把该命令添加到服务器端~/.bashrc中永久生效。 - 禁用Cygwin终端的鼠标事件上报
如果你使用Cygwin默认的mintty终端,右键窗口标题→选项→终端,关闭鼠标位置上报选项,也可以在Cygwin的~/.minttyrc中添加MouseMode=none永久生效。 - 升级Cygwin版本
你当前使用的Cygwin 3.1.7是2020年的旧版本,后续版本已经修复了大量终端控制序列兼容问题,升级到最新稳定版即可直接解决该问题。
内容的提问来源于stack exchange,提问作者user3273814
相关产品推荐
相关产品推荐

