Org-mode mailing list
 help / color / mirror / Atom feed
* Re: Bug: Double trailing slash for default candidate in org-refile-get-target [9.4 (9.4-7-g3eccc5-elpaplus @ /home/gustavo/.emacs.d/elpa/org-plus-contrib-20200921/)]
@ 2021-05-10 18:04 Bhavin Gandhi
  2021-05-23 18:05 ` Bhavin Gandhi
  0 siblings, 1 reply; 12+ messages in thread
From: Bhavin Gandhi @ 2021-05-10 18:04 UTC (permalink / raw)
  To: bzg; +Cc: emacs-orgmode

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

Hello Bastien

I'm new to Org mode codebase as well as Elisp. Is this something I can pick
up, I was not sure that's why I thought of asking here on the list.

Bhavin Gandhi (bhavin192) |

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

^ permalink raw reply	[flat|nested] 12+ messages in thread
* Bug: Double trailing slash for default candidate in org-refile-get-target [9.4 (9.4-7-g3eccc5-elpaplus @ /home/gustavo/.emacs.d/elpa/org-plus-contrib-20200921/)]
@ 2020-09-21 18:34 Gustavo Barros
  2020-09-23 14:17 ` stardiviner
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Gustavo Barros @ 2020-09-21 18:34 UTC (permalink / raw)
  To: emacs-orgmode

Hi All,

some time ago, I've reported an issue regarding duplicity of the default 
candidate in `org-refile' 
(  The problem was 
that, when using `org-refile-use-outline-path' an "extra" slash was 
appended at the end of every path, but candidates were stored in 
`org-refile-history' without that extra slash.  Bastien took care of 
that and indeed changed things so as to pass the elements to 
`org-refile-history' with the trailing slash as appropriate.

At the time, I reported a difference of behavior between 
`completing-read-default' and `ivy-completing-read' after the mentioned 
commit by Bastien.  But the issue did not appear for Bastien, which does 
not use Ivy, and I also was not able to diagnose the problem properly. 
I felt I didn't have enough to offer as to insist, so I resorted to an 
old hack of mine.  But the new release this week (thank you very much!, 
btw) has bitten me again on this, so I went back to some digging, and 
hopefully I can do a better job this time in diagnosing the problem and 
suggesting a fix.

An ECM to reproduce the issue as it currently stands is:

- Start 'emacs -Q'

