为什么是;“后藤线”;是否在Emacs中仅用于交互?

为什么是;“后藤线”;是否在Emacs中仅用于交互?,emacs,elisp,Emacs,Elisp,如果在非交互式elisp程序中使用goto line功能,会出现什么问题?它的docstring发出警告说: 在Lisp程序中使用此函数通常是错误的。 您可能想要的是: (goto-char (point-min)) (forward-line (1- N)) 此外,当我尝试字节编译文件我的初始文件包括转到行时,我再次收到这样一个令人不快的警告: .emacs:170:19:Warning: `goto-line' used from Lisp code That command is des

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

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

(goto-char (point-min)) (forward-line (1- N))
此外,当我尝试
字节编译文件
我的初始文件包括
转到行
时,我再次收到这样一个令人不快的警告:

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

在非交互式程序中使用
goto-line
真的很危险吗?与此相关的是,为什么建议的
转发行
解决方案更可取?

首先,这可以防止Elisp程序员养成坏习惯——编写代码 以行号为中心的代码效率低下。i、 而不是使用
(前进行1)
计算当前行号,递增并使用
转到行

从邮件列表文章:

简言之,goto line的原因不应该是
所使用的命令是,通常并没有理由想进入生产线 数字N除非你有一个程序告诉你 这句话很有趣

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

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

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

除了上面所说的:

“goto-line”最终递归到“(forward-line(1-line)”,这实际上起到了作用。“goto-line”命令体的43行中的所有其他行都处理交互使用。例如,考虑一个可能的通用参数


在编写程序或运行程序时,您的计算机处于另一种状态,而不是执行交互式调用。因此,您应该使用“转发线路”来解决此状态一直往前走。

不确定“转到”行如何工作。它不以交互方式转到当前行中的一行buffer@JonLin您可以在:
th evince sync
找到一个非交互使用
goto line
的示例。event\u jr已经回答了您提出的问题,但您为什么要尝试这样做?可能有更好的方法来实现还有,我要指出的是,如果缓冲区被缩小到某一行,它很可能不会像你想象的那样工作。@scottfrazer乍一看,由于它的名字,
goto-line
语句看起来更直观(也更紧凑)到第n行的方式比
forward-line
的习惯用法要多。此外,我在互联网上遇到了一些非交互使用
goto-line
的程序。现在我明白了
goto-line
可能会有一些开发人员无法预料的副作用。至于缩小范围,
forward-line
也很重要ted到缓冲区的可访问部分。当从Lisp程序调用
转到行
时,处理交互使用的
(交互式arg描述符)
部分看起来被跳过。从,“命令可以像任何其他函数一样从Lisp程序中调用,但调用方提供参数,arg描述符无效。”@dkim也可以在参数计算之外编写代码,处理交互使用:仍然有push-mark、switch-to-buffer等功能。”通常情况下,没有理由想访问第N行,除非您有一个程序告诉您该行上有一些有趣的内容”-如果您的程序(或elisp代码)怎么办计算出这条线上确实有一些有趣的东西吗?那么建议从这条线上减去当前的线,然后改用前进线?(简单,但要确保。)