help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: replacing a function with another one


From: Michael Heerdegen
Subject: Re: replacing a function with another one
Date: Mon, 10 Mar 2014 03:18:39 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)

lee <address@hidden> 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.

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)
   (let ((hi-lock-interactive-patterns
          (append hi-lock-interactive-patterns
                  hi-lock-file-patterns))))
   (apply f args)))

> It´s somewhat frustrating when you have to figure out how things work
> and stare at error messages that make you ask what they are supposed to
> tell you --- but I´m learning :)
>
> So far, I figured out this:
>
>
> (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.

Generally, you could use directory local variables for storing your
patterns, but these would of course not be automatically updated, what
you presumably want.

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.

> And I would end up with two defadvices on the same function ... but as
> far as I understand the documentation, that should work fine.  Hm ...

Yes, that should work fine.  But you can anytime combine any number of
advices into one around advice.

Michael.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]