2012-08-04 85 views
20

可如果goto-line功能在非交互式的elisp程序中出现什么问题?它的文档字符串给出了一个警告:为什么“转到行”在Emacs只能交互使用?

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

+0

不确定goto-line将如何不交互工作,它会转到当前缓冲区中的一行 – 2012-08-04 03:07:20

+0

@JonLin你可以在[EmacsWiki:AUCTeX](http://emacswiki.org/emacs/AUCTeX#toc20):'th-evince-sync'找到一个非交互式使用'goto-line'的例子。 – dkim 2012-08-04 03:35:11

+0

event_jr已回答您提出的问题,但仍然*为什么*您是否在尝试这样做?可能有更好的方法来完成你真正想要的。另外,我会指出,如果缓冲区已经缩小到某一行,可能不会做你认为的事。 – scottfrazer 2012-08-04 10:40:40

回答

29

首先,这样可以防止elisp的程序员从落入坏习惯 - 在一个行号中心的方式写 低效的代码。即,而不是使用 (forward-line 1)计算当前行号递增,并使用 goto-line

this邮件列表中的文章:

概括地说,之所以转到行不应该是一个经常 使用的命令是,通常没有理由想排队 数N,除非你有一个程序,告诉你,有一些有趣的 该行上。

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

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

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

除了说了什么
+1

+1提点操作。 – 2012-08-04 05:50:49

+0

“通常没有理由想要达到第N行,除非你有一个程序告诉你这个行有一些有趣的事情” - 如果你的程序(或elisp代码)已经计算出那里确实有一些有趣的东西,那该怎么办? ?那么建议从该行中减去当前行,并使用前向行? (很简单,但只是确认) – ShreevatsaR 2016-09-18 09:32:06

6

“转到行”终于复发到“(正线(1-线)”,这实际上不工作的所有其他的43条线的“。 goto-line“命令体处理交互式使用,例如考虑一个可能的通用参数

在编写程序或运行它时,计算机处于另一个状态,而不是跟随交互式调用。直接使用“前进线”

+1

处理交互使用的'(交互式参数描述符)'部分看起来像是在从Lisp程序调用goto-line时被跳过。从[参考手册](http://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Interactive.html#index-interactive-1253),“命令可以从Lisp程序调用任何其他函数,但调用者提供参数并且_arg-descriptor_不起作用。“ – dkim 2012-08-05 20:00:57

+0

@dkim除了参数计算之外的代码还处理交互式使用:仍然存在推送标志,切换到缓冲区等。 – 2015-06-08 11:30:41

相关问题