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 を実行することから始めましたが、低速のコンピューターを使用する傾向があるため、これは良い解決策ではありません。代わりに、Octave のインスタンスをリモート制御するように Vim を構成しました。

これは、ここで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 に答える