emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: "Sébastien Vauban" <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org>
To: emacs-orgmode-mXXj517/zsQ@public.gmane.org
Subject: Re: Having (too) many files in org-agenda-files
Date: Wed, 29 Sep 2010 23:21:31 +0200	[thread overview]
Message-ID: <871v8cxn38.fsf@mundaneum.com> (raw)
In-Reply-To: 878w2ld3jb.fsf@fastmail.fm

Hi Matt,

Matt Lundin wrote:
> Sébastien Vauban writes:

First thing: no prob' for my name. The reply is important, my name much
less... isn't it, Matt (or Mattew? ;-))


>> Of course, I have many, many files in Org mode. All files I write (or
>> touch) in fact.
>>
>> Of course, I would like to search through my files at some point in time. I
>> even would like to search through your files at some point in time, I mean
>> through =org-mode/contrib/babel= and =Worg= for example.
>
> The drawback of org-mode's plain text format is that org-mode needs to load,
> parse, and fontify, and preserve in memory all files it queries (i.e.,
> agenda files). Too many agenda files can thus cause a pretty big performance
> hit (both when loading agenda files and constructing agenda views). To avoid
> this, I would recommend including only important files in org-agenda-files.
> Possible solutions for searching other files include:
>
> 1. loading the other directories when needed (e.g., through a function that
>    changes the value of org-agenda-files)

Good idea.


> 2. using the variable org-agenda-text-search-extra-files (see below)

In fact, more or less the same as the above... and already foreseen. Nice.


> 3. searching other directories with external tools (grep, perl script, etc.)

Not really interested by this. I love some much the powerful and very quick
search capabilities offered by Org.


>> The problem is the load-time of my Emacs, now:
>>
>> Emacs Init startup time: 221 seconds.
>
> Do you invoke an agenda command in your emacs, such as org-agenda-to-appt?
> That would cause org-mode to load all org files.

As seen in my reply to Carsten today, yes, I have an org-agenda-list. I know
that it is looking in every pointed file. The problem is that it really takes
much time... fontifying and so.


>> coming from 20 seconds before the heavy use of Org...
>>
>> with tens of times such lines in my *Messages* buffer:
>>
>> OVERVIEW
>> Checking for library `filladapt'...
>> +-> Requiring `filladapt' (already loaded)
>> Checking for library `filladapt'... Found
>> Fontifying Axa.org... (regexps............................................)
>> Checking for library `filladapt'... Found
>> Fontifying Axa.org... (regexps.............................................)
>> Checking for library `filladapt'... Found
>> Fontifying Axa.org... (regexps..............................................)
>> Checking for library `filladapt'... Found
>> +-> Requiring `outline-mode-easy-bindings' (already loaded)
>> +-> Requiring `ispell' (already loaded)
>> Evaluate code AFTER HAVING LOADED `flyspell'... [2 times]
>> Starting new Ispell process [en_US] ...
>> Checking for library `filladapt'...
>> +-> Requiring `filladapt' (already loaded)
>> Checking for library `filladapt'... Found
>
> It seems that filladapt is causing some of the verbosity (and possible
> slowness) there. When loading agenda files, my *Messages* buffer only shows:
>
> OVERVIEW [29 times]

OK, I have to tell that, in order to debug some problems, I've changed some
basic functions in order to get more verbosity in the Messages buffer. Here
they are:

--8<---------------cut here---------------start------------->8---
      ;; REPLACES ORIGINAL in `C source code' (dumped)
      ;; redefine require to leave a trace of packages being loaded
      (if (not (fboundp 'orig-require))
          (fset 'orig-require (symbol-function 'require))
        (message "The code to redefine `require' should not be loaded twice"))

      (defvar my-require-depth 0)

      (defun require (feature &optional filename noerror)
        "Leave a trace of packages being loaded."
        (cond ((member feature features)
               (message "%sRequiring `%s' (already loaded)"
                        (concat (make-string (* 2 my-require-depth) ? ) "+-> ")
                        feature))
              (t
               (message "%sRequiring `%s'"
                        (concat (make-string (* 2 my-require-depth) ? ) "+-> ")
                        feature)
               (let ((my-require-depth (+ 1 my-require-depth)))
                 (orig-require feature filename noerror))
               (message "%sRequiring `%s'...done"
                        (concat (make-string (* 2 my-require-depth) ? ) "+-> ")
                        feature))))

      (defvar missing-packages-list nil
        "List of packages that `try-require' can't find.")

      ;; attempt to load a feature/library, failing silently
      (defun try-require (feature)
        "Attempt to load a library or module. Return true if the
library given as argument is successfully loaded. If not, instead
of an error, just add the package to a list of missing packages."
        (condition-case err
            ;; protected form
            (progn
              (message "Checking for library `%s'..." feature)
              (if (stringp feature)
                  (load-library feature)
                (require feature))
              (message "Checking for library `%s'... Found" feature))
          ;; error handler
          (file-error  ; condition
           (progn
             (message "Checking for library `%s'... Missing" feature)
             (add-to-list 'missing-packages-list feature 'append))
           nil)))
