Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Nicolas Goaziou writes: > Hello, > > stardiviner writes: > >> Because the variable `org-src-source-file' is a bridge to pass info >> between two buffers "source buffer" and source block opened "dedicated >> buffer". So this variable must be global. Otherwise the "dedicated >> buffer" can't read it. > > The variable is set in the "dedicated buffer", and is local to it. OTOH, > the source buffer doesn't need to read it, ever. > > I committed a change in "master" branch. Could you tell me if it fixes > your issue? > > Regards, I tested, confirm that it works. -- [ stardiviner ] I try to make every word tell the meaning what I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Hello, stardiviner writes: > Because the variable `org-src-source-file' is a bridge to pass info > between two buffers "source buffer" and source block opened "dedicated > buffer". So this variable must be global. Otherwise the "dedicated > buffer" can't read it. The variable is set in the "dedicated buffer", and is local to it. OTOH, the source buffer doesn't need to read it, ever. I committed a change in "master" branch. Could you tell me if it fixes your issue? Regards, -- Nicolas Goaziou
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Nicolas Goaziou writes: >> --- >> lisp/org-src.el | 9 - >> lisp/org.el | 9 ++--- >> 2 files changed, 14 insertions(+), 4 deletions(-) >> >> diff --git a/lisp/org-src.el b/lisp/org-src.el >> index 42e1225ed..0426ff96a 100644 >> --- a/lisp/org-src.el >> +++ b/lisp/org-src.el > > Why not using `defvar-local' instead? Also, since it is meant to be used > in other libraries, it should be `org-src-source-file'. Because the variable `org-src-source-file' is a bridge to pass info between two buffers "source buffer" and source block opened "dedicated buffer". So this variable must be global. Otherwise the "dedicated buffer" can't read it. > >> + (lang-f (progn >> + (setq-local org-src--source-file (buffer-file-name)) >> + (and (eq type 'src-block) (org-src--get-lang-mode lang > > I don't think this is the right place to set `org-src--source-file': it > is unrelated to LANG-F. > I tried this: #+begin_src diff @@ -1000,9 +1000,11 @@ name of the sub-editing buffer." (let* ((lang (if (eq type 'src-block) (org-element-property :language element) "example")) - (lang-f (progn -(setq-local org-src--source-file (buffer-file-name)) -(and (eq type 'src-block) (org-src--get-lang-mode lang + (lang-f (and (eq type 'src-block) (org-src--get-lang-mode lang))) + (org-src-source-file (buffer-file-name)) + (initialize (lambda () +(setq org-src-source-file (buffer-file-name)) +(funcall lang-f))) (babel-info (and (eq type 'src-block) (org-babel-get-src-block-info 'light))) deactivate-mark) #+end_src Put it into initialize function. This is the best way I can come up with. > Also, the value comes from the source buffer, but the variable needs to > be set in the edit buffer. AFAIU, here you set it in the source buffer, > not in the edit buffer. > >> + (insert (format coderef-format label)) >> + (setq link (format "file:%s::%s" >> + org-src--source-file >> + (concat "(" label ")"))) > > Should we check if `org-src-source-file' is the same as the current > file, and offer a simplified link in this case? Don't know which part you mean, I just insert the source file path into the link. About the final link is modified by bellowing `org-link-file-path-type' variable. > >> (setq desc nil))) >> (t (setq link nil) >> >> @@ -9852,6 +9853,8 @@ Use TAB to complete link prefixes, then RET for >> type-specific completion support >> (setq path (expand-file-name path))) >> ((eq org-link-file-path-type 'relative) >> (setq path (file-relative-name path))) >> + ((eq org-link-file-path-type 'adaptive) >> +(setq path (file-relative-name path))) >> (t >> (save-match-data >>(if (string-match (concat "^" (regexp-quote > > Would you writing a few tests? > > Thank you. > > Regards, -- [ stardiviner ] I try to make every word tell the meaning what I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Hello, stardiviner writes: > I regenerated the patch. Thank you. Some more comments. > * org-src.el (org-src-source-file): Add a variable to get the file path >at the beginning of the function `org-src--edit-element'. > * org.el (org-insert-link): support option org-link-file-path-type > 'adaptive value. > --- > lisp/org-src.el | 9 - > lisp/org.el | 9 ++--- > 2 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/lisp/org-src.el b/lisp/org-src.el > index 42e1225ed..0426ff96a 100644 > --- a/lisp/org-src.el > +++ b/lisp/org-src.el > @@ -277,6 +277,11 @@ issued in the language major mode buffer." >"Type of element being edited, as a symbol.") > (put 'org-src--source-type 'permanent-local t) > > +(defvar org-src--source-file nil > + "A variable used to store the source file path before entering > + source block dedicated buffer.") > +(put 'org-src--source-file 'permanent-local t) The first sentence of a docstring needs to be one or more complete sentences. Why not using `defvar-local' instead? Also, since it is meant to be used in other libraries, it should be `org-src-source-file'. > +(lang-f (progn > + (setq-local org-src--source-file (buffer-file-name)) > + (and (eq type 'src-block) (org-src--get-lang-mode lang I don't think this is the right place to set `org-src--source-file': it is unrelated to LANG-F. Also, the value comes from the source buffer, but the variable needs to be set in the edit buffer. AFAIU, here you set it in the source buffer, not in the edit buffer. > +(insert (format coderef-format label)) > +(setq link (format "file:%s::%s" > + org-src--source-file > + (concat "(" label ")"))) Should we check if `org-src-source-file' is the same as the current file, and offer a simplified link in this case? > (setq desc nil))) > (t (setq link nil) > > @@ -9852,6 +9853,8 @@ Use TAB to complete link prefixes, then RET for > type-specific completion support > (setq path (expand-file-name path))) > ((eq org-link-file-path-type 'relative) > (setq path (file-relative-name path))) > +((eq org-link-file-path-type 'adaptive) > + (setq path (file-relative-name path))) > (t > (save-match-data > (if (string-match (concat "^" (regexp-quote Would you writing a few tests? Thank you. Regards, -- Nicolas Goaziou
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Hi, Nicolas, just a remind that have you reviewed my patch? Is it what you said in `INITIALIZE` argument? Is it fine to merge? -- [ stardiviner ] I try to make every word tell the meaning what I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Nicolas Goaziou writes: > Hello, > > stardiviner writes: > >> Thanks for this hint, I added a new entry in org-src--babel-info list to >> pass the original parent file path. > > Thank you. Some comments follow. > >> - (language body arguments switches name start coderef)" >> + (language body arguments switches name start coderef parent-file-path)" > > This is not needed. It would be better to create a new variable, e.g. > `org-src-source-file', get the file name at the beginning of the > function `org-src--edit-element', and set it from its INITIALIZE > argument. > >> + (insert (format coderef-format label)) >> + (setq link (format "file:%s::%s" >> + (car (last org-src--babel-info)) >> + (concat "(" label ")"))) > > You can get the file name by reading `org-src-source-file' value. > > Does that make sense? > > Could you also provide some tests? > > Regards, I regenerated the patch. >From da491e12fcbf75d9b016f58fbcdeb74d601a1b91 Mon Sep 17 00:00:00 2001 From: stardiviner Date: Wed, 24 Oct 2018 10:45:40 +0800 Subject: [PATCH] org.el: fix org-coderef does not support adaptive file path link type. * org-src.el (org-src-source-file): Add a variable to get the file path at the beginning of the function `org-src--edit-element'. * org.el (org-insert-link): support option org-link-file-path-type 'adaptive value. --- lisp/org-src.el | 9 - lisp/org.el | 9 ++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lisp/org-src.el b/lisp/org-src.el index 42e1225ed..0426ff96a 100644 --- a/lisp/org-src.el +++ b/lisp/org-src.el @@ -277,6 +277,11 @@ issued in the language major mode buffer." "Type of element being edited, as a symbol.") (put 'org-src--source-type 'permanent-local t) +(defvar org-src--source-file nil + "A variable used to store the source file path before entering + source block dedicated buffer.") +(put 'org-src--source-file 'permanent-local t) + (defvar-local org-src--tab-width nil "Contains `tab-width' value from Org source buffer. However, if `indent-tabs-mode' is nil in that buffer, its value @@ -995,7 +1000,9 @@ name of the sub-editing buffer." (let* ((lang (if (eq type 'src-block) (org-element-property :language element) "example")) - (lang-f (and (eq type 'src-block) (org-src--get-lang-mode lang))) + (lang-f (progn + (setq-local org-src--source-file (buffer-file-name)) + (and (eq type 'src-block) (org-src--get-lang-mode lang (babel-info (and (eq type 'src-block) (org-babel-get-src-block-info 'light))) deactivate-mark) diff --git a/lisp/org.el b/lisp/org.el index 0b5e8d739..ab86345bf 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9249,13 +9249,14 @@ non-nil." (interactive? (let ((label (read-string "Code line label: "))) (end-of-line) - (setq link (format coderef-format label)) (let ((gc (- 79 (length link (if (< (current-column) gc) (org-move-to-column gc t) (insert " "))) - (insert link) - (setq link (concat "(" label ")")) + (insert (format coderef-format label)) + (setq link (format "file:%s::%s" + org-src--source-file + (concat "(" label ")"))) (setq desc nil))) (t (setq link nil) @@ -9852,6 +9853,8 @@ Use TAB to complete link prefixes, then RET for type-specific completion support (setq path (expand-file-name path))) ((eq org-link-file-path-type 'relative) (setq path (file-relative-name path))) + ((eq org-link-file-path-type 'adaptive) + (setq path (file-relative-name path))) (t (save-match-data (if (string-match (concat "^" (regexp-quote -- 2.19.1 -- [ stardiviner ] I try to make every word tell the meaning what I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Hello, stardiviner writes: > Thanks for this hint, I added a new entry in org-src--babel-info list to > pass the original parent file path. Thank you. Some comments follow. > - (language body arguments switches name start coderef)" > + (language body arguments switches name start coderef parent-file-path)" This is not needed. It would be better to create a new variable, e.g. `org-src-source-file', get the file name at the beginning of the function `org-src--edit-element', and set it from its INITIALIZE argument. > +(insert (format coderef-format label)) > +(setq link (format "file:%s::%s" > + (car (last org-src--babel-info)) > + (concat "(" label ")"))) You can get the file name by reading `org-src-source-file' value. Does that make sense? Could you also provide some tests? Regards, -- Nicolas Goaziou
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Nicolas Goaziou writes: >> ;; I tried to add this, but failed. because `coderef` is executed in >> `org-edit-src-code` which invokes `org-src--edit-element`, it create a >> dedicated buffer which does not have `buffer-file-name`. I don't know how to >> archive what I want now. >> ;; ((eq org-link-file-path-type 'adaptive) > > In "org-src.el", we create local variables to store information from > original buffer. See, e.g., `org-src--src-type' or `org-src--tab-width'. > Anyway, see my first question. Thanks for this hint, I added a new entry in org-src--babel-info list to pass the original parent file path. >From 6e8469545185a41d22b8046ebb367c3c742f0ff4 Mon Sep 17 00:00:00 2001 From: stardiviner Date: Wed, 24 Oct 2018 10:45:40 +0800 Subject: [PATCH] org.el: fix org-coderef does not support adaptive file path link type. * org.el (org-insert-link): support option org-link-file-path-type 'adaptive value. * ob-core.el (org-babel-get-src-block-info): add an new entry into src block info list to pass parent file path. --- lisp/ob-core.el | 5 +++-- lisp/org.el | 9 ++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lisp/ob-core.el b/lisp/ob-core.el index 42360d618..73117f1a7 100644 --- a/lisp/ob-core.el +++ b/lisp/ob-core.el @@ -578,7 +578,7 @@ object instead. Return nil if point is not on a source block. Otherwise, return a list with the following pattern: - (language body arguments switches name start coderef)" + (language body arguments switches name start coderef parent-file-path)" (let* ((datum (or datum (org-element-context))) (type (org-element-type datum)) (inline (eq type 'inline-src-block))) @@ -609,7 +609,8 @@ a list with the following pattern: name (org-element-property (if inline :begin :post-affiliated) datum) - (and (not inline) (org-src-coderef-format datum) + (and (not inline) (org-src-coderef-format datum)) + buffer-file-name))) (unless light (setf (nth 2 info) (org-babel-process-params (nth 2 info (setf (nth 2 info) (org-babel-generate-file-param name (nth 2 info))) diff --git a/lisp/org.el b/lisp/org.el index 0b5e8d739..37524bce0 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9249,13 +9249,14 @@ non-nil." (interactive? (let ((label (read-string "Code line label: "))) (end-of-line) - (setq link (format coderef-format label)) (let ((gc (- 79 (length link (if (< (current-column) gc) (org-move-to-column gc t) (insert " "))) - (insert link) - (setq link (concat "(" label ")")) + (insert (format coderef-format label)) + (setq link (format "file:%s::%s" + (car (last org-src--babel-info)) + (concat "(" label ")"))) (setq desc nil))) (t (setq link nil) @@ -9852,6 +9853,8 @@ Use TAB to complete link prefixes, then RET for type-specific completion support (setq path (expand-file-name path))) ((eq org-link-file-path-type 'relative) (setq path (file-relative-name path))) + ((eq org-link-file-path-type 'adaptive) + (setq path (file-relative-name path))) (t (save-match-data (if (string-match (concat "^" (regexp-quote -- 2.19.1 -- [ stardiviner ] I try to make every word tell the meaning what I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Hello, stardiviner writes: > I take a look at the org.el code of functions `org-store-link`, > `org-insert-link`, they can't inherit the original buffer file name > `buffer-file-name`. Why can't they? > So can't use `org-link-file-path-type 'adaptive` case. But I found > `org-insert-link` function definition has this snippet of code: [...] > ;; I tried to add this, but failed. because `coderef` is executed in > `org-edit-src-code` which invokes `org-src--edit-element`, it create a > dedicated buffer which does not have `buffer-file-name`. I don't know how to > archive what I want now. > ;; ((eq org-link-file-path-type 'adaptive) In "org-src.el", we create local variables to store information from original buffer. See, e.g., `org-src--src-type' or `org-src--tab-width'. Anyway, see my first question. Regards, -- Nicolas Goaziou0x80A93738
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Nicolas Goaziou writes: > Hello, > > stardiviner writes: > >> `org-insert-link` should be smart on decide whether current buffer is the >> same buffer with `org-store-link` source buffer, if yes, use [[(set the temp >> buffer to unibyte)]]. If no, use: >> >> [[file:~/Org/elquery.org::(set%20the%20temp%20buffer%20to%20unibyte)][(set >> the temp buffer to unibyte)]] >> >> WDYT? > > It sounds like a good idea. Do you want to implement it? > > Regards, I take a look at the org.el code of functions `org-store-link`, `org-insert-link`, they can't inherit the original buffer file name `buffer-file-name`. So can't use `org-link-file-path-type 'adaptive` case. But I found `org-insert-link` function definition has this snippet of code: ``` (defun org-insert-link ... ... (cond ((or (eq org-link-file-path-type 'absolute) (equal complete-file '(16))) (setq path (abbreviate-file-name (expand-file-name path ((eq org-link-file-path-type 'noabbrev) (setq path (expand-file-name path))) ((eq org-link-file-path-type 'relative) (setq path (file-relative-name path))) ;; I tried to add this, but failed. because `coderef` is executed in `org-edit-src-code` which invokes `org-src--edit-element`, it create a dedicated buffer which does not have `buffer-file-name`. I don't know how to archive what I want now. ;; ((eq org-link-file-path-type 'adaptive) ;; (setq path (file-relative-name path))) (t (save-match-data (if (string-match (concat "^" (regexp-quote (expand-file-name (file-name-as-directory default-directory (expand-file-name path)) ;; We are linking a file with relative path name. (setq path (substring (expand-file-name path) (match-end 0))) (setq path (abbreviate-file-name (expand-file-name path))) . ``` I don't know which function should I change to let `org-insert-link` and `org-store-link` can inherit the original buffer filename info. Because 'adaptive org-link-file-path-type need compare two pathes like this: ``` (let ((coderef-path PATH) ; TODO: (org-unbracket-string "<" ">" ( (org-link-prettify (first (reverse org-stored-links) (same-directory? (not (string= (expand-file-name default-directory) (expand-file-name (file-name-directory (or coderef-path ""))) (if (and default-directory same-directory?) (if (eq org-link-file-path-type 'adaptive) (format "[[file:%s::%s][%s]]" (file-relative-name (expand-file-name (or coderef-path "") default-directory) (file-name-directory buffer-file-name)) label ; (format coderef-format label) label ; (format coderef-format label) ) (expand-file-name coderef-path default-directory ``` This is a snippet of code I adapted from my original commit: "49a8de4ffd2d0fc50c975ff3edac15d2bb37a809" Can you help me on this? Thanks :) :) -- [ stardiviner ] don't need to convince with trends. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
I just toke a look at the source code of `org-store-link'. I think it's possible to implement it. I will take a try. Might need to add support in `org-open-at-point` [C-c C-o]. Nicolas Goaziou writes: > Hello, > > stardiviner writes: > >> `org-insert-link` should be smart on decide whether current buffer is the >> same buffer with `org-store-link` source buffer, if yes, use [[(set the temp >> buffer to unibyte)]]. If no, use: >> >> [[file:~/Org/elquery.org::(set%20the%20temp%20buffer%20to%20unibyte)][(set >> the temp buffer to unibyte)]] >> >> WDYT? > > It sounds like a good idea. Do you want to implement it? > > Regards, -- [ stardiviner ] don't need to convince with trends. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
Re: [O] coderef does not provide file path for org-insert-link when not in original buffre
Hello, stardiviner writes: > `org-insert-link` should be smart on decide whether current buffer is the > same buffer with `org-store-link` source buffer, if yes, use [[(set the temp > buffer to unibyte)]]. If no, use: > > [[file:~/Org/elquery.org::(set%20the%20temp%20buffer%20to%20unibyte)][(set > the temp buffer to unibyte)]] > > WDYT? It sounds like a good idea. Do you want to implement it? Regards, -- Nicolas Goaziou
[O] coderef does not provide file path for org-insert-link when not in original buffre
Suppose I have a src block: #+begin_src emacs-lisp (let ((case-fold-search nil) (str (prin1-to-string (with-temp-buffer (set-buffer-multibyte nil) ; (ref:set the temp buffer to unibyte) (insert (with-current-buffer (url-retrieve-synchronously "https://nginx.org/en/docs/dirindex.html;) (buffer-string))) (let ((tree (libxml-parse-html-region (point-min) (point-max tree) (and (string-match "\"content" str) (match-string 0 str))) ;=> "\"content" #+end_src On the `(set-buffer-multibyte nil)` line, then I use `org-store-link` to add coderef link. It insert [[(set the temp buffer to unibyte)]] for current buffer. But when in other file buffer, it still is this link. It suppose contains file path like: [[file:~/Org/elquery.org::(set%20the%20temp%20buffer%20to%20unibyte)][(set the temp buffer to unibyte)]] `org-insert-link` should be smart on decide whether current buffer is the same buffer with `org-store-link` source buffer, if yes, use [[(set the temp buffer to unibyte)]]. If no, use: [[file:~/Org/elquery.org::(set%20the%20temp%20buffer%20to%20unibyte)][(set the temp buffer to unibyte)]] WDYT? -- [ stardiviner ] don't need to convince with trends. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3