在Windows版Git中设置COMP_WORDBREAKS后,可以重新初始化什么?

问题描述

我已经完成了一些使用@的操作(如@group),我希望将其从COMP_WORDBREAKS删除,但是我还不了解什么是还原 @:我完全知道我们不应该修改COMP_WORDBREAKS并使用_get_comp_words_by_ref -n @,而是Git Windows 2.28.0.windows.1(+ bash)上的版本4.4.23(1)-发行版)与Linux上的版本(Gentoo + Bash 5 + app-shells / bash-completion 2.11)不同。

我试图将其添加到Windows的~/.bashrc中,该窗口由~/.bash_profile派生,其输出显示在PS1提示符之前:

echo "COMP_WORDBREAKS before:"; declare -p COMP_WORDBREAKS
COMP_WORDBREAKS="${COMP_WORDBREAKS//@/}"
echo "COMP_WORDBREAKS after:"; declare -p COMP_WORDBREAKS
export COMP_WORDBREAKS

但是,这无法正常工作:如果我键入@命令,则declare -p COMP_WORDBREAKS仍然存在:

COMP_WORDBREAKS before:
declare -- COMP_WORDBREAKS="
\"'><=;|&(:"
COMP_WORDBREAKS after:
declare -- COMP_WORDBREAKS="
\"'><=;|&(:"
# when I have first access to the TERM and that I can input the declare -p COMP_WORDBREAKS
$ declare -p COMP_WORDBREAKS
declare -- COMP_WORDBREAKS="@
\"'><=;|&(:"

此屏幕快照中还显示了以下内容(我删除了识别部分,但这是Windows附带的“ Git Bash”命令):

Terminal and COMP_WORDBREAKS

如我们所见,某项(我想是bash)正在加回@,但我找不到在哪里或做什么。

  • 我已签入Bash manual,但看不到它将恢复@的位置吗?
  • 我还检查了可以修改COMP_WORDBREAKS文件,但没有发现任何结论性文件

解决方法

问题是由于主机名完成(shopt -p hostcomplete)导致bash包含@才能完成(或拆分)主机,例如user@hos

看到在Windows下,完成功能非常有限,因此我将其禁用了:

  • 它至少使用/etc/hosts作为来源
  • 用于Windows /etc/hosts的Git没有任何主机。
  • MSYS2 /etc/hosts似乎是C:\Windows\System32\drivers\etc\hosts的副本

我不知道(与我的问题无关)为什么/何时从/etc/hosts复制C:\Windows\System32\drivers\etc\hosts,但是对于我来说,这种完成是毫无用处的。

,

它不会还原它。错误是您设置/打印值的方式。

COMP_WORDBREAKS="${COMP_WORDBREAKS//@/}"

您已正确删除了@,如果您只是做了一个

echo "COMP_WORDBREAKS after:"; declare -p COMP_WORDBREAKS

您会看到所做的更改仍然存在。但是您决定将其写为

echo "COMP_WORDBREAKS after: $(declare -p COMP_WORDBREAKS)"

这将创建一个用于执行declare的子进程,并且由于您没有导出变量,因此该子进程不知道您已对其进行了修改,并创建了自己的全新版本。