2012-08-04 63 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

相關問題