mplayer хочет использовать Ваш терминал, который является причиной, почему это останавливается в фоновом режиме ([2]+ Stopped
) и все блокируется. Я предлагаю использовать отдельные терминалы для программ. Или просто нормальные окна терминала или через screen
или tmux
. Другая опция использует nohup mplayer
.
Я не знаю, является ли это приемлемым решением или нет, но отправка SIGSTOP (Ctrl+S), кажется, имеет желаемый эффект с дополнительным преимуществом, что можно запустить автоматическое заполнение снова при отправке SIGSTART (Ctrl+Q) прежде, чем ввести что-либо еще. Я не эксперт по управлению заданиями, хотя, таким образом, это может оставить некоторую дополнительную помеху связанной с остановленным заданием.
Вот решение, которое настраивает обработчик 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
}