タイマー付き組織のアジェンダバッファの再構築

Org Agenda バッファをタイマーで再構築しようとしています。私はこのようにしています:

(defun renewOrgBuffer ()
  (interactive)
  (dolist (buffer (buffer-list))
    (with-current-buffer buffer
      (when (derived-mode-p 'org-agenda-mode)
    (org-agenda-redo t))))
  )
(run-with-idle-timer 60 1000 #'renewOrgBuffer)

私は基本的にこれを別の答えからスワイプしましたが、orgファイルが保存されたときに何かしたいと思っていました。私はタイマーでそれを更新したいとエラーに実行しています。

When I just run the function in ielm 私はエラーが表示されます: *** Eval error *** ‘recenter’ing a window that does not display current-buffer.

私は、Emacs 25.1.50.2クライアントをUbuntu 15.10上のorg verion 8.2.10とデーモンに接続して実行しています。

私の目的は、自分のトドスと予定を1つのバッファに入れ、その隣に Org Agenda バッファを配置したいということです。したがって、 Org Agenda バッファを更新する主な目的は、 now ---- - という行が更新されるようにすることです。それは小さな思考ですが、私はそれを理解したいだけです。

どんな助けや指針もありがとうございます。

3月7日を編集

ディスパッチャ(*オプション)からスティッキーアジェンダビューを有効にすると、以前定義した renewOrgBuffer 関数をMxと対話的に呼び出すことができ、エラーを取得する代わりに、 "org-agenda-list: '現在のバッファを表示しないウィンドウを再センタリングします。"という素晴らしいミニバッファですが、毎回インタラクティブに呼び出すことは望ましくありません。

スクラッチバッファーやタイマーのような関数を実行しようとすると

(run-with-idle-timer 3 1000 #'renewOrgBuffer)

私はエラーが表示されます:

Rebuilding agenda buffer...done
Error running timer ‘renewOrgBuffer’: (error "‘recenter’ing a window that does not display current-buffer.")

「アジェンダバッファを再構築する...完了しました」とは言いますが、実際に再構築するわけではありません。

この情報が追加された場合は、何か助けてください、ありがとう。

1
@lawlist emacsに付属のorgmodeバージョンを使用している場合、ソースはどこですか?コンパイルされたelispファイルは、 /usr/local/share/emacs/25.1.50/lisp/org にしか見つかりません。ソースの編集と再コンパイルをお勧めしますか?ありがとう
追加された 著者 user10117,
@lawlist私はソースの周りでgrepを行い、再センタリングが使用されていた別の行をコメントしていましたが、 org-agenda-redo /code>でも使えるものはいくつかあります。あなたの入力をありがとう!
追加された 著者 user10117,
org-modeにはいくつかの recenter しかありません。それらをgrepしてコメントアウトし、必要に応じて再バイトコンパイルします。または、(recenter )という単語を含む問題のある関数を見つけて、再定義するか、またはアドバイスを使用します。表示されていないバッファを操作したい場合は recenter 後であなたの新しいシステムを開発することができなくなります。後で、ウィンドウが表示されたときにいくつかの例外を書き留めてから、再度入れることができます。
追加された 著者 lawlist,
使用しているバージョンのソースコードをダウンロードする必要があります。次に、 recenter を単語検索できます。ソースを編集して再度バイトコンパイルするか、変更が必要なものに対して同じ名前の新しい関数を作成することができます。例えば、 foo という名前の関数が recenter コマンド `を含み、 fooorg-foo.elあなたの .emacs は次のようなものを持つことができます:(require 'org-foo)(defun foo(しかし多くの引数) して、Emacsを再起動するか、 .emacs ファイルを評価してください。
追加された 著者 lawlist,

1 答え

私は、 org-agenda-redo の代わりに org-agenda-maybe-redo という関数を使っていることが分かりました。 だから私の更新機能は次のようになります:

(defun renewOrgBuffer ()
  (interactive)
  (dolist (buffer (buffer-list))
    (with-current-buffer buffer
      (when (derived-mode-p 'org-agenda-mode)
    (org-agenda-maybe-redo))))
  )

議事録を更新するためのタイマーを作った:

(run-with-idle-timer 3 1000 #'renewOrgBuffer)

org-agenda-redoorg-agenda-maybe-redo を比較すると、おそらく私の問題は get-buffer-ウィンドウ関数を呼び出します。

0
追加された
はい、私はそれを見ました。私が行ったことは、関数を自分のスクラッチバッファにコピーしてから、その行をコメントアウトして C-x C-e でロードしました。私はまだ問題を抱えていたので、recenter関数が別の場所で呼び出されていると思うようになった。
追加された 著者 user10117,
org-agenda-redo の最後の行は(recenter window-line)です - この関数を書き直して最後の行をコメントアウトすることができます(コード化されたコードの最後の行を除くすべてのもの))を呼び出すことはできません。ウィンドウに表示されている場合を除いて、バッファに再配置してください。そうでない場合は、エラーが発生します。バッファウィンドウが表示されている場合にのみ、再センタリングするために例外を書き込むこともできます。
追加された 著者 lawlist,
それは他の場所から来ている可能性がありますが、 recenter を呼び出す org-mode の最新バージョンには10カ所しかありません。 org-mode 以外の場所から来る可能性は低いです。
追加された 著者 lawlist,