4

What I want to do from inside a term shell is have a function called when there is new output or a certain regexp (e.g. a prompt) appears in in a term's output. The callback function should then be able to access text from the either the last time it was called, or from the last time that pattern was seen.

In comint this would be a function stored in comint-output-filter-functions, and for eshell: eshell-output-filter-functions

Can this be done in term.el? If so, how?

2
  • You could add a :before advice to term-emulate-terminal -- the process-filter of the buffer-process of a term buffer.
    – Tobias
    Aug 21, 2017 at 15:45
  • 1
    I don't understand. And I'm not good at inference. I can try experimenting but I need more details. Perhaps code snippets and/or links to concepts you are referring to?
    – rocky
    Aug 23, 2017 at 1:44

1 Answer 1

1

Here is a concrete example using the old style advice:

(defadvice term-emulate-terminal (before out-terminal-string activate)
  (message "%s" str))

Notes:

  • term-emulate-terminal is the output process filter for terminals
  • output-terminal-string is a label for this advice, change as you please
  • The variable str matches the string variable used in term-emulate-terminal. In this advice style you are allowed to directly reference the original arguments by name.
9
  • Seems interesting although I don't have time right now to check it out. I will later. Thanks.
    – rocky
    Jan 23, 2018 at 16:47
  • Take your time. I spent a reasonable amount of time messing with this recently, so if you have any questions don't hesitate to ask. My purpose was to get pdbtrack working with term/ansi-term, which I was successful with. Jan 24, 2018 at 13:28
  • Want to get realgud working with term/ansi-term? I'd be eternally grateful. github.com/realgud/realgud/blob/master/realgud/common/…
    – rocky
    Jan 24, 2018 at 17:14
  • I'll even add a bounty for it if you do it - name your price :-)
    – rocky
    Jan 24, 2018 at 17:22
  • I don't use realgud at the moment, partially because I often don't have access to more than vanilla emacs 24+. However, looking at your comint hook, it looks like you take the approach that pdbtrack takes with its comint hook, you track the actual comint buffer rather than the text string passed to the hook function. When getting pdbtrack working with term/ansi-term I use the actual text passed to my hook/advice. This was enough in my case, but there is a note in your hook comments about "piecing the text together", could you elaborate? JohnLunzer@github. Jan 29, 2018 at 11:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.