gpt4 book ai didi

bash - emacs 终端 bash (PS1) 提示重复

转载 作者:行者123 更新时间:2023-12-03 22:47:54 24 4
gpt4 key购买 nike

这是一个有点令人费解的问题,但这里什么也没有!
我最近将我的 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”)添加测试?

最佳答案

错误来自 export PROMPT_COMMAND=...陈述。

您可以通过检查您是否在 emacs 中运行 shell 来避免在您的配置中读取此信息。这里的环境变量INSIDE_EMACS变得方便。来自 Emacs 手册( Sect. 32.7 ):

Emacs sets the environment variable INSIDE_EMACS in the subshell to ‘version,comint’, where version is the Emacs version (e.g., ‘24.1’). Programs can check this variable to determine whether they are running inside an Emacs subshell



在你的例子中,你想要 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变量设置为您想要的值。

关于bash - emacs 终端 bash (PS1) 提示重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24812345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com