gpt4 book ai didi

matlab - 在 Emacs 中跟踪缓冲区更改并在事件发生后触发 Hook

转载 作者:行者123 更新时间:2023-12-02 06:46:39 25 4
gpt4 key购买 nike

我正在尝试向 Emacs 中的 matlab 环境添加一些工具。基本上,我想要一个额外的缓冲区(*Matlab Whos*)来显示我的所有变量。 matlab-shell 完成表达式求值后,缓冲区应自动更新。换句话说,我按 shell 上的 return 后, Hook 应该调用一个函数来更新 *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工作正常。然而,这个解决方案的问题是我的钩子(Hook)在 matlab shell 完成其评估之前调用该函数(由 (comint-send-input) 请求)。因此,matlab-whos-buffer-update 返回错误:

Matlab-shell-collect-command-output: MATLAB shell must be non-busy to do that.

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

最佳答案

你可以从类似的事情开始

(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 个 block 发送其输出,它将运行 5 次)。

尝试一下,如果效果不够好,然后再提出另一个问题。

关于matlab - 在 Emacs 中跟踪缓冲区更改并在事件发生后触发 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34977344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com