Using your .vimrc
file on many machines with different versions and feature
sets for Vim is generally not too much of a problem if you apply a little care
in making a gracefully degrading .vimrc
. In most cases, using the output
of vim --version
and checking the help files will tell you what features to
check in order to determine which parts of your .vimrc
configuration to load,
and which to ignore.
There’s one particular feature that’s less obvious, though, and that’s eval
.
Vim’s help describes it like this in :help +eval
:
N *+eval* expression evaluation |eval.txt|
The eval.txt
document, in turn, describes the syntax for various features
fundamental to Vimscript, including variables, functions, lists, and
dictionaries.
All this makes eval
perhaps the most central feature of Vim. Without it, Vim
doesn’t have much of its programmable nature, and remains not much more than
classic vi
. If your particular build of Vim doesn’t include it, then
Vimscript essentially does not work as a programming language, and elementary
calls like function
and let
will throw errors:
E319: Sorry, the command is not available in this version: function
E319: Sorry, the command is not available in this version: let
If you’re getting this kind of error, you’re probably using a very
stripped-down version of Vim that doesn’t include eval
. If you just want to
prevent the error by ignoring a block of code if the feature is unavailable,
you can do this with has()
:
if has("eval")
...
endif
Vim will still be perfectly functional as a vi
-style editor without +eval
,
but if you’re going to need any Vimscript at all, you should recompile Vim with
a --with-features
value for the ./configure
line that does include it, such
as normal
, big
, or huge
, or install a more fully-featured packaged
version. For example, on Debian-like systems, the vim-tiny
package that is
included in the netinst
system does not include eval
, but the vim
and
vim-runtime
packages do.
Inspecting Vim’s source, in particular the ex_docmd.c
file, gives some
indication of how fundamental this feature is, applying the C function ex_ni
which simply prints the “not available” error shown above to a large number of
control structures and statements if the FEAT_EVAL
constant is not defined:
#ifndef FEAT_EVAL
# define ex_scriptnames ex_ni
# define ex_finish ex_ni
# define ex_echo ex_ni
# define ex_echohl ex_ni
# define ex_execute ex_ni
# define ex_call ex_ni
# define ex_if ex_ni
# define ex_endif ex_ni
# define ex_else ex_ni
# define ex_while ex_ni
# define ex_continue ex_ni
# define ex_break ex_ni
# define ex_endwhile ex_ni
# define ex_throw ex_ni
# define ex_try ex_ni
# define ex_catch ex_ni
# define ex_finally ex_ni
# define ex_endtry ex_ni
# define ex_endfunction ex_ni
# define ex_let ex_ni
# define ex_unlet ex_ni
# define ex_lockvar ex_ni
# define ex_unlockvar ex_ni
# define ex_function ex_ni
# define ex_delfunction ex_ni
# define ex_return ex_ni
# define ex_oldfiles ex_ni
#endif