(in-package :editor) (setup-indent 'store-and-run 2) (defmacro store-and-run (var lambda-list &body body) `(progn (setf ,var (lambda ,lambda-list ,@body)) (funcall ,var ,@lambda-list))) (setup-indent 'def-vim-change 4) (defmacro def-vim-change (name lambda-list command-doc function-doc &body body) `(defcommand ,name ,lambda-list ,command-doc ,function-doc (setf *vim-last-action* (lambda (,(car lambda-list)) ,@body)) (funcall *vim-last-action* ,(car lambda-list)))) (setup-indent 'def-vim-move 6) (defmacro def-vim-move (name lambda-list wiseness exclusiveness command-doc function-doc &body body) (let ((p (car lambda-list))) `(defcommand ,name ,lambda-list ,command-doc ,function-doc (store-and-run *vim-last-action* (,p) (store-and-run *vim-last-movement* (,p) (setf b-vim-wiseness ,wiseness b-vim-exclusiveness ,exclusiveness) (move-point b-vim-point-before-movement (current-point)) ,@body (move-point b-vim-point-after-movement (current-point)) (when b-vim-pending-command (funcall b-vim-pending-command b-vim-point-before-movement b-vim-point-after-movement))))))) (defmacro def-vim-movement-pending (name lambda-list command-doc function-doc &body body) `(defcommand ,name (p) ,command-doc ,function-doc (declare (ignorable p)) (flet ((set-pending () (setf b-vim-pending-command (lambda ,lambda-list ,@body (setf b-vim-pending-command nil))))) (set-pending) (setf *vim-last-action* (lambda (p) (set-pending) (funcall *vim-last-movement* p))))))