mintty下启动emacs shell mode后,垃圾字符问题

十年以后,重回emacs怀抱,会了。

在mintty下启动emacs的shell mode以后,总会在提示符之前显示几个固定的垃圾字符。

term和ansi-term也一样,网上搜索了很久也没有解决办法。


仔细分析以后发现,系统home下面的.bashrc里PS1变量最前面一段

\[\e]0;\w\a\]

其实是给xterm或者说给mintty修改title用的,下面是我用MSYS2系统的时候完整的PS1变量

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[35m\]$MSYSTEM\[\e[0m\] \[\e[33m\]\w\[\e[0m\]\n\$ '

当我们启动emacs的shell mode以后,无法解析到最前面这几个字符。所以这几个字符就无情的显示在emacs的shell中了。

于是我想到了在emacs中重新定义PS1这个变量,也就是把seten的函数饮用一下放到emacs的启动elisp中,

(setenv "PS1" "XXXX")
不过很悲惨地,你可以在emacs中通过M-x getenv看到这个变量,但是无法应用在emacs的shell中。于是,,,于是郁闷很久。

一天我上网突然看到有人在.bashrc中通过判断term的类型来重新定义PS1,感觉曙光就在眼前了。我把之前的PS1变量的设置方法重新写了一下

case $TERM in 
 (xterm*) set_title='\[\e]0;\w\a\]'
           (*) set_title=
esac
PS1=$set_title'\n\[\e[32m\]\u@\h \[\e[35m\]$MSYSTEM\[\e[0m\] \[\e[33m\]\w\[\e[0m\]\n\$ '


也就是说,如果我当前执行的term不时xterm这类的,我就把之前设定title的字符移除。

结论当然是肯定的,从此以后emacs的shell,term,ansi-term都干净了。而且原来mintty的title还可以继续显示用户的当前目录

mintty下启动emacs shell mode后,垃圾字符问题_第1张图片



你可能感兴趣的:(cygwin,emacs,xterm,msys2,mintty)