2012-12-29 44 views
1

我想告訴Emacs在緩衝區中「監視」一個特定的表格(由其car標識),並在編輯它時進行評估。觀看sexpr進行編輯

我能想到的一種方法是給post-self-insert-hook添加一個函數,該函數將查找並解析目標窗體並將其與之前存儲的狀態進行比較。

它不會發出響亮效率低下,特別是如果強制執行「每秒呼叫次數」(例如使用current-time)。

是否有更高級別/更習慣性的方式來實現這一目標?這聽起來像已經解決了這種問題。

+0

這可能是一個愚蠢的問題,但考慮到你所談論的人工編輯,你可以確認'CMx'(即'EVAL-defun')絕對不是一個適當的解 – phils

+0

我通常以這種方式(即手動)評估東西,但我的問題的關鍵是如何自動執行某些形式的此過程。 – vemv

+1

我與wvxvw在這一個。與最後一段相反,如果有人曾試圖「解決」這個問題,我真的會感到有點驚訝。如果你正在編輯一個表達式,它可能會經過許多有效和無效的狀態,只有你知道它何時*實際上*準備好被重新評估。因此,這必然是一項手動任務(至少在一般情況下肯定是這樣)。如果你堅持要這樣做,一個例子可能會有用,因爲它確實聽起來很奇怪。 – phils

回答

3

我認爲最自然的方法是創建一個覆蓋從表格的開始到結尾。

疊加層有一個modification-hooks屬性,您可以添加一個觀察器功能。

如果您嚴格修改其中的緩衝區內容,則疊加層將收縮或展開,但您需要決定在窗體邊緣編輯緩衝區時應執行的操作。請參閱insert-in-front-hooksinsert-behind-hooksmake-overlay的最後兩個參數。我可能只是在大多數情況下重新創建覆蓋圖,只是爲了確定新的邊界。

關於「每秒通話次數」的事情,您可以使用run-with-idle-timer

2

提到的@Dmitry的一部分可以變成簡單的原型。馬克(message "text")和運行的Mxeval-on-modify-add

(defun eval-on-modify-add() 
    (interactive) 
    (let ((ov (make-overlay (region-beginning) (region-end)))) 
    (overlay-put ov 'modification-hooks '(eval-on-modify-execute)))) 

(defun eval-on-modify-execute (ov &optional flag &rest rv) 
    (if flag 
     (eval-region (overlay-start ov) (overlay-end ov)))) 

(message "test")