dot-mode

Homepage: https://github.com/wyrickre/dot-mode

Author: Robert Wyrick

Updated:

Summary

Minor mode to repeat typing or commands

Commentary

Purpose of this package: minor mode to repeat typing or commands

Installation instructions

Install this file somewhere in your load path, byte-compile it and
add one of the following to your .emacs file (remove the comment
delimiters ;-)

If you only want dot-mode to activate when you press "C-.", add the
the following to your .emacs:

    (autoload 'dot-mode "dot-mode" nil t) ; vi `.' command emulation
    (global-set-key [(control ?.)] (lambda () (interactive) (dot-mode 1)
                                      (message "Dot mode activated.")))

If you want dot-mode all the time (like me), add the following to
your .emacs:

    (require 'dot-mode)
    (add-hook 'find-file-hooks 'dot-mode-on)

You may still want to use the global-set-key above.. especially if you
use the *scratch* buffer.

To toggle dot mode on or off type `M-x dot-mode'

There are only two variables that allow you to modify how dot-mode
behaves:
          dot-mode-ignore-undo
          dot-mode-global-mode

dot-mode-ignore-undo - defaults to t.  When nil, it will record keystrokes
    that generate an undo just like any other keystroke that changed the
    buffer.  I personally find that annoying, but if you want dot-mode to
    always remember your undo's:
        (setq dot-mode-ignore-undo nil)
    Besides, you can always use dot-mode-override to record an undo when
    you need to (or even M-x undo).

dot-mode-global-mode - defaults to t.  When t, dot-mode only has one
    keyboard command buffer.  That means you can make a change in one
    buffer, switch buffers, then repeat the change.  When set to nil,
    each buffer gets its own command buffer.  That means that after
    making a change in a buffer, if you switch buffers, that change
    cannot repeated.  If you switch back to the first buffer, your
    change can then be repeated again.  This has a nasty side effect
    if your change yanks from the kill-ring (You could end up
    yanking text you killed in a different buffer).
    If you want to set this to nil, you should do so before dot-mode
    is activated on any buffers.  Otherwise, you may end up with some
    buffers having a local command buffer and others using the global
    one.

Usage instructions:

`C-.'    is bound to dot-mode-execute, which executes the buffer of
         stored commands as a keyboard macro.

`C-M-.'  is bound to dot-mode-override, which will cause dot-mode
         to remember the next keystroke regardless of whether it
         changes the buffer and regardless of the value of the
         dot-mode-ignore-undo variable.

`C-c-.'  is bound to dot-mode-copy-to-last-kbd-macro, which will
         copy the current dot mode keyboard macro to the last-kbd-macro
         variable.  It can then be executed via call-last-kbd-macro
         (normally bound to `C-x-e'), named via name-last-kbd-macro,
         and then inserted into your .emacs via insert-kbd-macro.

Known bugs:

none


COMMENTARY

This mode is written to address one argument in the emacs vs. vi
jihad :-)  It emulates the vi `redo' command, repeating the
immediately preceding sequence of commands.  This is done by
recording input commands which change the buffer, i.e. not motion
commands.

DESIGN

The heart of this minor mode is a state machine.  The function
dot-mode-after-change is called from after-change-functions and
sets a variable (is there one already?  I couldn't find it) which
is examined by dot-mode-loop, called from from post-command-hook.
This variable, dot-mode-changed, is used in conjunction with
dot-mode-state to move to the next state in the state machine.
The state machine is hard coded into dot-mode-loop in the
interests of speed; it uses two normal states (idle and store)
and two corresponding override states which allow the user to
forcibly store commands which do not change the buffer.

TODO
* Explore using recent-keys for this functionality

Dependencies