Sestavil jsem své vlastní řešení pomocí VimScriptu a rozhraní skriptů Mathematica. Funguje to pro Linux; pro ostatní OS upravte podle potřeby.
Nejprve vytvoříme soubor, řekněme ~/bin/mathpipe.m
který převezme výraz Mathematica ze standardního vstupu a vytiskne výsledek na standardní výstup. Pokud vím, neexistuje žádný vestavěný způsob, jak to udělat, opravte mě, pokud se mýlím. Používám Mathematica 10; dokumentaci pro kontrolu správného řádku hashbang (může se změnit z MathematicaScript
do 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];
Proveďte chmod +x ~/bin/mathpipe.m
.Můžeme běžet
$ echo "2+2" | ~/bin/mathpipe.m
4
Nyní v našem .vimrc
přidáme jednu pomocnou funkci:
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
Tím získá aktuální (nebo nejnovější) vizuální výběr a vrátí jej jako seznam hodnot řetězců. Pomocí toho můžeme definovat příkaz pro opakování vyhodnocení vybraného výrazu (také jde o .vimrc
):
function! Mathpipe1()
let mathpipe = s:get_visual_selection()
call writefile(mathpipe, '/tmp/mathpipein')
silent !cat /tmp/mathpipein | ~/bin/mathpipe.m
endfunction
Přidejte tento řádek pro mapování funkce na <leader>m
sekvence kláves:
xnoremap <leader>m :<c-h><c-h><c-h><c-h><c-h>call Mathpipe1()<CR>
Takže když ve Vimu vizuálně vybereme nějaký text, který je výrazem Mathematica, a stiskneme <leader>m
(obvykle \m
), výsledek se zobrazí ve výstupní oblasti na příkazovém řádku ex.Fungují i víceřádkové výběry.
Pokud chceme, aby byl výsledek vytištěn v aktuální vyrovnávací paměti Vim přímo pod tím, co jsme vybrali, můžeme to udělat také:
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>
Pomocí toho můžeme vybrat text a stisknout <leader>M
a vyhodnocení se vytiskne na další řádek.
Tento balíček poskytuje integraci Vim-Mathematica:
- http://library.wolfram.com/infocenter/MathSource/2584/
Citace z popisu balíčku:
Toto je rozhraní Mathematica zabudované do Vimu, což je špičkový programátorský editor, vysoce kompatibilní s vi, ale se spoustou dalších funkcí. Frontend je pouze doplněk pro editor, který lze stále používat jako standardní editor pro všechny druhy souborů ASCII.
Frontend je aplikace v "textovém režimu", která poběží v libovolném terminálu (samozřejmě včetně xterms). Funkčnost je podobná standardnímu rozhraní notebooku, bez grafiky (je však vestavěna podpora pro externí diváci mají rádi ghostview), ale s výrazně vylepšenými možnostmi úprav.
Balíček je z roku 1999. To je éra Vim 5 a Mathematica 4. Dnes to velmi pravděpodobně nefunguje po vybalení, ale měl by to být dobrý výchozí bod pro implementaci něčeho podobného s Vim 8 a Mathematica 11.