Nvim の:help
ページ。 生成されたもので、ソース を tree-sitter-vimdoc パーサーを使用して生成されています。
jobstart(..., {'pty': v:true})
または termopen() で開かれた PTY のマスターエンドを通じて。on_stdout
、on_stderr
、on_stdin
、またはon_data
オプションキーに割り当てられたコールバック関数を使用して、チャネルアクティビティ(受信データ)に対応できます。コールバックは高速にする必要があります。潜在的に遅く/高価な作業は避けてください。{chan-id}
チャネルハンドル。 channel-id{data}
チャネルから読み取られた生のデータ(readfile() スタイルの文字列のリスト)。EOF は単一項目のリストです:['']
。最初と最後の項目は不完全な行である可能性があります! channel-lines{name}
ストリーム名(文字列)。例:「stdout」。同じ関数が複数のストリームを処理できるようにするためです。イベント名は、チャネルが開かれた方法とモード/プロトコルによって異なります。['']
はEOF(ストリームのクローズ)を示します。または、stdout_buffered
、stderr_buffered
、stdin_buffered
、またはdata_buffered
オプションキーを設定して、すべての出力が収集され、ストリームが閉じられた後にのみコールバックを呼び出すこともできます。E5210{name}
キーに保存されます。キーが存在する場合はエラーとなります。{data}
リストの最初と最後の項目は不完全な行である可能性があります。空文字列は前の不完全な行を完了します。例(EOF で出力される最後の['']
は含まれません)foobar
は['fo'], ['obar']
として到着する可能性があります。foo\nbar
は次のように到着する可能性があります。['foo','bar']
['foo',''], ['bar']
['foo'], ['','bar']
['fo'], ['o','bar']
let s:lines = ['']
func! s:on_event(job_id, data, event) dict
let eof = (a:data == [''])
" Complete the previous line.
let s:lines[-1] .= a:data[0]
" Append (last item may be a partial line, until EOF).
call extend(s:lines, a:data[1:])
endf
function! s:OnEvent(id, data, event) dict
let str = join(a:data, "\n")
echomsg str
endfunction
let id = jobstart(['cat'], {'on_stdout': function('s:OnEvent') } )
call chansend(id, "hello!")
function! s:OnEvent(id, data, event) dict
call nvim_buf_set_lines(2, 0, -1, v:true, a:data)
endfunction
let id = jobstart(['grep', '^[0-9]'], { 'on_stdout': function('s:OnEvent'),
\ 'stdout_buffered':v:true } )
call chansend(id, "stuff\n10 PRINT \"NVIM\"\nxx")
" no output is received, buffer is empty
call chansend(id, "xx\n20 GOTO 10\nzz\n")
call chanclose(id, 'stdin')
" now buffer has result
jobstart(..., {'pty': v:true})
で開かれた PTY チャネルは ANSI エスケープシーケンスを前処理しません。これらは生のままコールバックに送信されます。ただし、jobresize() を使用して、PTY サイズの変更をスレーブにシグナルすることができます。terminal-emulator も参照してください。:echo system('nvim --headless +"te stty -a" +"sleep 1" +"1,/^$/print" +q')
rpc
オプションが true に設定されてチャネルが開かれると、チャネルは双方向のリモートメソッド呼び出しに使用できます。msgpack-rpc を参照してください。rpc チャネルは暗黙的に信頼されており、反対側のプロセスは任意の API 関数を呼び出すことができることに注意してください!func! OnEvent(id, data, event)
if a:data == [""]
quit
end
call chansend(a:id, map(a:data, {i,v -> toupper(v)}))
endfunc
call stdioopen({'on_stdin': 'OnEvent'})
uppercase.vim
に配置し、実行します。nvim --headless --cmd "source uppercase.vim"
:startinsert
を使用してください。これにより、ユーザーは行の入力を開始できます。CTRL-W
キーを使用して、CTRL-W
w のようにウィンドウコマンドを開始できます(次のウィンドウに切り替えます)。これは挿入モードでも機能します(単語を削除するには Shift-CTRL-W を使用します)。ウィンドウを離れると、挿入モードは停止します。プロンプトウィンドウに戻ると、挿入モードが復元されます。" Function handling a line of text that has been typed.
func TextEntered(text)
" Send the text to a shell with Enter appended.
call chansend(g:shell_job, [a:text, ''])
endfunc
" Function handling output from the shell: Add it above the prompt.
func GotOutput(channel, msg, name)
call append(line("$") - 1, a:msg)
endfunc
" Function handling the shell exits: close the window.
func JobExit(job, status, event)
quit!
endfunc
" Start a shell in the background.
let shell_job = jobstart(["/bin/sh"], #{
\ on_stdout: function('GotOutput'),
\ on_stderr: function('GotOutput'),
\ on_exit: function('JobExit'),
\ })
new
set buftype=prompt
let buf = bufnr('')
call prompt_setcallback(buf, function("TextEntered"))
call prompt_setprompt(buf, "shell command: ")
" start accepting shell commands
startinsert