Matlab 在Emacs中跟踪缓冲区更改并在事件发生后触发挂钩
我试图在Emacs中为我的matlab环境添加一些工具。 基本上,我希望有一个额外的缓冲区(*Matlab Whos*)来显示我的所有变量。在MatlabShell完成表达式求值后,缓冲区应自动更新。换句话说,在我按下shell上的return之后,钩子应该调用一个函数来更新*matlabwhos* 我提出的简单解决方案是: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 ()
(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)
。你的问题没问题,但你的评论没有问题。