Чтобы было ясно, я не говорю о чем-то, что должно требовать многопоточности emacs (хотя это, вероятно, также решило бы это). Воспроизвести:
- emacs -Q # Я работаю 24.4.1
- Сделать второй кадр
- Вернитесь к первому кадру
- Mx shell
- Mx переименовывать однозначно (мы собираемся сделать вторую оболочку позже)
- Начните бежать:
while true; do echo "hello world"; done
- Во втором кадре Mx shell
Вторая оболочка почти никогда не будет отображаться (редко работает после повторных попыток). Очевидно, что emacs никогда не будет делать перерыв в чтении вывода первой оболочки, чтобы прослушать вывод, поступающий от любого другого процесса. Было бы гораздо лучше, если бы он выполнял циклический перебор, когда есть несколько процессов с ожидающим выводом. Есть ли способ улучшить поведение?
Единственная хитрость, которую я знаю, это сделать буфер оболочки своим собственным процессом, но, к сожалению, у меня это не сработает. Даже если я сделаю это, мне придется запустить подпроцесс для прослушивания сокета, чтобы моя программа распознавания речи работала, чтобы я мог фактически контролировать оболочку, вот как я это обнаружил; выполнение бесконечного цикла, как описано выше, предотвращает удаление любых данных из сокета.
start-process
с aset-process-filter
и aset-process-sentinel
- это позволяет мне идти своим веселым путем, делая другие вещи во время выполнения процесса - я даже иногда отправляю свои выходные данные в*Messages*
буфер, используя,insert
чтобы моя область эха не затрагивалась, или я использую выделенный буфер вывода процесса (при необходимости). Например, я могу запустить длительныйrsync
сеанс. У меня нет никакого опыта, пытаясь запустить несколько одновременных / длинныхstart-process
, поэтому я не уверен, как Emacs справится с множеством происходящих событий.