为什么Emacs中的"goto-line"仅供交互使用?

dki*_*kim 20 emacs elisp

如果goto-line在非交互式elisp程序中使用该函数会出现什么问题?它的docstring发出警告说:

在Lisp程序中使用此函数通常是错误的.您可能想要的是:

(goto-char (point-min)) (forward-line (1- N))
Run Code Online (Sandbox Code Playgroud)

此外,当我尝试byte-compile-file我的init文件时goto-line,我再次得到一个令人不快的警告:

.emacs:170:19:Warning: `goto-line' used from Lisp code
That command is designed for interactive use only
Run Code Online (Sandbox Code Playgroud)

使用goto-line在非交互式程序真的有这么危险吗?相关地,为什么建议的forward-line解决方案更可取?

eve*_*_jr 29

首先,这可以防止Elisp程序员陷入坏习惯 - 以行号为中心编写低效的代码.即代替使用 (forward-line 1)计算当前行号,递增和使用 goto-line.

这个邮件列表文章:

简而言之,goto-line不应该是一个经常使用的命令的原因是通常没有理由想要获得行号N,除非你有一个程序告诉你在那一行有一些有趣的东西.

其次,除了移动点(即push-mark)之外,goto-line还操纵用户的环境.对于非交互式使用,这可能不是您想要的.另一方面,如果考虑到所有这些,你相信goto-line正是你需要的,那么就这样称呼它:

(defun foo ()
  (interactive)
  (with-no-warnings
    (goto-line N)))
Run Code Online (Sandbox Code Playgroud)

并且您不会收到任何编译器警告.


And*_*ler 6

除了所说的:

"goto-line"最后再次出现在"(forward-line(1- line)"上,这实际上是完成了工作."goto-line"命令体的43行中的所有其他行处理交互式使用.例如考虑到可能普遍的论点.

编写程序时 在运行它时,您的计算机处于另一种状态,而不是跟随交互式呼叫.因此,你应该直接使用"前线"来解决这种状态.