From: lee <lee@yun.yagibdah.de>
To: help-gnu-emacs@gnu.org
Subject: Re: replacing a function with another one
Date: Mon, 10 Mar 2014 16:29:41 +0100 [thread overview]
Message-ID: <87pplugjh6.fsf@yun.yagibdah.de> (raw)
In-Reply-To: <87wqg2u77k.fsf@web.de> (Michael Heerdegen's message of "Mon, 10 Mar 2014 03:18:39 +0100")
Michael Heerdegen <michael_heerdegen@web.de> writes:
> lee <lee@yun.yagibdah.de> writes:
>
>> Thank you! It seems rather complicated --- I´ll look into it tomorrow
>> and try to figure it out.
>
> Actually, it's only abstract, but quite simple.
Too abstract, maybe: I understand by removing abstractions and don´t
know how else I could understand something. I can only do it the other
way round, i. e. understand something first and then come up with
abstractions. That´s a barrier which has its merits.
> About the original question you raised (not forgetting patterns), would
> something like this do what you want:
>
> (advice-add
> 'hi-lock-write-interactive-patterns :around
> ;; also include `hi-lock-file-patterns'
> (lambda (f &rest args)
What does (f &rest args) do or mean?
> (let ((hi-lock-interactive-patterns
> (append hi-lock-interactive-patterns
> hi-lock-file-patterns))))
So this makes one list from both variables (lists) and assigns it to one
of them. Then, I suppose, the intention is to have
hi-lock-write-interactive-patterns write them --- i. e. combine both
lists just before writing them and otherwise keep them separate. This
would be better than my approach because it avoids duplication.
I´ll have to try that out.
> (apply f args)))
f args?
hi-lock-write-interactive-patterns doesn´t have any arguments.
>> (defvar patterns-other-buffer nil)
>> (defvar original-buffer nil)
>>
>> (defadvice hi-lock-set-file-patterns (after my-test-obtain-patterns)
>> (setq patterns-other-buffer (ad-get-arg 0))
>> (ad-deactivate 'hi-lock-set-file-patterns)
>> (pop-to-buffer original-buffer)
>> (hi-lock-set-file-patterns patterns-other-buffer))
>>
>> (defadvice hi-lock-find-patterns (before hi-lock-find-other-patterns activate)
>> (my-test))
>>
>> (defun my-test ()
>> (interactive)
>> (ad-activate 'hi-lock-set-file-patterns)
>> (save-excursion
>> (save-restriction
>> (widen)
>> (goto-char (point-min))
>> (when (re-search-forward "^// ext-fontify-defs: " nil t)
>> (message "found marker")
>> (let ((filename (thing-at-point 'filename)))
>> (message "filename at %d: %s/%s for buffer %s" (point) filename (thing-at-point 'filename) (buffer-name original-buffer))
>> (when filename
>> (when (file-exists-p filename)
>> (setq original-buffer (current-buffer))
>> (find-file filename)
>> (set-auto-mode-0 'hi-lock-mode t))))))))
>>
>>
>> This actually works, i. e. it lets me save hi-lock-mode
>> highlighting-patterns to an arbitrary file and put a line like "//
>> ext-fontify-defs: name-of-file-with-patterns" into the file to load the
>> highlighting-patterns from the file the name of which is specified in
>> that line. The patterns are then applied.
>>
>> But I don´t like this. It´s a really terrible hack.
>
> I'm not sure I completely understand what you are trying to do.
I´m trying to make an extension to hi-lock-mode.
The mode keeps the highlighting-patterns in the same buffer as the text
that is being highlighted. Instead, I want to be able to keep the
highlighting-patterns in a separate file. From the buffer that has the
text which is to be highlighted, I want to refer to this separate file
so that the highlighting-patterns kept in the separate file are used to
highlight the text in the buffer.
Think of it as a form of '#include "highlighting.patterns"'.
To achieve this, I´m inserting my own function before
hi-lock-find-patterns. My own function searches for the equivalent of
the '#include "highlighting.patterns"' statement. When it finds one, it
visits[1] the specified file (like "highlighting.patterns"). That puts
this file into the current buffer.
Since hi-lock-find-patterns reads the highlighting-patterns from the
current buffer, it now reads them from the file I have included rather
than from the original buffer. And hi-lock-find-patterns calls
hi-lock-set-file-patterns, giving the patterns as an argument to it so
that hi-lock-set-file-patterns can apply the highlighting to the current
buffer.
At that point, the current buffer is the included file and not the
original buffer I want the highlighting-patterns applied to. Therefore,
I need to get a copy of the patterns, switch back to the original buffer
and apply the patterns from my copy. To get a copy of the patterns and
to apply them to the original buffer, I use hi-lock-set-file-patterns:
So I first advise hi-lock-set-file-patterns to get a copy of the
patterns. Then I disable the advice, switch to the original buffer and
run the non-advised version of hi-lock-set-file-patterns again to
finally apply my copy of the patterns to the buffer I want them applied
to.
It´s self-modifying code, a creative (ab)use of defadvice.
I think it´s an awkward way to do this and a terrible hack: I´m cheating
an "unexpected" buffer underneath hi-lock-find-patterns to read
"unexpected" patterns. This isn´t necessarily too bad, but much worse,
I´m bending hi-lock-set-file-patterns in a weird way.
> Generally, you could use directory local variables for storing your
> patterns, but these would of course not be automatically updated, what
> you presumably want.
Hmm ... First I should make the variables I´m using to remember what
was the original buffer and to have a copy of the patterns local. Then
I should somehow follow your approach to avoid duplication of the
patterns.
Another step is to modify things so that when adding a new pattern, the
new pattern is added to the included file rather than to the original
file. Avoiding the duplication might make this easier.
> Nitpick: instead of activating and deactivating pieces of advice, define
> a variable and use it as a flag. The flag says whether the advice
> should kick in. In the advice's body, look at the variable and decide
> what to do.
That´s a good idea. I don´t need to bend hi-lock-set-file-patterns so
much when I use a variable. And I can probably use add-advice because I
don´t need to disable the advice anymore.
[1]: Another question:
To get patterns from a separate file, I´m using find-file. This is
probably not very efficient: I suspect that the file is actually loaded
every time, with all what that implies. So when I have X files that
want to read highlighting-patterns from the same file, that same file is
loaded and processed X times.
It would be more efficient to load and to process the file only once. I
don´t know how to go about that, though. Is there a function that tells
me for a given file which buffer is visiting it? I could write one that
goes through the buffer list and returns the buffer visiting the file,
but maybe there is something better for this.
As to processing the file only once, I´d have to somehow check whether
the currently available copy of patterns is from the file that is to be
included. If it is, just apply the copy, if not, read the file.
But then, suppose I have X files each of which include patterns-A and
patterns-B: This caching strategy would fail, and patterns-A and
patterns-B would be processed X times.
Can I somehow have a (global) "collection" of included files and their
patterns? In that case, once patterns-A has been processed, the
patterns would be available and could be applied to any file which
includes patterns-A, no matter in which order the pattern-files are
included.
--
Knowledge is volatile and fluid. Software is power.
next prev parent reply other threads:[~2014-03-10 15:29 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-08 19:43 replacing a function with another one lee
2014-03-08 19:54 ` Eli Zaretskii
2014-03-09 1:17 ` lee
2014-03-08 22:30 ` Michael Heerdegen
2014-03-09 17:58 ` lee
2014-03-09 19:10 ` Michael Heerdegen
2014-03-09 20:57 ` lee
2014-03-09 22:02 ` Michael Heerdegen
2014-03-10 0:53 ` lee
2014-03-10 2:18 ` Michael Heerdegen
2014-03-10 15:29 ` lee [this message]
2014-03-11 0:03 ` Michael Heerdegen
2014-03-11 13:34 ` lee
2014-03-11 23:40 ` Michael Heerdegen
2014-03-12 6:11 ` Michael Heerdegen
2014-03-12 7:07 ` Michael Heerdegen
2014-03-12 14:48 ` lee
2014-03-13 7:19 ` Michael Heerdegen
2014-03-15 19:51 ` lee
2014-03-17 12:00 ` Michael Heerdegen
2014-03-12 14:04 ` lee
2014-03-12 18:26 ` Stefan Monnier
2014-03-12 4:10 ` Michael Heerdegen
2014-03-10 12:44 ` Stefan Monnier
2014-03-10 23:35 ` lee
2014-03-11 0:41 ` Michael Heerdegen
2014-03-11 1:45 ` Michael Heerdegen
2014-03-11 19:05 ` lee
2014-03-11 22:58 ` Michael Heerdegen
2014-03-12 15:11 ` lee
2014-03-12 18:15 ` Stefan Monnier
2014-03-12 21:43 ` lee
2014-03-13 7:22 ` Michael Heerdegen
2014-03-15 20:02 ` lee
2014-03-11 4:11 ` lee
2014-03-11 5:01 ` Michael Heerdegen
2014-03-11 14:25 ` lee
2014-03-11 23:51 ` Michael Heerdegen
2014-03-12 15:22 ` lee
2014-03-13 7:33 ` Michael Heerdegen
2014-03-13 12:29 ` Stefan Monnier
2014-03-15 20:05 ` lee
2014-03-16 17:20 ` Stefan
2014-03-11 6:51 ` Michael Heerdegen
2014-03-11 15:41 ` lee
2014-03-11 23:21 ` Michael Heerdegen
2014-03-12 17:33 ` lee
2014-03-12 19:34 ` Florian Beck
2014-03-12 19:51 ` Florian Beck
2014-03-13 7:54 ` Michael Heerdegen
2014-03-15 20:14 ` lee
2014-03-12 12:45 ` Stefan Monnier
2014-03-12 17:42 ` lee
2014-03-13 2:43 ` Jambunathan K
2014-03-15 20:17 ` How to propose an emacs patch (Re: replacing a function with another one) lee
2014-03-16 3:21 ` Jambunathan K
2014-03-17 4:35 ` lee
2014-03-10 13:45 ` replacing a function with another one lee
2014-03-10 23:31 ` Michael Heerdegen
2014-03-12 13:16 ` Jambunathan K
2014-03-12 13:18 ` Jambunathan K
2014-03-15 20:22 ` lee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87pplugjh6.fsf@yun.yagibdah.de \
--to=lee@yun.yagibdah.de \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.