Function: c-electric-lt-gt
c-electric-lt-gt is an interactive and byte-compiled function defined
in cc-cmds.el.gz.
Signature
(c-electric-lt-gt ARG)
Documentation
Insert a "<" or ">" character.
If the current language uses angle bracket parens (e.g. template arguments in C++), try to find out if the inserted character is a paren and give it paren syntax if appropriate.
If c-electric-flag and c-syntactic-indentation are both non-nil, the
line will be reindented if the inserted character is a paren or if it
finishes a C++ style stream operator in C++ mode. Exceptions are when a
numeric argument is supplied, or the point is inside a literal.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/cc-cmds.el.gz
(defun c-electric-lt-gt (arg)
"Insert a \"<\" or \">\" character.
If the current language uses angle bracket parens (e.g. template
arguments in C++), try to find out if the inserted character is a
paren and give it paren syntax if appropriate.
If `c-electric-flag' and `c-syntactic-indentation' are both non-nil, the
line will be reindented if the inserted character is a paren or if it
finishes a C++ style stream operator in C++ mode. Exceptions are when a
numeric argument is supplied, or the point is inside a literal."
(interactive "*P")
(let ((literal (c-save-buffer-state () (c-in-literal)))
template-delim include-delim
(c-echo-syntactic-information-p nil)
final-pos found-delim case-fold-search)
(let (post-self-insert-hook) ; Disable random functionality.
(self-insert-command (prefix-numeric-value arg)))
(setq final-pos (point))
;;;; 2010-01-31: There used to be code here to put a syntax-table text
;;;; property on the new < or > and its mate (if any) when they are template
;;;; parens. This is now done in an after-change function.
(when (and (not arg) (not literal))
;; Have we got a delimiter on a #include directive?
(beginning-of-line)
(setq include-delim
(and
(looking-at c-cpp-include-key)
(if (eq (c-last-command-char) ?<)
(eq (match-end 0) (1- final-pos))
(goto-char (1- final-pos))
(skip-chars-backward "^<>" (c-point 'bol))
(eq (char-before) ?<))))
(goto-char final-pos)
;; Indent the line if appropriate.
(when (and c-electric-flag c-syntactic-indentation c-recognize-<>-arglists)
(setq found-delim
(if (eq (c-last-command-char) ?<)
;; If a <, basically see if it's got "template" before it .....
(or (and (progn
(backward-char)
(= (point)
(progn (c-beginning-of-current-token) (point))))
(progn
(c-backward-token-2)
(looking-at c-opt-<>-sexp-key))
(setq template-delim t))
;; ..... or is a C++ << operator.
(and (c-major-mode-is 'c++-mode)
(progn
(goto-char (1- final-pos))
(c-beginning-of-current-token)
(looking-at "<<"))
(>= (match-end 0) final-pos)))
;; It's a >. Either a template/generic terminator ...
(or (and (c-get-char-property (1- final-pos) 'syntax-table)
(setq template-delim t))
;; or a C++ >> operator.
(and (c-major-mode-is 'c++-mode)
(progn
(goto-char (1- final-pos))
(c-beginning-of-current-token)
(looking-at ">>"))
(>= (match-end 0) final-pos)))))
(goto-char final-pos)
(when found-delim
(indent-according-to-mode)))
;; On the off chance that < and > are configured as pairs in
;; electric-pair-mode.
(when (and (boundp 'electric-pair-mode) electric-pair-mode
(or template-delim include-delim))
(let (post-self-insert-hook)
(electric-pair-post-self-insert-function))))
(when found-delim
(when (and (eq (char-before) ?>)
(not executing-kbd-macro)
blink-paren-function)
;; From now (2016-01-01), the syntax-table text properties on < and >
;; are applied in an after-change function, not during redisplay. Hence
;; we no longer need to call (sit-for 0) for blink paren to work.
(funcall blink-paren-function))))
(c--call-post-self-insert-hook-more-safely))