运行 VIM 命令时终端中出现奇怪的垃圾(ansi 转义字符?)

运行 VIM 命令时终端中出现奇怪的垃圾(ansi 转义字符?)

我有一个脚本,当运行时有时/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\\\]\
\\\$\

相关内容