From: Stefan Monnier <monnier@iro.umontreal.ca>
To: Markus Triska <triska@metalevel.at>
Cc: 21526@debbugs.gnu.org
Subject: bug#21526: 24.5; prolog-mode: broken indentation for if-then-else construct
Date: Sun, 20 Sep 2015 23:03:34 -0400 [thread overview]
Message-ID: <jwvmvwgmq59.fsf-monnier+emacsbugs@gnu.org> (raw)
In-Reply-To: <m2vbb47uoj.fsf@metalevel.at> (Markus Triska's message of "Sun, 20 Sep 2015 21:33:00 +0200")
I installed the patch below which should fix many of your problems.
IIUC the only remaining issue is the indentation we get when the line is
empty.
Stefan
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index b36df21..24ac8d7 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -925,12 +925,30 @@ This is really kludgy, and unneeded (i.e. obsolete) in Emacs>=24."
(`(:after . ".") '(column . 0)) ;; To work around smie-closer-alist.
;; Allow indentation of if-then-else as:
;; ( test
- ;; -> thenrule
- ;; ; elserule
+ ;; -> thenrule
+ ;; ; elserule
;; )
(`(:before . ,(or `"->" `";"))
- (and (smie-rule-bolp) (smie-rule-parent-p "(") (smie-rule-parent 1)))
- (`(:after . ,(or `":-" `"->" `"-->")) prolog-indent-width)))
+ (and (smie-rule-bolp) (smie-rule-parent-p "(") (smie-rule-parent 0)))
+ (`(:after . ,(or `"->" `"*->"))
+ ;; We distinguish
+ ;;
+ ;; (a ->
+ ;; b;
+ ;; c)
+ ;; and
+ ;; ( a ->
+ ;; b
+ ;; ; c)
+ ;;
+ ;; based on the space between the open paren and the "a".
+ (unless (and (smie-rule-parent-p "(")
+ (save-excursion
+ (smie-indent-forward-token)
+ (smie-backward-sexp 'halfsexp)
+ (not (eq ?\( (char-before)))))
+ prolog-indent-width))
+ (`(:after . ,(or `":-" `"-->")) prolog-indent-width)))
\f
;;-------------------------------------------------------------------
@@ -1121,6 +1139,9 @@ Commands:
(dolist (ar prolog-align-rules) (add-to-list 'align-rules-list ar))
(add-hook 'post-self-insert-hook #'prolog-post-self-insert nil t)
;; `imenu' entry moved to the appropriate hook for consistency.
+ (when prolog-electric-dot-flag
+ (setq-local electric-indent-chars
+ (cons ?\. electric-indent-chars)))
;; Load SICStus debugger if suitable
(if (and (eq prolog-system 'sicstus)
@@ -2078,6 +2099,7 @@ whitespace characters, parentheses, or then/else branches."
(when prolog-electric-if-then-else-flag
(save-excursion
(let ((regexp (concat "(\\|" prolog-left-indent-regexp))
+ (pos (point))
level)
(beginning-of-line)
(skip-chars-forward " \t")
@@ -2087,6 +2109,9 @@ whitespace characters, parentheses, or then/else branches."
;; prolog-paren-indent))
;; work on all subsequent "->", "(", ";"
+ (and (looking-at regexp)
+ (= pos (match-end 0))
+ (indent-according-to-mode))
(while (looking-at regexp)
(goto-char (match-end 0))
(setq level (+ (prolog-find-unmatched-paren) prolog-paren-indent))
diff --git a/test/indent/prolog.prolog b/test/indent/prolog.prolog
index 5b5d272..ca4d2c9 100644
--- a/test/indent/prolog.prolog
+++ b/test/indent/prolog.prolog
@@ -1,5 +1,27 @@
%% -*- mode: prolog; coding: utf-8; fill-column: 78 -*-
+%% bug#21526
+test1 :-
+ ( a ->
+ b
+ ; c
+ ).
+
+test2 :-
+ ( a
+ -> b1,
+ b2
+ ; c1,
+ c2
+ )
+
+test3 :-
+ ( a,
+ b
+ ; c
+ ).
+
+
%% Testing correct tokenizing.
foo(X) :- 0'= = X.
foo(X) :- 8'234 = X.
@@ -50,9 +72,9 @@ subst(X, V, FV, lambda(Y, Ti, Bi), lambda(Y1, To, Bo)) :-
%% Perform substitution on the body.
subst(X, V, FV, Bi1, Bo)),
( X = Y
- %% If X is equal to Y, X is shadowed, so no subst can take place.
- -> Y1 = Y, Bo = Bi
- ; (member((Y, _), FV)
+ %% If X is equal to Y, X is shadowed, so no subst can take place.
+ -> Y1 = Y, Bo = Bi
+ ; (member((Y, _), FV)
%% If Y appears in FV, it can appear in V, so we need to
%% rename it to avoid name capture.
-> new_atom(Y, Y1),
next prev parent reply other threads:[~2015-09-21 3:03 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-20 13:02 bug#21526: 24.5; prolog-mode: broken indentation for if-then-else construct Markus Triska
2015-09-20 18:04 ` Stefan Monnier
2015-09-20 19:33 ` Markus Triska
2015-09-21 2:34 ` Stefan Monnier
2015-09-21 3:03 ` Stefan Monnier [this message]
2015-09-21 6:02 ` Markus Triska
2015-09-21 20:22 ` Stefan Monnier
2015-09-22 6:25 ` Markus Triska
2015-09-22 15:12 ` Stefan Monnier
2015-09-22 16:38 ` Markus Triska
2015-09-22 21:04 ` Markus Triska
2015-09-23 21:08 ` Markus Triska
2015-09-25 16:20 ` Markus Triska
2015-09-30 2:04 ` Stefan Monnier
2015-09-30 3:28 ` Stefan Monnier
2015-09-30 6:38 ` Markus Triska
2015-09-30 9:23 ` Stefan Monnier
2015-09-30 18:35 ` Markus Triska
2015-09-30 20:19 ` Stefan Monnier
2015-09-30 20:40 ` Markus Triska
2015-10-01 0:14 ` Stefan Monnier
2015-10-01 6:22 ` Markus Triska
2015-10-01 14:07 ` Stefan Monnier
2015-10-02 16:23 ` Markus Triska
2015-10-02 20:47 ` Stefan Monnier
2015-10-05 22:38 ` Markus Triska
2015-10-06 2:23 ` Stefan Monnier
2015-09-30 18:03 ` Markus Triska
2015-09-30 21:19 ` Stefan Monnier
2015-09-30 3:28 ` Stefan Monnier
2015-09-30 2:07 ` Stefan Monnier
2015-09-30 6:32 ` Markus Triska
2015-09-30 8:55 ` Stefan Monnier
2015-09-30 18:11 ` Markus Triska
2015-10-05 23:49 ` Markus Triska
2015-10-06 1:17 ` Stefan Monnier
2015-10-06 16:45 ` Markus Triska
2015-10-06 20:09 ` Stefan Monnier
2015-10-20 23:47 ` Markus Triska
2015-10-21 16:06 ` Stefan Monnier
2015-10-21 21:58 ` Markus Triska
2015-10-22 1:16 ` Stefan Monnier
2015-10-22 19:08 ` Markus Triska
2015-10-25 20:01 ` Stefan Monnier
2015-11-23 16:36 ` Stefan Monnier
2020-08-24 18:23 ` Lars Ingebrigtsen
2015-09-29 15:27 ` Stefan Monnier
2015-09-29 16:24 ` Markus Triska
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=jwvmvwgmq59.fsf-monnier+emacsbugs@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=21526@debbugs.gnu.org \
--cc=triska@metalevel.at \
/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.