2014-07-17 66 views
1

这是一个复杂的问题,但这里什么都没有! 我最近更新了我的bash提示符,出现在此主题的最后一篇文章中的漂亮版本:Bash: custom PS1 with nice working directory path。 相关的bash代码(从该线程后)在这里被复制:emacs终端bash(PS1)提示重复

# define the awk script using heredoc notation for easy modification 
MYPSDIR_AWK=$(cat << 'EOF' 
BEGIN { FS = OFS = "/" } 
{ 
    if (length($0) > 16 && NF > 4) 
     print $1,$2,".." NF-4 "..",$(NF-1),$NF 
    else 
     print $0 
} 
EOF 
) 

# my replacement for \w prompt expansion 
export MYPSDIR='$(echo -n "${PWD/#$HOME/~}" | awk "$MYPSDIR_AWK")' 

# the fancy colorized prompt: [0 [email protected] ~]% 
# return code is in green, [email protected] is in bold/white 
export PS1='[\[\033[1;32m\]$?\[\033[0;0m\] \[\033[0;1m\]\[email protected]\h\[\033[0;0m\] $(eval "echo ${MYPSDIR}")]% ' 

# set x/ssh window title as well 
export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"' 

此提示看起来大致是这样(在非emacs的终端):

[0 [email protected] ~/my_dir]% 

其中“0”以上绿色和“用户@主机”为粗体。 (注意“0”可以是各种数字,并且表示最后一个命令的返回值。)

我遇到的问题特定于在emacs中运行的shell(对于大多数变体emacs中的终端交互:'term','ansi-term','shell'和'eshell')。 提示出现两次(和稍微打破)在emacs的终端,像这样:

0;[email protected] ~/my_dir[0 [email protected] ~/my_dir]% 

提示,所述的“第二”版本从开始并包括“[”看起来就好了。 这是前面的文字,它没有任何样式(即没有绿色和没有粗体)。 因此,emacs必须将提示的某些部分解释为输入,并且我的猜测是连接到提示的“0”和“user @ host”部分的颜色或粗体转义指示符?

任何人都知道如何告诉emacs正确解释转义? 或者,或者,如何修改提示设置命令,使两个emacs不会讨厌它,它仍然可以在非emacs终端工作? 也许甚至有另一种选择:如何使用emacs友好的已修改字符串为终端类型添加测试(emacs中的'eterm-color')?

+0

如果您禁用'PROMPT_COMMAND',这会停止吗? –

+0

是的。万分感谢! 好吧,我只是试着添加一个钩子来清除shell的环境变量。 (或者只是住在没有窗口标题更新功能的地方。) 再次感谢! – mmuurr

+0

有可能让emacs理解控制顺序,但我甚至不知道从哪里开始。我使用vim。 =) –

回答

1

额外显示来自PROMPT_COMMAND变量的内容。 emacs似乎不理解OSC 0标题设置xterm转义序列,因此打印输出。

3

错误来自export PROMPT_COMMAND=...声明。

通过检查是否有在emacs内部运行的shell,可以避免在配置中读取此内容。这里环境变量INSIDE_EMACS变得方便。从Emacs手册(Sect. 32.7):

Emacs的设置环境变量INSIDE_EMACS在壳层为“版本,通信情报”,其中版本是版本的Emacs(例如,'24 0.1’ )。程序可以检查此变量,以确定它们是否在Emacs中运行子shell

在你的榜样,你要 export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"只有当你不在的emacs被执行,否则,你得到这个讨厌的“双重提示”。代码中的以下条件语句将有所帮助。

if [ -z "$INSIDE_EMACS" ]; 
then 
    export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"' 
else 
    export PROMPT_COMMAND='' 
fi 

它检查不管你是不是在Emacs,才把PROMPT_COMMAND变量设置为你想要的值。