Як я можу отримати свій емулятор терміналу, коли Emacs робить?


2

Це можна вважати подальшим заходом: Як зберегти історію оболонки від emacs та використовувати її в терміналі?

Я намагаюся змусити bash вийти із наступним у моєму файлі .emacs, але він не працює, навіть якщо після слова "вихід" я включаю вбудований символ ^ M. Чи можна це змусити працювати?

(defun bye ()
  "Leaving emacs now"
  (interactive)
  (shell)
  (goto-char (point-max))
  (insert-string "exit"))
(add-hook 'kill-emacs-hook 'bye)

Відповіді:


0

Частина причини, чому те, що ти робиш, не спрацює, це те, що (shell)фактично запускає нову неповноцінну оболонку, яка може бути, а може і не бути цільовою метою (insert-string); у будь-якому випадку, найбільше це можна зробити - це вийти з нижньої оболонки. У вікі Emacs є питання без відповіді на цю тему, яке порівняно рідко зустрічається з будь-якої теми; між цим, і загальною незацікавленістю, яку виявляє Emacs, що не працює в пакетному режимі, будь-якими способами спілкуватися зі своїм батьківським процесом, я схиляюся до сумнівів у тому, що ви намагаєтесь зробити.

Це, однак, не означає, що ви не можете отримати бажаного результату - адже Emacs не повинен спілкуватися з його батьківським процесом; якщо ви заміните процес оболонки на Emacs, то будь-який термінал, який ви використовуєте, буде виходити в той же час, що і Emacs, таким же чином, як і будь-який термінал, коли процес, приєднаний до його pty, закінчиться.

Метод змінюватиметься залежно від вашої оболонки, але в Bash, zsh і, ймовірно, також tcsh (також, якщо хтось все ще використовує), вам потрібно просто передмовити виклик Emacs exec- якщо ви зазвичай говорите emacs -nw, замість цього скажіть exec emacs -nw, & c.

Це передбачає, що ви викликаєте Emacs безпосередньо з оболонки, як це здається ймовірним. Якщо ви (наприклад) використовуєте скрипт оболонки для виклику Emacs, це не спрацює, тому що execзамінить процес оболонки, що виконує сценарій, а не той, який пов'язаний з вашим pty; у такому випадку просто execсценарій оболонки, і ви все одно отримаєте результат, якого ви шукаєте, якщо тільки ваш сценарій не зробить щось по-справжньому дивно, і в цьому випадку ви повинні оновити своє запитання, щоб включити його, і хтось, ймовірно, зможе щось розібратися це спрацює.


Насправді це нижча оболонка, яку я намагаюся зробити, і (shell) запускає нову нижчу оболонку лише тоді, коли немає існуючого буфера під назвою "* shell *". У мене майже завжди є буфер під назвою "* shell *", тому я вважаю, що якби я міг отримати баш для обробки команди "вихід", яку я вставляю, вона буде працювати.
wytten

Я повернувся і дотримувався пропозиції, яку ви зробили в попередньому запитанні про читання bash FAQ, і це виглядає як додавання PROMPT_COMMAND = "історія -a" до мого .bashrc - це рішення, яке працює, дякую!
wytten

@wytten Ярмарок досить; рада допомогти.
Аарон Міллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.