Function: c-electric-paren

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

Signature

(c-electric-paren ARG)

Documentation

Insert a parenthesis.

If c-syntactic-indentation and c-electric-flag are both non-nil, the line is reindented unless a numeric ARG is supplied, or the parenthesis is inserted inside a literal.

Whitespace between a function name and the parenthesis may get added or removed; see the variable c-cleanup-list.

Also, if c-electric-flag and c-auto-newline are both non-nil, some newline cleanups are done if appropriate; see the variable c-cleanup-list.

Probably introduced at or before Emacs version 20.4.

Key Bindings

Source Code

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

If `c-syntactic-indentation' and `c-electric-flag' are both non-nil, the
line is reindented unless a numeric ARG is supplied, or the parenthesis
is inserted inside a literal.

Whitespace between a function name and the parenthesis may get added or
removed; see the variable `c-cleanup-list'.

Also, if `c-electric-flag' and `c-auto-newline' are both non-nil, some
newline cleanups are done if appropriate; see the variable `c-cleanup-list'."
  (interactive "*P")
  (let ((literal (c-save-buffer-state ()
		   (c-with-string-fences (c-in-literal))))
	;; shut this up
	(c-echo-syntactic-information-p nil)
	case-fold-search)
    (let (post-self-insert-hook) ; The only way to get defined functionality
					; from `self-insert-command'.
      (self-insert-command (prefix-numeric-value arg)))

    (if (and (not arg) (not literal))
	(let* (;; We want to inhibit blinking the paren since this will
	       ;; be most disruptive.  We'll blink it ourselves
	       ;; afterwards.
	       (old-blink-paren blink-paren-function)
	       blink-paren-function)
	  (c-with-string-fences
	   (if (and c-syntactic-indentation c-electric-flag)
	       (indent-according-to-mode))

	   ;; If we're at EOL, check for new-line clean-ups.
	   (when (and c-electric-flag c-auto-newline
		      (looking-at "[ \t]*\\\\?$"))

	     ;; clean up brace-elseif-brace
	     (when
		 (and (memq 'brace-elseif-brace c-cleanup-list)
		      (eq (c-last-command-char) ?\()
		      (re-search-backward
		       (concat "}"
			       "\\([ \t\n]\\|\\\\\n\\)*"
			       "else"
			       "\\([ \t\n]\\|\\\\\n\\)+"
			       "if"
			       "\\([ \t\n]\\|\\\\\n\\)*"
			       "("
			       "\\=")
		       nil t)
		      (not  (c-save-buffer-state () (c-in-literal))))
	       (delete-region (match-beginning 0) (match-end 0))
	       (insert-and-inherit "} else if ("))

	     ;; clean up brace-catch-brace
	     (when
		 (and (memq 'brace-catch-brace c-cleanup-list)
		      (eq (c-last-command-char) ?\()
		      (re-search-backward
		       (concat "}"
			       "\\([ \t\n]\\|\\\\\n\\)*"
			       "catch"
			       "\\([ \t\n]\\|\\\\\n\\)*"
			       "("
			       "\\=")
		       nil t)
		      (not  (c-save-buffer-state () (c-in-literal))))
	       (delete-region (match-beginning 0) (match-end 0))
	       (insert-and-inherit "} catch ("))))

	  ;; Apply `electric-pair-mode' stuff.
	  (when (and (boundp 'electric-pair-mode)
		     electric-pair-mode)
	    (let (post-self-insert-hook)
	      (electric-pair-post-self-insert-function)))

	  (c-with-string-fences
	   ;; Check for clean-ups at function calls.  These two DON'T need
	   ;; `c-electric-flag' or `c-syntactic-indentation' set.
	   ;; Point is currently just after the inserted paren.
	   (let (beg (end (1- (point))))
	     (cond

	      ;; space-before-funcall clean-up?
	      ((and (memq 'space-before-funcall c-cleanup-list)
		    (eq (c-last-command-char) ?\()
		    (save-excursion
		      (backward-char)
		      (skip-chars-backward " \t")
		      (setq beg (point))
		      (and (c-save-buffer-state () (c-on-identifier))
                           ;; Don't add a space into #define FOO()....
                           (not (and (c-beginning-of-macro)
                                     (c-forward-over-cpp-define-id)
                                     (eq (point) beg))))))
	       (save-excursion
		 (delete-region beg end)
		 (goto-char beg)
		 (insert ?\ )))

	      ;; compact-empty-funcall clean-up?
	      ((c-save-buffer-state ()
		 (and (memq 'compact-empty-funcall c-cleanup-list)
		      (eq (c-last-command-char) ?\))
		      (save-excursion
			(c-safe (backward-char 2))
			(when (looking-at "()")
			  (setq end (point))
			  (skip-chars-backward " \t")
			  (setq beg (point))
			  (c-on-identifier)))))
	       (delete-region beg end)))))
	  (and (eq last-input-event ?\))
	       (not executing-kbd-macro)
	       old-blink-paren
	       (funcall old-blink-paren)))

      ;; Apply `electric-pair-mode' stuff inside a string or comment.
      (when (and (boundp 'electric-pair-mode) electric-pair-mode)
	(let (post-self-insert-hook)
	  (electric-pair-post-self-insert-function)))))
  (c--call-post-self-insert-hook-more-safely))