GIT补全中的奇怪字符

GIT补全中的奇怪字符

我正在运行 bash

GNU bash,版本 4.3.25(1)-发布 (x86_64-apple-darwin13.4.0)

在 OS X 10.10.1 上。大约一周前,我注意到自动完成功能已停止工作,但仅限于 git。我使用这个脚本进行 git 自动补全:

https://github.com/git/git/blob/master/contrib/completion/git-completion.bash

在它停止工作几天后,我注意到自动完成功能仍然适用于以字母 's' 开头的命令(例如 status、show、stash)。之后我尝试自动完成此命令:

git c

这是输出:

用户:~$ git c^[[m^[[K

c^[[m^[[Kat 文件
c^[[m^[[Kheck-attr
c^[[m^[[Kheck-忽略
c^[[m^[[Kheck-mailmap
c^[[m^] [[Kheck-ref-format
c^[[m^[[Kheckout
c^[[m^[[Kheckout-index
c^[[m^[[Kherry
c^[[m^[[Kherry-pick
c^[]] [m^[[Kitool
c^[[m^[[Klean
c^[[m^[[Klone
c^[[m^[[Kolumn c^[[m^[[Kommit c^[[m^[[Kolone
c^[[m^[[Kolumn c^[[m^[[Kommit
c^[[m^[[] Kommit-tree
c^[[m^[[Konfig
c^[[m^[[Kount-objects
c^[[m^[[Kredential
c^[[m^[[Kredential-cache
c^[[m^[] [Kredential-osxkeychain
c^[[m^[[Kredential-store
c^[[m^[[Kvsexportcommit
c^[[m^[[Kvsimport
c^[[m^[[Kvsserver]

正如您所看到的,在每个命令的第一个字母后面插入了一些奇怪的(转义?)字符(除了“s”之外的所有其他字母也会发生同样的情况)。由于这些字符,自动完成功能无法按预期工作。

有谁知道什么可能导致这种情况?我什至不知道如何调试这个,所以欢迎任何提示。

答案1

这些奇怪的转义序列是变色命令。

完成代码运行以下命令来列出可用命令:

git help -a|egrep '^  [a-zA-Z0-9]'

的输出git help -a看起来像这样:

添加 grep 远程添加--交互式哈希对象远程-ext am 帮助远程-fd … fsck-对象接收包写入树 gc reflog get-tar-commit-id 重新链接

如果 grep 配置为以颜色打印该行的匹配部分,则第一列中的命令名称将突出显示其第一个字母:

$ git help -a|egrep --color=always '^  [a-zA-Z0-9]' | cat -v | head -n 1
^[[01;31m^[[K  a^[[m^[[Kdd                      grep                     remote

当 bash 看到此输出时,它认为^[[01;31m^[[Ka^[[m^[[Kddgrepremote是可能的命令。第一个不会出现,最后两个是正确的,第二个被破坏了。

你需要配置grep当其输出不在终端上时不要使用颜色。如果您已使用别名egrepegrep --color=always并且与grep和相同fgrep),请将其更改为--color=auto。如果您已GREP_OPTIONS在某处设置了变量,请更改--color=always--color=auto那里。

相关内容