2012-01-10 3 views
7

В моем .vimrc и моем VIM плагине UltiSnips У меня есть много кода, который выглядит, как этотСовместимый способ использования: py OR: py3 в vim?

:py << EOF 
print("Hi") 
EOF 

Теперь я хочу, чтобы проверить, если python3 компилируется в Vim с помощью has("python3"), а затем использовать :py3 вместо :py , Сохранение кода python, совместимого между python 2 и 3, не является проблемой - проблема заключается в том, чтобы сказать vim: py3, если он доступен, и: py в противном случае.

Есть ли у кого-то хорошая идея?

+0

Очевидным способом было бы иметь 'if has (" python3 ")' каждый раз, когда вы хотите использовать ': py3'. – romainl

+0

Или, может быть, функция-обертка, которая принимает код Python, который вы хотите запустить как аргумент, и выполняет одиночный 'if'. – romainl

+0

Ваш первый комментарий - очевидное решение, которое я выбрал сейчас. Второй комментарий - это то, что я хотел сделать, но я не знаю, как сделать функцию, определенную пользователем, принятой синтаксисом heredoc (<< EOF). Вы? – SirVer

ответ

6

Вы можете воспользоваться на то, что команды, определенные пользователем в Vim просто место-в-скороговоркой-и-Eval заявления и написать:

if has("python3") 
    command! -nargs=1 Py py3 <args> 
else 
    command! -nargs=1 Py py <args> 
endif 

Затем вы можете использовать :Py для запуска питона команд точно так же, как вы регулярно использовать :py или :py3.

+0

Нет, это не работает с синтаксисом << EOF, который понимает команда python. Однако это немного лучше, чем мое решение. – SirVer

+0

Работает отлично для меня: http://imageshack.us/photo/my-images/832/52433408.png/ –

+0

Действительно ... Он работает и на меня. Должно быть, я сделал что-то не так, когда сам пробовал. Возможно, аргумент -nargs = 1. Спасибо за ваше упорство в том, чтобы помочь мне! Я один-на ваше решение, но я по-прежнему буду поддерживать тот, о котором я упоминал ниже, потому что кажется немного затруднительным определить новую команду только для внутреннего использования, и потому что у меня есть отчеты о том, что решение exec работает в разных системах. – SirVer

0

Я решил это сейчас в уродливой моды лишь проверяя один раз для Python3 или Python, то установка переменной

let g:_uspy=":py " or ":py3 " 

, а затем бросали синтаксис < < EOF за борт и вместо того, чтобы позвонить каждую строку Python с помощью

exec g:_uspy "print('Hello')" 

который, похоже, работает okaish. Смотрите полное решение в этом мерзавца сгустка:

https://github.com/SirVer/ultisnips/blob/da49b4b7c4669bc462a98c9abc71b42d43d408bc/plugin/UltiSnips.vim