В конце концов, я решил это, написав скрипт с именем pyexec.vim и поместил его в каталог плагинов.Сценарий воспроизводится ниже:
python << endpython
import vim
def pycurpos(pythonstatement):
#split the python statement at ;
pythonstatement = pythonstatement.split(';')
stringToInsert = ''
for aStatement in pythonstatement:
#try to eval() the statement. This will work if the statement is a valid expression
try:
s = str(eval(aStatement))
except SyntaxError:
#statement is not a valid expression, so try exec. This will work if the statement is a valid python statement (such as if a==b: or print 'a')
#if this doesn't work either, fail
s = None
exec aStatement
stringToInsert += s if s is not None else ''
currentPos = vim.current.window.cursor[1]
currentLine = vim.current.line
vim.current.line = currentLine[:currentPos]+stringToInsert+currentLine[currentPos:]
endpython
Это работает, как и ожидалось для oneliners, но не совсем работает для нескольких операторов после блока.Таким образом, python pycurpos('a=2;if a==3:b=4;c=6')
приведет к тому, что c
всегда будет 6
, поскольку блок if
заканчивается первой строкой, следующей за ним.
Но для быстрого и грязного выполнения Python, чего я и хотел, сценарий является адекватным.