--8<---------------cut here---------------end--------------->8---


>> You'll tell me: not a problem, you do that only once a day, and you use
>> Emacs client/server for the rest of the time. True. A bit, because I
>> sometimes have to restart Emacs for testing a fresh one (not impacted by
>> defvars already defined, or deffaces, etc.).
>>
>> Having to wait almost 4 minutes is a real pain. So, here my
>> comments/questions:
>>
>> - Isn't it possible to delay the fontification/ispell/etc. to when we
>>   really display (i.e., pop up) the buffer? I guess this must be a major
>>   component of the time this takes.
>
> I imagine the fontification is necessary for the agenda to function
> properly.

This assumption should be checked. Does parsing really mean fontifying?  From
what I understood about jit-lock-mode, I'd say no... but...


> Thus, org files are parsed en masse when the agenda is called for the first
> time. (Hence my question about whether you were calling the agenda from
> ~/.emacs.)
>
>> - Couldn't we have 2 vars: =org-agenda-files= for the files you know you
>>   want have scanned for the agenda construction, and an extra list such as
>>   =org-search-files= for files not containing any dates? Then, some time
>>   would have to be taken when =C-c a s=, but not before. And not if you
>>   don't search for anything in your Org files during that Emacs session...
>
> This already exists. See org-agenda-text-search-extra-files.

Thanks for this, did not know about that (up to today)...

Best regards,
  Seb

-- 
Sébastien Vauban


_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
Emacs-orgmode-mXXj517/zsQ@public.gmane.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

  reply	other threads:[~2010-09-29 21:21 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-28 18:45 Having (too) many files in org-agenda-files Sébastien Vauban
2010-09-28 20:19 ` Matt Lundin
2010-09-29 21:21   ` Sébastien Vauban [this message]
2010-09-29  3:39 ` Shelagh Manton
2010-09-29  8:52   ` Sébastien Vauban
2010-09-29  3:56 ` Carsten Dominik
2010-09-29  8:32   ` Sébastien Vauban
2010-09-29 13:19     ` Carsten Dominik
2010-09-29 22:20       ` Sébastien Vauban
2010-09-30 11:24         ` Carsten Dominik
2010-09-30 11:53           ` Sébastien Vauban
2010-09-30 15:33             ` Nick Dokos
2010-09-30 17:08               ` Sébastien Vauban
2010-09-30 17:37                 ` Carsten Dominik
2010-12-01 19:46                   ` Sébastien Vauban
2010-12-01 23:00                     ` Eric S Fraga
     [not found]                       ` <17540.1291246717@gamaville.americas.hpqcorp.net>
2010-12-02  8:57                         ` Eric S Fraga
2010-12-02  9:25                           ` Sébastien Vauban
2010-12-12 18:28                             ` David Maus
2010-12-02  3:10                     ` Jeff Horn
2010-12-02  9:15                       ` Sébastien Vauban
2010-10-06 14:47                 ` Daniel Clemente
2010-09-30 13:37   ` Sébastien Vauban
2010-09-30 13:41     ` Carsten Dominik
2010-09-29 12:38 ` Matt Lundin
2010-09-29 12:47   ` Matthew Lundin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871v8cxn38.fsf@mundaneum.com \
    --to=wxhgmqzgwmuf-genee64ty+gs+fvcfc7uqw@public.gmane.org \
    --cc=emacs-orgmode-mXXj517/zsQ@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).