all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: michael@cadilhac.name (Michaël Cadilhac)
To: emacs-devel@gnu.org
Subject: Re: Indentation in the METAPOST mode.
Date: Thu, 09 Aug 2007 15:22:31 +0200	[thread overview]
Message-ID: <87hcn87sh4.fsf@lrde.org> (raw)
In-Reply-To: 87y7gl7c94.fsf@lrde.org


[-- Attachment #1.1.1: Type: text/plain, Size: 1186 bytes --]

michael@cadilhac.name (Michaël Cadilhac) writes:

> Hi guys, long time no see !
>
> Indentation in the METAPOST mode has, IMO, two major flaws :
>
> 1. A bug. If the buffer starts with beginfig, the contents of the figure
> is not properly indented (it stays on the first column).
>
> 2. When wrapping an expression on several lines, the indentation is the
> same for each line, this is bad style : I'd prefer
>
> beginfig(1)
>   draw (0,0)--(1,2)--(10,3)--
>     (0,1)--(10,3);
>   draw (2,2);
> endfig
>
> I propose the following patch which considers that keywords like
> beginfig does not need ending semicolon (it's /quite/ the case).
>
> Tell me if it's worth installing it.

Please consider this extended version. It uses a complete other way to
deal with the indentation which suffers from less flaws. It still has
the following, however, with grouping :

  draw begingraph(3cm,2cm)
      setrange(whatever, 0, whatever, whatever);
    gdraw "data1";
    other-instruction;
  endgraph;

This is not that bad however. I've tested it with the 305 examples of
http://tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html
with great result.


[-- Attachment #1.1.2: meta-mode.patch --]
[-- Type: text/x-patch, Size: 10227 bytes --]

Index: lisp/progmodes/meta-mode.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/progmodes/meta-mode.el,v
retrieving revision 1.19
diff -c -r1.19 meta-mode.el
*** lisp/progmodes/meta-mode.el	26 Jul 2007 05:27:28 -0000	1.19
--- lisp/progmodes/meta-mode.el	9 Aug 2007 13:13:31 -0000
***************
*** 605,618 ****
  
  (defun meta-indent-calculate ()
    "Return the indentation of current line of Metafont or MetaPost source."
    (save-excursion
      (back-to-indentation)
      (cond
!       ;; Comments to the left margin.
       ((and meta-left-comment-regexp
             (looking-at meta-left-comment-regexp))
        0)
!       ;; Comments to the right margin.
       ((and meta-right-comment-regexp
             (looking-at meta-right-comment-regexp))
        comment-column)
--- 605,620 ----
  
  (defun meta-indent-calculate ()
    "Return the indentation of current line of Metafont or MetaPost source."
+   ;; Indentation within strings is not considered as Meta* don't allow multi
+   ;; line strings.
    (save-excursion
      (back-to-indentation)
      (cond
!      ;; Comments to the left margin.
       ((and meta-left-comment-regexp
             (looking-at meta-left-comment-regexp))
        0)
!      ;; Comments to the right margin.
       ((and meta-right-comment-regexp
             (looking-at meta-right-comment-regexp))
        comment-column)
***************
*** 620,661 ****
       ((and meta-ignore-comment-regexp
             (looking-at meta-ignore-comment-regexp))
        (current-indentation))
       ;; Backindent at end of environments.
!      ((looking-at
         (concat "\\<" meta-end-environment-regexp "\\>"))
!       (- (meta-indent-calculate-last) meta-indent-level))
       ;; Backindent at keywords within environments.
!      ((looking-at
         (concat "\\<" meta-within-environment-regexp "\\>"))
!       (- (meta-indent-calculate-last) meta-indent-level))
!      (t (meta-indent-calculate-last)))))
  
! (defun meta-indent-calculate-last ()
!   "Return the indentation of previous line of Metafont or MetaPost source."
!   (save-restriction
!     (widen)
      (skip-chars-backward "\n\t ")
!     (move-to-column (current-indentation))
!     ;; Ignore comments.
!     (while (and (looking-at comment-start) (not (bobp)))
!       (skip-chars-backward "\n\t ")
!       (if (not (bobp))
!           (move-to-column (current-indentation))))
!     (cond
!      ((bobp) 0)
!      (t (+ (current-indentation)
!            (meta-indent-level-count)
!            (cond
!             ;; Compensate for backindent at end of environments.
!             ((looking-at
!               (concat "\\<"meta-end-environment-regexp "\\>"))
!              meta-indent-level)
!             ;; Compensate for backindent within environments.
!             ((looking-at
!               (concat "\\<" meta-within-environment-regexp "\\>"))
!              meta-indent-level)
!             (t 0)))))
!     ))
  
  (defun meta-indent-level-count ()
    "Count indentation change for begin-end commands in the current line."
--- 622,734 ----
       ((and meta-ignore-comment-regexp
             (looking-at meta-ignore-comment-regexp))
        (current-indentation))
+      ;; Beginning of buffer.
+      ((eq (point-at-bol) (point-min))
+       0)
       ;; Backindent at end of environments.
!      ((meta-indent-looking-at-code
         (concat "\\<" meta-end-environment-regexp "\\>"))
!       (- (meta-indent-current-indentation) meta-indent-level))
       ;; Backindent at keywords within environments.
!      ((meta-indent-looking-at-code
         (concat "\\<" meta-within-environment-regexp "\\>"))
!       (- (meta-indent-current-indentation) meta-indent-level))
!      (t (meta-indent-current-indentation)))))
  
! (defun meta-indent-in-string-p ()
!   "Tell if the point is in a string."
!   (or (nth 3 (syntax-ppss))
!       (eq (get-text-property (point) 'face) font-lock-string-face)))
! 
! (defun meta-indent-looking-at-code (regexp)
!   "Same as `looking-at' but checks that the point is not in a string."
!   (unless (meta-indent-in-string-p)
!     (looking-at regexp)))
! 
! (defun meta-indent-previous-line ()
!   "Go to the previous line of code, skipping comments."
!   (skip-chars-backward "\n\t ")
!   (move-to-column (current-indentation))
!   ;; Ignore comments.
!   (while (and (looking-at comment-start) (not (bobp)))
      (skip-chars-backward "\n\t ")
!     (if (not (bobp))
! 	(move-to-column (current-indentation)))))
! 
! (defun meta-indent-unfinished-line ()
!   "Tell if the current line of code ends with an unfinished expression."
!   (save-excursion
!     (end-of-line)
!     ;; Skip backward the comments.
!     (while (search-backward comment-start (point-at-bol) t))
!     ;; Search for the end of the previous expression.
!     (if (search-backward ";" (point-at-bol) t)
! 	(progn (while (and (meta-indent-in-string-p)
! 			   (search-backward ";" (point-at-bol) t)))
! 	       (if (= (char-after) ?\;)
! 		   (forward-char)
! 		 (beginning-of-line)))
!       (beginning-of-line))
!     ;; See if the last statement of the line is environment-related,
!     ;; or exists at all.
!     (if (meta-indent-looking-at-code
! 	 (concat "[ \t]*\\($\\|" (regexp-quote comment-start)
! 		 "\\|\\<" meta-end-environment-regexp "\\>"
! 		 "\\|\\<" meta-begin-environment-regexp "\\>"
! 		 "\\|\\<" meta-within-environment-regexp "\\>\\)"))
! 	nil
!       t)))
! 
! (defun meta-indent-current-indentation ()
!   "Return the indentation wanted for the current line of code."
!   (+ (meta-indent-current-nesting)
!      (if (save-excursion
! 	   (back-to-indentation)
! 	   (and (not (looking-at (concat "\\<" meta-end-environment-regexp "\\>"
! 					 "\\|\\<" meta-within-environment-regexp "\\>")))
! 		(progn (meta-indent-previous-line)
! 		       (meta-indent-unfinished-line))))
! 	 meta-indent-level
!        0)))
! 
! (defun meta-indent-current-nesting ()
!   "Return the indentation according to the nearest environment keyword."
!   (save-excursion
!     (save-restriction
!       (widen)
!       (back-to-indentation)
!       (let ((to-add 0))
! 	;; If we found some environment marker backward...
! 	(if (catch 'found
! 	      (while (re-search-backward
! 		      (concat "(\\|)\\|\\<" meta-end-environment-regexp "\\>"
! 			      "\\|\\<" meta-begin-environment-regexp "\\>"
! 			      "\\|\\<" meta-within-environment-regexp "\\>")
! 		      nil t)
! 		;; If we aren't in a string or in a comment, we've found something.
! 		(unless (or (meta-indent-in-string-p)
! 			    (nth 4 (syntax-ppss)))
! 		  (cond ((= (char-after) ?\()
! 			 (setq to-add (+ to-add meta-indent-level)))
! 			((= (char-after) ?\))
! 			 (setq to-add (- to-add meta-indent-level)))
! 			(t (throw 'found t))))))
! 	    (progn
! 	      ;; ... then use it to compute the current indentation.
! 	      (back-to-indentation)
! 	      (+ to-add (current-indentation) (meta-indent-level-count)
! 		 ;; Compensate for backindent of end and within keywords.
! 		 (if (meta-indent-looking-at-code
! 		      (concat "\\<" meta-end-environment-regexp "\\>\\|"
! 			      "\\<" meta-within-environment-regexp "\\>"))
! 		     meta-indent-level
! 		   ;; Compensate for unfinished line.
! 		   (if (save-excursion
! 			 (meta-indent-previous-line)
! 			 (meta-indent-unfinished-line))
! 		       (- meta-indent-level)
! 		     0))))
! 	  0)))))
  
  (defun meta-indent-level-count ()
    "Count indentation change for begin-end commands in the current line."
***************
*** 671,688 ****
              (goto-char (match-beginning 0))
              (cond
               ;; Count number of begin-end keywords within line.
!              ((looking-at
                 (concat "\\<" meta-begin-environment-regexp "\\>"))
                (setq count (+ count meta-indent-level)))
!              ((looking-at
                 (concat "\\<" meta-end-environment-regexp "\\>"))
!               (setq count (- count meta-indent-level)))
!              ;; Count number of open-close parentheses within line.
!              ((looking-at "(")
!               (setq count (+ count meta-indent-level)))
!              ((looking-at ")")
!               (setq count (- count meta-indent-level)))
!              )))
          count))))
  
  
--- 744,755 ----
              (goto-char (match-beginning 0))
              (cond
               ;; Count number of begin-end keywords within line.
!              ((meta-indent-looking-at-code
                 (concat "\\<" meta-begin-environment-regexp "\\>"))
                (setq count (+ count meta-indent-level)))
!              ((meta-indent-looking-at-code
                 (concat "\\<" meta-end-environment-regexp "\\>"))
!               (setq count (- count meta-indent-level))))))
          count))))
  
  
Index: lisp/ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.11534
diff -C 0 -r1.11534 ChangeLog
*** lisp/ChangeLog	8 Aug 2007 16:38:31 -0000	1.11534
--- lisp/ChangeLog	9 Aug 2007 13:13:46 -0000
***************
*** 0 ****
--- 1,18 ----
+ 2007-08-09  Michaël Cadilhac  <michael@cadilhac.name>
+ 
+ 	* progmodes/meta-mode.el (meta-indent-calculate-last): Remove.
+ 	(meta-indent-current-nesting): Use a computation of the nesting
+ 	instead.
+ 	(meta-indent-current-indentation): Indentation is given according
+ 	to nesting and if the previous line was finished or not.
+ 	(meta-indent-unfinished-line): Tell if the current line ends with
+ 	a finished expression.
+ 	(meta-indent-looking-at-code): Like `looking-at', but checks if
+ 	the point is a string before.
+ 	(meta-indent-level-count): Use it.  Don't count parenthesis as it's
+ 	done in the nesting function.
+ 	(meta-indent-in-string-p): Tell if the current point is in a
+ 	string.
+ 	(meta-indent-calculate): Treat b-o-b as a special case.  Use the
+ 	previous functions
+ 

[-- Attachment #1.1.3: Type: text/plain, Size: 327 bytes --]


-- 
 |   Michaël `Micha' Cadilhac       |    The second-degree,                  |
 |   http://michael.cadilhac.name   |       is kind of                       |
 |   JID/MSN:                       |   the semantic back slang.             |
 `----  michael.cadilhac@gmail.com  |                                   -  --'

[-- Attachment #1.2: Type: application/pgp-signature, Size: 188 bytes --]

[-- Attachment #2: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  parent reply	other threads:[~2007-08-09 13:22 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-09  1:00 Indentation in the METAPOST mode Michaël Cadilhac
2007-08-09  7:05 ` Leo
2007-08-09  9:50 ` Michaël Cadilhac
2007-08-09 13:22 ` Michaël Cadilhac [this message]
2007-08-09 23:11 ` Richard Stallman
2007-09-10 12:49   ` Leo
2007-09-10 17:11   ` Leo
2007-09-10 17:31     ` Michaël Cadilhac
2007-09-10 17:39       ` Leo

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=87hcn87sh4.fsf@lrde.org \
    --to=michael@cadilhac.name \
    --cc=emacs-devel@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.