【发布时间】:2014-09-08 20:16:07
【问题描述】:
这是一个有点复杂的问题,但这里什么都没有! 我最近将我的 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”)添加测试?
【问题讨论】:
-
如果你禁用
PROMPT_COMMAND会停止吗? -
是的。万分感谢!好的,所以我将尝试添加一个挂钩来清除 shell 的环境变量。 (或者只是忍受没有窗口标题更新功能。)再次感谢!
-
也许可以让 emacs 理解该控制序列,但我什至不知道从哪里开始。我用vim。 =)
-
查看类似问题“在 ansi-term 中使用 ssh 时Shell 提示重复”的答案:stackoverflow.com/a/17598138/973603
标签: bash shell emacs command-prompt prompt