Subject: * lisp/progmodes/prolog.el: Improve handling of if/then/else
(prolog-smie-rules): Accomodate standard if/then/else special indentation. (prolog-mode): Add . to electric-indent-chars. (prolog-electric--if-then-else): Re-indent the line before adding space after the new char (bug#21526).
This commit is contained in:
parent
dadcf33984
commit
57d48c364c
2 changed files with 54 additions and 7 deletions
|
@ -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)))
|
||||
|
||||
|
||||
;;-------------------------------------------------------------------
|
||||
|
@ -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))
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Add table
Reference in a new issue