Re: [PATCH] org-agenda.el: customise outline path in echo area

2022-08-30 Thread Mikhail Skorzhisnkii
I have signed the FSF papers now and we can continue the review of this work 
now.

I am attaching updated and rebased patch for this and another e-mail thread, 
since these two patches are depend on each other. I have additionally tested 
the functionality of these changes by verifying that it works as expected on my 
setup;

• Tried to use org-agenda on buffers with and without title property set
• Tried to call org-refile and see if refiling will happen
• `make test' passes

I have *not* tried to see if it will work on buffers without file 
representation, but the component tests for refile should cover that.

Let me know what you think.

  Thanks,
  Mikhail Skorzhinskii

Ihor Radchenko  writes:

> Mikhail Skorzhinskii  writes:
>
>> Thank you for your comments once again. I’ve changed string= to eq and
>> it appears to be working OK.
>>
>> I’ve also renamed “title” variable to “title-prop” for better
>> readability. The -prop suffix should show the reader that it was
>> extracted from the file, and thus cost some CPU/IO.
>>
>> I’ve attached an updated version to this email. Would love to hear what
>> you think.
>
> Thanks! And sorry for the late reply. Your patch fell through the cracks
> in my todo list.
>
>> * lisp/org-agenda.el (org-agenda-show-outline-path): add an option to
>> show document title in outline path (instead of file name)
>> * lisp/org.el (org-get-title-from-file): a function to collect the
>> document title from the org-mode file
>> * lisp/org.el (org-display-outline-path): add logic that will collect a
>> document title and put it into the outline path if
>> org-agenda-show-outline-path set to ’title
>
> It would make sense to document the new customization in ORG-NEWS.
>
>> +(defun org-get-title-from-file (file)
>> +  “Collect tilte from the provided `org-mode’ FILE.”
>> +  (let (title)
>   ^ typo
>> +(when file
>> +  (with-current-buffer
>> +  (get-file-buffer file)
>> +(pcase (org-collect-keywords ’(“TITLE”))
>> +  (`((“TITLE” . ,val))
>> +   (setq title (car val)
>> +  title)))
>
> Note that this function behavior is underfined when FILE buffer does not
> exist. It would be better to accept buffer as argument.
>
> Best,
> Ihor
>From 646af66fa88fbcc2b1f2848a14dd5c262763ef98 Mon Sep 17 00:00:00 2001
From: Mikhail Skorzhinskii 
Date: Mon, 21 Sep 2020 14:53:13 +0200
Subject: [PATCH 2/2] org-refile.el: show refile targets with doc. title

* lisp/org-refile.el (org-refile-use-outline-path): add an option 'title
* lisp/org-refile.el (org-refile-get-targets): start refile target
outline with document title (#+title) instead of file name
---
 etc/ORG-NEWS |  4 
 lisp/org-refile.el   | 16 +---
 testing/lisp/test-org.el | 37 -
 3 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 4405489bb..df2c882bb 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -290,6 +290,10 @@ level used for top level headings, much like how
 headings in HTML export.
 
 ** New options
+*** A new option for custom setting =org-refile-use-outline-path= to show document title in refile targets
+
+Setting =org-refile-use-outline-path= to ='title= will show title instead of the file name in refile targets. If the documen do not have a title, the filename will be used, similar to ='file= option.
+
 *** A new option for custom setting =org-agenda-show-outline-path= to show document title
 
 Settings =org-agenda-show-outline-path=  to ='title= will show title instead of
diff --git a/lisp/org-refile.el b/lisp/org-refile.el
index 01f0dfa46..14bd81a2b 100644
--- a/lisp/org-refile.el
+++ b/lisp/org-refile.el
@@ -158,7 +158,8 @@ When `buffer-name', use the buffer name."
 	  (const :tag "Yes" t)
 	  (const :tag "Start with file name" file)
 	  (const :tag "Start with full file path" full-file-path)
-	  (const :tag "Start with buffer name" buffer-name)))
+	  (const :tag "Start with buffer name" buffer-name)
+	  (const :tag "Start with document title" title)))
 
 (defcustom org-outline-path-complete-in-steps t
   "Non-nil means complete the outline path in hierarchical steps.
@@ -317,6 +318,9 @@ converted to a headline before refiling."
 		 (push (list (and (buffer-file-name (buffer-base-buffer))
   (file-truename (buffer-file-name (buffer-base-buffer
  f nil nil) tgs))
+	   (when (eq org-refile-use-outline-path 'title)
+		 (push (list (or (org-get-title-from-buffer)
+ (and f (file-name-nondirectory f))) f nil nil) tgs))
 	   (org-with-wide-buffer
 		(goto-char (point-min))
 		(setq org-outline-path-cache nil)
@@ -343,7 +347,13 @@ converted to a headline before refiling."
(and (buffer-file-name (buffer-base-buffer))
 (file-name-nondirectory

Re: [PATCH] org-agenda.el: customise outline path in echo area

2022-06-11 Thread Ihor Radchenko
Mikhail Skorzhinskii  writes:

> Thank you for your comments once again. I've changed string= to eq and
> it appears to be working OK.
>
> I've also renamed "title" variable to "title-prop" for better
> readability. The -prop suffix should show the reader that it was
> extracted from the file, and thus cost some CPU/IO.
>
> I've attached an updated version to this email. Would love to hear what
> you think.

Thanks! And sorry for the late reply. Your patch fell through the cracks
in my todo list.

> * lisp/org-agenda.el (org-agenda-show-outline-path): add an option to
> show document title in outline path (instead of file name)
> * lisp/org.el (org-get-title-from-file): a function to collect the
> document title from the org-mode file
> * lisp/org.el (org-display-outline-path): add logic that will collect a
> document title and put it into the outline path if
> org-agenda-show-outline-path set to 'title

It would make sense to document the new customization in ORG-NEWS.

> +(defun org-get-title-from-file (file)
> +  "Collect tilte from the provided `org-mode' FILE."
> +  (let (title)
  ^ typo
> +(when file
> +  (with-current-buffer
> +   (get-file-buffer file)
> + (pcase (org-collect-keywords '("TITLE"))
> +   (`(("TITLE" . ,val))
> +(setq title (car val)
> +  title)))

Note that this function behavior is underfined when FILE buffer does not
exist. It would be better to accept buffer as argument.

Best,
Ihor



Re: [PATCH] org-agenda.el: customise outline path in echo area

2021-12-28 Thread Mikhail Skorzhinskii
Hi Ihor,

Thank you for your comments once again. I've changed string= to eq and
it appears to be working OK.

I've also renamed "title" variable to "title-prop" for better
readability. The -prop suffix should show the reader that it was
extracted from the file, and thus cost some CPU/IO.

I've attached an updated version to this email. Would love to hear what
you think.

Thanks,
Mikhail

On Sun, 2021-12-26 at 21:44 +0800, Ihor Radchenko wrote:
> Mikhail Skorzhinskii  writes:
> 
> Thanks for the patch! The addition looks reasonable to me.
> 
> > +    (title (when (and file-or-title (string= file-or-title
> > 'title))
> > ...
> > +  (and file-or-title bfn (concat (if (and (string= file-
> > or-
> > title 'title) title)
> 
> (string= file-or-title 'title) will match FILE-OR-TITLE values
> "title"
> and 'title. I am not sure if it is what you intended to achieve.
> Probably, a simple (eq file-or-title 'title) would be sufficient.
> 
> Best,
> Ihor
From 1a09ea522b51f2a418b58f0f6122c578a836f69f Mon Sep 17 00:00:00 2001
From: Mikhail Skorzhinskii 
Date: Sat, 12 Sep 2020 18:10:05 +0200
Subject: [PATCH 1/5] org-agenda.el: customize outline path in echo area

* lisp/org-agenda.el (org-agenda-show-outline-path): add an option to
show document title in outline path (instead of file name)
* lisp/org.el (org-get-title-from-file): a function to collect the
document title from the org-mode file
* lisp/org.el (org-display-outline-path): add logic that will collect a
document title and put it into the outline path if
org-agenda-show-outline-path set to 'title
---
 lisp/org-agenda.el | 11 ---
 lisp/org.el| 25 ++---
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index 721ef2ced..817354659 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -1045,9 +1045,14 @@ current item's tree, in an indirect buffer."
   :type 'boolean)
 
 (defcustom org-agenda-show-outline-path t
-  "Non-nil means show outline path in echo area after line motion."
+  "Non-nil means show outline path in echo area after line motion.
+
+If set to 'title, show document title."
   :group 'org-agenda-startup
-  :type 'boolean)
+  :type '(choice
+	  (const :tag "Don't show outline path in agenda view." nil)
+	  (const :tag "Show outline path with prepended file name." t)
+	  (const :tag "Show outline path with prepended document title. Fallback to file name is no title is present." title)))
 
 (defcustom org-agenda-start-with-entry-text-mode nil
   "The initial value of entry-text-mode in a newly created agenda window."
@@ -9354,7 +9359,7 @@ When called with a prefix argument, include all archive files as well."
 	   (org-agenda-tree-to-indirect-buffer nil)
 	 (org-agenda-show)))
   (and org-agenda-show-outline-path
-	   (org-with-point-at m (org-display-outline-path t))
+	   (org-with-point-at m (org-display-outline-path org-agenda-show-outline-path))
 
 (defun org-agenda-show-tags ()
   "Show the tags applicable to the current item."
diff --git a/lisp/org.el b/lisp/org.el
index ce4e08eab..8790c72ab 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -8166,10 +8166,24 @@ the default is \"/\"."
 	(setf (substring fpath (- width 2)) "..")))
 fpath))
 
-(defun org-display-outline-path ( file current separator just-return-string)
+(defun org-get-title-from-file (file)
+  "Collect tilte from the provided `org-mode' FILE."
+  (let (title)
+(when file
+  (with-current-buffer
+	  (get-file-buffer file)
+	(pcase (org-collect-keywords '("TITLE"))
+	  (`(("TITLE" . ,val))
+	   (setq title (car val)
+  title)))
+
+
+(defun org-display-outline-path ( file-or-title current separator just-return-string)
   "Display the current outline path in the echo area.
 
-If FILE is non-nil, prepend the output with the file name.
+If FILE-OR-TITLE is 'title, prepend outline with file title.  If
+it is non-nil or title is not present in document, prepend
+outline path with the file name.
 If CURRENT is non-nil, append the current heading to the output.
 SEPARATOR is passed through to `org-format-outline-path'.  It separates
 the different parts of the path and defaults to \"/\".
@@ -8177,6 +8191,8 @@ If JUST-RETURN-STRING is non-nil, return a string, don't display a message."
   (interactive "P")
   (let* (case-fold-search
 	 (bfn (buffer-file-name (buffer-base-buffer)))
+	 (title-prop (when (and file-or-title (eq file-or-title 'title))
+		  (org-get-title-from-file bfn)))
 	 (path (and (derived-mode-p 'org-mode) (org-get-outline-path)))
 	 res)
 (when current (setq path (append path
@@ -8188,7 +8204,10 @@ If JUST-RETURN-STRING is non-nil, return a string, don't display a message."
 	  (org-format-outline-path
 	   path
 	   (1- (frame-width))
-	   (and file bfn (concat (file-name-nondirectory bfn) separator))
+	   (and file-or-title bfn (concat (if (and (eq file-or-title 'title) title-prop)
+	  title-prop
+	

Re: [PATCH] org-agenda.el: customise outline path in echo area

2021-12-26 Thread Ihor Radchenko
"Mikhail Skorzhinskiy"  writes:

> Should I resubmit the patch in this thread? I agree with your change.

Yes. Just reply to my message with the new version of the patch.

Best,
Ihor



Re: [PATCH] org-agenda.el: customise outline path in echo area

2021-12-26 Thread Mikhail Skorzhinskiy
Glad to hear that.

Should I resubmit the patch in this thread? I agree with your change.

Thanks, Mikhail

-- 
  Mikhail Skorzhinskiy
  mskorzhins...@eml.cc

On Sun, Dec 26, 2021, at 16:44, Ihor Radchenko wrote:
> Mikhail Skorzhinskii  writes:
>
> Thanks for the patch! The addition looks reasonable to me.
>
>> +    (title (when (and file-or-title (string= file-or-title
>> 'title))
>> ...
>> +  (and file-or-title bfn (concat (if (and (string= file-or-
>> title 'title) title)
>
> (string= file-or-title 'title) will match FILE-OR-TITLE values "title"
> and 'title. I am not sure if it is what you intended to achieve.
> Probably, a simple (eq file-or-title 'title) would be sufficient.
>
> Best,
> Ihor



Re: [PATCH] org-agenda.el: customise outline path in echo area

2021-12-26 Thread Ihor Radchenko
Mikhail Skorzhinskii  writes:

Thanks for the patch! The addition looks reasonable to me.

> +    (title (when (and file-or-title (string= file-or-title
> 'title))
> ...
> +  (and file-or-title bfn (concat (if (and (string= file-or-
> title 'title) title)

(string= file-or-title 'title) will match FILE-OR-TITLE values "title"
and 'title. I am not sure if it is what you intended to achieve.
Probably, a simple (eq file-or-title 'title) would be sufficient.

Best,
Ihor



[PATCH] org-agenda.el: customise outline path in echo area

2021-12-25 Thread Mikhail Skorzhinskii


* lisp/org-agenda.el (org-agenda-show-outline-path): add an option to
show document title in outline path (instead of file name)
* lisp/org.el (org-get-title-from-file): a function to collect the
document title from the org-mode file
* lisp/org.el (org-display-outline-path): add logic that will collect a
document title and put it into the outline path if
org-agenda-show-outline-path set to 'title
---
 lisp/org-agenda.el | 11 ---
 lisp/org.el    | 25 ++---
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el
index 721ef2ced..817354659 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -1045,9 +1045,14 @@ current item's tree, in an indirect buffer."
   :type 'boolean)
 
 (defcustom org-agenda-show-outline-path t
-  "Non-nil means show outline path in echo area after line motion."
+  "Non-nil means show outline path in echo area after line motion.
+
+If set to 'title, show document title."
   :group 'org-agenda-startup
-  :type 'boolean)
+  :type '(choice
+ (const :tag "Don't show outline path in agenda view." nil)
+ (const :tag "Show outline path with prepended file name." t)
+ (const :tag "Show outline path with prepended document title.
Fallback to file name is no title is present." title)))
 
 (defcustom org-agenda-start-with-entry-text-mode nil
   "The initial value of entry-text-mode in a newly created agenda
window."
@@ -9354,7 +9359,7 @@ When called with a prefix argument, include all
archive files as well."
   (org-agenda-tree-to-indirect-buffer nil)
 (org-agenda-show)))
   (and org-agenda-show-outline-path
-  (org-with-point-at m (org-display-outline-path t))
+  (org-with-point-at m (org-display-outline-path org-agenda-
show-outline-path))
 
 (defun org-agenda-show-tags ()
   "Show the tags applicable to the current item."
diff --git a/lisp/org.el b/lisp/org.el
index ce4e08eab..eab3aed3c 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -8166,10 +8166,24 @@ the default is \"/\"."
(setf (substring fpath (- width 2)) "..")))
 fpath))
 
-(defun org-display-outline-path ( file current separator
just-return-string)
+(defun org-get-title-from-file (file)
+  "Collect tilte from the provided `org-mode' FILE."
+  (let (title)
+    (when file
+  (with-current-buffer
+ (get-file-buffer file)
+   (pcase (org-collect-keywords '("TITLE"))
+ (`(("TITLE" . ,val))
+  (setq title (car val)
+  title)))
+
+
+(defun org-display-outline-path ( file-or-title current
separator just-return-string)
   "Display the current outline path in the echo area.
 
-If FILE is non-nil, prepend the output with the file name.
+If FILE-OR-TITLE is 'title, prepend outline with file title.  If
+it is non-nil or title is not present in document, prepend
+outline path with the file name.
 If CURRENT is non-nil, append the current heading to the output.
 SEPARATOR is passed through to `org-format-outline-path'.  It
separates
 the different parts of the path and defaults to \"/\".
@@ -8177,6 +8191,8 @@ If JUST-RETURN-STRING is non-nil, return a
string, don't display a message."
   (interactive "P")
   (let* (case-fold-search
 (bfn (buffer-file-name (buffer-base-buffer)))
+    (title (when (and file-or-title (string= file-or-title
'title))
+ (org-get-title-from-file bfn)))
 (path (and (derived-mode-p 'org-mode) (org-get-outline-path)))
 res)
 (when current (setq path (append path
@@ -8188,7 +8204,10 @@ If JUST-RETURN-STRING is non-nil, return a
string, don't display a message."
  (org-format-outline-path
   path
   (1- (frame-width))
-  (and file bfn (concat (file-name-nondirectory bfn)
separator))
+  (and file-or-title bfn (concat (if (and (string= file-or-
title 'title) title)
+ title
+   (file-name-nondirectory
bfn))
+    separator))
   separator))
 (add-face-text-property 0 (length res)
    `(:height ,(face-attribute 'default
:height))