簡體   English   中英

如何異步運行elisp函數?

[英]How can I run an elisp function asynchronously?

對於那些不知道的人來說, imenu是emacs中的一個東西,它允許模式將一個或多個菜單項插入菜單欄。 最常見的用法是從下拉菜單中訪問“目錄”,因此用戶可以快速跳轉到文檔中的函數或類或節的聲明等。

imenu有幾種不同的工作方式 - 在第一種和更常用的方式中,主模式為imenu提供regexp,而imenu使用這些regexp來執行緩沖區的掃描並構​​建索引。 主要模式通過將regexp列表放入imenu-generic-expression 第二種方式是主模式執行自己的掃描。 它可以通過將變量imenu-create-index-function設置為由theode定義imenu-create-index-function的名稱來執行此操作,該函數返回包含目錄的列表。

我正在做后者 - imenu-create-index-function - 但有時fn需要花費很長的時間來運行,比如3或4秒或更長時間,這會凍結UI。 如果我使操作異步,那將解決該問題。

我知道異步過程。 掃描邏輯在elisp中實現。 是否可以在異步流程中運行elisp? 如果是這樣,怎么樣?

或者,有沒有辦法在emacs中異步運行常規的elisp,而不需要求助於異步進程?

我認為font-lock的作用方式是,它在閑置時就會出現問題。 它一次保持狀態和一點點狀態,始終記住它停止的地方,還需要做什么其他事情,自上次祝福以來發生了什么變化等等。我的理解是否正確? 也許我可以使用這種增量方法。

建議?

要以異步方式運行elisp,可以使用run-with-idle-timerrun-with-timer 我想你會想要idle版。 有關詳細信息,請查看文檔鏈接。

注意:如果代碼需要3或4秒才能運行,它仍然會花費那么長時間(並在運行時凍結你的Emacs),所以如果你可以將工作分成足夠小的塊,只需要0.5秒或所以,在某個時間,這可能會很好。

我一直使用的一個軟件包pabbrev.el非常好地使用空閑計時器 - 我從未注意到它正在運行。 這可能是一個很好的包,可以檢查它是如何分解工作的(它掃描所有打開的緩沖區並構建一個單詞頻率列表)。

TreyJackson和jeremiahd發布的答案在2011年有效。現在,在2018年,這里是異步進程的emacs文檔的鏈接。

您可以通過以批處理模式生成emacs作為進程來在異步流程中運行elisp,請參閱http://www.emacswiki.org/emacs/BatchMode 除此之外,據我所知,基本上沒什么。

它看起來像http://nschum.de/src/emacs/async-eval/基本上包裝了執行此操作所需的樣板。 不知道它是否積極維護或其他任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM