在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还可以继续显示用户的当前目录