all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [BUG] org-capture got file userlock error when I capture on second time.
@ 2023-03-20 12:53 stardiviner
  2023-03-22 11:38 ` Ihor Radchenko
  0 siblings, 1 reply; 3+ messages in thread
From: stardiviner @ 2023-03-20 12:53 UTC (permalink / raw)
  To: Org-mode

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

When I org-capture from elfeed-entry buffer (I defined custom functions to
extract elfeed entry buffer content) in the second time and later, the
bellowing error raised up. The first-time capture is fine.

Here is the error backtrace:
#+begin_example
Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  expand-file-name(nil)
  userlock--check-content-unchanged("~/Org/Tasks/Tasks.org")
  userlock--ask-user-about-supersession-threat("~/Org/Tasks/Tasks.org")
  delete-region(269 270)
  (let ((pos (point))) (org-back-over-empty-lines) (delete-region (point)
pos) (if (> n 0) (progn (newline n))))
  org-capture-empty-lines-before()
  (let ((origin (point-marker))) (if (bolp) nil (insert "\n"))
(org-capture-empty-lines-before) (let ((beg (point))) (save-restriction (if
insert-here? (progn (narrow-to-region beg beg))) (org-paste-subtree level
template 'for-yank)) (org-capture-position-for-last-stored beg)
(org-capture-empty-lines-after) (if (org-at-heading-p) nil
(outline-next-heading)) (org-capture-mark-kill-region origin (point))
(org-capture-narrow beg (if (eobp) (point) (1- (point))))
(org-capture--position-cursor beg (point))))
  (let ((template (org-capture-get :template)) (reversed? (org-capture-get
:prepend)) (exact-position (org-capture-get :exact-position)) (insert-here?
(org-capture-get :insert-here)) (level 1)) (org-capture-verify-tree
template) (if exact-position (progn (goto-char exact-position))) (cond
(insert-here? (setq level (org-get-valid-level (if (or (org-at-heading-p)
(condition-case nil ... ...)) (org-outline-level) 1)))) ((org-capture-get
:target-entry-p) (setq level (org-get-valid-level (if (org-at-heading-p)
(org-outline-level) 1) 1)) (if reversed? (outline-next-heading)
(org-end-of-subtree t t))) (reversed? (goto-char (point-min)) (if
(org-at-heading-p) nil (outline-next-heading))) (t (goto-char (point-max))
(let (buffers dead-properties) (if (and (not (buffer-base-buffer)) (not
(memq ... org-fold-core--indirect-buffers))) (setq buffers (list
(current-buffer))) (let ((tail ...)) (while tail (let ... ... ...)))) (let
((tail buffers)) (while tail (let (...) (save-current-buffer ... ... ...)
(setq tail ...))))))) (let ((origin (point-marker))) (if (bolp) nil (insert
"\n")) (org-capture-empty-lines-before) (let ((beg (point)))
(save-restriction (if insert-here? (progn (narrow-to-region beg beg)))
(org-paste-subtree level template 'for-yank))
(org-capture-position-for-last-stored beg) (org-capture-empty-lines-after)
(if (org-at-heading-p) nil (outline-next-heading))
(org-capture-mark-kill-region origin (point)) (org-capture-narrow beg (if
(eobp) (point) (1- (point)))) (org-capture--position-cursor beg (point)))))
  org-capture-place-entry()
  (let nil (org-capture-place-entry))
  (cond ((memq val '(entry nil)) (let nil (org-capture-place-entry))) ((eq
val 'table-line) (let nil (org-capture-place-table-line))) ((eq val 'plain)
(let nil (org-capture-place-plain-text))) ((eq val 'item) (let nil
(org-capture-place-item))) ((eq val 'checkitem) (let nil
(org-capture-place-item))))
  (let* ((val (org-capture-get :type))) (cond ((memq val '(entry nil)) (let
nil (org-capture-place-entry))) ((eq val 'table-line) (let nil
(org-capture-place-table-line))) ((eq val 'plain) (let nil
(org-capture-place-plain-text))) ((eq val 'item) (let nil
(org-capture-place-item))) ((eq val 'checkitem) (let nil
(org-capture-place-item)))))
  org-capture-place-template(nil)
  (condition-case error (org-capture-place-template (eq (car
(org-capture-get :target)) 'function)) ((error quit) (if (and
(buffer-base-buffer (current-buffer)) (string-prefix-p "CAPTURE-"
(buffer-name))) (progn (kill-buffer (current-buffer))))
(set-window-configuration (org-capture-get :return-to-wconf)) (error
"Capture template `%s': %s" (org-capture-get :key) (error-message-string
error))))
  (cond ((equal entry "C") (customize-variable 'org-capture-templates))
((equal entry "q") (user-error "Abort")) (t (org-capture-set-plist entry)
(org-capture-get-template) (org-capture-put :original-buffer orig-buf
:original-file (or (buffer-file-name orig-buf) (and (featurep 'dired) (car
(rassq orig-buf dired-buffers)))) :original-file-nondirectory (and
(buffer-file-name orig-buf) (file-name-nondirectory (buffer-file-name
orig-buf))) :annotation annotation :initial initial :return-to-wconf
(current-window-configuration) :default-time (or
org-overriding-default-time (org-current-time)))
(org-capture-set-target-location (and (equal goto 0) 'here))
(condition-case error (org-capture-put :template
(org-capture-fill-template)) ((error quit) (if (get-buffer "*Capture*")
(kill-buffer "*Capture*")) (error "Capture abort: %s" (error-message-string
error)))) (setq org-capture-clock-keep (org-capture-get :clock-keep))
(condition-case error (org-capture-place-template (eq (car (org-capture-get
:target)) 'function)) ((error quit) (if (and (buffer-base-buffer
(current-buffer)) (string-prefix-p "CAPTURE-" (buffer-name))) (progn
(kill-buffer (current-buffer)))) (set-window-configuration (org-capture-get
:return-to-wconf)) (error "Capture template `%s': %s" (org-capture-get
:key) (error-message-string error)))) (if (and (derived-mode-p 'org-mode)
(org-capture-get :clock-in)) (progn (condition-case nil (progn (if
(org-clock-is-active) (progn ...)) (org-clock-in) (set (make-local-variable
...) (copy-marker org-clock-marker))) (error "Could not start the clock in
this capture buffer")))) (if (org-capture-get :immediate-finish) (progn
(org-capture-finalize)))))
  (let* ((orig-buf (current-buffer)) (annotation (if (and (boundp
'org-capture-link-is-already-stored) org-capture-link-is-already-stored)
(plist-get org-store-link-plist :annotation) (condition-case nil (progn
(org-store-link nil)) (error nil)))) (entry (or org-capture-entry
(org-capture-select-template keys))) initial) (setq initial (or
org-capture-initial (and (org-region-active-p) (buffer-substring (point)
(mark))))) (if (stringp initial) (progn (remove-text-properties 0 (length
initial) '(read-only t) initial))) (if (stringp annotation) (progn
(remove-text-properties 0 (length annotation) '(read-only t) annotation)))
(cond ((equal entry "C") (customize-variable 'org-capture-templates))
((equal entry "q") (user-error "Abort")) (t (org-capture-set-plist entry)
(org-capture-get-template) (org-capture-put :original-buffer orig-buf
:original-file (or (buffer-file-name orig-buf) (and (featurep 'dired) (car
(rassq orig-buf dired-buffers)))) :original-file-nondirectory (and
(buffer-file-name orig-buf) (file-name-nondirectory (buffer-file-name
orig-buf))) :annotation annotation :initial initial :return-to-wconf
(current-window-configuration) :default-time (or
org-overriding-default-time (org-current-time)))
(org-capture-set-target-location (and (equal goto 0) 'here))
(condition-case error (org-capture-put :template
(org-capture-fill-template)) ((error quit) (if (get-buffer "*Capture*")
(kill-buffer "*Capture*")) (error "Capture abort: %s" (error-message-string
error)))) (setq org-capture-clock-keep (org-capture-get :clock-keep))
(condition-case error (org-capture-place-template (eq (car (org-capture-get
:target)) 'function)) ((error quit) (if (and (buffer-base-buffer ...)
(string-prefix-p "CAPTURE-" ...)) (progn (kill-buffer ...)))
(set-window-configuration (org-capture-get :return-to-wconf)) (error
"Capture template `%s': %s" (org-capture-get :key) (error-message-string
error)))) (if (and (derived-mode-p 'org-mode) (org-capture-get :clock-in))
(progn (condition-case nil (progn (if ... ...) (org-clock-in) (set ...
...)) (error "Could not start the clock in this capture buffer")))) (if
(org-capture-get :immediate-finish) (progn (org-capture-finalize))))))
  (cond ((equal goto '(4)) (org-capture-goto-target keys)) ((equal goto
'(16)) (org-capture-goto-last-stored)) (t (let* ((orig-buf
(current-buffer)) (annotation (if (and (boundp ...)
org-capture-link-is-already-stored) (plist-get org-store-link-plist
:annotation) (condition-case nil (progn ...) (error nil)))) (entry (or
org-capture-entry (org-capture-select-template keys))) initial) (setq
initial (or org-capture-initial (and (org-region-active-p)
(buffer-substring (point) (mark))))) (if (stringp initial) (progn
(remove-text-properties 0 (length initial) '(read-only t) initial))) (if
(stringp annotation) (progn (remove-text-properties 0 (length annotation)
'(read-only t) annotation))) (cond ((equal entry "C") (customize-variable
'org-capture-templates)) ((equal entry "q") (user-error "Abort")) (t
(org-capture-set-plist entry) (org-capture-get-template) (org-capture-put
:original-buffer orig-buf :original-file (or (buffer-file-name orig-buf)
(and ... ...)) :original-file-nondirectory (and (buffer-file-name orig-buf)
(file-name-nondirectory ...)) :annotation annotation :initial initial
:return-to-wconf (current-window-configuration) :default-time (or
org-overriding-default-time (org-current-time)))
(org-capture-set-target-location (and (equal goto 0) 'here))
(condition-case error (org-capture-put :template
(org-capture-fill-template)) ((error quit) (if ... ...) (error "Capture
abort: %s" ...))) (setq org-capture-clock-keep (org-capture-get
:clock-keep)) (condition-case error (org-capture-place-template (eq ...
...)) ((error quit) (if ... ...) (set-window-configuration ...) (error
"Capture template `%s': %s" ... ...))) (if (and (derived-mode-p ...)
(org-capture-get :clock-in)) (progn (condition-case nil ... ...))) (if
(org-capture-get :immediate-finish) (progn (org-capture-finalize))))))))
  org-capture(nil)
  funcall-interactively(org-capture nil)
  call-interactively(org-capture nil nil)
  command-execute(org-capture)
#+end_example

And here is my emacs minimal config try to reproduce this error but can't
and don't know how to reproduce it.

#+begin_src emacs-lisp
(require 'org-capture)
(setq org-capture-templates
      `(("t" ,(format "%s\tstart a clock task" (all-the-icons-faicon
"hourglass-start" :face 'all-the-icons-red :v-adjust 0.05))
         entry (file "~/Org/Tasks/Tasks.org")
         "* TODO [#A] %?\nSCHEDULED: %(org-insert-time-stamp (org-read-date
nil t \"+0d\"))\n%a\n"
         :clock-in t :clock-resume t :clock-keep t :empty-lines 1)
        ))

(use-package all-the-icons
  :ensure t)

(use-package elfeed
  :ensure t
  ;; For debugging
  ;; :preface (setq elfeed-log-level 'debug)
  :commands (elfeed elfeed-update)
  :custom ((elfeed-db-directory (expand-file-name ".elfeed"
user-emacs-directory))
           ;; specify proxy for elfeed backend cURL.
           (elfeed-curl-extra-arguments '("--proxy" "socks5h://
127.0.0.1:7890"))
           ;; elfeed startup initial tags
           (elfeed-initial-tags '(unread))

           (elfeed-feeds
            '(;; Programming
              ;; ("http://blog.stackoverflow.com/feed/" programming
stackoverflow)
              ;; ("http://programmers.blogoverflow.com/feed/" programming
stackoverflow)
              ;; Emacs
              ;; ("https://www.reddit.com/r/emacs/.rss" emacs reddit) ;
Reddit r/Emacs
              ;; ("https://planet.emacslife.com/atom.xml" emacs planet) ;
Planet Emacslife
              ;; ("https://www.reddit.com/r/orgmode/.rss" org-mode reddit)
; Reddit r/Org-mode
              ;; ("https://emacs-china.org/posts.rss" emacs china)  ; Emacs
China 最新帖子
              ;; ("https://emacs-china.org/latest.rss" emacs china) ; Emacs
China 最新话题
              ("https://sachachua.com/blog/feed/atom/" blog emacs)
     ; Sacha Chua Blog
              ("http://feeds.feedburner.com/TheKitchinResearchGroup" blog
emacs) ; The Kitchin Research Group
              ("https://200ok.ch/atom.xml" blog emacs)
      ; 200ok.ch
              ))
           )
  :init (advice-add 'elfeed :after #'elfeed-update) ; auto update after
entering elfeed.
  ;; (run-at-time nil (* 4 60 60) #'elfeed-update) ; auto update elfeed
every 4 hours.
  ;; FIXME: `elfeed' use `switch-to-buffer'.
  (add-to-list 'display-buffer-alist '("^\\*elfeed-search\\*" .
(display-buffer-below-selected)))
  :config
  ;; (define-key elfeed-search-mode-map (kbd "#") 'elfeed-search-set-filter)

  (defalias 'elfeed-search-toggle-all-star ; [m], [*]
    (elfeed-expose #'elfeed-search-toggle-all 'star)
    "Toggle the `star' tag to all selected entries.")
  (define-key elfeed-search-mode-map (kbd "m")
'elfeed-search-toggle-all-star)

  ;; Auto close elfeed buffers when quit Emacs.
  (defun elfeed-quit ()
    "Close elfeed buffers."
    (interactive)
    (elfeed-db-save)
    (dolist (buffer '("*elfeed-log*" "*elfeed-search*" "*elfeed-entry*"))
      (when (buffer-live-p (get-buffer buffer))
        (with-current-buffer buffer
          (kill-buffer)))))
  (define-key elfeed-search-mode-map (kbd "q") 'elfeed-quit)
  (add-hook 'kill-emacs-hook #'elfeed-quit)

  ;; support Org Mode Capture template
  (defun my/org-capture-elfeed-title ()
    (with-current-buffer "*elfeed-entry*"
      (elfeed-entry-title elfeed-show-entry)))
  (defun my/org-capture-elfeed-date ()
    (with-current-buffer "*elfeed-entry*"
      (format-time-string
       "[%Y-%m-%d %a %H:%M]"
       (seconds-to-time (elfeed-entry-date elfeed-show-entry)))))
  (defun my/org-capture-elfeed-source ()
    (with-current-buffer "*elfeed-entry*"
      (let ((feed (elfeed-entry-feed elfeed-show-entry)))
        (elfeed-feed-title feed))))
  (defun my/org-capture-elfeed-content ()
    (with-current-buffer "*elfeed-entry*"
      (let* ((content (elfeed-deref (elfeed-entry-content
elfeed-show-entry)))
             (type (elfeed-entry-content-type elfeed-show-entry))
             (feed (elfeed-entry-feed elfeed-show-entry))
             (base-url (and feed (elfeed-compute-base (elfeed-feed-url
feed)))))
        (if content
            (if (eq type 'html)
                (progn
                  (unless (fboundp 'org-web-tools--html-to-org-with-pandoc)
                    (require 'org-web-tools))
                  (let ((org-web-tools-pandoc-sleep-time 5))
                    (org-web-tools--html-to-org-with-pandoc content)))
              (insert content))))))

  (with-eval-after-load 'org-capture
    (add-to-list 'org-capture-templates
                 `("r" ,(format "%s\tcapture elfeed RSS feed content to Org
buffer" (all-the-icons-faicon "rss" :face 'all-the-icons-blue-alt))
                   entry (file "")
                   "* %(my/org-capture-elfeed-title)
:PROPERTIES:
:SOURCE: %(my/org-capture-elfeed-source)
:DATE(original): %(my/org-capture-elfeed-date)
:DATE: %u
:END:

%(my/org-capture-elfeed-content)"
                   :empty-lines 1
                   :jump-to-captured t)
                 :append))

  ;; auto re-format elfeed entry org-capture buffer.
  (defun my/elfeed-format-org-capture-buffer ()
    "A helper command to Delete org-capture elfeed-entry ending backslash
\\."
    (interactive)
    (goto-char (point-min))
    (replace-string "\\" "")
    (replace-string " " "")
    ;; using regex replace using \( \)\{2,\}  which means 2 or more
consecutive spaces and replace that with 1 space.
    (replace-regexp "\\( \\)\\{2,\\}" " ")
    (org-mark-subtree) ; or `org-mark-element', `mark-whole-buffer'
    (call-interactively 'org-fill-paragraph) ; or `fill-paragraph'
    )

  (add-hook 'org-capture-mode-hook #'my/elfeed-format-org-capture-buffer)

  ;; Download link media with youtube-dl.
  (defun youtube-dl-cmd-wrapper (url)
    "Downloads the URL with youtube-dl in an async shell"
    (let ((default-directory "~/Downloads"))
      (async-shell-command (format "youtube-dl %s" url))))

  (defun elfeed-youtube-dl (&optional use-generic-p)
    "Use youtube-dl to download the link media."
    (interactive "P")
    (let ((entries (elfeed-search-selected)))
      (cl-loop for entry in entries
               do (elfeed-untag entry 'unread)
               when (elfeed-entry-link entry)
               do (youtube-dl-cmd-wrapper it))
      (mapc #'elfeed-search-update-entry entries)
      (unless (use-region-p) (forward-line))))

  (define-key elfeed-search-mode-map (kbd "d") 'elfeed-youtube-dl)
  )
#+end_src

I might need to take some time to bisect my Emacs config with bug-hunter to
check whether some options caused this error. I will add more details later.

If you have any clue about this error, thanks for the hint.

[stardiviner]           <Hack this world!>      GPG key ID: 47C32433
IRC(freeenode): stardiviner                     Twitter:  @numbchild
Key fingerprint = 9BAA 92BC CDDD B9EF 3B36  CB99 B8C4 B8E5 47C3 2433
Blog: http://stardiviner.github.io/

[-- Attachment #2: Type: text/html, Size: 20642 bytes --]

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

* Re: [BUG] org-capture got file userlock error when I capture on second time.
  2023-03-20 12:53 [BUG] org-capture got file userlock error when I capture on second time stardiviner
@ 2023-03-22 11:38 ` Ihor Radchenko
  2023-03-23  4:07   ` [CANCELED] " Christopher M. Miles
  0 siblings, 1 reply; 3+ messages in thread
From: Ihor Radchenko @ 2023-03-22 11:38 UTC (permalink / raw)
  To: stardiviner; +Cc: Org-mode

stardiviner <numbchild@gmail.com> writes:

> When I org-capture from elfeed-entry buffer (I defined custom functions to
> extract elfeed entry buffer content) in the second time and later, the
> bellowing error raised up. The first-time capture is fine.
>
> Here is the error backtrace:
> #+begin_example
> Debugger entered--Lisp error: (wrong-type-argument stringp nil)
>   expand-file-name(nil)
>   userlock--check-content-unchanged("~/Org/Tasks/Tasks.org")

This looks like some interaction between Org setting `buffer-file-name'
to nil in *Capture* buffer and Emacs' file locking machinery. Maybe.
Maybe Emacs bug. I have no better ideas.

I also see nothing wrong we do on Org side.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


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

* [CANCELED] Re: [BUG] org-capture got file userlock error when I capture on second time.
  2023-03-22 11:38 ` Ihor Radchenko
@ 2023-03-23  4:07   ` Christopher M. Miles
  0 siblings, 0 replies; 3+ messages in thread
From: Christopher M. Miles @ 2023-03-23  4:07 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: stardiviner, Org-mode

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


Ihor Radchenko <yantar92@posteo.net> writes:

> stardiviner <numbchild@gmail.com> writes:
>
>> When I org-capture from elfeed-entry buffer (I defined custom functions to
>> extract elfeed entry buffer content) in the second time and later, the
>> bellowing error raised up. The first-time capture is fine.
>>
>> Here is the error backtrace:
>> #+begin_example
>> Debugger entered--Lisp error: (wrong-type-argument stringp nil)
>>   expand-file-name(nil)
>>   userlock--check-content-unchanged("~/Org/Tasks/Tasks.org")
>
> This looks like some interaction between Org setting `buffer-file-name'
> to nil in *Capture* buffer and Emacs' file locking machinery. Maybe.
> Maybe Emacs bug. I have no better ideas.
>
> I also see nothing wrong we do on Org side.

First, Ihor, I need to thank you. With your hints. I try to figure out
what things might get involved between Org setting `buffer-file-name'
and *Capture* buffer.

1. I try to set `org-capture-mode-hook`, `org-mode-hook' etc to nil.

2. Use bug-hunter to bisect my emacs config, the first start, the
   problem does not occurred, this is weird, even I tried many times.

3. Then I use comment to bisect my init.el, try to figure out the
   reason. Still not found. And the problem not occurred.

4. I start Emacs again with original config. Now the problem gone. I
   restart Emacs many times, problem still not occurred. Weird.

-- 

[ stardiviner ]
I try to make every word tell the meaning that I want to express without misunderstanding.

Blog: https://stardiviner.github.io/
IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner
GPG: F09F650D7D674819892591401B5DF1C95AE89AC3

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]

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

end of thread, other threads:[~2023-03-23  4:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-20 12:53 [BUG] org-capture got file userlock error when I capture on second time stardiviner
2023-03-22 11:38 ` Ihor Radchenko
2023-03-23  4:07   ` [CANCELED] " Christopher M. Miles

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.