Function: mode-local-bind
mode-local-bind is a byte-compiled function defined in
mode-local.el.gz.
Signature
(mode-local-bind BINDINGS &optional PLIST MODE)
Documentation
Define BINDINGS in the specified environment.
BINDINGS is a list of (VARIABLE . VALUE). Optional argument PLIST is a property list each VARIABLE symbol will be set to. The following properties have special meaning:
- constant-flag if non-nil, prevent rebinding variables.
- mode-variable-flag if non-nil, define mode variables.
- override-flag if non-nil, define override functions.
The override-flag and mode-variable-flag properties are mutually
exclusive.
If optional argument MODE is non-nil, it must be a major mode symbol.
BINDINGS will be defined globally for this major mode. If MODE is
nil, BINDINGS will be defined locally in the current buffer, in
variable mode-local-symbol-table. The later should be done in MODE
hook.
Source Code
;; Defined in /usr/src/emacs/lisp/cedet/mode-local.el.gz
(defun mode-local-bind (bindings &optional plist mode)
"Define BINDINGS in the specified environment.
BINDINGS is a list of (VARIABLE . VALUE).
Optional argument PLIST is a property list each VARIABLE symbol will
be set to. The following properties have special meaning:
- `constant-flag' if non-nil, prevent rebinding variables.
- `mode-variable-flag' if non-nil, define mode variables.
- `override-flag' if non-nil, define override functions.
The `override-flag' and `mode-variable-flag' properties are mutually
exclusive.
If optional argument MODE is non-nil, it must be a major mode symbol.
BINDINGS will be defined globally for this major mode. If MODE is
nil, BINDINGS will be defined locally in the current buffer, in
variable `mode-local-symbol-table'. The later should be done in MODE
hook."
;; Check plist consistency
(and (plist-get plist 'mode-variable-flag)
(plist-get plist 'override-flag)
(error "Bindings can't be both overrides and mode variables"))
(let (table variable varname value binding)
(if mode
(progn
;; Install in given MODE symbol table. Create a new one if
;; needed.
(setq table (or (get mode 'mode-local-symbol-table)
(mode-local--new-bindings)))
(put mode 'mode-local-symbol-table table))
;; Fail if trying to bind mode variables in local context!
(if (plist-get plist 'mode-variable-flag)
(error "Mode required to bind mode variables"))
;; Install in buffer local symbol table. Create a new one if
;; needed.
(setq table (or mode-local-symbol-table
(setq mode-local-symbol-table
(mode-local--new-bindings)))))
(while bindings
(setq binding (car bindings)
bindings (cdr bindings)
varname (symbol-name (car binding))
value (cdr binding))
(if (setq variable (intern-soft varname table))
;; Binding already exists
;; Check rebind consistency
(cond
((equal (symbol-value variable) value)
;; Just ignore rebind with the same value.
)
((get variable 'constant-flag)
(error "Can't change the value of constant `%s'"
variable))
((and (get variable 'mode-variable-flag)
(plist-get plist 'override-flag))
(error "Can't rebind override `%s' as a mode variable"
variable))
((and (get variable 'override-flag)
(plist-get plist 'mode-variable-flag))
(error "Can't rebind mode variable `%s' as an override"
variable))
(t
;; Merge plist and assign new value
(setplist variable (append plist (symbol-plist variable)))
(set variable value)))
;; New binding
(setq variable (intern varname table))
;; Set new plist and assign initial value
(setplist variable plist)
(set variable value)))
;; Return the symbol table used
table))