在文件末尾添加一行

时间:2013-03-06 07:14:57

标签: vim octave

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

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

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

如何映射F6,以便每次调用密钥时都会自动添加此暂停命令?

感谢。

1 个答案:

答案 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脚本的当前工作目录相同。