emacs终端bash(PS1)提示重复

时间:2014-07-17 19:52:24

标签: bash shell emacs command-prompt prompt

这是一个令人费解的问题,但这里什么都没有! 我最近将我的bash提示更新为该帖子的最后一篇文章中出现的漂亮版本:Bash: custom PS1 with nice working directory path。 相关的bash代码(来自该帖子的帖子)在这里被复制:

# 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 user@host ~]%
# return code is in green, user@host is in bold/white
export PS1='[\[\033[1;32m\]$?\[\033[0;0m\] \[\033[0;1m\]\u@\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 user@host ~/my_dir]%

上面的“0”为绿色,“user @ host”为粗体。 (注意,“0”可以是各种数字,并表示最后一个命令的返回值。)

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

0;user@host ~/my_dir[0 user@host ~/my_dir]%

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

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

2 个答案:

答案 0 :(得分:4)

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

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

  

Emacs将子shell中的环境变量INSIDE_EMACS设置为'version,comint',其中version是Emacs版本(例如,'24 .1')。程序可以检查此变量以确定它们是否在Emacs子shell中运行

在您的示例中,您想要 export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"仅在您不在emacs时执行,否则您会得到这个令人讨厌的&#34;双提示&#34;。代码中的以下条件语句将有所帮助。

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变量设置为您想要的值。

答案 1 :(得分:0)

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