Mercurial > emacs
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) |