gpt4 book ai didi

php - Bash 在 OS X 上用冒号补全

转载 作者:行者123 更新时间:2023-12-04 17:52:56 25 4
gpt4 key购买 nike

我是面向开发人员的基于 PHP 的命令行应用程序的创建者和维护者。我的命令的语法遵循其他 PHP 命令行应用程序的规范,看起来像这样

pestle.phar some:command:name ...arguments and options here...
pestle.phar some:command ...arguments and options here...

也就是说——命令名称中使用了冒号。这在我尝试使用 bash 的常用自动完成功能时出现了问题。

感谢some其他 answers我能够确定这是将 : 视为单词分隔符的 bash,并且 bash-completion 项目 (brew install bash-completion) 可以提供帮助。我已经能够将一个脚本组合在一起——但我被困在一些事情上并且对系统的理解不够好,无法自行诊断。另外,我的 bash 脚本编写技巧生疏了。

下面是一些类似作品的示例。

#File: /usr/local/etc/bash_completion.d/pestle-autocomplete.sh
#!/bin/bash

_commandList ()
{
echo "codecept:convert-selenium-id-for-codecept"
echo "magento2:check-templates"
echo "magento2:generate:acl"
#.. other comand names..
return 0;
}

_pestleAutocomplete ()
{
local cur
local all
_get_comp_words_by_ref -n : cur
all=$(_commandList)
COMPREPLY=( $(compgen -W "$all" $cur) )
__ltrim_colon_completions "$cur"
return 0
}
complete -F _pestleAutocomplete -o filenames pestle.phar

如果我输入 $ peSTLe.phar mag 然后点击 Tab,我的 shell 中会输出以下内容

$ pestle.phar magento2\:    

也就是说,magento2: 自动完成,但 : 用斜线转义。如果我完成一个命令名称,这个“有效”,但看起来有点滑稽。所以问题 1 -- 我如何去掉那个斜线,它从哪里来。

其次——我不明白__ltrim_colon_completions 命令的作用。在我见过的例子中,它通常使用类似

_mytool()
{
local cur
_get_comp_words_by_ref -n : cur

# my implementation here

__ltrim_colon_completions "$cur"
}
complete -F _mytool mytool

然而,在我天真的眼中——这似乎什么也没做。它是在脚本末尾使用局部变量进行的无关调用。我假设它改变了 bash 完成系统中的某些状态,但同样,我的知识是不完整的。我不确定它是否与我的转义问题有关。

如果这里有人有具体的答案,或者可以为我指出正确的方向,我将不胜感激。 OS X 10.11、El Cap、stock bash——如果重要的话。

最佳答案

可以调整 COMP_WORDBREAKS 变量,使冒号的行为不同于正常的完成行为:

COMP_WORDBREAKS=${COMP_WORDBREAKS//:}

从该值中删除 : 足以使冒号不特殊完成(这可能是也可能不是您想要的)。我怀疑它前面的反斜杠 \: 是因为您使用 _get_comp_words_by_ref -n : cur 排除它的方式。您也可以用反斜杠引用冒号来临时获得相同的结果。

Filename completion (and word completion in general) may appear to behave improperly if there is a colon in the word to be completed.

The colon is special to readline's word completion code: it is one of the characters that breaks words for the completer. Readline uses these characters in sort of the same way that bash uses $IFS: as they break or separate the words the completion code hands to the application-specific or default word completion functions. The original intent was to make it easy to edit colon-separated lists (such as $PATH in bash) in various applications using readline for input.

This is complicated by the fact that some versions of the popular `bash-completion' programmable completion package have problems with the default completion behavior in the presence of colons.

The current set of completion word break characters is available in bash as the value of the COMP_WORDBREAKS variable. Removing `:' from that value is enough to make the colon not special to completion.

__ltrim_colon_completions

这个函数基本上只是修剪完成,以便返回的单词只是前缀(或右侧最后一个冒号左侧剩余的任何内容)。一个例子是诸如 hello:world 之类的命令,我开始输入 he 并按下 TABhello: 部分将被返回。函数就是这样:

# Define preload__ltrim_colon_completions="false", if the function
# __perf__ltrim_colon_completions() is required instead.
preload__ltrim_colon_completions="true"

if [ $preload__ltrim_colon_completions = "true" ]; then
type __ltrim_colon_completions &>/dev/null ||
preload__ltrim_colon_completions="false"
fi
[ $preload__ltrim_colon_completions = "true" ] ||
__perf___ltrim_colon_completions()
{
if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
# Remove colon-word prefix from COMPREPLY items
local colon_word=${1%"${1##*:}"}
local i=${#COMPREPLY[*]}
while [[ $((--i)) -ge 0 ]]; do
COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
echo $COMPREPLY[$i]
done
echo $colon_word
fi
}

完成代码中的一些其他变量可以设置为根据应用程序不同地处理单词;也许尝试最顶部的方法,如果这不是您要找的,那么也许浏览 the code负责控制它。

关于php - Bash 在 OS X 上用冒号补全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43058218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com