跟踪缓冲区更改并在Emacs事件后触发一个钩子

问题描述:

我试图添加一些设施到Emacs中的我的matlab环境。 基本上,我想要一个额外的缓冲区(* Matlab Whos *)来显示我所有的变量。在之后,缓冲区应该自动更新matlab-shell完成评估表达式。换句话说,之后我按下了返回的shell,一个钩子应该调用一个函数来更新* Matlab Whos *。跟踪缓冲区更改并在Emacs事件后触发一个钩子

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

(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的壳收集命令输出:MATLAB外壳必须是非忙着 做到这一点。

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

+0

您是否尝试过使用'COMINT输出过滤函数'? – Drew

+0

如何使用那个合适的ÿ?我只是尝试'(加钩'matlab-shell-mode-hook'(cons'matlab-whos-buffer-update'comint-output-filter-functions)',但那也不起作用。 – dangom

+0

一般评论:一次添加一个函数到钩子,比如'(add-hook'foo-hook'foo-func)'。在你的问题中没有问题,但你的评论没有问题。 – jpkotta

你可以用的东西开始喜欢

(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次)。

试试吧,回来与另一个问题,如果不工作不够好。