我想让 bash 自动完成的TAB
行为有点像 oh-my-zsh。
我已经添加了忽略大小写并循环遍历每个选项卡上的所有可能性。
现在,如果我在名为的目录中有一个文件夹LinuxCommands
,并且我写的Comm+TAB
它与文件夹不匹配LinuxCommands
。
有没有办法改变 bash 的行为,以匹配基于“ filename contains keywords
”而不是当前行为“ filename starts with keywords
”输入的关键字和文件夹和文件名?
我认为这并不重要,因为这都是bash。但为了以防万一,我使用的是 MacOS Sierra。
更新1
目前我的代码中有此~/.bashrc
修改
_cd_completion() {
mapfile -t COMPREPLY < <(ls -d */ | grep "${COMP_WORDS[COMP_CWORD]}")
}
complete -F _cd_completion cd
# If ~./inputrc doesn't exist yet, first include the original /etc/inputrc so we don't override it
if [ ! -a ~/.inputrc ]; then echo '$include /etc/inputrc' > ~/.inputrc; fi
# Add option to ~/.inputrc to enable case-insensitive tab completion
bind 'set completion-ignore-case On'
bind 'set show-all-if-ambiguous on'
bind 'TAB:menu-complete'
它单独完成任务。但整体表现却很奇怪。它会自动完成,然后在自动完成后循环浏览同一文件夹的内容,该文件夹比目录低一级。
例如:如果我有Folder1、Something2 和NewFolder3,如果我按下cd F+TAB
,它会显示> cd Folder1/
,然后当我TAB
再次按下时,它会显示> cd Folder1/Something2
,下一次会显示> cd Folder1/NewFolder3
,并像这样不断循环浏览上一级文件夹。
答案1
~/.bashrc
您可以通过将以下代码添加到文件中来添加自己的 bash_completion 规则:
_cd_completion() {
mapfile -t COMPREPLY < <(ls -d */ | grep "${COMP_WORDS[COMP_CWORD]}")
}
complete -F _cd_completion cd
接下来您必须重新启动终端或输入下一个命令:source ~/.bashrc
如果您想使其在系统范围内使用,您还可以将规则添加到文件 /usr/share/bash-completion/completions/cd 内的 bash_completion
答案2
TAB: menu-complete
就我而言,帮助在我的中注释掉~/.inputrc
,所以现在看起来:
"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char
set match-hidden-files off
set page-completions off
set completion-query-items 350
set completion-ignore-case on
set colored-stats on
set show-all-if-ambiguous off
set enable-bracketed-paste on
set history-size -1
set menu-complete-display-prefix on
#set bell-style none
#TAB: menu-complete