git completion error in bash

浏览:16日期:2023-10-03

问题描述

在新安装的Debian的Bash下,通过sudo apt-get install git安装后,git的补全出现异常。

$ git <TAB>^[[1;43m^[[Kc^[[m^[[Kherry d^[[m^[[Kifftool h^[[m^[[Kttp-backendm^[[m^[[Kerge-file rm a^[[m^[[Kdd c^[[m^[[Kherry-pick d^[[m^[[Kiff-tree h^[[m^[[Kttp-fetch m^[[m^[[Kerge-index shortlog a^[[m^[[Km c^[[m^[[Klean f^[[m^[[Kast-export h^[[m^[[Kttp-push m^[[m^[[Kerge-octopus show a^[[m^[[Knnotate c^[[m^[[Klone f^[[m^[[Kast-import i^[[m^[[Kmap-send mv show-branch a^[[m^[[Kpply c^[[m^[[Kolumn f^[[m^[[Ketch i^[[m^[[Kndex-pack name-rev stage a^[[m^[[Krchive c^[[m^[[Kommit f^[[m^[[Ketch-pack i^[[m^[[Knitnotes stash b^[[m^[[Kisect c^[[m^[[Kommit-tree f^[[m^[[Kilter-branch i^[[m^[[Knit-db pullstatus b^[[m^[[Klame c^[[m^[[Konfig f^[[m^[[Kmt-merge-msg i^[[m^[[Knstaweb pushsubmodule b^[[m^[[Kranch c^[[m^[[Kount-objects f^[[m^[[Kor-each-refl^[[m^[[Kog rebase subtree b^[[m^[[Kundle c^[[m^[[Kredential f^[[m^[[Kormat-patchl^[[m^[[Ks-files reflog tag c^[[m^[[Kat-file c^[[m^[[Kredential-cache f^[[m^[[Ksckl^[[m^[[Ks-remote relink verify-commit c^[[m^[[Kheck-attr c^[[m^[[Kredential-store f^[[m^[[Ksck-objectsl^[[m^[[Ks-tree remote whatchanged c^[[m^[[Kheck-ignored^[[m^[[Kaemon g^[[m^[[Kc mergetool repack c^[[m^[[Kheck-mailmap d^[[m^[[Kescribe g^[[m^[[Ket-tar-commit-id m^[[m^[[Kailinfo replace c^[[m^[[Kheckout d^[[m^[[Kiffg^[[m^[[Krepm^[[m^[[Kailsplit request-pullc^[[m^[[Kheckout-index d^[[m^[[Kiff-files h^[[m^[[Kash-object m^[[m^[[Kerge reset c^[[m^[[Kheck-ref-format d^[[m^[[Kiff-index h^[[m^[[Kelpm^[[m^[[Kerge-base revert

部分是正常的,比如git revert。但是很大一部分,比如git add,由于补全项为git a^[[m^[[Kdd而无法正常使用。

请问:

Bash中,这个^[[m^[[K是什么?

如何去除它,让git的补全正常?

(我曾经用过git-completion这个方案,但是它太老,早已不更新,导致新功能补全缺失。)

问题解答

回答1:

再强调一遍,终端是终端,Shell是Shell,总有人分不清终端和Shell…

这个问题是由你的终端配置不当导致的,Bash再神通广大也管不到ANSI Escape Code的解析啊,正如你把i3换成i7照样不能让黑白显示器显示出彩色一样。

你有两个选择:

关闭Git补全的彩色

调整你的终端,使其支持ANSI Escape Code

如果你的Terminal Emulator支持彩色的话,通常改一下$TERM就能解决问题。更详细的说明可以参考http://www.tldp.org/HOWTO/Text-Terminal-HOWTO-16.html,以及这个网页中的链接。

回答2:

Bash 中,这个^[[m^[[K是什么?

是 ANSI escape code。^[表示ESC键,而^[[即ESC[表示 CSI(Control Sequence Introducer),所以^[[m^[[K表示 CSI m,CSI K。至于 CSI m 和 CSI K 表示什么意思就需要查表了。

CSI m 的完整形式是 CSInm,表示 SGR – Select Graphic Rendition,即控制台中的文本的渲染效果。其中n是0至多个参数,当没有参数的时候就成了 CSI m,表示重置为默认渲染效果。具体见这里。(自定义控制台的 PS 也是通过这个来设置颜色的。) 例如,问题开头的^[[1;43m表示“加粗;红色”渲染效果。

CSI K 的完整形式是 CSInK,表示 EL – Erase in Line,即删除部分行。其中n也是参数,当n为0或省略的时候,即 CSI K,表示从光标位置删除到行尾。其它情况可参考维基百科中的描述。

相关文章: