2015-01-10 2 views
1

Я выполнил команду в Vim, который вставляет результат вычисления в файле, то есть вы наберетеКак упростить этот оклейки калькулятор

:CalP 34 * 89 

и он должен вставить результат после того, как курсор.

Код выглядит следующим образом:

command! -nargs=+ CalP :call Calculator(<q-args>) | normal! p 
py from math import * 

fun Calculator(arg) 
    redir @" 
    execute "py print " a:arg 
    redir END 
    let @" = strpart(@", 1) 
endfun 

Это работает, но грязнее, чем я хотел бы, простой операции, в основном потому, что:

  1. Я не знаю, лучший способ перенаправления выход py print ... в " регистре
  2. Я должен написать execute "py print " a:arg, потому что только py print a:arg не работает
  3. let @" = strpart(@", 1) удаляет паразитную новую строку в передней части регистра, который создает py print, в идеале это должно быть удалено

Я думаю, что это должно быть выполнимо в одной строке, но я не знаю достаточно vimscript.

ответ

3

Я предложу второе предложение Амадана. Если вы предпочитаете Python над Vimscript, вы можете использовать функцию pyeval(), например. непосредственно из режима вставки:

<C-R>=pyeval('34 * 89')<CR> 

Если вы хотите сохранить вашу пользовательскую команду, то возможно, тоже:

command! -nargs=+ CalP execute 'normal! a' . pyeval(<q-args>) . "\<Esc>" 
+0

Спасибо, я на самом деле не знаю об этом. Это решает большую часть проблемы, единственное, что я хотел, чтобы она работала со сложными числами, а также с pyeval. Я получаю сообщение об ошибке «Не удалось преобразовать возвращенный объект python в значение vim», тогда как в моей функции, если я импортирую cmath в моем vimrc я могу оценить такие вещи, как 'exp (pi * 1j)' – texasflood

+0

Обернуть выражение в 'str (...)', чтобы убедиться, что * Python * преобразует его в строку, а не ожидает, что Vim сделает это. – Amadan

4

Для этого не требуется никаких сценариев. В режиме вставки вы можете использовать <Ctrl-R>=34*89<CR>, чтобы вставить результат этого расчета.

:help i_CTRL-R 
:help expression 
Смежные вопросы