Unix Сбой утилиты Dialog в оболочке fi sh при реагировании на выдаваемое событие - PullRequest
1 голос
/ 06 апреля 2020

У меня есть эта функция (известно, что она работает нормально)

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

, когда я вызываю problem_open напрямую, диалог отображается нормально. Когда я вызываю функцию косвенно, через emit on_problem_open диалоговое окно не отображается.

Есть идеи, почему это происходит? Это ожидаемое поведение с событиями?

Я могу обойти эту проблему, но это будет нелепый взлом.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

После обсуждения с членом команды fi sh dev Фабианом Хомборгом (@faho) кажется, что желаемая функциональность не будет работать (не когда-либо) по причинам, аналогичным «почтенному» условному доступу к обновлениям экрана в пользовательском интерфейсе. нить "вопрос в windows и др. Мало того, команда разработчиков намерена в будущем перенести вызов событий в другой поток, поэтому нет надежды на взаимодействие с терминалом из обработчика событий.

В итоге я создал другой API что, когда ожидается ввод-вывод пользователя, вместо этого используется прямой вызов функции. См. Функцию _define_subcommand_nonevented для реализации.

0 голосов
/ 09 апреля 2020

Ваш пример в порядке, но один совет - убедиться, что функция определена вручную или в вашем config.fish, а не полагаться на то, что она будет загружаться автоматически. Функции, хранящиеся в автоматически загружаемых файлах, не прослушивают обработчики событий, пока они не будут запущены в первый раз .

...