Klaus,

Thanks for your enhancements. I am a beginner lisp programmer
(which may have been revealed by my long winded coding style and indentation
and incomplete knowledge of what is already available in base emacs
packages).


Where I want to take this idea is to:

1. Run a background compilation (during idle times) using JDEE compilation
server. A similar behavior could be hooked up to the compilation finish hook.

2. Indicate the error messages using an underline (or user customizable) face
(say!) over the extent of the buffer text causing the error.

(unfortunately not all compilers give the column or column range where
the error is).

3. User can get details of the error message with mouse-over or
some key combination (I need to check if 'help-echo text property
will work for that).

4. Provide a popup menu of possible actions user could take to
correct the error e.g.

        i. importing a type
        ii. inserting a parenthesis or a semicolon etc.

        (This is to take care of quickly fixing the errors which most modern
        compilers diagnose very well).

I will keep working at it...no promises though as to when I will be able to
have something working...

-sandip


> -----Original Message-----
> From: Klaus Berndl [mailto:[EMAIL PROTECTED] 
> Sent: Monday, February 24, 2003 2:34 AM
> To: [EMAIL PROTECTED]
> Subject: Re: Syntax error indication oon the fly....the beginning...
> 
> 
> 
> Hi Sandip,
> 
> a really nifty idea which could be enhanced with a general 
> package - i have written long time before - to highlight not 
> only the current error in the compilation-buffer (like the 
> standard compile.el package does) but also the related 
> code-line in the source-buffer.
> 
> Your nifty idea (but somehow long winded code) could be 
> written much smaller if using in combination with my package 
> - see below.
> 
> First here comes a rewritten version of your function:
> 
> ,----
> | (defun animate-compilation-messages1 ()
> |   (interactive)
> |   (if compilation-last-buffer
> |       (let ((number-of-errors (length (save-excursion
> |                                         (set-buffer 
> compilation-last-buffer)
> |                                         compilation-error-list))))
> |     (dotimes (i number-of-errors)
> |           (next-error)
> |           (sit-for 3))
> |         (message "Done"))))
> `----
> 
> This displays the error-message not in the echo-area but 
> walks through the compilation-buffer itself. But maybe this 
> should be made customizable because displaying the 
> error-message in the minibuffer or as tool-tip can make sense 
> if the compilation-window has been deleted to get more space 
> for the source-buffer?! So the code could first check if the 
> compilation-window is visible.... 
> 
> Anyway, here comes the code which enables highlighting 
> (customizable! See option compilation-highlight-source a.o.) 
> both error-message and related
> code-line:
> 
> ,----
> | ;; enhancement of next-error: with this advice it highlights the 
> | error-line in ;; the sourcebuffer. (defvar 
> compilation-source-overlay 
> | (make-overlay 1 1)
> |   "Internal overlay used for the source-line in the source-buffer")
> | 
> | (defcustom compilation-highlight-source 
> '(secondary-selection . any-command)
> |   "*If not nil then highlight the source-line in the source-buffer. 
> | Then you must define the face for the source-line and when the 
> | unhighlighting of the source-line should be done. The value 
> is either 
> | nil or a cons where the car is the face for the source-line and the 
> | cdr is one of the following symbols:
> | - any-command: Any command will unhighlight the source-line 
> \(default)
> | - window: Any command that scrolls the source-line outside 
> the visible
> |   portion of the buffer will unhighlight it
> | - line: Any command that moves point out of the source-line 
> | unhighlights it.
> | - after-change: The first buffer-change will unhighlight 
> the source-line."
> |   :group 'compilation
> |   :set '(lambda (symbol value)
> |           (set symbol value)
> |           (if (and (consp value) (or (featurep 'xemacs)
> |                                      (facep (car value))))
> |               (overlay-put compilation-source-overlay 'face 
> (car value))))
> |   :type '(radio (const :tag "No highlighting of 
> source-line" :value nil)
> |                 (cons :tag "Highlight source-line"
> |                       (face :tag "Face for the highligthing")
> |                       (radio :tag "Unhighlight source-line"
> |                              (const :tag "After any command"
> |                                     :value any-command)
> |                              (const :tag "After scrolling 
> out of the window"
> |                                     :value window)
> |                              (const :tag "After moving 
> point out of the source-line"
> |                                     :value line)
> |                              (const :tag "After first 
> change in the buffer"
> |                                     :value after-change)))))
> | 
> | (defvar compilation-error-overlay (make-overlay 1 1)
> |   "Internal overlay used for the error-line in the 
> | compilation-buffer")
> | 
> | (defcustom compilation-highlight-error 'secondary-selection
> |   "*If not nil and a face then highlight the error-line in the 
> | compilation-buffer with this face."
> |   :group 'compilation
> |   :set '(lambda (symbol value)
> |           (set symbol value)
> |           (if (and value (or (featurep 'xemacs)
> |                              (facep value)))
> |               (overlay-put compilation-error-overlay 'face value)))
> |   :type '(radio (const :tag "No highlighting of error-line" 
> :value nil)
> |                 (face :tag "Face for the error-line")))
> | 
> | (defvar compilation-highlight-error-activated nil
> |   "If non-nil then the adviced version of `compilation-goto-locus' 
> | highlights the ERROR and SOURCE lines, depending on 
> | `compilation-highlight-error' and `compilation-highlight-source', 
> | respectively. This is not an user-option but it should only be set 
> | temporally \(with `let') to non-nil to activate this 
> mechanism during 
> | evaluation of a function or expression. The adviced version of 
> | `next-error' does this for example.")
> | 
> | ;; for Emacs < 20 and XEmacs
> | (if (not (fboundp 'line-beginning-position))
> |     (defun line-beginning-position ()
> |       (if (featurep 'xemacs)
> |           (point-at-bol)
> |         (save-excursion 
> |           (beginning-of-line)) (point))))
> | 
> | (if (not (fboundp 'line-end-position))
> |     (defun line-end-position ()
> |       (if (featurep 'xemacs)
> |           (point-at-eol)
> |         (save-excursion 
> |           (end-of-line)) (point))))
> | 
> | 
> | (defadvice compilation-goto-locus (after highlight activate compile)
> |   "If `compilation-highlight-error' is non-nil, highlight the ERROR 
> | line. If `compilation-highlight-source' is non-nil, highlight the 
> | SOURCE line. \(This is only effective when 
> | `compilation-highlight-error-activated' is non-nil, as when 
> `next-error's highlight advice binds it.)"
> |   (if compilation-highlight-error-activated
> |       (let ((error-marker (car (ad-get-arg 0))) ; (car NEXT-ERROR)
> |             (source-marker (cdr (ad-get-arg 0)))) ; (cdr NEXT-ERROR)
> |         (when compilation-highlight-error
> |           (save-excursion
> |             (set-buffer (marker-buffer error-marker))
> |             (goto-char (marker-position error-marker))
> |             (move-overlay compilation-error-overlay
> |                           (line-beginning-position)
> |                           (line-end-position)
> |                           (current-buffer))))
> |         (when compilation-highlight-source
> |           (save-excursion
> |             (set-buffer (marker-buffer source-marker))
> |             (goto-char (marker-position source-marker))
> |             (move-overlay compilation-source-overlay
> |                           (line-beginning-position)
> |                           (line-end-position)
> |                           (current-buffer)))
> |           (if (equal (cdr compilation-highlight-source) 
> 'after-change)
> |               (progn
> |                 ;; because this is an after advice, we are 
> here always in the
> |                 ;; source-buffer, so we can here make the 
> hook local.
> |                 (make-local-hook 'after-change-functions)
> |                 (add-hook 'after-change-functions
> |                           
> 'compilation-unhighlight-source-after-change nil t))
> |             (add-hook 'post-command-hook 
> | 'compilation-unhighlight-source))))))
> | 
> | (defadvice next-error(around highlight activate)
> |   "If `compilation-highlight-error' is non-nil, highlight the ERROR 
> | line. If `compilation-highlight-source' is non-nil, 
> highlight the SOURCE line."
> |   (let ((compilation-highlight-error-activated t))
> |     ad-do-it))
> | 
> | (defconst compilation-next-error-caller-list
> |   '(compile-mouse-goto-error
> |     compile-goto-error
> |     next-error
> |     previous-error
> |     first-error)
> |   "List of functions in compile.el which uses `next-error' 
> to jump to 
> | the source-line of the error")
> | 
> | (defun compilation-unhighlight-source ()
> |   "Delete `compilation-source-overlay' depending on the value of 
> | `compilation-highlight-source' \('after-change is not 
> handled here but 
> | with `compilation-unhighlight-source-after-change')."
> |   (if (and (overlay-buffer compilation-source-overlay)
> |            ;; we must not calling the following 
> unhighlighting code if the
> |            ;; last event was a mouse-movement (maybe 
> track-mouse it t) or if
> |            ;; `this-command' is one of the next-error 
> callers because then the
> |            ;; highlighting would be deleted immediatelly 
> after highlighting it
> |            ;; if `compilation-highlight-source' is 
> 'any-command or 'window
> |            (if (not (featurep 'xemacs))
> |                (not (equal (event-basic-type 
> last-command-event) 'mouse-movement))
> |              t)
> |            (not (member this-command 
> compilation-next-error-caller-list)))
> |       (let ((unhighlight (cdr compilation-highlight-source)))
> |         (when (or (not unhighlight)
> |                   (equal unhighlight 'any-command)
> |                   (and (equal unhighlight 'window)
> |                        (not (pos-visible-in-window-p (overlay-start
> |                                                       
> compilation-source-overlay)
> |                                                      
> (get-buffer-window
> |                                                       
> (overlay-buffer
> |                                                        
> compilation-source-overlay)
> |                                                       'visible))))
> |                   (and (equal unhighlight 'line)
> |                        (save-excursion
> |                          (set-buffer (overlay-buffer 
> compilation-source-overlay))
> |                          (or (< (point) (overlay-start 
> compilation-source-overlay))
> |                              (> (point) (overlay-end 
> compilation-source-overlay))))))
> |           (delete-overlay compilation-source-overlay)
> |           (remove-hook 'post-command-hook 
> | 'compilation-unhighlight-source)))))
> | 
> | (defun compilation-unhighlight-source-after-change (&rest args)
> |   "Delete `compilation-source-overlay' after a buffer change. This 
> | hook is only added to `after-change-functions' after 
> | `compilation-goto-locus' if the cdr of 
> `compilation-highlight-source' 
> | is 'after-change. This hook removes itself from 
> `after-change-functions'."
> |   (when (overlay-buffer compilation-source-overlay)
> |     (delete-overlay compilation-source-overlay)
> |     (remove-hook 'after-change-functions
> |                  'compilation-unhighlight-source-after-change t)))
> `----
> 
> Enjoy it and maybe enhance your nifty command with this...
> 
> Klaus
> 
> On Sat, 22 Feb 2003, Sandip Chitale wrote:
> 
> >  Folks,
> >   
> >      I had brought up this issue earlier...I took a first crack at  
> > it.....  It is still rough but with some expert help this could be 
> > completed...  Especially I need help with save-excursion and buffer 
> > selection etc...
> >   
> >  For now -
> >   
> >  1. Compile any java class such that it results in error 
> messages  2. 
> > Switch to the *compilation* buffer  3. Invoke the following 
> function 
> > animate-messages
> >   
> >  (defun animate-messages()
> >    "Animate messages in *compilation* buffer."
> >    (interactive)
> >    (let* (
> >    (errorMarker (compilation-next-error-locus 1 t t))
> >    (compilation-error-overlay)
> >    )
> >      (while errorMarker
> >        (let (
> >       (nextErrorMarker (compilation-next-error-locus 1 nil t))
> >       (errorBufferMarker (car errorMarker))
> >       errorString
> >       errorBegin
> >       errorEnd
> >       )
> >   (save-excursion
> >     (setq errorBegin (marker-position errorBufferMarker))
> >     (if nextErrorMarker
> >         (setq errorEnd (marker-position (car nextErrorMarker)))
> >       (setq errorEnd (point-max))
> >       )
> >     (setq errorString (buffer-substring errorBegin errorEnd))
> >     )
> >   (save-excursion
> >     (if (not (eq (current-buffer) (marker-buffer (cdr 
> errorMarker))))
> >         (switch-to-buffer (marker-buffer (cdr errorMarker)))
> >       )
> >     (goto-char (marker-position (cdr errorMarker)))
> >     (if compilation-error-overlay
> >         (move-overlay compilation-error-overlay 
> > (line-beginning-position)
> >  (line-end-position))
> >       (setq compilation-error-overlay
> >      (make-overlay (line-beginning-position) (line-end-position)))
> >       )
> >     (overlay-put compilation-error-overlay 'face 'underline)
> >     (message errorString)
> >     (sit-for 3)
> >     )
> >   (setq errorMarker (compilation-next-error-locus 1 nil t))
> >   )
> >        )
> >      (if compilation-error-overlay
> >   (delete-overlay compilation-error-overlay)
> >        )
> >      (message "Done.")
> >      )
> >    )
> >   
> >  [NOTE: The above works for grep output also.]
> >   
> >  4. This should animate the error messages i.e.
> >   
> >      i. move the point to the location of error
> >      ii. temporarily underline the line
> >      iii. echo the error message in mini-buffer
> >   
> >  What I want to do eventually is to hook this function to 
> compilation  
> > finish hook.  When there are compilation error messages the error 
> > messages are shown  in the
> >  buffer with some overlay. The help-echo text property is 
> used to show
> >  the error meesage
> >  in mini-buffer.
> >   
> >  A background compilation may be invoked every so often or 
> on demand  
> > basis...
> >   
> >  enjoy,
> >  sandip
> 
> -- 
> Klaus Berndl                  mailto: [EMAIL PROTECTED]
> sd&m AG                               http://www.sdm.de
> software design & management  
> Thomas-Dehler-Str. 27, 81737 München, Germany
> Tel +49 89 63812-392, Fax -220
> 

Reply via email to