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

Matlab 在Emacs中跟踪缓冲区更改并在事件发生后触发挂钩,matlab,emacs,elisp,Matlab,Emacs,Elisp,我试图在Emacs中为我的matlab环境添加一些工具。 基本上,我希望有一个额外的缓冲区(*Matlab Whos*)来显示我的所有变量。在MatlabShell完成表达式求值后,缓冲区应自动更新。换句话说,在我按下shell上的return之后,钩子应该调用一个函数来更新*matlabwhos* 我提出的简单解决方案是: (defvar matlab-whos-buffer-name "*Matlab Whos*") (defun matlab-whos-buffer-update ()

我试图在Emacs中为我的matlab环境添加一些工具。 基本上,我希望有一个额外的缓冲区(*Matlab Whos*)来显示我的所有变量。在MatlabShell完成表达式求值后,缓冲区应自动更新。换句话说,在我按下shell上的return之后,钩子应该调用一个函数来更新*matlabwhos*

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

(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)))))
(defvar matlab whos缓冲区名称“*matlab whos*”)
(定义matlab whos缓冲区更新()
“如果缓冲区不存在,则创建它。
如果存在,请更新其值。“
(拉姆达)
(互动)
(let((doc whos(matlab shell收集命令输出“whos”))
(使用当前缓冲区(获取缓冲区创建缓冲区名称)
(擦除缓冲区)
(插入文件whos)))
(添加钩子的matlab外壳模式钩子
(lambda()
(定义关键matlab外壳模式映射(kbd“”)
(lambda()
(互动)
(comint发送输入)
(matlab whos缓冲区更新(()()))
函数
matlabwhos buffer update
运行良好。但是,这个解决方案的问题是,我的钩子在MatlabShell完成其求值之前调用函数(由
(comint send input)
请求)。因此,
matlab whos buffer update
返回一个错误,说明:

Matlab shell collect命令输出:Matlab shell必须处于非繁忙状态才能运行 那样做


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

(add-hook 'matlab-shell-mode-hook
          (lambda ()
            (add-hook 'comint-output-filter-functions
                      #'matlab-whos-buffer-update
                      nil 'local)))
但请注意,每次进程发送内容时,这都会调用您的函数。我可以预见它有两个问题:

  • 如果
    matlabshell collect命令输出
    最终使用相同的设置(并因此调用
    matlabwhos缓冲区更新
    ),那么它可能会失败
  • 它可能会运行太多次(如果您的进程以5个块的形式发送其输出,那么它将运行5次)

试试看,如果效果不够好,再问另一个问题。

你有没有试过使用
comint输出过滤函数
?如何正确使用它?我刚刚试过
(添加hook'matlab shell mode hook'(cons'matlab whos buffer update'comint output filter functions)
,但那也不起作用。(没有发生任何事情)一般评论:一次向一个钩子添加一个函数,比如
(添加hook'foo hook'foo func)
。你的问题没问题,但你的评论没有问题。