Orgagenda-buffer opnieuw opbouwen met timer

Ik probeer mijn Org Agenda -buffer opnieuw te maken met een timer. Ik probeer het zo te doen:

(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)

Ik heb dit eigenlijk van een ander antwoord geveegd, maar ze wilden iets doen wanneer het org-bestand werd opgeslagen. Ik wil het updaten met een timer en fouten tegenkomen.

When I just run the function in ielm Ik krijg de foutmelding: *** Eval error *** ‘recenter’ing a window that does not display current-buffer.

Ik gebruik de Emacs 25.1.50.2-client die is verbonden met een daemon met org versie 8.2.10 op Ubuntu 15.10.

Het doel hiervan is dat ik mijn orgbestand met mijn taken en afspraken graag in één buffer opsla en de buffer Org Agenda ernaast. Dus het belangrijkste doel voor mij om de Org Agenda -buffer bij te werken, is gewoon zo dat de regel die zegt nu - - - - - updatet. Het is een kleine gedachte, maar ik wil het gewoon uitzoeken.

Alle hulp of aanwijzingen wordt op prijs gesteld.

Bewerken 7 maart

Ik heb geconstateerd dat als je de sticky agendaweergave van de dispatcher inschakelt (* optie), ik mijn eerder gedefinieerde renewOrgBuffer -functie interactief met Mx kan aanroepen en in plaats van een fout te krijgen, krijg ik een bericht in de mini buffer die zegt "org-agenda-lijst: 'een venster recenter dat geen current-buffer weergeeft.", wat geweldig is, maar ik wil het niet steeds interactief noemen.

Wanneer ik die functie probeer uit te voeren vanuit de scratch-buffer of op een timer zoals

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

Ik krijg de foutmelding:

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

Hoewel er staat 'Rebuilding agenda buffer ... done' wordt dit niet echt opnieuw opgebouwd.

Alle hulp met deze toegevoegde informatie zou nuttig zijn, bedankt.

1
@lawlist Als ik de orgmode-versie gebruik die met emacs is geleverd, waar is de bron dan? Ik kan alleen de gecompileerde elisp-bestanden vinden in /usr/local/share/emacs/25.1.50/lisp/org . Suggereer je om de bron te bewerken en opnieuw te compileren? Bedankt
toegevoegd de auteur user10117, de bron
@lawlist Ik heb gegooid rond de bron en gaf commentaar op verschillende regels waar recentering werd gebruikt, maar ik stuitte ook op org-agenda-maybe-redo , die org-agenda-redo maar sommige andere dingen maken het bruikbaar voor mij. Bedankt voor je inbreng!
toegevoegd de auteur user10117, de bron
Er zijn slechts een paar recenter in de org-modus - grep ze en becommentarieer ze en compileer indien nodig opnieuw byte. Of zoek de overtredende functie met het woord (recenter ) en herdefinieer het of gebruik advies.U wilt kunnen werken op buffers die niet zichtbaar zijn en recenter is zodat je je nieuwe systeem niet verder kunt ontwikkelen, later kun je een paar uitzonderingen schrijven voor wanneer een venster zichtbaar is, en dan weer ... Ik heb dat lang geleden in mijn eigen opstelling gedaan.
toegevoegd de auteur lawlist, de bron
U moet de broncode downloaden van de versie die u gebruikt. Vervolgens kunt u zoeken naar recenter . U kunt de bron en de re-byte-compilatie bewerken, of u kunt gewoon nieuwe functies maken met dezelfde namen voor diegenen die moeten worden gewijzigd. Als de functie met de naam foo bijvoorbeeld een recenter -commando bevat en foo zich bevindt in de bibliotheek met de naam org-foo.el , dan kan je .emacs iets hebben als: (vereist 'org-foo) (defun foo (nochtans veel argumenten) [de gemodificeerde lef minder de recenter afval])) en start Emacs opnieuw op of evalueer uw .emacs -bestand.
toegevoegd de auteur lawlist, de bron

1 antwoord

Ik vond dat het gebruik van de functie org-agenda-maybe-redo werkte in plaats van org-agenda-opnieuw . Dus mijn vernieuwingsfunctie ziet er nu als volgt uit:

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

en ik heb een timer gemaakt om de agenda-buffers te vernieuwen:

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

Als ik org-agenda-redo en org-agenda-maybe-redo vergelijk, lijkt het erop dat mijn probleem misschien was dat ik de get-buffer- venster functie.

0
toegevoegd
Ja dat heb ik wel gezien. Wat ik had gedaan, was de functie naar mijn scratch-buffer gekopieerd en vervolgens heb ik die regel becommentarieerd en geladen met C-x C-e . Ik had nog steeds het probleem, waardoor ik dacht dat de recentere functie ook ergens anders werd genoemd.
toegevoegd de auteur user10117, de bron
De laatste regel van org-agenda-opnieuw is (recentere venstertegel) - dus u kunt die functie gewoon herschrijven om de laatste regel te markeren - dezelfde procedure die wordt genoemd hierboven: (vereist 'org-agenda) (defun org-agenda-redo (& optioneel alles). [alles behalve de laatste coderegel met betrekking tot recentering]) Je kunt gewoon niet bellen recenter op een buffer tenzij deze zichtbaar is in een venster, anders zal er een fout optreden. U kunt ook alleen in een uitzondering op recenter schrijven wanneer het buffervenster zichtbaar is.
toegevoegd de auteur lawlist, de bron
Het is mogelijk dat het ergens anders vandaan kwam, maar er zijn niet meer dan 10 plaatsen in de laatste versie van org-mode die recenter aanroept. Het komt waarschijnlijk niet van een andere locatie dan org-mode .
toegevoegd de auteur lawlist, de bron