在 VIM 中,我可以通过这个映射执行 Octave 脚本:
map <F6> :w<CR>:!run-octave -q % <CR>
然而,正如我最近发现的那样,除非脚本末尾有“暂停”命令,否则 Octave 不会显示任何绘图。
如何映射 F6 以便在每次调用该键时自动添加此暂停命令?
谢谢。
这可能不是处理从 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 的一个实例。
这可以通过终端多路复用器来完成,类似于我在这里为 Matlab 建议的,例如:
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 脚本的工作目录相同。