[Top][All Lists]

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

Re: replacing a function with another one

From: lee
Subject: Re: replacing a function with another one
Date: Mon, 10 Mar 2014 01:53:34 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)

Michael Heerdegen <address@hidden> writes:

> lee <address@hidden> writes:
>> (defadvice hi-lock-set-file-patterns (after
>> lsl-hi-lock-set-file-patterns-advice activate)
>>   (setq hi-lock-interactive-patterns (ad-get-arg 0)))
>> How would I do the same with add-advice (or whatever is appropriate)?
> (advice-add
>  'hi-lock-set-file-patterns :after
>  (lambda (patterns)
>    (setq hi-lock-interactive-patterns patterns)))
> You can also give the piece of advice a name like in defadvice:
> [...]

Thank you!  It seems rather complicated --- I´ll look into it tomorrow
and try to figure it out.

>> Suddenly finding out that what I´m trying to do doesn´t work anymore
>> won´t be so great.
> Indeed.  But if you only rely on documented behavior (docstring), the
> risk is low, since changes are backwards compatible most of the time.

/How/ the functions I´m advising do their work may change even when they
still do the same thing --- like a variable or an argument I´m using
might change or no longer be available ...

>> One change I´m thinking about is keeping the highlighting-patterns in a
>> separate buffer and applying them to several buffers.  That way, you can
>> have several files that all use the same highlighting-patterns which
>> were generated on the fly, centralised for the whole project (or some
>> files of it).  That´ll probably require quite a few modifications.
> Don't hesitate to ask when you've questions, but I think you're on a
> good way.

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)

(defun my-test ()
  (ad-activate 'hi-lock-set-file-patterns)
      (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.

Or is this the way to go (letting aside the two obvious glitches)?

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 ...

Knowledge is volatile and fluid.  Software is power.

reply via email to

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