停止完成某些字符

停止完成某些字符

随着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,您会得到: grep+tab 然后,您可以按住tab以循环显示显示的完成情况: 再次 Tab 循环 或者,您可以键入突出显示的字符之一,然后tab再次按以插入列出的补全中常见的下一组字符: 或按突出显示的字符 + Tab 然后tab再次按以显示新的完成列表: 再次拉片,冲洗并重复 等等,等等。起泡沫,冲洗并重复。

相关内容