Duplicate tip
This tip is very similar to the following:
These tips need to be merged – see the merge guidelines.
created November 24, 2003 · complexity intermediate · author Eugene M. Minkovskii · version 6.0
The Python language is generally more powerful than Vim's scripting language. If you want to evaluate a fragment of Python code in Vim, you can use command:
:py print 2*2
See :help if_pyth.txt.
Below is a more elaborate example. Put the following code in your vimrc:
python << EOL import vim # Do not say 'from vim import *' because that # will delete builtin function eval. def EvaluateCurrentLine(*args): cur_str = vim.current.line action, symb = None, None for i in args: if i in ["r","p"]: action = i else: symb = i try: start = cur_str.rindex(symb)+len(symb) except: start = 0 result = eval(cur_str[start:],globals()) if action == "r": vim.current.line = cur_str[:start]+str(result) else: print result EOL command -narg=* PyEv python EvaluateCurrentLine(<f-args>)
Be careful about identation in the Python part. This code provides command:
:PyEv
This command evaluates expression in line under cursor and prints result in echo area.
With r argument, it will evaluate the expression and be replaced by the result of evaluation:
:PyEv r
You can give one more argument - it will mark from which char in current line it should start evaluation.
For example: Running the following command:
:PyEv r {
on the following line:
\setlength{\textwidth}{450-63
will give:
\setlength{\textwidth}{387
Comments[]
I tried to modify your script to execute a range of lines, but the :command's -range option did not seem to propagate into vim.current.range. It always just took one line instead of the range I specified. I finally ended up with:
python << EOL import vim def EvaluateCurrentRange(): eval(compile('\n'.join(vim.current.range),'<string>','exec'),globals()) EOL map H :py EvaluateCurrentRange()<CR>
The command definition using the same function (command -range Pyr python EvaluateCurrentRange()) did not work.