Preparé mi propia solución usando VimScript y la interfaz de script de Mathematica. Esto funciona para Linux; para otros sistemas operativos, modifique según sea necesario.
Primero creamos un archivo, digamos ~/bin/mathpipe.m
que toma una expresión de Mathematica de la entrada estándar e imprime el resultado en la salida estándar. Hasta donde yo sé, no hay una forma integrada de hacer esto, corríjame si me equivoco. Estoy usando Mathematica 10; consulte el documentación para verificar la línea hashbang correcta para usted (puede haber cambiado de MathematicaScript
a wolfram
).
#!/usr/local/bin/MathematicaScript -script
(* read standard input, one line at a time, evaluating each one.
print the InputForm of the evaluated last line. *)
val = Input[];
ret = val;
While[val = Input[]; val =!= EndOfFile, ret = val];
Print[ret];
Haz chmod +x ~/bin/mathpipe.m
.Podemos correr
$ echo "2+2" | ~/bin/mathpipe.m
4
Ahora, en nuestro .vimrc
agregamos una función auxiliar:
function! s:get_visual_selection()
" from http://stackoverflow.com/a/6271254/371334
let [lnum1, col1] = getpos("'<")[1:2]
let [lnum2, col2] = getpos("'>")[1:2]
let lines = getline(lnum1, lnum2)
let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)]
let lines[0] = lines[0][col1 - 1:]
"return join(lines, "\n")
return lines
endfunction
Esto obtiene la selección visual actual (o más reciente) y la devuelve como una lista de valores de cadena. Con esto podemos definir un comando para hacer eco de la evaluación de una expresión seleccionada (también va en .vimrc
):
function! Mathpipe1()
let mathpipe = s:get_visual_selection()
call writefile(mathpipe, '/tmp/mathpipein')
silent !cat /tmp/mathpipein | ~/bin/mathpipe.m
endfunction
Agregue esta línea para asignar la función al <leader>m
secuencia de teclas:
xnoremap <leader>m :<c-h><c-h><c-h><c-h><c-h>call Mathpipe1()<CR>
Ahora, si seleccionamos visualmente algún texto en Vim que sea una expresión de Mathematica y presionamos <leader>m
(normalmente \m
), el resultado se muestra en el área de salida en la línea de comando ex. Las selecciones de varias líneas también funcionan.
Si queremos que el resultado se imprima en el búfer Vim actual justo debajo de lo que seleccionamos, también podemos hacerlo:
function! Mathpipe2()
let mathpipe = s:get_visual_selection()
call writefile(mathpipe, '/tmp/mathpipein')
silent !cat /tmp/mathpipein | ~/bin/mathpipe.m > /tmp/mathpipeout
normal `>
r /tmp/mathpipeout
endfunction
xnoremap <leader>M :<c-h><c-h><c-h><c-h><c-h>call Mathpipe2()<CR>
Con esto, podemos seleccionar texto, presionar <leader>M
y la evaluación se imprime en la línea siguiente.
Este paquete proporciona integración Vim-Mathematica:
- http://library.wolfram.com/infocenter/MathSource/2584/
Citando la descripción del paquete:
Esta es una interfaz de Mathematica integrada en Vim, que es un editor de programadores de alto nivel, altamente compatible con vi pero con muchas características adicionales. El front-end es solo un complemento para el editor, que todavía se puede usar como un editor estándar para todo tipo de archivos ASCII.
El front-end es una aplicación en "modo de texto" que se ejecutará en cualquier terminal (incluidos, por supuesto, xterms). La funcionalidad es similar a la interfaz estándar de un portátil, sin gráficos (sin embargo, hay soporte integrado para aplicaciones externas). a los espectadores les gusta ghostview), pero con capacidades de edición muy mejoradas.
El paquete es de 1999. Esa es la era de Vim 5 y Mathematica 4. Es muy probable que no funcione hoy en día, pero debería ser un buen punto de partida para implementar algo similar con Vim 8 y Mathematica 11.