2016-01-24 71 views
3

我試圖添加一些設施到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

回答

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
  • 它可能運行次數太多(如果你的程序將其輸出在5塊,它將會運行5次)。

試試吧,回來與另一個問題,如果不工作不夠好。