emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
@ 2013-02-12  9:07 Sebastien Vauban
  2013-02-12 10:48 ` Bastien
  2013-02-13 10:09 ` Christopher Schmidt
  0 siblings, 2 replies; 9+ messages in thread
From: Sebastien Vauban @ 2013-02-12  9:07 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

Hello,

Since the last pull I made, I can't expand anymore BBDB aliases in Gnus...
because of Org!

--8<---------------cut here---------------start------------->8---
Debugger entered--Lisp error: (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  yas--all-parents(text-mode)
  (lambda (mode) (yas--all-parents mode))(text-mode)
  mapcar((lambda (mode) (yas--all-parents mode)) (text-mode message-mode))
  cl-mapcar((lambda (mode) (yas--all-parents mode)) (text-mode message-mode))
  apply(cl-mapcar (lambda (mode) (yas--all-parents mode)) (text-mode message-mode) nil)
  mapcan((lambda (mode) (yas--all-parents mode)) (text-mode message-mode))
  (append modes-to-activate (mapcan (function (lambda (mode) (yas--all-parents mode))) modes-to-activate))
  (remove-duplicates (append modes-to-activate (mapcan (function (lambda (mode) (yas--all-parents mode))) modes-to-activate)))
  (let ((modes-to-activate (list major-mode)) (mode major-mode)) (while (setq mode (get mode (quote derived-mode-parent))) (setq modes-to-activate (cons mode modes-to-activate))) (progn (let ((--dolist-tail-- (yas-extra-modes)) mode) (while --dolist-tail-- (setq mode (car --dolist-tail--)) (setq modes-to-activate (cons mode modes-to-activate)) (setq --dolist-tail-- (cdr --dolist-tail--))))) (remove-duplicates (append modes-to-activate (mapcan (function (lambda (mode) (yas--all-parents mode))) modes-to-activate))))
  yas--modes-to-activate()
  (mapcar (function (lambda (mode-name) (gethash mode-name yas--tables))) (yas--modes-to-activate))
  (remove nil (mapcar (function (lambda (mode-name) (gethash mode-name yas--tables))) (yas--modes-to-activate)))
  yas--get-snippet-tables()
  (mapcan (function (lambda (table) (yas--fetch table (buffer-substring-no-properties start end)))) (yas--get-snippet-tables))
  (setq templates (mapcan (function (lambda (table) (yas--fetch table (buffer-substring-no-properties start end)))) (yas--get-snippet-tables)))
  (while (and (not done) syntaxes) (setq syntax (car syntaxes)) (setq syntaxes (cdr syntaxes)) (save-excursion (skip-syntax-backward syntax) (setq start (point))) (setq templates (mapcan (function (lambda (table) (yas--fetch table (buffer-substring-no-properties start end)))) (yas--get-snippet-tables))) (if templates (setq done t) (setq start end)))
  (let ((start (point)) (end (point)) (syntaxes yas-key-syntaxes) syntax done templates) (while (and (not done) syntaxes) (setq syntax (car syntaxes)) (setq syntaxes (cdr syntaxes)) (save-excursion (skip-syntax-backward syntax) (setq start (point))) (setq templates (mapcan (function (lambda (table) (yas--fetch table (buffer-substring-no-properties start end)))) (yas--get-snippet-tables))) (if templates (setq done t) (setq start end))) (list templates start end))
  yas--current-key()
  (if field (save-restriction (narrow-to-region (yas--field-start field) (yas--field-end field)) (yas--current-key)) (yas--current-key))
  (setq templates-and-pos (if field (save-restriction (narrow-to-region (yas--field-start field) (yas--field-end field)) (yas--current-key)) (yas--current-key)))
  (if (and yas-expand-only-for-last-commands (not (member last-command yas-expand-only-for-last-commands))) nil (setq templates-and-pos (if field (save-restriction (narrow-to-region (yas--field-start field) (yas--field-end field)) (yas--current-key)) (yas--current-key))))
  (let (templates-and-pos) (if (and yas-expand-only-for-last-commands (not (member last-command yas-expand-only-for-last-commands))) nil (setq templates-and-pos (if field (save-restriction (narrow-to-region (yas--field-start field) (yas--field-end field)) (yas--current-key)) (yas--current-key)))) (if (and templates-and-pos (first templates-and-pos)) (yas--expand-or-prompt-for-template (first templates-and-pos) (second templates-and-pos) (car (cdr (cdr templates-and-pos)))) (yas--fallback (quote trigger-key))))
  yas-expand()
  call-interactively(yas-expand)
  (if (keymapp binding) (set-temporary-overlay-map binding) (call-interactively (or binding (quote orgstruct-error))))
  (let ((binding (let ((orgstruct-mode)) (key-binding "	")))) (if (keymapp binding) (set-temporary-overlay-map binding) (call-interactively (or binding (quote orgstruct-error)))))
  (if (let* ((org-heading-regexp (concat "^" orgstruct-heading-prefix-regexp "\\(\\*+\\)\\(?: +\\(.*?\\)\\)?[ 	]*$")) (org-outline-regexp (concat orgstruct-heading-prefix-regexp "\\*+ ")) (org-outline-regexp-bol (concat "^" org-outline-regexp)) (outline-regexp org-outline-regexp) (outline-heading-end-regexp "\n") (outline-level (quote outline-level)) (outline-heading-alist)) (when (org-context-p (quote headline) (quote item) nil) (org-run-like-in-org-mode (quote org-cycle)) t)) nil (let ((binding (let ((orgstruct-mode)) (key-binding "	")))) (if (keymapp binding) (set-temporary-overlay-map binding) (call-interactively (or binding (quote orgstruct-error))))))
  (unless (let* ((org-heading-regexp (concat "^" orgstruct-heading-prefix-regexp "\\(\\*+\\)\\(?: +\\(.*?\\)\\)?[ 	]*$")) (org-outline-regexp (concat orgstruct-heading-prefix-regexp "\\*+ ")) (org-outline-regexp-bol (concat "^" org-outline-regexp)) (outline-regexp org-outline-regexp) (outline-heading-end-regexp "\n") (outline-level (quote outline-level)) (outline-heading-alist)) (when (org-context-p (quote headline) (quote item) nil) (org-run-like-in-org-mode (quote org-cycle)) t)) (let ((binding (let ((orgstruct-mode)) (key-binding "	")))) (if (keymapp binding) (set-temporary-overlay-map binding) (call-interactively (or binding (quote orgstruct-error))))))
  orgstruct-hijacker-org-cycle(1)
  call-interactively(orgstruct-hijacker-org-cycle)
  (let* ((beyond-yasnippet (yas--keybinding-beyond-yasnippet))) (yas--message 4 "Falling back to %s" beyond-yasnippet) (progn (or (or (null beyond-yasnippet) (commandp beyond-yasnippet)) (signal (quote cl-assertion-failed) (list (quote (or (null beyond-yasnippet) (commandp beyond-yasnippet)))))) nil) (setq this-original-command beyond-yasnippet) (call-interactively beyond-yasnippet))
  (cond ((eq yas-fallback-behavior (quote return-nil)) nil) ((eq yas-fallback-behavior (quote call-other-command)) (let* ((beyond-yasnippet (yas--keybinding-beyond-yasnippet))) (yas--message 4 "Falling back to %s" beyond-yasnippet) (progn (or (or (null beyond-yasnippet) (commandp beyond-yasnippet)) (signal (quote cl-assertion-failed) (list (quote ...)))) nil) (setq this-original-command beyond-yasnippet) (call-interactively beyond-yasnippet))) ((and (listp yas-fallback-behavior) (cdr yas-fallback-behavior) (eq (quote apply) (car yas-fallback-behavior))) (if (cddr yas-fallback-behavior) (apply (cadr yas-fallback-behavior) (cddr yas-fallback-behavior)) (if (commandp (cadr yas-fallback-behavior)) (progn (setq this-command (cadr yas-fallback-behavior)) (call-interactively (cadr yas-fallback-be
 havior)))))) (t nil))
  yas--fallback(trigger-key)
  (if (and templates-and-pos (first templates-and-pos)) (yas--expand-or-prompt-for-template (first templates-and-pos) (second templates-and-pos) (car (cdr (cdr templates-and-pos)))) (yas--fallback (quote trigger-key)))
  (let (templates-and-pos) (if (and yas-expand-only-for-last-commands (not (member last-command yas-expand-only-for-last-commands))) nil (setq templates-and-pos (if field (save-restriction (narrow-to-region (yas--field-start field) (yas--field-end field)) (yas--current-key)) (yas--current-key)))) (if (and templates-and-pos (first templates-and-pos)) (yas--expand-or-prompt-for-template (first templates-and-pos) (second templates-and-pos) (car (cdr (cdr templates-and-pos)))) (yas--fallback (quote trigger-key))))
  yas-expand()
  call-interactively(yas-expand)

  [... many repeated blocks ...]

  call-interactively(yas-expand)
  (let (orgtbl-mode) (call-interactively (or (key-binding [(tab)]) (key-binding "	") (quote orgtbl-error))))
  (if (org-at-table-p) (call-interactively (quote orgtbl-tab)) (let (orgtbl-mode) (call-interactively (or (key-binding [(tab)]) (key-binding "	") (quote orgtbl-error)))))
  orgtbl-hijacker-command-102(1)
  call-interactively(orgtbl-hijacker-command-102 nil nil)
--8<---------------cut here---------------end--------------->8---

Note that Org is plugged into Message mode:

--8<---------------cut here---------------start------------->8---
  (defun my/message-mode-hook ()
    (local-set-key (kbd "<M-tab>") 'mail-abbrev-complete-alias)
    (turn-on-auto-fill)
    (turn-on-orgtbl)
    (turn-on-orgstruct++)
    (when (try-require 'org-footnote)
      (set (make-local-variable 'org-footnote-auto-label) 'plain)
      (set (make-local-variable
      'org-footnote-tag-for-non-org-mode-files) nil)))

  (add-hook 'message-mode-hook 'my/message-mode-hook)
--8<---------------cut here---------------end--------------->8---

Hence, the link between Org and BBDB <TAB> expansion...

I've bisected, and found out that:

--8<---------------cut here---------------start------------->8---
a3f6570fffcfc1b1880b646cfabdf2a6f8187956 is the first bad commit
commit a3f6570fffcfc1b1880b646cfabdf2a6f8187956
Author: Christopher Schmidt <christopher-TsugTnnrXQtNhJN0HIYqWA@public.gmane.org>
Date:   Sun Feb 10 18:46:57 2013 +0100

    Allow a custom headline prefix in orgstruct-mode.

    * lisp/org.el (org-cycle-global-status)
    (org-cycle-subtree-status): Set state property.
    (org-heading-components): Use org-heading-regexp in
    orgstruct-mode.
    (orgstruct-heading-prefix-regexp, orgstruct-setup-hook): New
    options.
    (orgstruct-initialized): New variable.
    (orgstruct-mode): Simplify implementation.
    (orgstruct-setup): Simplify implementation.  Translate keys to
    their most general equivalent.
    (orgstruct-make-binding): Generate index on the fly.  Discard
    alternative keys.  Bind variables according to
    orgstruct-heading-prefix-regexp.
    (org-get-local-variables): Honour state property.
    (org-run-like-in-org-mode): Do not override variables with
    non-default values.
    (org-forward-heading-same-level): Do not skip to headlines on
    another level.  Handle negative prefix argument correctly.
    (org-backward-heading-same-level): Use
    org-forward-heading-same-level.
--8<---------------cut here---------------end--------------->8---

Effectively, when checking out commit ba38de1 (last good commit), everything
works again like expected.

Best regards,
  Seb

-- 
Sebastien Vauban

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-12  9:07 [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'") Sebastien Vauban
@ 2013-02-12 10:48 ` Bastien
  2013-02-12 17:41   ` Sebastien Vauban
  2013-02-13 10:09 ` Christopher Schmidt
  1 sibling, 1 reply; 9+ messages in thread
From: Bastien @ 2013-02-12 10:48 UTC (permalink / raw)
  To: Sebastien Vauban; +Cc: public-emacs-orgmode-mXXj517/zsQ



Hi Sébastien,

"Sebastien Vauban"
<wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> writes:

> Since the last pull I made, I can't expand anymore BBDB aliases in Gnus...
> because of Org!

Do you have the same error when you don't load yasnippets?

It looks like this is a bad interaction between yasnippets and
orgstruct++-mode, not a bug only in orgstruct++-mode.

Thanks,

-- 
 Bastien

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-12 10:48 ` Bastien
@ 2013-02-12 17:41   ` Sebastien Vauban
  2013-02-12 17:45     ` Bastien
  0 siblings, 1 reply; 9+ messages in thread
From: Sebastien Vauban @ 2013-02-12 17:41 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

HI Bastien,

Bastien wrote:
> "Sebastien Vauban" writes:
>
>> Since the last pull I made, I can't expand anymore BBDB aliases in Gnus...
>> because of Org!
>
> Do you have the same error when you don't load yasnippets?
>
> It looks like this is a bad interaction between yasnippets and
> orgstruct++-mode, not a bug only in orgstruct++-mode.

After testing: nope, it does not occur when YASnippet is not loaded.

Best regards,
  Seb

-- 
Sebastien Vauban

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-12 17:41   ` Sebastien Vauban
@ 2013-02-12 17:45     ` Bastien
  2013-02-12 18:55       ` Sebastien Vauban
  0 siblings, 1 reply; 9+ messages in thread
From: Bastien @ 2013-02-12 17:45 UTC (permalink / raw)
  To: Sebastien Vauban; +Cc: public-emacs-orgmode-mXXj517/zsQ



Hi Sébastien,

"Sebastien Vauban"
<wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> writes:

> After testing: nope, it does not occur when YASnippet is not loaded.

Now that John H. gave me some directions on using yasnippet, I'm ready
to test further and to hunt your bug.

Would you mind sharing the minimal yas/org config I need to reproduce
the problem?  Let me insist on minimal :)

Thanks,

-- 
 Bastien

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-12 17:45     ` Bastien
@ 2013-02-12 18:55       ` Sebastien Vauban
  0 siblings, 0 replies; 9+ messages in thread
From: Sebastien Vauban @ 2013-02-12 18:55 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

Bastien,

Bastien wrote:
> "Sebastien Vauban" writes:
>
>> After testing: nope, it does not occur when YASnippet is not loaded.
>
> Now that John H. gave me some directions on using yasnippet, I'm ready
> to test further and to hunt your bug.
>
> Would you mind sharing the minimal yas/org config I need to reproduce
> the problem?  Let me insist on minimal :)

Okaayyy, understood! ;-)

#+begin_src emacs-lisp
  (add-to-list 'load-path "~/Public/Repositories/yasnippet")

  ;; Yet Another Snippet extension for Emacs
  (require 'yasnippet)

  ;; root directories that store the snippets
  (setq yas/root-directory nil)
  (let ((my-snippets "~/src/yasnippet/snippets")
        (local-snippets "~/Public/Repositories/yasnippet/snippets"))
    (when (file-directory-p local-snippets)
      (add-to-list 'yas/root-directory local-snippets))
    ;; the first element is always the user-created snippets directory
    (when (file-directory-p my-snippets)
      (add-to-list 'yas/root-directory my-snippets)))

  ;; enable the YASnippet menu and tab-trigger expansion in *all*
  ;; buffers
  (yas/global-mode 1)

  ;; text that will be used in menu to represent the trigger
  (setq yas/trigger-symbol " <tab>")

  ;; allow YASnippet to do its thing in Org files
  (when (fboundp 'yas/expand)

    (defun yas/org-very-safe-expand ()
      (let ((yas/fallback-behavior 'return-nil))
        (yas/expand)))

    (add-hook 'org-mode-hook
              (lambda ()
                (set (make-local-variable 'yas/trigger-key) (kbd "tab")) ;; needed?
                (add-to-list 'org-tab-first-hook
                             'yas/org-very-safe-expand)
                (define-key yas/keymap (kbd "tab") 'yas/next-field)))) ;; needed?
#+end_src

Best regards,
  Seb

-- 
Sebastien Vauban

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-12  9:07 [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'") Sebastien Vauban
  2013-02-12 10:48 ` Bastien
@ 2013-02-13 10:09 ` Christopher Schmidt
  2013-02-13 10:31   ` Sebastien Vauban
  1 sibling, 1 reply; 9+ messages in thread
From: Christopher Schmidt @ 2013-02-13 10:09 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 437 bytes --]

"Sebastien Vauban" <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> writes:
> Since the last pull I made, I can't expand anymore BBDB aliases in
> Gnus...  because of Org!
> Debugger entered--Lisp error: (error "Lisp nesting exceeds `max-lisp-eval-depth'")

It looks like this is orgstruct-mode and yas-snippet both hijacking the
TAB key and ultimately falling back to each other.  Could you please
give master + this patch a try?

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-diff, Size: 515 bytes --]

--- a/lisp/org.el
+++ b/lisp/org.el
@@ -8672,7 +8672,8 @@ should be checked in for a command to execute outside of tables."
                                          'item-body)))
                 (org-run-like-in-org-mode ',fun)
                 t))
-          (let ((binding (let ((orgstruct-mode)) (key-binding ,key))))
+          (let* ((orgstruct-mode)
+		 (binding (key-binding ,key)))
             (if (keymapp binding)
                 (set-temporary-overlay-map binding)
               (call-interactively

[-- Attachment #3: Type: text/plain, Size: 21 bytes --]


        Christopher

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-13 10:09 ` Christopher Schmidt
@ 2013-02-13 10:31   ` Sebastien Vauban
  2013-02-13 11:38     ` Christopher Schmidt
  0 siblings, 1 reply; 9+ messages in thread
From: Sebastien Vauban @ 2013-02-13 10:31 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

Hi Christopher,

Christopher Schmidt wrote:
> Sebastien Vauban writes:
>> Since the last pull I made, I can't expand anymore BBDB aliases in
>> Gnus...  because of Org!
>> Debugger entered--Lisp error: (error "Lisp nesting exceeds
>> max-lisp-eval-depth'")
>
> It looks like this is orgstruct-mode and yas-snippet both hijacking the
> TAB key and ultimately falling back to each other.  Could you please
> give master + this patch a try?
>
> --- a/lisp/org.el
> +++ b/lisp/org.el
> @@ -8672,7 +8672,8 @@ should be checked in for a command to execute outside of tables."
>                                           'item-body)))
>                  (org-run-like-in-org-mode ',fun)
>                  t))
> -          (let ((binding (let ((orgstruct-mode)) (key-binding ,key))))
> +          (let* ((orgstruct-mode)
> +		 (binding (key-binding ,key)))
>              (if (keymapp binding)
>                  (set-temporary-overlay-map binding)
>                (call-interactively

Well, it seems to yes. Thanks!

What's weird is that I applied the patch, and then did C-M-x with the cursor
in the function. I did test composing an email, and it still did not work.

I restarted Emacs to be really, really sure, and now it works!

So, I don't know what's bad in the above procedure (C-M-x of the fucntion),
but your patch works, yes.

Best regards,
  Seb

-- 
Sebastien Vauban

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-13 10:31   ` Sebastien Vauban
@ 2013-02-13 11:38     ` Christopher Schmidt
  2013-02-13 13:10       ` Sebastien Vauban
  0 siblings, 1 reply; 9+ messages in thread
From: Christopher Schmidt @ 2013-02-13 11:38 UTC (permalink / raw)
  To: emacs-orgmode

"Sebastien Vauban" <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> writes:
> What's weird is that I applied the patch, and then did C-M-x with the
> cursor in the function. I did test composing an email, and it still
> did not work.
>
> I restarted Emacs to be really, really sure, and now it works!
>
> So, I don't know what's bad in the above procedure (C-M-x of the
> fucntion), but your patch works, yes.

That is expected.  The function is only executed the very first time you
enable orgstruct\(++\)-mode.

orgstruct-mode is an ugly hack.  So is yasnippet.  There is no fix for
this problem, just a workaround that can introduce other issues in
somewhat rare and obscure corner cases.

I applied the patch.

    7c27e57 org.el: Disable orgstruct-mode when falling back to original command

        Christopher

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'")
  2013-02-13 11:38     ` Christopher Schmidt
@ 2013-02-13 13:10       ` Sebastien Vauban
  0 siblings, 0 replies; 9+ messages in thread
From: Sebastien Vauban @ 2013-02-13 13:10 UTC (permalink / raw)
  To: emacs-orgmode-mXXj517/zsQ

Hi Christopher,

Christopher Schmidt wrote:
> "Sebastien Vauban" <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org> writes:
>> What's weird is that I applied the patch, and then did C-M-x with the
>> cursor in the function. I did test composing an email, and it still
>> did not work.
>>
>> I restarted Emacs to be really, really sure, and now it works!
>>
>> So, I don't know what's bad in the above procedure (C-M-x of the
>> fucntion), but your patch works, yes.
>
> That is expected.  The function is only executed the very first time you
> enable orgstruct\(++\)-mode.
>
> orgstruct-mode is an ugly hack.  So is yasnippet.  There is no fix for
> this problem, just a workaround that can introduce other issues in
> somewhat rare and obscure corner cases.
>
> I applied the patch.
>
>     7c27e57 org.el: Disable orgstruct-mode when falling back to original command

Thanks for the explanation to the mystery, and for the patch.

Best regards,
  Seb

-- 
Sebastien Vauban

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-02-13 13:10 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-02-12  9:07 [BUG] (error "Lisp nesting exceeds `max-lisp-eval-depth'") Sebastien Vauban
2013-02-12 10:48 ` Bastien
2013-02-12 17:41   ` Sebastien Vauban
2013-02-12 17:45     ` Bastien
2013-02-12 18:55       ` Sebastien Vauban
2013-02-13 10:09 ` Christopher Schmidt
2013-02-13 10:31   ` Sebastien Vauban
2013-02-13 11:38     ` Christopher Schmidt
2013-02-13 13:10       ` Sebastien Vauban

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