Fish Shell 无主名带后缀的隐藏文件命令补全实现方法
无主名纯后缀隐藏文件的Fish Shell补全实现
内置__fish_complete_suffix不生效的核心原因
- Fish 通配规则默认遵循POSIX标准,
*通配符不会匹配文件名开头的.字符,即*.bar形式的匹配规则,天生无法命中.bar这类无主名的隐藏文件。 __fish_complete_suffix的内置实现,就是基于*.$suffix的通配规则遍历候选文件,没有针对纯后缀隐藏文件做适配性匹配,因此无法返回预期的补全结果。- Fish 默认补全机制仅当用户输入的路径前缀以
.结尾时,才会展示对应路径下的隐藏文件补全项,测试场景下输入的foo a/前缀末尾没有点,就算调整匹配规则,默认机制也不会主动纳入隐藏文件候选。
可直接落地的实现方案
内置__fish_complete_suffix没有开放适配纯后缀文件的可调参数,无法通过参数调整直接满足需求,可以通过两种轻量方案实现同等补全能力:
- 零自定义函数方案:直接利用Fish内置的glob补全语法,在候选生成规则里显式同时匹配带主名的普通后缀文件、纯后缀隐藏文件:
语法说明:规则中的# completions/foo.fish 内容 complete -c foo -k -x -a "(*.bar|.bar)(file)"(file)是Fish内置的筛选标记,会自动排除目录、非普通文件等无效候选;匹配分支里单独写的.bar,会绕开“通配符不匹配开头点”的限制,直接把对应隐藏文件纳入补全列表。 - 带递归遍历的自定义补全函数方案:如果需要和
__fish_complete_suffix保持一致的多子目录递归补全能力(即输入foo a/时自动遍历a目录下所有子目录的匹配文件),可以写一个极短的包装函数替代内置逻辑:
对应的补全声明调整为:# ~/.config/fish/functions/__fish_complete_suffix_include_hidden.fish 内容 function __fish_complete_suffix_include_hidden set -l target_suffix $argv[1] for match in *."$target_suffix" ."$target_suffix"(file) ^/dev/null echo "$match" end end# completions/foo.fish 内容 complete -c foo -k -x -a "(__fish_complete_suffix_include_hidden .bar)"
按照前述测试目录结构验证,两种方案在输入foo a/触发TAB补全时,都会同时返回a/1.bar、a/2.bar、a/.bar三类目标文件,完全适配direnv这类需要匹配.envrc纯后缀隐藏文件的场景,实际使用时只要把匹配后缀换成.envrc即可复用逻辑。
内容的提问来源于stack exchange,提问作者snapshoe
相关产品推荐
相关产品推荐

