I've translated `primitive-undo' from C to Lisp. This function is the engine behind the `undo' command in Emacs -- C-/, C-x u and so on. I've purposely cargo-culted the original C version, including carrying over the comments and the parts that I believe are vestigial. I've been using and maintaining this code since 2010 and haven't had any issues. I've added a default condition to the while-loop that calls `undefined' -- ringing the bell in Emacs -- for my own purposes, but it should be removed. I'm happy to contribute this back to Emacs in the hope of excising 200 lines of C code from undo.c and adding 150 lines of Lisp to simple.el.
Install the Lisp version by putting the following snippet in your .emacs, and putting the library primundo.el (attached) in your load-path. (unless (fboundp 'primitive-undo-C) (fset 'primitive-undo-C (symbol-function 'primitive-undo)) (fmakunbound 'primitive-undo)) ;; Roll-back the above with: ;; (fset 'primitive-undo (symbol-function 'primitive-undo-C)) (autoload 'primitive-undo "primundo" "Undo N records from the front of the list LIST. \(fn n list)") I wrote 5 tests that cover most of the execution paths and behavior. These tests call `primitive-undo' 23 times. I've benchmarked the Lisp and C versions using benchmark.el end `elp-instrument-function' by running these tests 100 times. The elapsed time of these tests on my computer for both versions of `primitive-undo' is approximately 200 seconds. (benchmark 100 '(undo-test-all)) ;; C `primitive-undo' => Elapsed time: 199.088000s (69.875000s in 14605 GCs) (benchmark 100 '(undo-test-all)) ;; Lisp `primitive-undo' => Elapsed time: 197.356000s (71.113000s in 14600 GCs) Out of those 3 minutes, less than 4 seconds is attributable to `primitive-undo'. This averages to 1/600th (0.0016) of a second per call of `primitive-undo' for both versions. Function Name Call Count Elapsed Time Average Time ============= ========== ============ ============ primitive-undo C 2300 3.8009999999 0.0016526086 primitive-undo Lisp 2300 3.6029999999 0.0015665217 Send me comments off-list if you come across any issues with using it. Happy undoing, aaron
primundo.el
Description: Binary data
_______________________________________________ gnu-emacs-sources mailing list [email protected] https://lists.gnu.org/mailman/listinfo/gnu-emacs-sources
