emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] Unable to generate link in non-org file with org-id-store-


From: Liam Healy
Subject: Re: [Orgmode] Unable to generate link in non-org file with org-id-store-link present
Date: Tue, 2 Nov 2010 16:45:23 -0400

On Sun, Oct 31, 2010 at 5:28 PM, Liam Healy <address@hidden> wrote:
> On Sun, Oct 31, 2010 at 4:02 PM, David Maus <address@hidden> wrote:
>> At Sun, 31 Oct 2010 15:09:48 -0400,
>> Liam Healy wrote:
>>>
>>> With recent versions (since about version 7) of org-mode, I cannot
>>> generate links in a non-org file when org-id-store-link is in
>>> org-store-link-functions.  Either I get an error "before first
>>> headline" (makes no sense to me, since I'm not in an org file), or
>>> emacs spins forever, saturating the CPU and doing nothing.  If I leave
>>> org-id-store-link out of org-store-link-functions, everything works
>>> fine but of course I get no id link in org files.  Is there a fix for
>>> this?
>>
>> Which Org and Emacs version are you using?
>>
>> M-x org-version RET
>
> Org-mode version 7.02trans (release_7.02.22.gde21)
>
>> M-x emacs-version RET
>
> GNU Emacs 23.1.1 (x86_64-pc-linux-gnu, X toolkit, Xaw3d scroll bars)
> of 2009-10-19 on debian-build.int-office-er.priv, modified by Debian
>
>>
>> And can you provide a backtrace for this behavior?
>>
>>  1. reload Org mode so it runs on uncompiled files
>>
>>    M-x org-reload RET
>
> Done
>
>>
>>  2. Toggle debug-on-quit and debug-on-error
>>
>>    M-x toggle-debug-on-quite RET
>>    M-x toggle-debug-on-error RET
>>
>>  3. Try to reproduce the bug (if Emacs spins for ever, hit C-g)
>>
>> If you encounter the error or can stop Emacs from hanging (C-g), you
>> get a buffer with the backtrace.
>
> It did, I did, here it is:
>
> Debugger entered--Lisp error: (quit)
>  re-search-forward("^[         ]*" 4266 t)
>  (while (re-search-forward re end t))
>  (let ((indent ...) (beg ...) (re ...) end hiddenp)
> (outline-next-heading) (setq end (point)) (goto-char beg) (while
> (re-search-forward re end t)) (setq hiddenp (org-invisible-p))
> (end-of-line 1) (and (equal ... 10) (forward-char 1)) (while
> (looking-at "^[         ]*\\(:CLOCK:\\|:LOGBOOK:\\|CLOCK:\\|:END:\\)") (if
> ... ... ... ...)) (org-skip-over-state-notes) (skip-chars-backward "
>        \n
> ") (if (eq ... 42) (forward-char 1)) (let (...) (insert
> "\n:PROPERTIES:\n:END:")) (beginning-of-line 0) (org-indent-to-column
> indent) (beginning-of-line 2) (org-indent-to-column indent)
> (beginning-of-line 0) (if hiddenp (save-excursion ... ...)
> (org-flag-drawer t)))
>  org-insert-property-drawer()
>  (save-excursion (org-insert-property-drawer) (setq end (progn ... ...)))
>  (if force (save-excursion (org-insert-property-drawer) (setq end
> ...)) (throw (quote exit) nil))
>  (if (re-search-forward org-property-start-re end t) (setq beg (1+
> ...)) (if force (save-excursion ... ...) (throw ... nil)) (goto-char
> beg) (if (re-search-forward org-property-start-re end t) (setq beg
> ...)))
>  (let* ((beg ...) (end ...)) (goto-char beg) (if (re-search-forward
> org-property-start-re end t) (setq beg ...) (if force ... ...)
> (goto-char beg) (if ... ...)) (if (re-search-forward
> org-property-end-re end t) (setq end ...) (or force ...) (goto-char
> beg) (setq end beg) (org-indent-line-function) (insert ":END:\n"))
> (cons beg end))
>  (save-excursion (let* (... ...) (goto-char beg) (if ... ... ... ...
> ...) (if ... ... ... ... ... ... ...) (cons beg end)))
>  (catch (quote exit) (save-excursion (let* ... ... ... ... ...)))
>  org-get-property-block(4037 4266 force)
>  (setq range (org-get-property-block beg end (quote force)))
>  (let ((buffer-invisibility-spec ...)) (setq range
> (org-get-property-block beg end ...)) (goto-char (car range)) (if
> (re-search-forward ... ... t) (progn ... ...) (goto-char ...) (insert
> "\n") (backward-char 1) (org-indent-line-function) (insert ":"
> property ":")) (and value (insert " " value))
> (org-indent-line-function))
>  (cond ((equal property "TODO") (when ... ...) (if ... ...) (org-todo
> value) (org-set-tags nil ...)) ((equal property "PRIORITY")
> (org-priority ...) (org-set-tags nil ...)) ((equal property
> "SCHEDULED") (if ... ... ...)) ((equal property "DEADLINE") (if ...
> ... ...)) ((member property org-special-properties) (error "The %s
> property can not yet be set with `org-entry-put'" property)) (t (let
> ... ... ... ... ... ...)))
>  (let ((beg ...) (end ...) range) (cond (... ... ... ... ...) (...
> ... ...) (... ...) (... ...) (... ...) (t ...)))
>  (save-excursion (goto-char (or pom ...)) (org-back-to-heading t)
> (let (... ... range) (cond ... ... ... ... ... ...))
> (run-hook-with-args (quote org-property-changed-functions) property
> value))
>  (save-excursion (if (markerp pom) (set-buffer ...)) (save-excursion
> (goto-char ...) (org-back-to-heading t) (let ... ...)
> (run-hook-with-args ... property value)))
>  (org-with-point-at pom (org-back-to-heading t) (let (... ... range)
> (cond ... ... ... ... ... ...)) (run-hook-with-args (quote
> org-property-changed-functions) property value))
>  org-entry-put(4204 "ID" "b7f6dacd-3d83-492d-877e-075d3312d0a6")
>  (cond ((and id ... ...) id) (create (setq id ...) (org-entry-put pom
> "ID" id) (org-id-add-location id ...) id) (t nil))
>  (let ((id ...)) (cond (... id) (create ... ... ... id) (t nil)))
>  (save-excursion (goto-char (or pom ...)) (let (...) (cond ... ... ...)))
>  (save-excursion (if (markerp pom) (set-buffer ...)) (save-excursion
> (goto-char ...) (let ... ...)))
>  (org-with-point-at pom (let (...) (cond ... ... ...)))
>  org-id-get(4204 create)
>  org-id-get-create()
>  (org-make-link "id:" (org-id-get-create))
>  (let* ((link ...) (case-fold-search nil) (desc ...))
> (org-store-link-props :link link :description desc :type "id") link)
>  org-id-store-link()
>  run-hook-with-args-until-success(org-id-store-link)
>  (cond ((run-hook-with-args-until-success ...) (setq link ... desc
> ...)) ((equal ... "*Org Edit Src Example*") (let ... ... ... ... ...
> ... ... ...)) ((equal ... ...) (let ... ...)) ((eq major-mode ...)
> (let ... ... ...)) ((eq major-mode ...) (setq cpltxt ... link ...)
> (org-store-link-props :type "w3" :url ...)) ((eq major-mode ...) (setq
> cpltxt ... link ...) (org-store-link-props :type "w3m" :url ...))
> ((setq search ...) (setq link ...) (setq cpltxt ...)) ((eq major-mode
> ...) (setq cpltxt ... link ...) (org-store-link-props :type "image"
> :file buffer-file-name)) ((eq major-mode ...) (let ... ... ...)) ((and
> ... ...) (setq custom-id ...) (cond ... ... ...)) ((buffer-file-name
> ...) (setq cpltxt ...) (when ... ... ...) (setq link ...))
> ((interactive-p) (error "Cannot link to a buffer which is not visiting
> a file")) (t (setq link nil)))
>  (let ((outline-regexp ...) link cpltxt desc description search txt
> custom-id agenda-link) (cond (... ...) (... ...) (... ...) (... ...)
> (... ... ...) (... ... ...) (... ... ...) (... ... ...) (... ...) (...
> ... ...) (... ... ... ...) (... ...) (t ...)) (if (consp link) (setq
> cpltxt ... link ...)) (setq link (or link cpltxt) desc (or desc
> cpltxt)) (if (equal desc "NONE") (setq desc nil)) (if (and ... link)
> (progn ... ... ...) (or agenda-link ...)))
>  org-store-link(nil)
>  call-interactively(org-store-link nil nil)
>
>
>
>>
>> Best,
>>  -- David
>
> Thanks,
> Liam
>

Focusing on the high levels of the backtrace, it looks like
run-hook-with-args-until-success is calling org-id-store-link even on
non-org files.  As a hack, I put a check into org-id-store-link that
is similar to the clause in org-store-link so that it refuses to do
anything if it isn't an org file:

(defun org-id-store-link ()
  "Store a link to the current entry, using its ID."
  (interactive)
  (when (and (buffer-file-name (buffer-base-buffer)) (org-mode-p))
    (let* ((link (org-make-link "id:" (org-id-get-create)))
           (case-fold-search nil)
           (desc (save-excursion
                   (org-back-to-heading t)
                   (or (and (looking-at org-complex-heading-regexp)
                            (if (match-end 4) (match-string 4) (match-string 
0)))
                       link))))
      (org-store-link-props :link link :description desc :type "id")
      link)))

and this fixes the problem.  However, I think the root problem is that
run-hook-with-args-until-success seems to be try org-id-store-link
without qualification (that is, on non-org files).  Perhaps someone
more knowledgeable about this code can place a check/skip in a better
place and patch the original source.

Thanks,

Liam



reply via email to

[Prev in Thread] Current Thread [Next in Thread]