Function: c-electric-brace

c-electric-brace is an interactive and byte-compiled function defined in cc-cmds.el.gz.

Signature

(c-electric-brace ARG)

Documentation

Insert a brace.

If c-electric-flag is non-nil, the brace is not inside a literal and a numeric ARG hasn't been supplied, the command performs several electric actions:

(a) If the auto-newline feature is turned on (indicated by "/la" on
the mode line) newlines are inserted before and after the brace as directed by the settings in c-hanging-braces-alist.

(b) Any auto-newlines are indented. The original line is also
reindented unless c-syntactic-indentation is nil.

(c) If auto-newline is turned on, various newline cleanups based on the
settings of c-cleanup-list are done.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/progmodes/cc-cmds.el.gz
(defun c-electric-brace (arg)
  "Insert a brace.

If `c-electric-flag' is non-nil, the brace is not inside a literal and a
numeric ARG hasn't been supplied, the command performs several electric
actions:

\(a) If the auto-newline feature is turned on (indicated by \"/la\" on
the mode line) newlines are inserted before and after the brace as
directed by the settings in `c-hanging-braces-alist'.

\(b) Any auto-newlines are indented.  The original line is also
reindented unless `c-syntactic-indentation' is nil.

\(c) If auto-newline is turned on, various newline cleanups based on the
settings of `c-cleanup-list' are done."

  (interactive "*P")
  (let (safepos literal
		;; We want to inhibit blinking the paren since this would be
		;; most disruptive.  We'll blink it ourselves later on.
		(old-blink-paren blink-paren-function)
		blink-paren-function case-fold-search
		(at-eol (looking-at "[ \t]*\\\\?$"))
		(active-region (and (fboundp 'use-region-p) (use-region-p)))
		got-pair-} electric-pair-deletion)

    (c-with-string-fences
     (c-save-buffer-state ()
       (setq safepos (c-safe-position (point) (c-parse-state))
	     literal (c-in-literal safepos)))

     ;; Insert the brace.  Note that expand-abbrev might reindent
     ;; the line here if there's a preceding "else" or something.
     (let (post-self-insert-hook)  ; the only way to get defined functionality
					; from `self-insert-command'.
       (self-insert-command (prefix-numeric-value arg))))

    ;; Emulate `electric-pair-mode', outside of `c-with-string-fences'.
    (when (and (boundp 'electric-pair-mode)
	       electric-pair-mode)
      (let ((size (buffer-size))
	    post-self-insert-hook)
	(electric-pair-post-self-insert-function)
	(setq got-pair-} (and at-eol
			      (eq (c-last-command-char) ?{)
			      (eq (char-after) ?}))
	      electric-pair-deletion (< (buffer-size) size))))

    (c-with-string-fences
     ;; Perform any required CC Mode electric actions.
     (cond
      ((or literal arg (not c-electric-flag) active-region))
      ((not at-eol)
       (c-indent-line))
      (electric-pair-deletion
       (c-indent-line)
       (c-do-brace-electrics 'ignore nil))
      (t (c-do-brace-electrics nil nil)
	 (when got-pair-}
	   (save-excursion
	     (forward-char)
	     (c-do-brace-electrics 'assume 'ignore))
	   (c-indent-line))))

     ;; blink the paren
     (and (eq (c-last-command-char) ?\})
	  (not executing-kbd-macro)
	  old-blink-paren
	  (save-excursion
	    (c-save-buffer-state nil
	      (c-backward-syntactic-ws safepos))
	    (funcall old-blink-paren)))))
  (c--call-post-self-insert-hook-more-safely))