- Do an initial setup:
  #+begin_src emacs-lisp
  (add-to-list 'load-path "~/.emacs.d/elpa/org-plus-contrib-20200921")
  (add-to-list 'load-path "~/.emacs.d/elpa/ivy-20200826.955")
  ;; Those are the latest Org weekly build (Org 9.4) and the current up 
  to date
  ;; Ivy at Melpa
  (setq org-refile-targets '(("~/org/" :maxlevel . 2)))
  (setq org-refile-use-outline-path 'file)
  (setq org-outline-path-complete-in-steps nil)
  (require 'ivy)
  ;; Bear with me, the problem is not with Ivy, I'll demonstrate that.

- Open file "~/org/", with contents:
  #+begin_src org
  ,* Top heading 1
  ,* Top heading 2
  ,** Entry 1
  ,** Entry 2

- Go to heading "Entry 1", refile it to "Top heading 1"

- Go to heading "Entry 2", and call `org-refile'

- Observe the available candidates, and notice " heading 1/" 
  is there twice, once as the default candidate, with a *double* 
  trailing slash, and also on the paths list, with a single trailing 

I've tried to pin down what is going on here and my understanding is 
that Bastien's fix on that previous thread did indeed correct the 
problem of the missing trailing slash in `org-refile-history' and this 
indeed corresponds correctly to the state of the completion "collection" 
(the let bound `tbl' variable in `org-refile-get-location'), as it 
should.  But there remained a couple of instances in 
`org-refile-get-location' which added the trailing slash considering 
`org-refile-history' didn't have them, so that when this is done, we get 
a double trailing slash.

The two instances are: 1) when the completion function is actually 

#+begin_src emacs-lisp
(setq answ (funcall cfunc prompt tbl nil (not new-nodes)
			    nil 'org-refile-history
			    (or cdef (concat (car org-refile-history) 

2) And three lines bellow, on the let binding:

#+begin_src emacs-lisp
(let* ((last-refile-loc (car org-refile-history))
       (last-refile-loc-path (concat last-refile-loc extra)))

In both instances, we are getting the `car' of `org-refile-history' 
which now already has `extra' (that is, the trailing slash) and adding 
it again.

My suggested fix is to remove these `extra's in duplicity, they are 
remnants of when `org-refile-history' didn't have them already.  That 

#+begin_src emacs-lisp
(setq answ (funcall cfunc prompt tbl nil (not new-nodes)
			    nil 'org-refile-history
			    (or cdef (car org-refile-history))))


#+begin_src emacs-lisp
(let* ((last-refile-loc (car org-refile-history))
       (last-refile-loc-path last-refile-loc))

Of course, the second opens some opportunity to simplify the code that 
follows considering `last-refile-loc-path' and `last-refile-loc' are now 

Why I think this is the problem and the correct way to fix it:

1) If you add inspection points at the appropriate locations for the 
sexps =(concat (car org-refile-history) extra)= and =(concat 
last-refile-loc extra)= you will find the double trailing slash there, 
and it shouldn't be there.

2) The visual manifestation of this double trailing slash in the default 
candidate with `ivy-mode' is there therefore independently of 
`ivy-mode`.  Indeed, `ivy-mode' basically sets 
`completing-read-function' to `ivy-completing-read', which in turn calls 
its main API function `ivy-read'.  `ivy-completing-read' just passes 
along the `def' argument without manipulating it.  As far as I can see, 
`ivy-read' also does not change it before calling 

Why `completing-read-default' does not show this second trailing slash 
of the `def' argument it received is another matter.  But it's there...

3) I've tested this suggested fix in the following scenarios (starting 
from the ECM above):

#+begin_src emacs-lisp
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps nil)
;; (ivy-mode)

#+begin_src emacs-lisp
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps nil)

#+begin_src emacs-lisp
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps t)
;; `org-olpath-completing-read' does not play well with `ivy-mode' so no 
;; to use it here

#+begin_src emacs-lisp
(setq org-refile-use-outline-path nil)

#+begin_src emacs-lisp
(setq org-refile-use-outline-path nil)
;; (ivy-mode)

Other non-nil values of `org-refile-use-outline-path' should be 
equivalent to `file' with respect to the issue at hand, so they are 
implicitly covered.

Having tested these cases, to the best of my knowledge, they all work as 
expected.  Though I'm admittedly less acquainted with =(setq 
org-refile-use-outline-path nil)= and =(setq 
org-outline-path-complete-in-steps t)=.

All tests and ECM were ran with "Org mode version 9.4 
(9.4-7-g3eccc5-elpaplus @ 
/home/gustavo/.emacs.d/elpa/org-plus-contrib-20200921/)" and "GNU Emacs 
27.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.20, cairo version 
1.16.0) of 2020-08-11".

I hope this is a more useful report than last time.


Emacs  : GNU Emacs 27.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 
3.24.20, cairo version 1.16.0)
 of 2020-08-11
