2011-05-20 85 views
12

對於那些不知道的人來說,imenu是emacs中的一個東西,它允許一個模式在菜單欄中插入一個或多個菜單項。最常見的用法是從下拉菜單中訪問「目錄」,以便用戶可以快速跳轉到文檔中的功能或類或部分的聲明等。如何異步運行elisp函數?

imenu有一對不同的工作方式 - 在第一種和更常用的方式中,主要模式爲imenu提供了正則表達式,imenu使用這些正則表達式執行緩衝區掃描並構建索引。主要模式通過將正則表的列表放入imenu-generic-expression來設置它。第二種方式是讓主要模式執行自己的掃描。它可以通過將變量imenu-create-index-function設置爲由mode定義的函數的名稱來實現,它返回一個包含目錄表的列表。

我正在做後者 - imenu-create-index-function - 但有時fn需要一段時間才能運行,比如說3或4秒或更長時間,這會凍結用戶界面。如果我使操作異步,那就可以解決這個問題。

我瞭解異步流程。掃描邏輯在elisp中實現。是否有可能在異步過程中運行elisp?如果是這樣,怎麼樣?

或者,有沒有辦法在emacs中異步運行常規elisp,而不訴諸於異步進程?

我認爲字體鎖的方式,它閒置閒置。它一次保持狀態和小小的形象,永遠記住它停留的地方,還有什麼需要被建立,自從上一次分身運行以來發生了什麼變化,等等。我的理解是否正確?也許我可以使用這種漸進式方法。

建議?

回答

9

要異步運行elisp,您可以使用run-with-idle-timerrun-with-timer。我想你會想要idle版本。查看文檔鏈接瞭解更多詳情。

注意:如果代碼需要3或4秒才能運行,它仍然需要很長時間(並且在運行時凍結Emacs),所以如果可以將工作分解爲足夠小的塊每次0.5秒左右,這可能會奏效。

我一直使用的一個包,pabbrev.el,真的很好地使用了空閒計時器 - 我從未注意到它正在運行。這可能是一個很好的方法來檢查它是如何分解工作的(它正在掃描所有打開的緩衝區並建立一個詞頻列表)。