rusty@sdcarl.UUCP (rusty c. wright) (07/26/85)
after all of my hysterics about gnu emacs' c-mode i decided to write my own version of what i call autoindent-mode which mimics the autoindent mode of vi. it seems to all work except for one problem: because of the way autoindent-mode works it is likely that there will be lines that have only tabs or spaces on them. so i wrote a little routine that gets called when the file is written out and it cleans off all white space at the end of lines. unfortunately when i do the setq of write-file-hook it makes it global and this cleanup routine gets called for all buffers regardless of their mode when i do a save-buffer (ctl-s); i only want it to apply to buffers that autoindent-mode is invoked in. if i insert a make-local-variable before the setq then my cleanup routine doesn't even get called. what am i doing wrong? here is my autoindent-mode.el file: (defvar ai-mode-hook nil "If non-nil, its value is called on entry to autoindent-mode.") (defvar ai-mode-map nil "Keymap used in autoindent mode.") (defun autoindent-mode () "Autoindent mode mimics the autoindent mode of the vi editor. Specifically, a newline and open-line start the new line at the proper place to cause the new to line up with the previous line's indentation, if any." (kill-all-local-variables) (if (not ai-mode-map) (progn (setq ai-mode-map (make-sparse-keymap)) (define-key ai-mode-map "\^m" 'ai-newline) (define-key ai-mode-map "\^o" 'ai-open-line))) (use-local-map ai-mode-map) (setq mode-name "Autoindent") (set major-mode 'autoindent-mode) (setq write-file-hook 'ai-cleanup) (and (boundp 'ai-mode-hook) ai-mode-hook (funcall ai-mode-hook)) ) (defun ai-newline () "When starting a new line start it with the same level of indentation as the preceeding line." (interactive) (let ((previous-indentation (current-indentation))) (insert "\n") (indent-to previous-indentation))) (defun ai-open-line () "When opening up a new line, start it with the same level of indentation as the preceeding line." (interactive) (let ((previous-indentation (current-indentation))) (open-line 1) (indent-to previous-indentation))) (defun ai-cleanup () "Because of the klunky way that autoindent mode works it is necessary to clean up lines that may have unnecessary white space at the end; most notably empty lines that consist entirely of nothing but white space." (progn (message "starting cleanup...") (push-mark) (beginning-of-buffer) (while (not (eobp)) (end-of-line) (delete-horizontal-space) (if (not (equal (dot) (dot-max))) (forward-char))) (pop-mark) (exchange-dot-and-mark))) -- rusty c. wright {ucbvax,ihnp4,akgua,hplabs,sdcsvax}!sdcarl!rusty