Events Unix对话实用程序在fish shell中对发出的事件作出反应时失败

Events Unix对话实用程序在fish shell中对发出的事件作出反应时失败,events,dialog,fish,Events,Dialog,Fish,我有这个功能(已知工作正常) 当我直接调用problem\u open时,对话框显示良好。当我通过emit on\u problem\u open间接调用函数时,不会显示对话框 知道为什么会这样吗?这是事件的预期行为吗 我可以解决这个问题,但这将是一个棘手的问题。您的示例在这里没有问题,但有一个技巧是确保手动或在您的config.fish中定义函数,而不是依赖它自动加载 在与fish-dev团队成员Fabian Homborg(@faho)讨论后,所需的功能似乎无法运行(永远无法运行),原因类似

我有这个功能(已知工作正常)

当我直接调用
problem\u open
时,对话框显示良好。当我通过
emit on\u problem\u open
间接调用函数时,不会显示对话框

知道为什么会这样吗?这是事件的预期行为吗


我可以解决这个问题,但这将是一个棘手的问题。

您的示例在这里没有问题,但有一个技巧是确保手动或在您的
config.fish中定义函数,而不是依赖它自动加载

在与fish-dev团队成员Fabian Homborg(@faho)讨论后,所需的功能似乎无法运行(永远无法运行),原因类似于windows等中备受推崇的“在UI线程中争用屏幕更新”问题。不仅如此,开发团队打算在将来将事件调用转移到另一个线程中,因此不希望通过事件处理程序与终端交互

我最后做的是创建一个不同的API,当需要用户IO时,使用直接函数调用。有关实现,请参见函数

function problem_open -e on_problem_open -d "select from existing problems"
    set matches (find $FD_PROB_HOME/ -maxdepth 1 -mindepth 1 -type d ! -name ".git")

    if test 1 -eq (count $matches)
        if test -d $matches
            set -U FD_PROB_CURRENT $matches[1]
            echo "chose option 1"
            return
        end
    end
    set -g dcmd "dialog --stdout --no-tags --menu 'select the file to edit' 20 60 20 "
    set c 1
    for option in $matches
        set l (basename "$option")
        set -g dcmd "$dcmd $c '$l'"
        set c (math $c + 1)
    end
    set choice (eval "$dcmd") 
    #clear
    if test $status -eq 0
        echo "edit option $choice"
        set -U FD_PROB_CURRENT $matches[$choice]
    end
end