unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Can F90-mode blink at an "else"?
@ 2005-12-02 16:41 Svend Tollak Munkejord
  2005-12-06  1:34 ` Glenn Morris
  0 siblings, 1 reply; 4+ messages in thread
From: Svend Tollak Munkejord @ 2005-12-02 16:41 UTC (permalink / raw)


Hi,

I use GNU Emacs 21.2 for editing Fortran 77 and 90 programs.

With fortran-mode (for F77), when I use (setq fortran-blink-matching-if t),
Emacs shows the matching "if" when I hit TAB on the "else" like below:

if () then
...
else ! <-- cursor here
...
end if

In F90-mode, when I use (setq f90-smart-end 'blink), Emacs only
indicates the matching if when the cursor is at the "end if", but not
when it is at the "else". 

Does anybody know how I can make Emacs always show me the matching if?

Regards,
-- 
Svend Tollak Munkejord 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Can F90-mode blink at an "else"?
  2005-12-02 16:41 Can F90-mode blink at an "else"? Svend Tollak Munkejord
@ 2005-12-06  1:34 ` Glenn Morris
  2005-12-06  7:58   ` Svend Tollak Munkejord
  2005-12-11  3:37   ` Glenn Morris
  0 siblings, 2 replies; 4+ messages in thread
From: Glenn Morris @ 2005-12-06  1:34 UTC (permalink / raw)


Svend Tollak Munkejord wrote:

> In F90-mode, when I use (setq f90-smart-end 'blink), Emacs only
> indicates the matching if when the cursor is at the "end if", but not
> when it is at the "else". 
>
> Does anybody know how I can make Emacs always show me the matching if?

Sorry, I don't think there is any simple way to do this without
re-writing parts of the f90-indent-line and f90-match-end functions.
I'll try to add it as a feature for some future version.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Can F90-mode blink at an "else"?
  2005-12-06  1:34 ` Glenn Morris
@ 2005-12-06  7:58   ` Svend Tollak Munkejord
  2005-12-11  3:37   ` Glenn Morris
  1 sibling, 0 replies; 4+ messages in thread
From: Svend Tollak Munkejord @ 2005-12-06  7:58 UTC (permalink / raw)


On 2005-12-06, Glenn Morris <gmorris+news@ast.cam.ac.uk> wrote:

> Svend Tollak Munkejord wrote:
>
>> In F90-mode, when I use (setq f90-smart-end 'blink), Emacs only
>> indicates the matching if when the cursor is at the "end if", but not
>> when it is at the "else". 
>>
>> Does anybody know how I can make Emacs always show me the matching if?
>
> Sorry, I don't think there is any simple way to do this without
> re-writing parts of the f90-indent-line and f90-match-end functions.
> I'll try to add it as a feature for some future version.

OK, that would be nice!

-- 
Svend Tollak Munkejord 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Can F90-mode blink at an "else"?
  2005-12-06  1:34 ` Glenn Morris
  2005-12-06  7:58   ` Svend Tollak Munkejord
@ 2005-12-11  3:37   ` Glenn Morris
  1 sibling, 0 replies; 4+ messages in thread
From: Glenn Morris @ 2005-12-11  3:37 UTC (permalink / raw)


Glenn Morris wrote:

> Svend Tollak Munkejord wrote:
>
>> In F90-mode, when I use (setq f90-smart-end 'blink), Emacs only
>> indicates the matching if when the cursor is at the "end if", but not
>> when it is at the "else". 
>>
>> Does anybody know how I can make Emacs always show me the matching if?
>
> Sorry, I don't think there is any simple way to do this without
> re-writing parts of the f90-indent-line and f90-match-end functions.
> I'll try to add it as a feature for some future version.


Here's a briefly tested patch against the current CVS.


*** f90.el	04 Dec 2005 22:56:07 -0800	1.88
--- f90.el	10 Dec 2005 19:33:07 -0800	
***************
*** 991,996 ****
--- 991,1006 ----
  			  "?\\([ \t]+\\(\\sw+\\)\\)?\\>"))
        (list (match-string 1) (match-string 3))))
  
