Завершение отмены, но только завершение, в zsh

mplayer хочет использовать Ваш терминал, который является причиной, почему это останавливается в фоновом режиме ([2]+ Stopped) и все блокируется. Я предлагаю использовать отдельные терминалы для программ. Или просто нормальные окна терминала или через screen или tmux. Другая опция использует nohup mplayer.

13
13.04.2017, 15:37
2 ответа

Я не знаю, является ли это приемлемым решением или нет, но отправка SIGSTOP (Ctrl+S), кажется, имеет желаемый эффект с дополнительным преимуществом, что можно запустить автоматическое заполнение снова при отправке SIGSTART (Ctrl+Q) прежде, чем ввести что-либо еще. Я не эксперт по управлению заданиями, хотя, таким образом, это может оставить некоторую дополнительную помеху связанной с остановленным заданием.

0
27.01.2020, 19:53
  • 1
    Ctrl+S сбоев и Ctrl+Q являются командами управления потоком. Они только влияют на вывод к терминалу, который не важен здесь. Очевидно, Ctrl+S не имеет никакого эффекта во время завершения (zsh, отключает терминальную установку так или иначе, это захватывает сочетание клавиш). Нажатие Ctrl+Z (который отправляет SIGTOP) не имеет никакого эффекта также. –  Gilles 'SO- stop being evil' 25.09.2013, 22:40
  • 2
    Спасибо! я не был совершенно уверен, что продолжалось в фоновом режиме. Все, что я видел, было то, что я получил контроль терминала назад. –  Aaron Okano 26.09.2013, 05:21

Вот решение, которое настраивает обработчик SIGINT, который заставляет Ctrl+C только прервать, когда завершение активно.

# A completer widget that sets a flag for the duration of
# the completion so the SIGINT handler knows whether completion
# is active. It would be better if we could check some internal
# zsh parameter to determine if completion is running, but as 
# far as I'm aware that isn't possible.
function interruptible-expand-or-complete {
    COMPLETION_ACTIVE=1

    # Bonus feature: automatically interrupt completion
    # after a three second timeout.
    # ( sleep 3; kill -INT $$ ) &!

    zle expand-or-complete

    COMPLETION_ACTIVE=0
}

# Bind our completer widget to tab.
zle -N interruptible-expand-or-complete
bindkey '^I' interruptible-expand-or-complete

# Interrupt only if completion is active.
function TRAPINT {
    if [[ $COMPLETION_ACTIVE == 1 ]]; then
        COMPLETION_ACTIVE=0
        zle -M "Completion canceled."            

        # Returning non-zero tells zsh to handle SIGINT,
        # which will interrupt the completion function. 
        return 1
    else
        # Returning zero tells zsh that we handled SIGINT;
        # don't interrupt whatever is currently running.
        return 0
    fi
}
5
27.01.2020, 19:53

Теги

Похожие вопросы