• 締切済み

emacs lispで別のバッファを制御する方法

emacs lispのプログラミングをしていて、現在のバッファにあるファイル名と行番号を取得して別のwindowにそのファイルのその行を表示させたいのですが、以下の様にしてファイルのオープンは出来るのですが行の移動が出来ません。どの様にしたら良いのでしょうか? ------------------------ (defun elx-display-source () (interactive) (elx-link-to-source) ; <--この関数でfile-nameとline-noに値がセットされる (setq log-buffer (current-buffer)) <-- 今のバッファ ( if file-name (progn (setq rtl-buffer (find-file-noselect file-name)) <-- 新しいファイルを開く(OK) (display-buffer rtl-buffer) ; (switch-to-buffer rtl-buffer) ; (goto-line line-no) ; <-- ここで行をジャンプさせたいがしない。。。 (switch-to-buffer log-buffer))) ) ---------------------

みんなの回答

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

goto-lineの後に(sit-for 5)とか入れると移動自体はうまく行っているのがわかると思います。 (display-buffer rtl-buffer) を削除するか、(switch-to-buffer log-buffer)の後に移すと多分希望の動作になると思います。 他の方法として、(goto-line line-no)の後に何か書けばいいのかもしれませんがわかりません。 display-buffer によってこのバッファのウィンドウが作られ、次の switch-to-buffer によって同じバッファのウィンドウがまた別に作られます。goto-lineでは後から作られたウィンドウでポインタが移動しますが、最初に作られたウィンドウ上ではポインタは開かれた時点から動いていません。最後のswitch-to-bufferで後から作られたウィンドウが消えるのでポイント移動がなかったことになります。

すると、全ての回答が全文表示されます。
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

emacsの組み込みlisp関数の動作は知らないのですが、lisp自体は分かるので、若干のアドバイスです。 line-noに確実に行番号が入っていることは確認済みでしょうか。また、その場所でgoto-lineを使用して間違いなくジャンプすることは確認済みでしょうか。 念のため、 (goto-line line-no) のかわりに (goto-line 5) とか (goto-line 10) とかを実行して、指定したファイルの5行目/10行目に飛ぶかどうか試してみてはいかがでしょうか。 これで5行目/10行目に飛ぶようであればline-noに行番号が入っていない可能性が高いですし、5行目/10行目に飛ばないようであれば、この関数呼び出しのシーケンスではgoto-lineを使用してジャンプすることができないという判断ができます。

すると、全ての回答が全文表示されます。

関連するQ&A