comparison lisp/progmodes/prolog.el @ 110446:f81447dd641c

* lisp/progmodes/prolog.el (prolog-smie-forward-token) (prolog-smie-backward-token): New functions. (prolog-mode-variables): Use them to parse "!," correctly. Set up smie-blink-matching for ".". * test/indent/prolog.prolog: Use normal spacing around !.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 20 Sep 2010 16:22:16 +0200
parents f2b0181ddf31
children a9904c1962db
comparison
equal deleted inserted replaced
110445:8035d26918c9 110446:f81447dd641c
97 table)) 97 table))
98 98
99 (defvar prolog-mode-abbrev-table nil) 99 (defvar prolog-mode-abbrev-table nil)
100 (define-abbrev-table 'prolog-mode-abbrev-table ()) 100 (define-abbrev-table 'prolog-mode-abbrev-table ())
101 101
102 (defun prolog-smie-forward-token ()
103 (forward-comment (point-max))
104 (buffer-substring-no-properties
105 (point)
106 (progn (cond
107 ((looking-at "[!;]") (forward-char 1))
108 ((not (zerop (skip-chars-forward "#&*+-./:<=>?@\\^`~"))))
109 ((not (zerop (skip-syntax-forward "w_'"))))
110 ;; In case of non-ASCII punctuation.
111 ((not (zerop (skip-syntax-forward ".")))))
112 (point))))
113
114 (defun prolog-smie-backward-token ()
115 (forward-comment (- (point-max)))
116 (buffer-substring-no-properties
117 (point)
118 (progn (cond
119 ((memq (char-before) '(?! ?\;)) (forward-char -1))
120 ((not (zerop (skip-chars-backward "#&*+-./:<=>?@\\^`~"))))
121 ((not (zerop (skip-syntax-backward "w_'"))))
122 ;; In case of non-ASCII punctuation.
123 ((not (zerop (skip-syntax-backward ".")))))
124 (point))))
125
102 (defconst prolog-smie-op-levels 126 (defconst prolog-smie-op-levels
103 ;; Rather than construct the operator levels table from the BNF, 127 ;; Rather than construct the operator levels table from the BNF,
104 ;; we directly provide the operator precedences from GNU Prolog's 128 ;; we directly provide the operator precedences from GNU Prolog's
105 ;; manual. The only problem is that GNU Prolog's manual uses 129 ;; manual (7.14.10 op/3). The only problem is that GNU Prolog's
106 ;; precedence levels in the opposite sense (higher numbers bind less 130 ;; manual uses precedence levels in the opposite sense (higher
107 ;; tightly) than SMIE, so we use negative numbers. 131 ;; numbers bind less tightly) than SMIE, so we use negative numbers.
108 '(("." -10000 -10000) 132 '(("." -10000 -10000)
109 (":-" -1200 -1200) 133 (":-" -1200 -1200)
110 ("-->" -1200 -1200) 134 ("-->" -1200 -1200)
111 (";" -1100 -1100) 135 (";" -1100 -1100)
112 ("->" -1050 -1050) 136 ("->" -1050 -1050)
160 (make-local-variable 'paragraph-ignore-fill-prefix) 184 (make-local-variable 'paragraph-ignore-fill-prefix)
161 (setq paragraph-ignore-fill-prefix t) 185 (setq paragraph-ignore-fill-prefix t)
162 (make-local-variable 'imenu-generic-expression) 186 (make-local-variable 'imenu-generic-expression)
163 (setq imenu-generic-expression '((nil "^\\sw+" 0))) 187 (setq imenu-generic-expression '((nil "^\\sw+" 0)))
164 (smie-setup prolog-smie-op-levels prolog-smie-indent-rules) 188 (smie-setup prolog-smie-op-levels prolog-smie-indent-rules)
189 (set (make-local-variable 'smie-forward-token-function)
190 #'prolog-smie-forward-token)
191 (set (make-local-variable 'smie-backward-token-function)
192 #'prolog-smie-backward-token)
165 (set (make-local-variable 'forward-sexp-function) 193 (set (make-local-variable 'forward-sexp-function)
166 'smie-forward-sexp-command) 194 'smie-forward-sexp-command)
167 (set (make-local-variable 'smie-indent-basic) prolog-indent-width) 195 (set (make-local-variable 'smie-indent-basic) prolog-indent-width)
196 (set (make-local-variable 'smie-blink-matching-triggers) '(?.))
197 (set (make-local-variable 'smie-closer-alist) '((t . ".")))
198 (add-hook 'post-self-insert-hook #'smie-blink-matching-open 'append 'local)
199 ;; There's no real closer in Prolog anyway.
200 (set (make-local-variable 'smie-blink-matching-inners) t)
168 (make-local-variable 'comment-start) 201 (make-local-variable 'comment-start)
169 (setq comment-start "%") 202 (setq comment-start "%")
170 (make-local-variable 'comment-start-skip) 203 (make-local-variable 'comment-start-skip)
171 (setq comment-start-skip "\\(?:%+\\|/\\*+\\)[ \t]*") 204 (setq comment-start-skip "\\(?:%+\\|/\\*+\\)[ \t]*")
172 (make-local-variable 'comment-end-skip) 205 (make-local-variable 'comment-end-skip)