-(define-minor-mode plomvi-editable-mode
- "plomvi mode for editable buffers; uses `plomvi-editable-mode-map' to
-shadow `self-insert-command' keybindings and implement Vim-Normal-mode-style
-keybindings."
- nil " PVe" plomvi-editable-mode-map)
-
-(define-minor-mode plomvi-mode
- "Imperfectly emulates a subset of Vim normal mode.
-
-Actually encapsulates either `plomvi-basic-mode' or `plomvi-editable-mode'.
-Use `plomvi-activate' and `plomvi-deactivate' to toggle those.")
-
-(defun plomvi-activate ()
- "Outside mini-buffer, activate `plomvi-mode'.
-
-For read only-buffers, activate `plomvi-basic-mode'; else, `plomvi-editable-mode'."
- (interactive)
- (unless (minibufferp)
- ;(universal-argument)
- (plomvi-mode 1)
- (if buffer-read-only
- (plomvi-basic-mode 1)
- (plomvi-editable-mode 1))))
-
-(defun plomvi-deactivate()
- "Outside mini-buffer, deactivate `plomvi-mode'.
-
-For read only-buffers, deactivate `plomvi-basic-mode'; else, `plomvi-editable-mode'."
- (interactive)
- (plomvi-mode -1)
- (if buffer-read-only
- (plomvi-basic-mode -1)
- (plomvi-editable-mode -1)))
+(defvar plomvi-mode-hook)
+(defvar plomvi-mode-basic-hook)
+(defvar plomvi-mode-editable-hook)
+(defvar plomvi-mode-disable-hook)
+(defvar plomvi-mode-basic-disable-hook)
+(defvar plomvi-mode-editable-disable-hook)
+(defvar-local plomvi-mode nil "mode variable for `plomvi-mode'")
+(defvar-local plomvi-mode-basic nil
+ "toggles `plomvi-mode-basic-map' in `minor-mode-map-alist' for `plomvi-mode'")
+(defvar-local plomvi-mode-editable nil
+ "toggles `plomvi-mode-editable-map' in `minor-mode-map-alist' for `plomvi-mode'")
+
+(defun plomvi-mode (&optional arg)
+ "Imperfectly emulates a subset of Vim's Normal mode.
+
+Sets mode variable `plomvi-mode' and, on read-only buffers, `plomvi-mode-basic',
+or, on editable buffers, `plomvi-mode-editable'. The latter two's values in
+`minor-mode-map-alist' toggle either `plomvi-mode-basic-map' or
+`plomvi-mode-editable-map'."
+ (interactive (list (or current-prefix-arg 'toggle)))
+ (let ((enable (if (eq arg 'toggle)
+ (not plomvi-mode)
+ (> (prefix-numeric-value arg) 0 ))))
+ (if enable
+ (unless (minibufferp)
+ (if buffer-read-only
+ (setq plomvi-mode-basic t)
+ (setq plomvi-mode-editable t))
+ (setq plomvi-mode t)
+ (run-hooks 'plomvi-mode-hook)
+ (if plomvi-mode-basic
+ (run-hooks 'plomvi-mode-basic-hook)
+ (run-hooks 'plomvi-mode-editable-hook)))
+ (setq plomvi-mode-editable nil
+ plomvi-mode-basic nil
+ plomvi-mode nil)
+ (run-hooks 'plomvi-mode-editable-disable-hook)
+ (run-hooks 'plomvi-mode-basic-disable-hook)
+ (run-hooks 'plomvi-mode-disable-hook))))