Mercurial > emacs
diff lisp/progmodes/c-mode.el @ 837:a8aef92e0025
*** empty log message ***
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 22 Jul 1992 01:36:20 +0000 |
parents | 4f28bd14272c |
children | 20674ae6bf52 |
line wrap: on
line diff
--- a/lisp/progmodes/c-mode.el Wed Jul 22 01:19:00 1992 +0000 +++ b/lisp/progmodes/c-mode.el Wed Jul 22 01:36:20 1992 +0000 @@ -130,42 +130,6 @@ "*Non-nil means TAB in C mode should always reindent the current line, regardless of where in the line point is when the TAB command is used.") -(defun set-c-style (&optional style) - "Set up the c-mode style variables from the c-style variable or if - STYLE argument is given, use that. It makes the c indentation style - variables buffer local." - (interactive) - (let ((c-styles (mapcar 'car c-style-alist))) - (if (interactive-p) - (setq style - (let ((style-string ; get style name with completion - (completing-read - (format "Set c mode indentation style to (default %s): " - default-c-style) - (vconcat c-styles) - (function (lambda (arg) (memq arg c-styles))) - ))) - (if (string-equal "" style-string) - default-c-style - (intern style-string)) - ))) - (setq style (or style c-style)) ; use c-style if style is nil - (make-local-variable 'c-style) - (if (memq style c-styles) - (setq c-style style) - (error "Bad c style: %s" style) - ) - (message "c-style: %s" c-style) - ; finally, set the indentation style variables making each one local - (mapcar (function (lambda (c-style-pair) - (make-local-variable (car c-style-pair)) - (set (car c-style-pair) - (cdr c-style-pair)))) - (cdr (assq c-style c-style-alist))) - c-style - ) - ) - (defun c-mode () "Major mode for editing C code. Expression and list commands understand all C brackets. @@ -1066,18 +1030,90 @@ (indent-c-exp endmark) (set-marker endmark nil)))) -(defun set-c-style (style) +(defun set-c-style (style &optional global) "Set C-mode variables to use one of several different indentation styles. -Takes one argument, a string representing the desired style. -Available styles are GNU, K&R, BSD and Whitesmith." +The arguments are a string representing the desired style +and a flag which, if non-nil, means to set the style globally. +\(Interactively, the flag comes from the prefix argument.) +Available styles are GNU, K&R, BSD and Whitesmith. (interactive (list (completing-read "Use which C indentation style? " - c-style-alist nil t))) + c-style-alist nil t) + current-prefix-arg)) (let ((vars (cdr (assoc style c-style-alist)))) - (if vars - (if (interactive-p) (message "Using %s C indentation style" style)) - (error "Bogus style type, \"%s\"" style)) + (or vars + (error "Invalid C indentation style `%s'" style)) (while vars + (or global + (make-local-variable (car (car vars)))) (set (car (car vars)) (cdr (car vars))) (setq vars (cdr vars))))) + +;;; This page handles insertion and removal of backslashes for C macros. + +(defvar c-backslash-column 48 + "*Minimum column for end-of-line backslashes of macro definitions.") + +(defun c-backslash-region (from to delete-flag) + "Insert, align, or delete end-of-line backslashes on the lines in the region. +With no argument, inserts backslashes and aligns existing backslashes. +With an argument, deletes the backslashes. + +This function does not modify the last line of the region if the region ends +right at the start of the following line; it does not modify blank lines +at the start of the region. So you can put the region around an entire macro +definition and conveniently use this command." + (interactive "r\nP") + (save-excursion + (goto-char from) + (let ((column c-backslash-column) + (endmark (make-marker))) + (move-marker endmark to) + ;; Compute the smallest column number past the ends of all the lines. + (if (not delete-flag) + (while (< (point) to) + (end-of-line) + (if (= (preceding-char) ?\\) + (progn (forward-char -1) + (skip-chars-backward " \t"))) + (setq column (max column (1+ (current-column)))) + (forward-line 1))) + ;; Adjust upward to a tab column, if that doesn't push past the margin. + (if (> (% column tab-width) 0) + (let ((adjusted (* (/ (+ column tab-width -1) tab-width) tab-width))) + (if (< adjusted (window-width)) + (setq column adjusted)))) + ;; Don't modify blank lines at start of region. + (goto-char from) + (while (and (< (point) endmark) (eolp)) + (forward-line 1)) + ;; Add or remove backslashes on all the lines. + (while (and (< (point) endmark) + ;; Don't backslashify the last line + ;; if the region ends right at the start of the next line. + (save-excursion + (forward-line 1) + (< (point) endmark))) + (if (not delete-flag) + (c-append-backslash column) + (c-delete-backslash)) + (forward-line 1)) + (move-marker endmark nil)))) + +(defun c-append-backslash (column) + (end-of-line) + ;; Note that "\\\\" is needed to get one backslash. + (if (= (preceding-char) ?\\) + (progn (forward-char -1) + (delete-horizontal-space) + (indent-to column)) + (indent-to column) + (insert "\\"))) + +(defun c-delete-backslash () + (end-of-line) + (forward-char -1) + (if (looking-at "\\\\") + (delete-region (1+ (point)) + (progn (skip-chars-backward " \t") (point))))) ;;; c-mode.el ends here