+ (defsubst f90-looking-at-else-like ()
+   "Return KIND if an ELSE or CASE statement starts after point.
+ Returns \"selectcase\", \"elseif\", \"elsewhere\", \"else\", or nil."
+   (when (looking-at f90-else-like-re)
+     (cond ((looking-at "case[ \t]*\\(default\\|\(\\)")
+            "selectcase")
+           ((or (looking-at "else[ \t]*\\(if\\)\\>")
+                (looking-at "else\\(where\\)?\\>"))
+            (concat "else" (match-string 1))))))
+ 
  (defsubst f90-comment-indent ()
    "Return the indentation to be used for a comment starting at point.
  Used for `comment-indent-function' by F90 mode.
***************
*** 1430,1436 ****
        (skip-chars-forward " \t"))
      (if (looking-at "!")
  	(setq indent (f90-comment-indent))
!       (and f90-smart-end (looking-at "end")
             (f90-match-end))
        (setq indent (f90-calculate-indent)))
      (or (= indent (current-column))
--- 1440,1446 ----
        (skip-chars-forward " \t"))
      (if (looking-at "!")
  	(setq indent (f90-comment-indent))
!       (and f90-smart-end (looking-at (concat "end\\|" f90-else-like-re))
             (f90-match-end))
        (setq indent (f90-calculate-indent)))
      (or (= indent (current-column))
***************
*** 1719,1724 ****
--- 1729,1757 ----
               (replace-match ""))))
      (or (looking-at "[ \t]*!") (delete-horizontal-space))))
  
+ (defun f90-else-like-match (beg-block else-block)
+   "Match else-struct with beg-struct and complete else-struct if possible.
+ BEG-BLOCK is the type of block as indicated at the start (e.g., if).
+ ELSE-BLOCK is the type of block as indicated at the else (may be nil)."
+   (if (not (member beg-block '("if" "where" "select")))
+       (if beg-block
+           (message "`%s' block cannot have an ELSE/CASE." beg-block)
+         (message "No beginning for ELSE/CASE."))
+     (let ((else-type (cond
+                       ((string-equal else-block "selectcase") "select")
+                       ((string-match "else\\(if\\|where\\)" else-block)
+                        (match-string 1 else-block)))))
+       (unless (f90-equal-symbols beg-block else-type)
+         (if (or else-type
+                 (f90-equal-symbols beg-block "select"))
+             (progn
+               (message "%s does not match %s." else-block beg-block)
+               (end-of-line))
+           (cond ((string-equal beg-block "where")
+                  (message "Inserting %s." beg-block)
+                  (search-forward "else" (line-end-position))
+                  (insert beg-block))))))))
+ 
  (defun f90-match-end ()
    "From an end block statement, find the corresponding block and name."
    (interactive)
***************
*** 1726,1736 ****
          (top-of-window (window-start))
  	(end-point (point))
          (case-fold-search t)
! 	matching-beg beg-name end-name beg-block end-block end-struct)
      (when (save-excursion (beginning-of-line) (skip-chars-forward " \t0-9")
!                           (setq end-struct (f90-looking-at-program-block-end)))
!       (setq end-block (car end-struct)
!             end-name  (car (cdr end-struct)))
        (save-excursion
          (beginning-of-line)
          (while (and (> count 0)
--- 1759,1769 ----
          (top-of-window (window-start))
  	(end-point (point))
          (case-fold-search t)
! 	matching-beg beg-name beg-block end-struct else-struct)
      (when (save-excursion (beginning-of-line) (skip-chars-forward " \t0-9")
!                           (or (setq end-struct
!                                     (f90-looking-at-program-block-end))
!                               (setq else-struct (f90-looking-at-else-like))))
        (save-excursion
          (beginning-of-line)
          (while (and (> count 0)
***************
*** 1773,1779 ****
                  beg-name (car (cdr matching-beg)))
            (goto-char end-point)
            (beginning-of-line)
!           (f90-block-match beg-block beg-name end-block end-name))))))
  
  (defun f90-insert-end ()
    "Insert a complete end statement matching beginning of present block."
--- 1806,1815 ----
                  beg-name (car (cdr matching-beg)))
            (goto-char end-point)
            (beginning-of-line)
!           (if else-struct
!               (f90-else-like-match beg-block else-struct)
!             (f90-block-match beg-block beg-name
!                              (car end-struct) (cadr end-struct))))))))
  
  (defun f90-insert-end ()
    "Insert a complete end statement matching beginning of present block."

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-12-11  3:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-02 16:41 Can F90-mode blink at an "else"? Svend Tollak Munkejord
2005-12-06  1:34 ` Glenn Morris
2005-12-06  7:58   ` Svend Tollak Munkejord
2005-12-11  3:37   ` Glenn Morris

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).