在VIM中,我可以通过以下映射执行Octave脚本:
map <F6> :w<CR>:!run-octave -q % <CR>
但是,正如我最近发现的那样,除非脚本末尾有“暂停”命令,否则Octave不会显示任何图形。
如何映射F6,以便每次调用密钥时都会自动添加此暂停命令?
感谢。
答案 0 :(得分:4)
这可能不是处理从Vim运行Octave脚本的最佳方法,请参阅下面的替代方案。
要完成您想要的任务,请在某处定义以下功能:
function! RunOctave()
let save_cursor = getpos('.')
call append(line('$'), "pause")
write
execute "!run-octave -q " . expand('%')
$delete _
write
call setpos('.', save_cursor)
endfunction
并定义一个映射来调用它:
map <F6> :w<CR>:call RunOctave<CR>
我开始时运行类似于上面的Octave,但由于我倾向于使用慢速计算机,这对我来说不是一个好的解决方案。我已经将Vim配置为远程控制Octave的一个实例。
这可以通过终端多路复用器完成,类似于I suggested for Matlab here,例如:
tmux new-session -s octave "octave -q"
为了获得最佳灵活性,我希望能够从Vim评估八度音程中的单行:
imap <buffer> <F1> <Esc>:!tmux send-keys -t octave "<C-r>=getline('.')<CR>"<C-r>=nr2char(13)<CR><CR>a
nmap <buffer> <F1> :!tmux send-keys -t octave "<C-r>=getline('.')<CR>"<C-r>=nr2char(13)<CR><CR>
评估视觉选择:
vmap <buffer> <F2> call ExecSelection()<CR><CR>
这取决于以下功能:
let s:octave_selection = '/var/tmp/vim_octave_selection.m'
function! ExecSelection()
if line(".") == line("'<'")
exec ".write! " . s:octave_selection
else
exec ".write! >> " . s:octave_selection
endif
if line(".") == line("'>")
exec "!tmux send-keys -t octave 'run " . s:octave_selection . "'" . nr2char(13)
endif
endfunction
最后,但并非最不重要的是,评估整个文件:
imap <buffer> <F3> <Esc>:!tmux send-keys -t octave "<C-r>=expand('%:t:r')<CR>"<C-r>=nr2char(13)<CR><CR>a
nmap <buffer> <F3> :!tmux send-keys -t octave "<C-r>=expand('%:t:r')<CR>"<C-r>=nr2char(13)<CR><CR>
最后一次映射要求缓冲区的当前工作目录与Octave脚本的当前工作目录相同。