1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Some generic support for multi-mode indentation.

* lisp/progmodes/prog-mode.el (prog-indentation-context): New
	variable.
	(prog-first-column, prog-widen): New convenience functions.
This commit is contained in:
Christoph Wedler 2015-06-14 14:47:16 +00:00
parent 57e7666477
commit 52da972751
2 changed files with 73 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2015-06-14 Christoph Wedler <christoph.wedler@sap.com>
Some generic support for multi-mode indentation.
* lisp/progmodes/prog-mode.el (prog-indentation-context): New
variable.
(prog-first-column, prog-widen): New convenience functions.
2015-06-13 Glenn Morris <rgm@gnu.org>
Tweaks for getting repository version; a bit more like it was for bzr.

View file

@ -48,6 +48,51 @@
map)
"Keymap used for programming modes.")
(defvar prog-indentation-context nil
"Non-nil while indenting embedded code chunks.
There are languages where part of the code is actually written in
a sub language, e.g., a Yacc/Bison or ANTLR grammar also consists
of plain C code. This variable enables the major mode of the
main language to use the indentation engine of the sub mode for
lines in code chunks written in the sub language.
When a major mode of such a main language decides to delegate the
indentation of a line/region to the indentation engine of the sub
mode, it is supposed to bind this variable to non-nil around the call.
The non-nil value looks as follows
\(FIRST-COLUMN (START . END) PREVIOUS-CHUNKS)
FIRST-COLUMN is the column the indentation engine of the sub mode
should usually choose for top-level language constructs inside
the code chunk (instead of 0).
START to END is the region of the code chunk. See function
`prog-widen' for additional info.
PREVIOUS-CHUNKS, if non-nil, provides the indentation engine of
the sub mode with the virtual context of the code chunk. Valid
values are:
- A string containing code which the indentation engine can
consider as standing in front of the code chunk. To cache the
string's calculated syntactic information for repeated calls
with the same string, it is valid and expected for the inner
mode to add text-properties to the string.
A typical use case is for grammars with code chunks which are
to be indented like function bodies - the string would contain
a corresponding function header.
- A function called with the start position of the current
chunk. It will return either the region of the previous chunk
as \(PREV-START . PREV-END) or nil if there is no further
previous chunk.
A typical use case are literate programming sources - the
function would successively return the code chunks of the
previous macro definitions for the same name.")
(defun prog-indent-sexp (&optional defun)
"Indent the expression after point.
When interactively called with prefix, indent the enclosing defun
@ -61,6 +106,27 @@ instead."
(end (progn (forward-sexp 1) (point))))
(indent-region start end nil))))
(defun prog-first-column ()
"Return the indentation column normally used for top-level constructs."
(or (car prog-indentation-context) 0))
(defun prog-widen ()
"Remove restrictions (narrowing) from current code chunk or buffer.
This function can be used instead of `widen' in any function used
by the indentation engine to make it respect the value
`prog-indentation-context'.
This function (like 'widen') is useful inside a
`save-restriction' to make the indentation correctly work when
narrowing is in effect."
(let ((chunk (cadr prog-indentation-context)))
(if chunk
;; no widen necessary here, as narrow-to-region changes (not
;; just narrows) existing restrictions
(narrow-to-region (car chunk) (or (cdr chunk) (point-max)))
(widen))))
(defvar-local prettify-symbols-alist nil
"Alist of symbol prettifications.
Each element looks like (SYMBOL . CHARACTER), where the symbol