2012-08-04 5 views
20

goto-line関数が非対話型elispプログラムで使用されると、どのような問題が発生する可能性がありますか?そのドキュメント文字列は、次のような警告を出します:なぜインタラクティブな使い方のためにEmacsで "goto-line"を使うのですか?

この関数は通常、Lispプログラムで使うのに間違っています。

(goto-char (point-min)) (forward-line (1- N)) 

私はgoto-line含め私のinitファイルをbyte-compile-fileしようとすると、また、私は再びこのような不快な警告を得る:

.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がインタラクティブに動作しない方法がわからない場合は、現在のバッファの行に移動します –

+0

@JonLin [EmacsWiki:AUCTeX](http://emacswiki.org/emacs/AUCTeX#toc20): 'th-evince-sync'で非対話的に' goto-line'を使う例があります。 – dkim

+0

event_jrがあなたの質問に回答しましたが、まだ*なぜ*あなたはこれをやろうとしていますか?あなたが本当に望むものを達成するためのより良い方法があるかもしれません。また、バッファーが特定の行に絞られているとすれば、おそらくそれがあなたが思っていることをするつもりはないということを指摘しておきます。 – scottfrazer

答えて

29

まず、Elispプログラマが悪い習慣に陥るのを防ぎます。つまり、 という非効率的なコードを行番号中心に書くことです。即ち代わりに、現在の行数を計算 (forward-line 1)を使用してインクリメント、および goto-lineを使用します。

thisメーリングリストの記事から:一言で言えば

、後藤ラインが頻繁に 使用するコマンドであってはならない理由は、通常しない限り、 数N行目に取得したいする理由はありませんということですあなたはその行に面白い何かがあると言ったプログラムがあります。

第二に、後藤ラインは 点(即ちpush-mark)の移動に加えて、ユーザの環境を操作します。非インタラクティブな使用のために、これは あなたが欲しいものではないかもしれません。

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

そして、あなたはどのコンパイラの警告を取得することはありません。このすべてを検討した一方、あなたは、ちょうどこのようにそれを呼び出す、 後藤ラインはあなたが必要な正確に何であると考えています。言われたことに加えて

+1

ポイント操作に言及するため+1。 –

+0

"通常、行番号Nに行こうと思う理由はありません。その行に面白いことがあると言ったプログラムがない限りはありません" - あなたのプログラム(またはelispコード)が、 ?次に、その行から現在の行を減算し、代わりにforward-lineを使用することを推奨しますか? – ShreevatsaR

6

「後藤ラインは」最終的には実際に仕事をする「(前方ライン(1行)」、に再発 "の43行の他のすべて。

実行中のプログラムを書くとき、あなたのコンピュータは対話型コール以外の状態になっているので、この問題に対処する必要があります。状態を "forward-line"で真っ直ぐにしてください。

+1

インタラクティブな使い方を扱う '(対話型arg-descriptor)'部分は、 'goto-line'がLispプログラムから呼び出されたときにスキップされるように見えます。 [リファレンスマニュアル](http://www.gnu.org/software/emacs/manual/html_node/elisp/Using-Interactive.html#index-interactive-1253)から、 "コマンドはLispプログラムから呼び出すことができます呼び出し元が引数を提供し、_arg-descriptor_は効果がありません。 – dkim

+0

@dkimまた、引数の計算を超えたコードはインタラクティブな使い方を扱っています。プッシュマーク、スイッチ間バッファなどがあります。 –

関連する問題