- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是面向开发人员的基于 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
并按下 TAB,hello:
部分将被返回。函数就是这样:
# 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/
我用 IntelliJ IDEA 2021.1 CE 在 流行!_OS 20.04 与 bash 5.0.17 . 问题造句:我将IntelliJ终端设置为/bin/bash通过 IntelliJ 设
给定如下命令: bash --shortcuts 我想显示一个快捷方式列表,就像在这个页面上一样: http://www.skorks.com/2009/09/bash-shortcuts-for-m
我有一个脚本可以操作数据、创建参数并将它们发送到第二个脚本。其中一个参数包含一个空格。 脚本1.sh: args=() args+=("A") args+=("1 2") args+=("B") .
我的脚本的“只运行一次”版本的一个非常简单的示例: ./myscript.sh var1 "var2 with spaces" var3 #!/bin/bash echo $1 #output: va
我想了解数字( double )在 bash 中是如何表示的,以及当我在 bash 中以十六进制格式打印数字时会发生什么。 根据 IEEE 754 标准,double 应由 64 位表示:52 位(1
我试图在 bash -c "..." 命令中获取 bash 脚本,但它不起作用。 如果我在 bash -c "..." 之外运行命令,它会起作用。 我需要使用 bash -c "..." 因为我想确保
如何检测我的 bash shell 中是否加载了 bash 补全包?从 bash-completion 的 2.1 版(包含在 Debian 8 中)开始,除了 BASH_COMPLETION_COM
我的 bash_profile 中有一个投影函数。现在我试图从 bash 脚本中调用这个函数,但是我得到了一个未找到的错误。如何使投影函数对 bash 脚本可见? 最佳答案 必须导出函数 export
我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将它们全部传递给程序 (/bin/some_program)。从 bash 脚本调用的登录 shell 将取
当我创建一个新的 bash 进程时,提示符默认为一个非常简单的提示符。我知道我可以编辑 .bashrc 等来更改它,但是有没有办法使用 bash 命令传递提示? 谢谢! 最佳答案 提示由 PS1、PS
好的,我希望这个问题有一定道理,但是 bash shell 和 bash 终端之间有什么区别?例子。当我第一次打开终端时,会提示我当前的目录和用户名。在终端窗口标题中显示 -bash- ,当我键入 e
我是 SBCL 的新手,我正在尝试从 bash 终端运行存储在文本文件中的 Lisp 脚本。 这是我在文件开头写的内容 http://www.sbcl.org/manual/#Running-from
我知道我们可以在 bash 中使用将十六进制转换为十进制 #!/bin/bash echo "Type a hex number" read hexNum echo $(( 16#$hexNum ))
我正在尝试在 bash 脚本中自动完成文件夹名称。如果我输入完整的文件夹名称,一切正常,但我不知道如何自动完成名称。有什么想法吗? repo() { cd ~/Desktop/_REPOS/$1 }
我想检查远程网站上的一些文件。 这里是bash命令生成计算文件md5的命令 [root]# head -n 3 zrcpathAll | awk '{print $3}' | xargs -I {}
是否有任何内置函数可以使用 bash shell 脚本从给定日期获取下周日(下周一、下周二等)?例如,2014 年 9 月 1 日之后的第一个星期日是什么时候?我预计 2014 年 9 月 7 日。
我一直在尝试根据表格重命名一些特定文件,但没有成功。它要么重命名所有文件,要么给出错误。 该目录包含数百个以长条形码命名的文件,我只想重命名包含模式 _1_ 的文件。 例子 barcode_1_bar
bash 中有没有办法用变量的内容替换文本文件中的占位符? 例如,我想发送一封电子邮件通知,如下所示: Dear Foo, Alert: blah blah blah blah blah blah
我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。 这是一些示例输出: mv: cannot move â/tmp/myapp.zipâ
这个问题在这里已经有了答案: How do I place stdout on edit line? (1 个回答) Can a bash script prepopulate the prompt
我是一名优秀的程序员,十分优秀!