在 Git 中为 Windows 设置后,什么可以重新初始化 COMP_WORDBREAKS?
What could reinitialize COMP_WORDBREAKS after I set it in Git for Windows?
我有一些使用 @
的完成(如 @group
),我希望将其从 COMP_WORDBREAKS
中删除,但我还没有理解什么是 恢复 @
:我完全知道我们不应该修补COMP_WORDBREAKS
并使用_get_comp_words_by_ref -n @
,但Git上的版本Windows 2.28.0.windows.1 (+bash 4.4.23(1)-release) 与 Linux (Gentoo + Bash 5 + app-shells/bash-completion 2.11).
我试图将此添加到我的 ~/.bashrc
for Windows,它来自 ~/.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="@
\"'><=;|&(:"
此屏幕截图中也显示了这一点(我删除了识别部分,但这是与 Git 捆绑在一起用于 Windows 的“Git Bash”命令:
正如我们所见,某些东西(我想 bash
)正在加回 @
,但我找不到它在哪里或做什么。
- 我已经检查了 Bash manual,但我看不到它会在哪里恢复
@
?
- 我也检查了可以修改
COMP_WORDBREAKS
的文件,但没有看到任何决定性的文件。
它不恢复它。错误是你 set/print 值的方式。
在
COMP_WORDBREAKS="${COMP_WORDBREAKS//@/}"
你已经正确删除了 @
,如果你只是做了一个
echo "COMP_WORDBREAKS after:"; declare -p COMP_WORDBREAKS
您会看到您所做的更改仍然存在。但是你决定把它写成
echo "COMP_WORDBREAKS after: $(declare -p COMP_WORDBREAKS)"
它创建一个子进程来执行 declare
,并且由于您没有导出变量,子进程不知道您已经修改了它,并创建了自己的新版本。
问题是由于主机名完成 (shopt -p hostcomplete
) 导致 bash 包含 @
以完成(或拆分)主机,例如 user@hos
。
看到,在 Windows 下,完成度非常有限,我禁用了它:
- 它使用(至少)
/etc/hosts
作为来源来完成
- Git for Windows
/etc/hosts
没有任何主机。
- MSYS2
/etc/hosts
似乎是 C:\Windows\System32\drivers\etc\hosts
的副本
我不知道(这与我的问题无关)why/when /etc/hosts
是从 C:\Windows\System32\drivers\etc\hosts
复制的,但是这个完成对我来说毫无用处。
我有一些使用 @
的完成(如 @group
),我希望将其从 COMP_WORDBREAKS
中删除,但我还没有理解什么是 恢复 @
:我完全知道我们不应该修补COMP_WORDBREAKS
并使用_get_comp_words_by_ref -n @
,但Git上的版本Windows 2.28.0.windows.1 (+bash 4.4.23(1)-release) 与 Linux (Gentoo + Bash 5 + app-shells/bash-completion 2.11).
我试图将此添加到我的 ~/.bashrc
for Windows,它来自 ~/.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="@
\"'><=;|&(:"
此屏幕截图中也显示了这一点(我删除了识别部分,但这是与 Git 捆绑在一起用于 Windows 的“Git Bash”命令:
正如我们所见,某些东西(我想 bash
)正在加回 @
,但我找不到它在哪里或做什么。
- 我已经检查了 Bash manual,但我看不到它会在哪里恢复
@
? - 我也检查了可以修改
COMP_WORDBREAKS
的文件,但没有看到任何决定性的文件。
它不恢复它。错误是你 set/print 值的方式。
在
COMP_WORDBREAKS="${COMP_WORDBREAKS//@/}"
你已经正确删除了 @
,如果你只是做了一个
echo "COMP_WORDBREAKS after:"; declare -p COMP_WORDBREAKS
您会看到您所做的更改仍然存在。但是你决定把它写成
echo "COMP_WORDBREAKS after: $(declare -p COMP_WORDBREAKS)"
它创建一个子进程来执行 declare
,并且由于您没有导出变量,子进程不知道您已经修改了它,并创建了自己的新版本。
问题是由于主机名完成 (shopt -p hostcomplete
) 导致 bash 包含 @
以完成(或拆分)主机,例如 user@hos
。
看到,在 Windows 下,完成度非常有限,我禁用了它:
- 它使用(至少)
/etc/hosts
作为来源来完成 - Git for Windows
/etc/hosts
没有任何主机。 - MSYS2
/etc/hosts
似乎是C:\Windows\System32\drivers\etc\hosts
的副本
我不知道(这与我的问题无关)why/when /etc/hosts
是从 C:\Windows\System32\drivers\etc\hosts
复制的,但是这个完成对我来说毫无用处。