Function: c-electric-colon

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

Signature

(c-electric-colon ARG)

Documentation

Insert a colon.

If c-electric-flag is non-nil, the colon 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 colon based on the settings in c-hanging-colons-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, whitespace between two colons will be
"cleaned up" leaving a scope operator, if this action is set in
c-cleanup-list.

Probably introduced at or before Emacs version 19.23.

Key Bindings

Source Code

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

If `c-electric-flag' is non-nil, the colon 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 colon based on
the settings in `c-hanging-colons-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, whitespace between two colons will be
\"cleaned up\" leaving a scope operator, if this action is set in
`c-cleanup-list'."

  (interactive "*P")
  (let* ((bod (c-point 'bod))
	 (literal (c-save-buffer-state () (c-in-literal bod)))
	 newlines is-scope-op
	 ;; shut this up
	 (c-echo-syntactic-information-p nil))
    (let (post-self-insert-hook)	; Disable random functionality.
      (self-insert-command (prefix-numeric-value arg)))
    ;; Any electric action?
    (if (and c-electric-flag (not literal) (not arg))
	;; Unless we're at EOL, only re-indentation happens.
	(if (not (looking-at "[ \t]*\\\\?$"))
	    (if c-syntactic-indentation
		(indent-according-to-mode))

	  ;; scope-operator clean-up?
	  (let ((pos (- (point-max) (point)))
		(here (point)))
	    (if (c-save-buffer-state ()	; Why do we need this? [ACM, 2003-03-12]
		  (and c-auto-newline
		       (memq 'scope-operator c-cleanup-list)
		       (eq (char-before) ?:)
		       (progn
			 (forward-char -1)
			 (c-skip-ws-backward)
			 (eq (char-before) ?:))
		       (not (c-in-literal))
		       (not (eq (char-after (- (point) 2)) ?:))))
		(progn
		  (delete-region (point) (1- here))
		  (setq is-scope-op t)))
	    (goto-char (- (point-max) pos)))

	  ;; indent the current line if it's done syntactically.
	  (if c-syntactic-indentation
	      ;; Cannot use the same syntax analysis as we find below,
	      ;; since that's made with c-syntactic-indentation-in-macros
	      ;; always set to t.
	      (indent-according-to-mode))

	  ;; Calculate where, if anywhere, we want newlines.
	  (c-save-buffer-state
	      ((c-syntactic-indentation-in-macros t)
	       (c-auto-newline-analysis t)
	       ;; Turn on syntactic macro analysis to help with auto newlines
	       ;; only.
	       (syntax (c-guess-basic-syntax))
	       (elem syntax))
	    ;; Translate substatement-label to label for this operation.
	    (while elem
	      (if (eq (car (car elem)) 'substatement-label)
		  (setcar (car elem) 'label))
	      (setq elem (cdr elem)))
	    ;; some language elements can only be determined by checking
	    ;; the following line.  Let's first look for ones that can be
	    ;; found when looking on the line with the colon
	    (setq newlines
		  (and c-auto-newline
		       (or (c-lookup-lists '(case-label label access-label)
					   syntax c-hanging-colons-alist)
			   (c-lookup-lists '(member-init-intro inher-intro)
					   (progn
					     (insert ?\n)
					     (unwind-protect
						 (c-guess-basic-syntax)
					       (delete-char -1)))
					   c-hanging-colons-alist)))))
	  ;; does a newline go before the colon?  Watch out for already
	  ;; non-hung colons.  However, we don't unhang them because that
	  ;; would be a cleanup (and anti-social).
	  (if (and (memq 'before newlines)
		   (not is-scope-op)
		   (save-excursion
		     (skip-chars-backward ": \t")
		     (not (bolp))))
	      (let ((pos (- (point-max) (point))))
		(forward-char -1)
		(c-newline-and-indent)
		(goto-char (- (point-max) pos))))
	  ;; does a newline go after the colon?
	  (if (and (memq 'after (cdr-safe newlines))
		   (not is-scope-op))
	      (c-newline-and-indent))))
    (c--call-post-self-insert-hook-more-safely)))