随着grep命令,我倾向于使用各种组合-irln并将其限制为包含一种或多种相同的文件类型py、js、html、css。
例如
grep -ril --include=*{html,css}
我正在为 grep 的各种排列定义一套别名,我按以下格式使用:
grep.[options].[extensions]
我使用 python 脚本生成别名文件,该脚本迭代选项组合并在本例中生成大约 100 个别名。这里是其中的一些:
alias grep.il.html-css='grep -ril --include=*{html,css}'
alias grep.il.html-css='grep -ril --include=*{html,css}'
alias grep.il.html-js='grep -ril --include=*{html,js}'
alias grep.iln.html-js-css='grep -riln --include=*{html,js,css}'
(它们也都排除了 node_modules 目录。为了简洁起见,我隐藏了它,但现在你知道我为什么需要这些别名了!)
我使用句号的原因是因为由于完成,感觉几乎就像在 IDE 中键入对象的属性一样,但不完全一样,这就是我需要帮助的地方。
Tab 键尝试选择它找到的第一个完整命令。我希望它循环显示选项,直到完全停止(如果您愿意,可以在当前命名空间中)。
目前(未触及 Mint/Ubuntu/Debian bash 默认值)如果我输入以下内容:
grep.i
然后点击选项卡,直接进入:
grep.i.css
而我希望它不要这样做,而是循环浏览可用选项,直到首先到达下一个句号:
grep.i
grep.il
grep.in
grep.iln
grep.l
grep.n
当我击中 .它选择该选项,然后选项卡将循环浏览可用的选项,例如:
grep.il.css
grep.il.css_html
grep.il.css_js_html
这可能吗?可取吗?
我正在使用 bash,如果这是唯一的方法,我会考虑转向 zshell。
更新:
我可以通过一点技巧来改善这种情况,即为每个中间别名创建一个存根别名,因此在上面的示例中:
alias grep.='echo stub'
alias grep.il.='echo stub'
这在句号处停止,但完成后会添加一个空格,所以我最终得到:
“grep。”
在航站楼。我仍然可以按 Tab 键循环浏览选项,但在开始输入之前需要退格,否则我会得到:
“grep.i”
我研究了创建自定义自动完成行为的选项,使其不在具有 .在其中,但这也会捕获文件(例如,它会搞砸main.py hello
)我会继续挖掘......
答案1
这是让它在以下环境中工作的方法zsh
:
autoload -Uz compinit && compinit
bindkey '^I' complete-word
zle -C complete-word complete-word complete-word
complete-word() {
_main_complete
(( compstate[unambiguous_cursor] > ${#:-$PREFIX$SUFFIX}+1 )) \
&& compstate[insert]='automenu-unambiguous'
compstate[list]='list force'
}
zstyle ':completion:*:complete:*' show-ambiguity '07'
然后,当您键入grep
并按 时tab,您会得到:
然后,您可以按住tab以循环显示显示的完成情况:
或者,您可以键入突出显示的字符之一,然后tab再次按以插入列出的补全中常见的下一组字符:
然后tab再次按以显示新的完成列表:
等等,等等。起泡沫,冲洗并重复。