【问题标题】:Autocomplete directories in a subfolder with the Fish shell使用 Fish shell 自动完成子文件夹中的目录
【发布时间】:2021-06-03 02:57:23
【问题描述】:

我无法让鱼壳中的“完整”功能按我的意愿运行,我已经寻找答案好几天了。

总结

基本上我需要提供选项卡目录自动完成功能,就好像我在与我当前所在的目录不同的目录中一样。它的行为应该与“cd”和“ls”完全一样,但起点在另一个目录。能够做到这一点似乎是一件微不足道的事情,但我找不到让它发挥作用的方法。

说明

下面的示例文件夹结构

- root
  - foo
    - a
      - dir1
        - subdir1
      - dir2
        - subdir2
    - b
      - dir3
        - subdir3
      - dir4
        - subdir4

我在“根”目录中运行这些脚本,但我需要选项卡自动完成才能表现得就像我在“foo”目录中一样。

testfunc -d a/dir2/subdir2

代替

testfunc -d foo/a/dir2/subdir2

'foo' 内有很多目录以及其中的很多子目录,这种自动完成行为对于加快我们的进程是必要的(这个脚本在一天中被广泛使用)。

尝试的解决方案

我已经尝试使用 'complete' 内置函数通过指定要使用的目录来完成这项工作,但所有这一切都是在参数后使用空格自动完成第一级目录,而不是继续自动- 像 'cd' 一样完整。

complete -x -c testfunc -a "(__fish_complete_directories ./foo/)"

工作 bash 版本

我已经在 Bash 中完成了这项工作,我正在尝试将其移植到钓鱼中。 Bash 版本见下文。

_testfunc()
{
    local cur prev words cword
    _init_completion || return

    compopt +o default

    case $prev in
        testfunc)
            COMPREPLY=( $( compgen -W '-d' -- "$cur" ) )
            compopt +o nospace
            return
            ;;
        -d)
            curdir=$(pwd)
            cd foo/ 2>/dev/null && _filedir -d
            COMPREPLY=( $( compgen -d -S / -- "$cur" ) )
            cd $curdir
            return
            ;;
    esac

} &&
complete -o nospace -F _testfunc testfunc

这本质上是进入我想要的文件夹,执行自动完成,然后返回运行脚本的原始文件夹。我希望在 Fish 中让它在 Bash 中工作之后会更容易(我需要支撑这两个壳),但我只是把头发拉出来。

任何帮助将不胜感激!

【问题讨论】:

  • 您能否扩展一下“所有这一切都是在参数后用空格自动完成第一级目录,而不是像 'cd' 那样继续自动完成”?问题具体是空间吗?
  • 您好,感谢您的回复。问题是我正在尝试自动完成至少三个目录长的路径。所以我试图解释的是,我可以使用第一个目录自动完成它,但它只是作为参数进入该目录,后面有一个空格。我实际上希望它使用正斜杠自动完成,然后继续查找嵌套目录并自动完成它们。我所追求的行为是让我的终端相信我在尝试完成制表符时比实际更深一个文件夹。

标签: autocomplete fish


【解决方案1】:

我不是 bash 补全专家,但看起来 bash 补全是通过更改目录、运行补全然后改回来来实现的。你可以在fish中做同样的事情:

function complete_testfunc
    set prevdir $PWD
    cd foo
    __fish_complete_directories
    cd $prevdir
end

complete -x -c testfunc -a "(complete_testfunc)"

这对你有用吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2017-08-14
    • 2020-12-26
    • 1970-01-01
    • 2011-03-21
    • 2016-12-08
    • 1970-01-01
    相关资源
    最近更新 更多