跟踪缓冲区更改并在Emacs中触发事件后的挂钩

时间:2016-01-24 15:07:28

标签: matlab emacs elisp

我试图在Emacs中的matlab环境中添加一些功能。 基本上,我想要一个额外的缓冲区(* Matlab Whos *)来显示我的所有变量。在 matlab-shell完成对表达式的评估后,缓冲区应自动更新。换句话说,之后我按下shell上的return,一个钩子应该调用一个函数来更新* Matlab Whos *。

我想出的简单解决方案是:

(defvar matlab-whos-buffer-name "*Matlab Whos*")

(defun matlab-whos-buffer-update ()
 "Create Matlab Whos buffer if it doesn't exist. 
 If it exists, update its values."
  (lambda)
  (interactive)
  (let ((doc-whos (matlab-shell-collect-command-output "whos")))
    (with-current-buffer (get-buffer-create matlab-whos-buffer-name)
      (erase-buffer)
      (insert doc-whos))))

(add-hook 'matlab-shell-mode-hook
          (lambda ()
            (define-key matlab-shell-mode-map (kbd "<return>")
              (lambda ()
                (interactive)
                (comint-send-input)
                (matlab-whos-buffer-update)))))

函数matlab-whos-buffer-update运行正常。但是,这个解决方案的问题是我的钩子在matlab shell完成其评估之前调用该函数(由(comint-send-input)请求)。因此,matlab-whos-buffer-update会返回错误消息:

  

Matlab-shell-collect-command-output:MATLAB shell必须非忙   那样做。

如何跟踪对我的Matlab shell缓冲区的更改,以便我的钩子知道在评估结果返回后它只能触发matlab-whos-buffer-update

1 个答案:

答案 0 :(得分:0)

你可以从

之类的东西开始
(add-hook 'matlab-shell-mode-hook
          (lambda ()
            (add-hook 'comint-output-filter-functions
                      #'matlab-whos-buffer-update
                      nil 'local)))

但请注意,每次从流程发送内容时,这都会调用您的函数。我可以预见到它有两个问题:

  • 如果matlab-shell-collect-command-output最终使用相同的设置(因此也会调用matlab-whos-buffer-update,则可能会失败。
  • 可能会运行太多次(如果您的进程以5个块的形式发送输出,则会运行5次)。

如果效果不好,请尝试使用另一个问题。