[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [O] How to change a link?
From: |
Thorsten Jolitz |
Subject: |
Re: [O] How to change a link? |
Date: |
Sat, 18 Oct 2014 15:48:21 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) |
Marcin Borkowski <address@hidden> writes:
> On 2014-10-17, at 00:19, Thorsten Jolitz wrote:
>
>> 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:
>>
>> ,----
>> | #+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
>> `----
>
Hi Marcin,
> one thing I don't quite understand yet: why is the first argument to
> org-dp-rewire `'paragraph'? My intuition says it should rather be
> 'link, though this doesn't seem to work. How come that you say
> 'paragraph, but the lambda in the second parameter gets the link data in
> `cont'? (This might be a stupid question, but I really want to grok
> this.)
I was surprised too! But links are objects, and with point at a link
org-element-at-point return a paragraph with the link as content. So
to get the contents of a link, you take the contents of the contents
of a paragraph, but that a special case, because mostly you will work
directly with elements.
The 'paragraph' is the target element type. In this case I could have
written
,----
| '(org-dp-rewire nil ...)
`----
instead, since then parsed and rewired element types are the same. See
examples below of how to convert a link into a src-block or a keyword
(e.g.).
For more in depth info, have a look at:
,----[ C-h f org-dp-rewire RET ]
| org-dp-rewire is a Lisp function in `org-dp.el'.
|
| (org-dp-rewire ELEM-TYPE &optional CONTENTS REPLACE AFFILIATED ELEMENT
| &rest ARGS)
|
| Rewire element-at-point or ELEMENT (if given). [...]
`----
Example:
When you start with the file link below and eval the
following src-blocks in order, you get:
#+BEGIN_SRC picolisp
(println "Link label: min.org")
(println "Link type: file")
#+END_SRC
#+LABEL: min.org
[[file:junk/org/minimal.org][min.org]]
#+BEGIN_SRC emacs-lisp :results none
(require 'org-dp)
(org-dp-map
'(org-dp-rewire 'src-block nil 'prepend nil nil
:language "picolisp"
:value (lambda (_old_ elem)
(format
(concat
"(println \"Link label: %s\")\n"
"(println \"Link type: %s\")")
(org-dp-contents
(car (org-dp-contents elem nil t))
t t)
(org-element-property
:type (car
(org-dp-contents elem nil t))))))
org-link-re-with-space t)
#+END_SRC
#+BEGIN_SRC emacs-lisp :results none
(require 'org-dp)
(org-dp-map
'(org-dp-rewire 'keyword nil 'prepend nil nil
:key "LABEL"
:value (lambda (_old_ elem)
(org-dp-contents
(car (org-dp-contents elem nil t))
t t)))
org-link-re-with-space t)
#+END_SRC
This should give you a better idea of what the org-dp-rewire function
arguments stand for. In generel, org-dp functions have extensive
docstrings, so C-h f 'org-dp-xyz' is you friend.
For org-dp, the (few) properties that are interpreted are most
relevant, not so much the (many) properties that are parsed. See
variable `org-dp-elem-props' for an overview. In general, when
programming with org-dp, I often look into org-element.el, especially
at the interpreters.
> Second question: do I get it correctly that `org-element-put-property'
> returns the "new" version of the element (link, in this case), with
> everything as it was but the :raw-link property changed?
,----[ C-h f org-element-put-property RET ]
| org-element-put-property is a compiled Lisp function in
| `org-element.el'. [...]
| Return modified element.
`----
Yes!
--
cheers,
Thorsten
- Re: [O] How to change a link?, (continued)
- Re: [O] How to change a link?, Marcin Borkowski, 2014/10/15
- Re: [O] How to change a link?, Nicolas Goaziou, 2014/10/15
- Re: [O] How to change a link?, Marcin Borkowski, 2014/10/16
- Re: [O] How to change a link?, Nicolas Goaziou, 2014/10/16
- Re: [O] How to change a link?, Marcin Borkowski, 2014/10/16
- Re: [O] How to change a link?, Thorsten Jolitz, 2014/10/16
- Re: [O] How to change a link?, Marcin Borkowski, 2014/10/17
- Re: [O] How to change a link?, Nick Dokos, 2014/10/17
- Re: [O] How to change a link?, Thorsten Jolitz, 2014/10/18
- Re: [O] How to change a link?, Marcin Borkowski, 2014/10/17
- Re: [O] How to change a link?,
Thorsten Jolitz <=
- Re: [O] How to change a link?, Marcin Borkowski, 2014/10/19