我有一个脚本,当运行时有时/often 在遇到此行时输出“未转义的”ANSI 转义序列:
vim -X -u NONE -c "helptags ~/.vim/plugged/vim-fugitive/doc" -c q
结果如下:
我不知道为什么会发生这种情况,因为单独运行该命令似乎永远不会产生这种“垃圾”。只有当线路运行时才会发生这种情况;注释掉它可以消除该问题。更奇怪的是,它有时不会发生。这可能是件好事,然后我做点什么,结果就出现了。运行脚本的输出很好。然而,一旦它显现出来,它似乎是持久的(*不是真的,见下文)......打开另一个终端选项卡通常会显示问题。
知道这里发生了什么吗? vim 是否没有获取某些终端设置($TERM
?)并干扰输出?还是还有其他事情发生?
我的彩色输出实用函数是这里,应该重要吗?
编辑:
- 事实证明,将
PS1
提示更改为类似的内容$
会使问题在出现时消失,但是将提示重新设置为彩色提示并没有使问题回来,所以我很难在这里找到一些确定性。
PS1提示设置 已经完成了这里:
set_prompt(){
local user=$(green "\u")
local host=$(dark_yellow "\h")
local workdir=$(pink "\w")
local gitbranch=$(dark_red \$\(__git_ps1 "\(%s\)" \))
local at=$(dark_grey at)
local in=$(dark_grey in)
export PS1="\n${user} ${at} ${host} ${in} ${workdir} ${gitbranch}"$'\n\$ '
}
# Now set it. If any of these colors are later overridden, then just rerun `set_prompt`
set_prompt
和用途这些效用函数和变量:
# Color escape codes @see http://misc.flogisoft.com/bash/tip_colors_and_formatting
# Use \033 instead of \e. Workes better across platforms
# \e works in PS1 prompts, but not other places
c_X_reset_all='\033[0m' #stop code for color escape
c_X_bold='\033[21m'
c_X_reset_bold='\033[21m'
c_green='\033[01;32m'
c_blue='\033[01;34m'
c_pink='\033[01;35m'
c_dark_grey='\033[90m'
c_dark_yellow='\033[38;5;178m'
c_dark_red='\033[38;5;196m'
green(){
echo -n -e ${c_green}$@${c_X_reset_all}
}
blue(){
echo -n -e ${c_blue}$@${c_X_reset_all}
}
pink(){
echo -n -e ${c_pink}$@${c_X_reset_all}
}
dark_grey(){
echo -n -e ${c_dark_grey}$@${c_X_reset_all}
}
dark_yellow(){
echo -n -e ${c_dark_yellow}$@${c_X_reset_all}
}
dark_red(){
echo -n -e ${c_dark_red}$@${c_X_reset_all}
}
提示(更改前)
这是在实施注释中的更改之前的提示:
$ perl -e 'print quotemeta($ENV{PS1})'
\\n\[01\;32m\\u\[0m\ \[90mat\[0m\ \[38\;5\;178m\\h\[0m\ \[90min\[0m\ \[01\;35m\\w\[0m\ \[38\;5\;196m\$\(__git_ps1\ \\\(\%s\\\)\ \)\[0m\
\\\$\
您可以看到所有\033
位都消失并替换为\
。这是因为它是 ESC 字符的八进制表示形式(十进制为 27,十六进制为 1B),现在显示\
在输出中(\033[
变为\]
)。
提示(引入转义序列后)
这似乎已经解决了问题
这些评论建议在不可打印字符周围引入转义序列。这似乎改变了一些事情,因为 ESC 字符不再被替换:
$ perl -e 'print quotemeta($ENV{PS1})'
\\n\\\[\\033\[01\;32m\\\]\\u\ \\\[\\033\[90m\\\]at\ \\\[\\033\[38\;5\;178m\\\]\\h\ \\\[\\033\[90m\\\]in\ \\\[\\033\[01\;35m\\\]\\w\ \\\[\\033\[38\;5\;196m\\\]\(master\)\\\[\\033\[00m\\\]\
\\\$\