2

I had a problem with execution of (comint-simple-send process command). My previous example would not show the last output because I didn't use the hook and the result was being dispalyed before the command finished it's execution. Als I didn't know about having to restart the process to reflect the code changes.

My solution

The following code works.

(add-hook 'comint-output-filter-functions
          '(lambda (txt) (message (format  " output ----------- %c%s" 10 txt))))

(let* ((process-buffer (make-comint-in-buffer "StrangeTerm" "*strange-term*" "/bin/bash"))
       (p (get-buffer-process process-buffer)))
  (comint-simple-send p "ls -l /"))

The lambda has the expected output, which I can see in Messages and in future I can do what I want with it.

Please confirm if this is the correct approach.

ruby_object
  • 437
  • 2
  • 12
  • Why do you use ansi-term for ls ~/Desktop? Can't you use directory-files or shell-command or async-shell-command? (The latter two if the ls ~/Desktop is just an example of what you want to do.) – Tobias Jan 13 '17 at 17:36
  • it could be any command, like asking a programming language interpreter for the list of loaded modules. – ruby_object Jan 13 '17 at 17:58
  • You can call arbitrary commands from elisp without sending them to an ansi-term process. Unless you need to run multiple commands in the same terminal, there is an easier way to get the output of any single command. – Tyler Jan 13 '17 at 18:05
  • I know there are easier ways, but to understand comint-mode and talking to processes i need to do it this way. – ruby_object Jan 13 '17 at 18:12
  • Note that term-mode is based on comint but it does not use it. – Tobias Jan 13 '17 at 19:11
  • Note that you don't need a strange-term. Just use text properties to identify boundaries (put-text-property is your friend). You can even put text properties on newline characters. – Tobias Jan 13 '17 at 23:41

1 Answers1

3

One crude non-robust way to get the last output in term-modeis:

(defun term-recommended-hook ()
  "Hook function recommended as `term-mode-hook'. (See file \"term.el\".)"
  (setq term-prompt-regexp "^[^#$%>\n]*[#$%>] *")
  (setq-local mouse-yank-at-point t)
  (setq-local transient-mark-mode nil)
  (auto-fill-mode -1)
  (setq tab-width 8 ))

(add-hook #'term-mode-hook #'term-recommended-hook)

(let ((p (get-buffer-process "*ansi-term*")))
  (comint-simple-send p "ls ~/Desktop")
  (with-current-buffer (get-buffer "*ansi-term*")
    (buffer-substring-no-properties (save-excursion (term-previous-prompt 1) (forward-line) (point)) (line-beginning-position))))
Tobias
  • 33,167
  • 1
  • 37
  • 77
  • thank you, I get what I want except the fact that buffer substring returns only last line of output. I think I can manage from this point onwards. – ruby_object Jan 13 '17 at 19:47
  • @ruby_object In that case you didn't probably run term-recommended-hook (the setting for term-prompt-regexp is most important). Note that after installing the hook you need to restart ansi-term. – Tobias Jan 13 '17 at 19:49
  • killing the term process, as you said and your hook example has helped me to find the solution. – ruby_object Jan 13 '17 at 20:17