[英]Why is “goto-line” in Emacs for interactive use only?
如果在非交互式elisp程序中使用goto-line
函數會出現什么問題? 它的docstring發出警告說:
在Lisp程序中使用此函數通常是錯誤的。 您可能想要的是:
(goto-char (point-min)) (forward-line (1- N))
而且,當我嘗試使用goto-line
我的init文件進行byte-compile-file
,我再次得到一個令人不快的警告:
.emacs:170:19:Warning: `goto-line' used from Lisp code
That command is designed for interactive use only
在非交互式程序中使用goto-line
真的那么危險嗎? 相關地,為什么建議的forward-line
解決方案更可取?
首先,這可以防止Elisp程序員陷入壞習慣 - 以行號為中心編寫低效的代碼。 即代替使用(forward-line 1)
計算當前行號,遞增和使用goto-line
。
從這個郵件列表文章:
簡而言之,goto-line不應該是一個經常使用的命令的原因是通常沒有理由想要獲得行號N,除非你有一個程序告訴你在那一行有一些有趣的東西。
其次,除了移動點(即push-mark
)之外,goto-line還操縱用戶的環境。 對於非交互式使用,這可能不是您想要的。 另一方面,如果考慮到所有這些,你相信goto-line正是你需要的,那么就這樣稱呼它:
(defun foo ()
(interactive)
(with-no-warnings
(goto-line N)))
並且您不會收到任何編譯器警告。
除了所說的:
“goto-line”最后再次出現在“(前線(1-行)”上,這實際上是完成了工作。“goto-line”命令體的43行中的所有其他行處理交互式使用。例如考慮到可能普遍的論點。
編寫程序時 在運行它時,您的計算機處於另一種狀態,而不是跟隨交互式呼叫。 因此,你應該直接使用“前線”來解決這種狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.