1

在 VIM 中,我可以通过这个映射执行 Octave 脚本:

map <F6> :w<CR>:!run-octave -q % <CR>

然而,正如我最近发现的那样,除非脚本末尾有“暂停”命令,否则 Octave 不会显示任何绘图。

如何映射 F6 以便在每次调用该键时自动添加此暂停命令?

谢谢。

4

1 回答 1

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 的一个实例。

这可以通过终端多路复用器来完成,类似于我在这里为 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 脚本的工作目录相同。

于 2013-03-06T08:36:45.457 回答