为什么Emacs中的“goto-line”仅用于交互式使用?

时间:2012-08-04 03:01:14

标签: emacs elisp

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

  

这个函数在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解决方案更可取?

2 个答案:

答案 0 :(得分:29)

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

来自this邮件列表文章:

  

简而言之,为什么goto-line不应该频繁出现   used命令通常没有理由想要排队   数字N,除非你有一个程序告诉你有什么   这条路很有意思。

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

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

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

答案 1 :(得分:6)

除了所说的:

“goto-line”最终复制到“(前进行(1-行)”,这实际上是工作。“goto-line”命令体的43行中的所有其他行处理交互使用。考虑一个可能普遍的论点的例子。

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