使 Bash Tab 自动完成匹配所有可能的文件中的“包含”而不是“开头为”

使 Bash Tab 自动完成匹配所有可能的文件中的“包含”而不是“开头为”

我想让 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

相关内容