Package: Org mode version 9.4 (9.4-7-g3eccc5-elpaplus @ 

current state:
 org-src-mode-hook '(org-src-babel-configure-edit-buffer
 org-link-shell-confirm-function 'yes-or-no-p
 org-metadown-hook '(org-babel-pop-to-session-maybe)
 org-clock-out-hook '(org-clock-remove-empty-clock-drawer)
 org-refile-targets '(("~/org/" :maxlevel . 2))
 org-mode-hook '(#[0 "\300\301\302\303\304$\207"
		   [add-hook change-major-mode-hook org-show-all append 
		 #[0 "\300\301\302\303\304$\207"
		   [add-hook change-major-mode-hook 
		    append local]
		 org-babel-result-hide-spec org-babel-hide-all-hashes
 org-outline-path-complete-in-steps nil
 org-archive-hook '(org-attach-archive-delete-maybe)
 org-confirm-elisp-link-function 'yes-or-no-p
 org-agenda-before-write-hook '(org-agenda-add-entry-text)
 org-metaup-hook '(org-babel-load-in-session-maybe)
 org-bibtex-headline-format-function #[257 "\300\236A\207" [:title] 3 
 "\n\n(fn ENTRY)"]
 org-babel-pre-tangle-hook '(save-buffer)
 org-tab-first-hook '(org-babel-hide-result-toggle-maybe
 org-agenda-loop-over-headlines-in-active-region nil
 org-src-lang-modes '(("arduino" . arduino) ("redis" . redis) ("php" 
 . php)
		      ("C" . c) ("C++" . c++) ("asymptote" . asy)
		      ("bash" . sh) ("beamer" . latex) ("calc" 
		      . fundamental)
		      ("cpp" . c++) ("ditaa" . artist) ("dot" 
		      . fundamental)
		      ("elisp" . emacs-lisp) ("ocaml" . tuareg)
		      ("screen" . shell-script) ("shell" . sh)
		      ("sqlite" . sql))
 org-occur-hook '(org-first-headline-recenter)
 org-cycle-hook '(org-cycle-hide-archived-subtrees 
 org-speed-command-hook '(org-speed-command-activate
 org-refile-use-outline-path 'file
 org-export-before-parsing-hook '(org-attach-expand-links)
 org-confirm-shell-link-function 'yes-or-no-p
 org-link-parameters '(("attachment" :follow org-attach-follow :complete
		       ("id" :follow org-id-open)
		       ("eww" :follow org-eww-open :store 
		       ("rmail" :follow org-rmail-open :store
		       ("mhe" :follow org-mhe-open :store 
		       ("irc" :follow org-irc-visit :store 
			:export org-irc-export)
		       ("info" :follow org-info-open :export 
			:store org-info-store-link)
		       ("gnus" :follow org-gnus-open :store
		       ("docview" :follow org-docview-open :export
			org-docview-export :store 
		       ("bibtex" :follow org-bibtex-open :store
		       ("bbdb" :follow org-bbdb-open :export 
			:complete org-bbdb-complete-link :store
		       ("w3m" :store org-w3m-store-link) ("file+sys")
		       ("file+emacs") ("shell" :follow 
		       ("news" :follow
			#[514 "\301\300\302Q\"\207"
			  ["news" browse-url ":"] 6 "\n\n(fn URL ARG)"]
		       ("mailto" :follow
			#[514 "\301\300\302Q\"\207"
			  ["mailto" browse-url ":"] 6 "\n\n(fn URL 
		       ("https" :follow
			#[514 "\301\300\302Q\"\207"
			  ["https" browse-url ":"] 6 "\n\n(fn URL ARG)"]
		       ("http" :follow
			#[514 "\301\300\302Q\"\207"
			  ["http" browse-url ":"] 6 "\n\n(fn URL ARG)"]
		       ("ftp" :follow
			#[514 "\301\300\302Q\"\207" ["ftp" browse-url 
			  6 "\n\n(fn URL ARG)"]
		       ("help" :follow org-link--open-help)
		       ("file" :complete org-link-complete-file)
		       ("elisp" :follow org-link--open-elisp)
		       ("doi" :follow org-link--open-doi))
 org-link-elisp-confirm-function 'yes-or-no-p

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

end of thread, other threads:[~2021-05-25 17:53 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-10 18:04 Bug: Double trailing slash for default candidate in org-refile-get-target [9.4 (9.4-7-g3eccc5-elpaplus @ /home/gustavo/.emacs.d/elpa/org-plus-contrib-20200921/)] Bhavin Gandhi
2021-05-23 18:05 ` Bhavin Gandhi
2021-05-23 18:23   ` Timothy
2021-05-23 18:58   ` Gustavo Barros
2021-05-24 16:34     ` Bhavin Gandhi
2021-05-24 16:58       ` Gustavo Barros
2021-05-25 17:52         ` [PATCH] org-refile: Fix double slashes in the refile targets Bhavin Gandhi
  -- strict thread matches above, loose matches on Subject: below --
2020-09-21 18:34 Bug: Double trailing slash for default candidate in org-refile-get-target [9.4 (9.4-7-g3eccc5-elpaplus @ /home/gustavo/.emacs.d/elpa/org-plus-contrib-20200921/)] Gustavo Barros
2020-09-23 14:17 ` stardiviner
2020-09-23 14:49   ` Gustavo Barros
2021-02-14 12:55 ` Gustavo Barros
2021-05-04  6:27 ` Bastien

Org-mode mailing list

This inbox may be cloned and mirrored by anyone:

	git clone --mirror list/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 list list/ \
	public-inbox-index list

Example config snippet for mirrors.
Newsgroups are available over NNTP:

AGPL code for this site: git clone