21

goto-line如果在非交互式 elisp 程序中使用该函数会出现什么问题?它的文档字符串给出了一个警告说:

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

(goto-char (point-min)) (forward-line (1- N))

此外,当我尝试byte-compile-file包含 的初始化文件时goto-line,我再次收到这样一个令人不快的警告:

.emacs:170:19:Warning: `goto-line' used from Lisp code
That command is designed for interactive use only

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

4

2 回答 2

30

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

从此邮件列表文章中

简而言之,goto-line 不应该成为常用命令的原因是,通常没有理由想要到达第 N 行,除非您有一个程序告诉您该行有一些有趣的东西。

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

(defun foo ()
  (interactive)
  (with-no-warnings
    (goto-line N)))

而且您不会收到任何编译器警告。

于 2012-08-04T04:25:13.333 回答
6

除了所说的:

“goto-line”最终递归到“(forward-line (1-line)”,这实际上完成了工作。“goto-line”命令主体的 43 行中的所有其他行都处理交互使用。例如,考虑一个可能是普遍的论点。

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

于 2012-08-04T06:31:57.683 回答