скрипт vim для вставки формул ascii-art

Я стараюсь использовать Vim как можно чаще, чтобы изучить его.
Сегодня мне пришлось написать множество математических функций. Я написал их как f(x)=e^(x/sqrt(x)) (например, бессмысленная функция), но это очень трудно читать.

Моя идея заключалась в том, чтобы использовать консольный вывод maxima и вставить его в текст, чтобы получить что-то вроде:

             x
          -------
          sqrt(x)
f(x) := e

который очень легко читается.

Я уже знаю много команд maxima, поэтому мне было бы очень легко и продуктивно писать формулы в синтаксисе maxima и получать их в этом замечательном выводе :)

У меня не было абсолютно никакого опыта работы с vimscript. Как я могу это сделать?


person linluk    schedule 28.03.2014    source источник


Ответы (2)


Пока у вас есть внешняя команда, которая возвращает выходные данные (отображенную формулу) в stdout, команда :read! {cmd} будет вставлять выходные данные (ниже текущей строки или в начале [range]:

:read! maxima --very-quiet -r "formula"

Вы также можете создать собственную команду для этого:

:command! -nargs=1 -range Maxima execute '<line1>,<line2>read! maxima --very-quiet -r' shellescape(<q-args>, 1)
person Ingo Karkat    schedule 28.03.2014

я использую это в моем файле ~/.vimrc:

 " calls maxima --very-quit -r "[ARG];"
 function! AsciiMath(formula)
   let cmdln='maxima --very-quiet -r "'.a:formula.';"'
   let @a=system(cmdln)
   if !v:shell_error
 "    echo @a
     put a
   else
     echo '"'.a:formula.'" is an invalid maxima expression"'
   endif
 endfunction 

и назовите его так:
:call AsciiMath("f(x):=e^(x/sqrt(x))")

я думаю, что функция проста для понимания, но есть некоторые сложные моменты:

  • put требует регистр в качестве аргумента, см. :h registers и :h put
  • аргументы не могут использоваться как formula им нужен префикс (пространство имен) a: используйте его как a:formula.
  • если вы настроили vim для перезагрузки файла .vimrc, вам следует использовать function! вместо function, потому что в противном случае вы получите сообщение об ошибке (что-то вроде «[FUNCTIONNAME] уже определено»)
  • system() возвращает консольный вывод своего аргумента как возвращаемое значение и помещает возвращаемое значение своего аргумента в v:shell_error.
person linluk    schedule 28.03.2014
comment
Вы можете использовать :put с регистром выражения. Таким образом, вы используете локальную переменную вместо глобального регистра: сначала let a=system(cmdln), затем тест v:shell_error, а затем put=a. - person benjifisher; 29.03.2014
comment
Если я заменю @a на f.e. myvar, то это не работает. Читаю :h put и там написано, что надо использовать регистр. Я думал, что с @a я использую регистр a, верно? Я что-то не понял? - person linluk; 29.03.2014
comment
Подозреваю, что вы не проверяли мой пример. Я использовал a в качестве переменной, но вы могли бы использовать вместо нее myvar. Раз вы мне не верите, попробуйте прочитать :help @=. В последней строке упоминается использование регистра выражения с командой :p. - person benjifisher; 29.03.2014