2015-09-08 4 views
0

Отличный ответ на вопрос How do I define an Emacs List function to spawn a shell buffer with a particular command executed in the shell странно не работает в сеансе «экрана» Gnu. В контексте команды экрана, вместо команды я говорю это выполнить,команда в буфере оболочки в emacs на экране gnu

echo 'test1'\n 

, Emacs называется рекурсивно! Будущий буфер оболочки содержит знакомый «emacs: Terminal type« dumb »недостаточно мощный для запуска Emacs».

Как это сделать? Вот что я сделал:

В командной строке:

~ [email protected]{1}% screen -s run-emacs2 

Вот сценарий оболочки вводного emacs2:

#!/bin/bash 
EMACS=/usr/bin/emacs23-x 
export NO_AT_BRIDGE=1 ## suppress annoying gtk>2 warning 
exec "$EMACS" -nw --load init.el.test -f spawn-shell 

ПРИМЕЧАНИЕ: Если в командной строке я говорю:

~ [email protected]{1}% run-emacs2 

... все работает нормально. Проблема заключается в некотором взаимодействии с экраном Gnu.

Вот init.el.test (почти дословно из ответа, связанного выше):

(defun spawn-shell() 
    "Invoke shell test" 
    (pop-to-buffer (get-buffer-create (generate-new-buffer-name "gzo"))) 
    (shell (current-buffer)) 
    (process-send-string nil "echo 'test1'\n")) 

ответ

1

Это ожидаемое поведение. Согласно screen инструкции, вариант -s где искать:

-sпрограмма

Установить оболочку по умолчанию будет программа. По умолчанию на экране используется значение переменной окружения $SHELL или /bin/sh, если оно не определено. Эта опция эквивалентна команде оболочки (см. Раздел «Shell»).

Программа screen устанавливает $SHELL переменной программа (в рамках открытие нового окна), и наследуется в подпроцессе, который, в свою очередь, прогонах независимо $SHELL случается. Поскольку вы этого не хотите, исправление должно было бы изменить сценарий emacs на сбрасывать$SHELL назад до /bin/sh перед запуском «оболочки».

Смежные вопросы