From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id My+9B1vyaF8xNgAA0tVLHw (envelope-from ) for ; Mon, 21 Sep 2020 18:35:07 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id kGItA1vyaF/LOAAA1q6Kng (envelope-from ) for ; Mon, 21 Sep 2020 18:35:07 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 8F1339400C7 for ; Mon, 21 Sep 2020 18:35:06 +0000 (UTC) Received: from localhost ([::1]:44086 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kKQeX-0002vx-Ak for larch@yhetil.org; Mon, 21 Sep 2020 14:35:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57970) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kKQe2-0002td-LN for emacs-orgmode@gnu.org; Mon, 21 Sep 2020 14:34:34 -0400 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]:38146) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kKQe0-0006kC-8t for emacs-orgmode@gnu.org; Mon, 21 Sep 2020 14:34:34 -0400 Received: by mail-pj1-x1029.google.com with SMTP id u3so214987pjr.3 for ; Mon, 21 Sep 2020 11:34:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:user-agent:from:to:subject:message-id:date:mime-version; bh=u00BigmiI0S1nlkAXHwPj4TRkPuDM1lWoi6sVRMDN8Q=; b=oAwuN+7HV8WBVcUCjy7yVCafNN8YPr4nZ757+rKTC3g0RPjRTXDwoeHSRPhu6SuKXX PCCqIroFc+ySfxe4eB4B0qA+O3bG2zGAfy7qH8VKCPtsYgh+/5N13e1qj7aCBOaPcBhN vrjIH6sTJlRx+wEZyWObMDMRjz5QlNQOaBjM+dNiBM/v43kHbOSJ38bLypDNXGXuz20q J8r8+6i+IyQ9SoqxP9FZ5BtklhvjRoHVZTOVJj5uVTCgLitM6TlHyeJHOCp3z2zhoq9C CQhM7kGt8TCm+yJPxfdt2Y5IeXSKWD4nScpJppb2lM7kSfNf2mVnmfIHzA0BpThnrn7j LK1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:user-agent:from:to:subject:message-id :date:mime-version; bh=u00BigmiI0S1nlkAXHwPj4TRkPuDM1lWoi6sVRMDN8Q=; b=YEr9DwbCp7jyZKM9S5EKxzU9LKd2q0Zad0ImzruR6+YCGQjuZl71dWY3T+bIfXE5Pu LQvwlJgopGgU7s61v7YnOUGvse710pQuzagsIe41HEPYOmW598brSDj/fgfDMdfq48R5 ZCoFLZO0cB+XRbcghgqXMhvX7rfSu0vafCmndPQ3+H8TkfmW+UzdbEoisMnhZQiwBBke uQ5wCZ8cY2HjprpCZreFWPDKO1wvoG1yuUVo1RSWjCTwlAoLgS+sP1RBZHYUZk4bSoiL 75Mlw7dU/stZFzgvx411tduN0wRPLLxe2QMwdK80kVQtvLvpcdUKv0ayBrJokR5f2RRD yrFQ== X-Gm-Message-State: AOAM531raToLeFZrxOWyNHJuExiNgqirLx5Qj7+JxQRgROU/Ljsrtnk9 o/4aoUNtzdkSdo9f5wJasx1ITqmJmuo= X-Google-Smtp-Source: ABdhPJyAYpTNI/9qwPL4DV/8A6S17eDCJ/VrcM5vaPcegFfMKiL/yTTVwhBmSpndIip8VI1bPPBXcQ== X-Received: by 2002:a17:90b:3852:: with SMTP id nl18mr617860pjb.78.1600713269470; Mon, 21 Sep 2020 11:34:29 -0700 (PDT) Received: from gusbrs-laptop ([91.207.175.213]) by smtp.gmail.com with ESMTPSA id q24sm12449193pfs.206.2020.09.21.11.34.27 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 11:34:28 -0700 (PDT) User-agent: mu4e 1.4.13; emacs 27.1 From: Gustavo Barros To: emacs-orgmode@gnu.org Subject: 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/)] Message-ID: <87tuvrj7ww.fsf@gmail.com> Date: Mon, 21 Sep 2020 15:34:23 -0300 MIME-Version: 1.0 Content-Type: text/plain; format=flowed Received-SPF: pass client-ip=2607:f8b0:4864:20::1029; envelope-from=gusbrs.2016@gmail.com; helo=mail-pj1-x1029.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Scanner: scn0 Authentication-Results: aspmx1.migadu.com; dkim=fail (rsa verify failed) header.d=gmail.com header.s=20161025 header.b=oAwuN+7H; dmarc=fail reason="SPF not aligned (relaxed)" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of emacs-orgmode-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=emacs-orgmode-bounces@gnu.org X-Spam-Score: 3.39 X-TUID: R/jlp/rJlIan Hi All, some time ago, I've reported an issue regarding duplicity of the default candidate in `org-refile' (https://orgmode.org/list/87lftw1k2n.fsf@gmail.com/). 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/test.org" :maxlevel . 2))) (setq org-refile-use-outline-path 'file) (setq org-outline-path-complete-in-steps nil) (require 'ivy) (ivy-mode) ;; Bear with me, the problem is not with Ivy, I'll demonstrate that. #+end_src - Open file "~/org/test.org", with contents: #+begin_src org ,* Top heading 1 ,* Top heading 2 ,** Entry 1 ,** Entry 2 #+end_src - 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 "test.org/Top 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 slash. 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 called: #+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) extra)))) #+end_src 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))) ...) #+end_src 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 is: #+begin_src emacs-lisp (setq answ (funcall cfunc prompt tbl nil (not new-nodes) nil 'org-refile-history (or cdef (car org-refile-history)))) #+end_src And: #+begin_src emacs-lisp (let* ((last-refile-loc (car org-refile-history)) (last-refile-loc-path last-refile-loc)) ...) #+end_src Of course, the second opens some opportunity to simplify the code that follows considering `last-refile-loc-path' and `last-refile-loc' are now identical. 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 `read-from-minibuffer'. 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) #+end_src #+begin_src emacs-lisp (setq org-refile-use-outline-path 'file) (setq org-outline-path-complete-in-steps nil) (ivy-mode) #+end_src #+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 need ;; to use it here #+end_src #+begin_src emacs-lisp (setq org-refile-use-outline-path nil) (ivy-mode) #+end_src #+begin_src emacs-lisp (setq org-refile-use-outline-path nil) ;; (ivy-mode) #+end_src 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. Best, Gustavo. 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 @ /home/gustavo/.emacs.d/elpa/org-plus-contrib-20200921/) current state: ============== (setq org-src-mode-hook '(org-src-babel-configure-edit-buffer org-src-mode-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/test.org" :maxlevel . 2)) org-mode-hook '(#[0 "\300\301\302\303\304$\207" [add-hook change-major-mode-hook org-show-all append local] 5] #[0 "\300\301\302\303\304$\207" [add-hook change-major-mode-hook org-babel-show-result-all append local] 5] org-babel-result-hide-spec org-babel-hide-all-hashes org-eldoc-load) 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-babel-header-arg-expand) 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-cycle-hide-drawers org-cycle-show-empty-lines org-optimize-window-after-visibility-change) org-speed-command-hook '(org-speed-command-activate org-babel-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 org-attach-complete-link) ("id" :follow org-id-open) ("eww" :follow org-eww-open :store org-eww-store-link) ("rmail" :follow org-rmail-open :store org-rmail-store-link) ("mhe" :follow org-mhe-open :store org-mhe-store-link) ("irc" :follow org-irc-visit :store org-irc-store-link :export org-irc-export) ("info" :follow org-info-open :export org-info-export :store org-info-store-link) ("gnus" :follow org-gnus-open :store org-gnus-store-link) ("docview" :follow org-docview-open :export org-docview-export :store org-docview-store-link) ("bibtex" :follow org-bibtex-open :store org-bibtex-store-link) ("bbdb" :follow org-bbdb-open :export org-bbdb-export :complete org-bbdb-complete-link :store org-bbdb-store-link) ("w3m" :store org-w3m-store-link) ("file+sys") ("file+emacs") ("shell" :follow org-link--open-shell) ("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 ARG)"] ) ("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 )