我试图在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
?
答案 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
,则可能会失败。如果效果不好,请尝试使用另一个问题。