Marcin Borkowski <mb...@wmi.amu.edu.pl> writes: > On 2014-10-15, at 23:52, Nicolas Goaziou wrote: > >> Marcin Borkowski <mb...@wmi.amu.edu.pl> writes: >> >>> I have one more question. What I'm about to do is (basically) put >>> "file:some-file-name::" in front of the link, without changing the >>> description. I could use `org-element-put-property' and (AFAIU) >>> org-element-link-interpreter to put it into the buffer (and probably >>> delete the old one). It would be much easier (and maybe faster) just to >>> go to the point in the buffer where the link starts, go `(forward-char >>> 2)' (past the brackets) and `(insert (concat "file" name "::"))'. >>> >>> But, is it safe? Wouldn't it break something? And is it considered a >>> good practice? >> >> There are caveats. >> >> For example, as soon as you alter the buffer, your AST becomes invalid >> (buffer positions are all wrong after the insertion). If you want to >> process all the links from the same AST, you can, for example, maintain >> a counter for characters inserted so far that will fix buffer positions, >> or first get all internal links with `org-element-map', then process >> them in reverse order so buffer modifications do not invalidate them. > > OK, so what is the canonical way of doing this? I don't want to use > org-dp, since it is another dependency.
It is a problem to add dependencies to libraries the user must install himself, and at the same time its a pity that there is so much duplication instead of reuse ... However, here is a org-dp solution, use 't' instead of 'prepend to replace the links, and whatever you want instead of "file+emacs" as replacement. Of course one could easily re-search and replace "[[file:" in this simple case, but this uses the parser and allows doing more complex stuff in a clean way too: ,---- | * ORG SCRATCH | | ** Level 2 | | [[file+emacs:~/junk/org/minimal.org][min.org]] | | [[file:~/junk/org/minimal.org][min.org]] | | *** Level 3 | | [[file+emacs:~/junk/org/trash-me.org][trash.org]] | | [[file:~/junk/org/trash-me.org][trash.org]] | | | #+BEGIN_SRC emacs-lisp :results none | (require 'org-dp) | (org-dp-map | '(org-dp-rewire | 'paragraph | (lambda (cont elem) | (let* ((link (car cont)) | (raw-val (org-element-property :raw-link link)) | (new-val (mapconcat 'identity | (cons "file+emacs" | (cdr | (split-string | raw-val ":" t))) | ":"))) | (org-element-put-property link :raw-link new-val))) | 'prepend) | org-link-re-with-space t) | #+END_SRC `---- -- cheers, Thorsten