emacs 终端 bash (PS1) 提示重复

mmu*_*urr 4 emacs bash shell prompt command-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"'
Run Code Online (Sandbox Code Playgroud)

此提示大致如下(在非 emacs 终端中):

[0 user@host ~/my_dir]%
Run Code Online (Sandbox Code Playgroud)

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

我遇到的问题特定于在 emacs 中运行的 shell(并且它发生在 emacs 中终端交互的大多数变体中:“term”、“ansi-term”、“shell”和“eshell”)。提示在 emacs 终端中出现两次(并且略有中断),如下所示:

0;user@host ~/my_dir[0 user@host ~/my_dir]%
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*enz 5

错误来自export PROMPT_COMMAND=...语句。

您可以通过检查您是否在 emacs 中运行 shell 来避免在您的配置中读取此信息。在这里,环境变量INSIDE_EMACS变得很方便。来自 Emacs 手册(第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 中时被执行,否则您会得到这个讨厌的“双重提示”。代码中的以下条件语句会有所帮助。

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

它会检查您是否不在 emacs 中,然后才将PROMPT_COMMAND变量设置为您想要的值。