Compatible way to use either :py OR :py3 in vim?
-
19-04-2021 - |
Question
In my .vimrc
and my vim plugin UltiSnips I've got a lot of code that looks like that
:py << EOF
print("Hi")
EOF
Now, I want to check if python3 is compiled into Vim via has("python3")
and then use :py3
instead of :py
. Keeping the python code compatible between python 2 and 3 is not the issue - the issue is to tell vim to use :py3 if is available and :py otherwise.
Has someone a good idea?
Solution
You can take advantage on the fact that user defined commands in vim are simply place-in-patter-and-eval statements, and write:
if has("python3")
command! -nargs=1 Py py3 <args>
else
command! -nargs=1 Py py <args>
endif
Then you can use :Py
to run python commands the same way as you regularly use :py
or :py3
.
OTHER TIPS
I have solved this now in an ugly fashion by only checking ONCE for python3 or python, then setting a variable
let g:_uspy=":py " or ":py3 "
and then throwing the << EOF syntax overboard and instead call each line of python via
exec g:_uspy "print('Hello')"
which seems to work okaish. See the full solution in this git blob: