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文字(10進数27、16進数1B)の8進数表現であるためです(\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\\\]\
\\\$\

ベストアンサー1

おすすめ記事