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



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

在Lisp程序中使用此函数通常是错误的。你可能想要的是这样的东西:

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

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

.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行不应该是一个频繁的使用的命令是,通常没有理由想要到达行数字N,除非你有一个程序告诉你有什么在那条线上很有趣。

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

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

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

除了所说的:

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

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

最新更新