【问题标题】:Why is "goto-line" in Emacs for interactive use only?为什么 Emacs 中的“goto-line”仅用于交互使用?
【发布时间】:2012-08-04 03:01:14
【问题描述】:

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

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

【问题讨论】:

  • 不确定 goto-line 将如何以交互方式工作,它会转到当前缓冲区中的一行
  • @JonLin 你可以在EmacsWiki:AUCTeX:th-evince-sync找到一个非交互使用goto-line的例子。
  • event_jr 已经回答了您提出的问题,但您仍然为什么要这样做?可能有更好的方法来完成你真正想要的。另外,我要指出,如果缓冲区被缩小到某一行,可能不会像你想象的那样。
  • @scottfrazer 乍一看,由于它的名字,goto-line 语句似乎是进入第 n 行的更直观(和紧凑)的方式比forward-line 成语。此外,我在 Internet 上发现了一些以非交互方式使用 goto-line 的程序。现在我知道goto-line 可能会产生一些开发人员可能没有预料到的副作用。至于缩小,forward-line 也被限制在缓冲区的可访问部分。

标签: emacs elisp


【解决方案1】:

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

来自this邮件列表文章:

简而言之,goto-line 不应该频繁使用的原因 使用的命令是通常没有理由想要排队 数字 N 除非你有一个程序告诉你有什么 在那条线上很有趣。

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

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

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

【讨论】:

  • “通常没有理由想要到达第 N 行,除非你有一个程序告诉你在那一行有一些有趣的东西”——如果你的程序(或 elisp 代码)计算出有那条线上确实有什么有趣的东西吗?那么是否建议从该行中减去当前行,并改用前行? (简单,但只是确保。)
【解决方案2】:

除了所说的:

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

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

【讨论】:

  • 当从 Lisp 程序调用 goto-line 时,处理交互使用的 (interactive arg-descriptor) 部分看起来被跳过了。来自the reference manual,“命令可以像任何其他函数一样从 Lisp 程序中调用,但随后调用者提供了参数,而 arg-descriptor 无效。”
  • @dkim 计算参数之外的代码也处理交互式使用:还有 push-mark、switch-to-buffer 等。
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多