Commit 0c495c21 authored by Stefan Monnier's avatar Stefan Monnier
Browse files

Define auto-save-mode with define-minor-mode.

* emacs-lisp/easy-mmode.el (define-minor-mode):
Make :variable more flexible.
* files.el (auto-save-mode): Use it to define using define-minor-mode.
parent 07e99590
2010-05-06 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/easy-mmode.el (define-minor-mode):
Make :variable more flexible.
* files.el (auto-save-mode): Use it to define using define-minor-mode.
2010-05-05 Juri Linkov <juri@jurta.org>
Add `slow' and `history' tags to the desktop data.
......@@ -20,8 +26,8 @@
(ange-ftp-delete-file): Add FORCE arg.
(ange-ftp-rename-remote-to-remote)
(ange-ftp-rename-local-to-remote, ange-ftp-rename-remote-to-local)
(ange-ftp-load, ange-ftp-compress, ange-ftp-uncompress): Force
file deletion.
(ange-ftp-load, ange-ftp-compress, ange-ftp-uncompress):
Force file deletion.
* net/tramp-compat.el (tramp-compat-delete-file): New defun.
......@@ -39,8 +45,8 @@
(tramp-fish-handle-make-symbolic-link)
(tramp-fish-handle-process-file): Use `tramp-compat-delete-file'.
* net/tramp-ftp.el (tramp-ftp-file-name-handler): Use
`tramp-compat-delete-file'.
* net/tramp-ftp.el (tramp-ftp-file-name-handler):
Use `tramp-compat-delete-file'.
* net/tramp-gvfs.el (tramp-gvfs-handle-delete-file): Add FORCE arg.
(tramp-gvfs-handle-write-region): Use `tramp-compat-delete-file'.
......
......@@ -117,7 +117,10 @@ BODY contains code to execute each time the mode is activated or deactivated.
:keymap MAP Same as the KEYMAP argument.
:require SYM Same as in `defcustom'.
:variable PLACE The location (as can be used with `setf') to use instead
of the variable MODE to store the state of the mode.
of the variable MODE to store the state of the mode. PLACE
can also be of the form (GET . SET) where GET is an expression
that returns the current state and SET is a function that takes
a new state and sets it.
For example, you could write
(define-minor-mode foo-mode \"If enabled, foo on you!\"
......@@ -149,8 +152,9 @@ For example, you could write
(type nil)
(extra-args nil)
(extra-keywords nil)
(variable nil)
(modefun mode)
(variable nil) ;The PLACE where the state is stored.
(setter nil) ;The function (if any) to set the mode var.
(modefun mode) ;The minor mode function name we're defining.
(require t)
(hook (intern (concat mode-name "-hook")))
(hook-on (intern (concat mode-name "-on-hook")))
......@@ -171,7 +175,12 @@ For example, you could write
(:type (setq type (list :type (pop body))))
(:require (setq require (pop body)))
(:keymap (setq keymap (pop body)))
(:variable (setq variable (setq mode (pop body))))
(:variable (setq variable (pop body))
(if (not (functionp (cdr-safe variable)))
;; PLACE is not of the form (GET . SET).
(setq mode variable)
(setq mode (car variable))
(setq setter (cdr variable))))
(t (push keyw extra-keywords) (push (pop body) extra-keywords))))
(setq keymap-sym (if (and keymap (symbolp keymap)) keymap
......@@ -230,7 +239,8 @@ With zero or negative ARG turn mode off.
;; repeat-command still does the toggling correctly.
(interactive (list (or current-prefix-arg 'toggle)))
(let ((,last-message (current-message)))
(,(if (symbolp mode) 'setq 'setf) ,mode
(,@(if setter (list setter)
(list (if (symbolp mode) 'setq 'setf) mode))
(if (eq arg 'toggle)
(not ,mode)
;; A nil argument also means ON now.
......@@ -240,7 +250,8 @@ With zero or negative ARG turn mode off.
(run-hooks ',hook (if ,mode ',hook-on ',hook-off))
(if (called-interactively-p 'any)
(progn
,(if globalp `(customize-mark-as-set ',mode))
,(if (and globalp (symbolp mode))
`(customize-mark-as-set ',mode))
;; Avoid overwriting a message shown by the body,
;; but do overwrite previous messages.
(unless (and (current-message)
......@@ -265,10 +276,15 @@ With zero or negative ARG turn mode off.
(t (error "Invalid keymap %S" ,keymap))))
,(format "Keymap for `%s'." mode-name)))
,(unless variable
`(add-minor-mode ',mode ',lighter
,(if (not (symbolp mode))
(if (or lighter keymap)
(error ":lighter and :keymap unsupported with mode expression %s" mode))
`(with-no-warnings
(add-minor-mode ',mode ',lighter
,(if keymap keymap-sym
`(if (boundp ',keymap-sym) ,keymap-sym)))))))
`(if (boundp ',keymap-sym) ,keymap-sym))
nil
,(unless (eq mode modefun) 'modefun)))))))
;;;
;;; make global minor mode
......
......@@ -5150,29 +5150,25 @@ The optional second argument indicates whether to kill internal buffers too."
(kill-buffer-ask buffer)))))
(defun auto-save-mode (arg)
(define-minor-mode auto-save-mode
"Toggle auto-saving of contents of current buffer.
With prefix argument ARG, turn auto-saving on if positive, else off."
(interactive "P")
(setq buffer-auto-save-file-name
(and (if (null arg)
(or (not buffer-auto-save-file-name)
;; If auto-save is off because buffer has shrunk,
;; then toggling should turn it on.
(< buffer-saved-size 0))
(or (eq arg t) (listp arg) (and (integerp arg) (> arg 0))))
(if (and buffer-file-name auto-save-visited-file-name
(not buffer-read-only))
buffer-file-name
(make-auto-save-file-name))))
:variable ((and buffer-auto-save-file-name
;; If auto-save is off because buffer has shrunk,
;; then toggling should turn it on.
(>= buffer-saved-size 0))
. (lambda (val)
(setq buffer-auto-save-file-name
(cond
((null val) nil)
((and buffer-file-name auto-save-visited-file-name
(not buffer-read-only))
buffer-file-name)
(t (make-auto-save-file-name))))))
;; If -1 was stored here, to temporarily turn off saving,
;; turn it back on.
(and (< buffer-saved-size 0)
(setq buffer-saved-size 0))
(if (called-interactively-p 'interactive)
(message "Auto-save %s (in this buffer)"
(if buffer-auto-save-file-name "on" "off")))
buffer-auto-save-file-name)
(setq buffer-saved-size 0)))
(defun rename-auto-save-file ()
"Adjust current buffer's auto save file name for current conditions.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment