Does a "lazy" or "asynchronous" vc mode exist?
vc mode is designed on the assumption that the version control backend is fast. Much of the core vc features wants the version control status information immediately. For example,
vc-refresh-state is run from
find-file-hooks, which sets up buffer local state with respect to the
vc backend, synchronously.
There are places that do issue commands asynchronously. E.g. I do see
vc-do-async-command, and it is called for some operations, just not the ones that matter most to me (e.g. from
My negative experience
This is a problem on slow file systems or if the version control system is not fast. For example, with
global-auto-revert-mode on, in a large Mercurial client, where any given
hg status takes 0.3 seconds, changing the current branch can take quite a long time if I have a lot of buffers open.
If I disable vc mode with something like
vc-ignore-dir-regexp I lose all vc commands. I would gladly give up small niceties like up-to-date version control information in the mode line, if it got me performance.
A "lazy" vc mode might delay all interaction with the version control system until the user explicitly interacts with a vc command. Commands such as
vc-diff would first determine the vc backend, if needed, and then do the operation. This would be functional equivalent of having no vc mode at all, and simply switching to a shell and running commands like
foo diff, except that it would still have the nice Emacs veneer. In some respects, this might end up being a "vc mode lite".
An "asynchronous" vc mode would be more delicate to design and implement, but essentially run all external commands on an asynchronous queue. This way, a large number of files could be auto reverted without blocking Emacs.