blob: 94ceafeac49f2616fb442aa91078aade5c011927 [file] [log] [blame]
Bram Moolenaare0fa3742016-02-20 15:47:01 +01001*channel.txt* For Vim version 7.4. Last change: 2016 Feb 20
Bram Moolenaar3b5f9292016-01-28 22:37:01 +01002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
7 Inter-process communication *channel*
8
9DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT DRAFT
10
11Vim uses channels to communicate with other processes.
Bram Moolenaar38a55632016-02-15 22:07:32 +010012A channel uses a socket or pipes *socket-interface*
13Jobs can be used to start processes and communicate with them.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010014
Bram Moolenaar681baaf2016-02-04 20:57:07 +010015Vim current supports up to 10 simultaneous channels.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010016The Netbeans interface also uses a channel. |netbeans|
17
Bram Moolenaar38a55632016-02-15 22:07:32 +0100181. Overview |job-channel-overview|
192. Channel demo |channel-demo|
203. Opening a channel |channel-open|
214. Using a JSON or JS channel |channel-use|
225. Channel commands |channel-commands|
236. Using a RAW or NL channel |channel-raw|
247. More channel functions |channel-more|
258. Starting a job with a channel |job-start|
269. Starting a job without a channel |job-start-nochannel|
2710. Job options |job-options|
2811. Controlling a job |job-control|
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010029
30{Vi does not have any of these features}
Bram Moolenaar38a55632016-02-15 22:07:32 +010031{only when compiled with the |+channel| feature for channel stuff}
32{only when compiled with the |+job| feature for job stuff}
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010033
34==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +0100351. Overview *job-channel-overview*
36
37There are four main types of jobs:
381. A deamon, serving several Vim instances.
39 Vim connects to it with a socket.
402. One job working with one Vim instance, asynchronously.
41 Uses a socket or pipes.
423. A job performing some work for a short time, asynchronously.
43 Uses a socket or pipes.
444. Running a filter, synchronously.
45 Uses pipes.
46
47For when using sockets See |job-start|, |job-may-start| and |channel-open|.
48For 2 and 3, one or more jobs using pipes, see |job-start|.
49For 4 use the ":{range}!cmd" command, see |filter|.
50
51Over the socket and pipes these protocols are available:
52RAW nothing known, Vim cannot tell where a message ends
53NL every message ends in a NL (newline) character
54JSON JSON encoding |json_encode()|
55JS JavaScript style JSON-like encoding |js_encode()|
56
57Common combination are:
58- Using a job connected through pipes in NL mode. E.g., to run a style
59 checker and receive errors and warnings.
60- Using a deamon, connecting over a socket in JSON mode. E.g. to lookup
61 crosss-refrences in a database.
62
63==============================================================================
642. Channel demo *channel-demo*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010065
66This requires Python. The demo program can be found in
67$VIMRUNTIME/tools/demoserver.py
68Run it in one terminal. We will call this T1.
69
70Run Vim in another terminal. Connect to the demo server with: >
Bram Moolenaar38a55632016-02-15 22:07:32 +010071 let channel = ch_open('localhost:8765')
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010072
73In T1 you should see:
74 === socket opened === ~
75
76You can now send a message to the server: >
Bram Moolenaar38a55632016-02-15 22:07:32 +010077 echo ch_sendexpr(channel, 'hello!')
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010078
79The message is received in T1 and a response is sent back to Vim.
80You can see the raw messages in T1. What Vim sends is:
81 [1,"hello!"] ~
82And the response is:
83 [1,"got it"] ~
84The number will increase every time you send a message.
85
86The server can send a command to Vim. Type this on T1 (literally, including
Bram Moolenaarfb1f6262016-01-31 20:24:32 +010087the quotes):
88 ["ex","echo 'hi there'"] ~
89And you should see the message in Vim. You can move the cursor a word forward:
90 ["normal","w"] ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010091
92To handle asynchronous communication a callback needs to be used: >
Bram Moolenaar38a55632016-02-15 22:07:32 +010093 func MyHandler(channel, msg)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010094 echo "from the handler: " . a:msg
95 endfunc
Bram Moolenaar38a55632016-02-15 22:07:32 +010096 call ch_sendexpr(channel, 'hello!', "MyHandler")
97Vim will not wait for a response. Now the server can send the response later
98and MyHandler will be invoked.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +010099
100Instead of giving a callback with every send call, it can also be specified
101when opening the channel: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100102 call ch_close(channel)
103 let channel = ch_open('localhost:8765', {'callback': "MyHandler"})
104 call ch_sendexpr(channel, 'hello!', 0)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100105
106==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01001073. Opening a channel *channel-open*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100108
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100109To open a channel: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100110 let channel = ch_open({address} [, {options}])
111
112Use |ch_status()| to see if the channel could be opened.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100113
114{address} has the form "hostname:port". E.g., "localhost:8765".
115
Bram Moolenaar38a55632016-02-15 22:07:32 +0100116{options} is a dictionary with optional entries:
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100117
118"mode" can be: *channel-mode*
119 "json" - Use JSON, see below; most convenient way. Default.
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100120 "js" - Use JS (JavaScript) encoding, more efficient than JSON.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100121 "nl" - Use messages that end in a NL character
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100122 "raw" - Use raw messages
123
124 *channel-callback*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100125"callback" A function that is called when a message is received that is
126 not handled otherwise. It gets two arguments: the channel
127 handle and the received message. Example: >
128 func Handle(channel, msg)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100129 echo 'Received: ' . a:msg
130 endfunc
Bram Moolenaar38a55632016-02-15 22:07:32 +0100131 let channel = ch_open("localhost:8765", {"callback": "Handle"})
132<
133 TODO:
134"err-cb" A function like "callback" but used for stderr. Only for when
135 the channel uses pipes.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100136
Bram Moolenaar38a55632016-02-15 22:07:32 +0100137 TODO:
138"close-cb" A function that is called when the channel gets closed, other
139 than by calling ch_close(). It should be defined like this: >
140 func MyCloseHandler(channel)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100141
Bram Moolenaar38a55632016-02-15 22:07:32 +0100142"waittime" The time to wait for the connection to be made in
143 milliseconds. The default is zero, don't wait, which is
144 useful if the server is supposed to be running already. A
145 negative number waits forever.
146
147"timeout" The time to wait for a request when blocking, using
148 ch_sendexpr(). Again in milliseconds. The default is 2000 (2
149 seconds).
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100150
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100151When "mode" is "json" or "js" the "msg" argument is the body of the received
152message, converted to Vim types.
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100153When "mode" is "raw" the "msg" argument is the whole message as a string.
154
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100155When "mode" is "json" or "js" the "callback" is optional. When omitted it is
156only possible to receive a message after sending one.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100157
Bram Moolenaar38a55632016-02-15 22:07:32 +0100158To change the channel options after opening it use ch_setoptions(). The
159arguments are similar to what is passed to ch_open(), but "waittime" cannot be
160given, since that only applies to opening the channel.
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100161
Bram Moolenaar38a55632016-02-15 22:07:32 +0100162The handler can be added or changed: >
163 call ch_setoptions(channel, {'callback': callback})
164When "callback" is empty (zero or an empty string) the handler is removed.
165
166The timeout can be changed: >
167 call ch_setoptions(channel, {'timeout': msec})
168<
Bram Moolenaar835dc632016-02-07 14:27:38 +0100169 *E906*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100170Once done with the channel, disconnect it like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100171 call ch_close(channel)
172When a socket is used this will close the socket for both directions. When
173pipes are used (stdin/stdout/stderr) they are all closed. This might not be
174what you want! Stopping the job with job_stop() might be better.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100175
Bram Moolenaar38a55632016-02-15 22:07:32 +0100176TODO:
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100177Currently up to 10 channels can be in use at the same time. *E897*
178
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100179When the channel can't be opened you will get an error message. There is a
180difference between MS-Windows and Unix: On Unix when the port doesn't exist
181ch_open() fails quickly. On MS-Windows "waittime" applies.
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100182*E898* *E899* *E900* *E901* *E902*
183
184If there is an error reading or writing a channel it will be closed.
185*E896* *E630* *E631*
186
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100187==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01001884. Using a JSON or JS channel *channel-use*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100189
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100190If mode is JSON then a message can be sent synchronously like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100191 let response = ch_sendexpr(channel, {expr})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100192This awaits a response from the other side.
193
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100194When mode is JS this works the same, except that the messages use
Bram Moolenaar38a55632016-02-15 22:07:32 +0100195JavaScript encoding. See |js_encode()| for the difference.
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100196
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100197To send a message, without handling a response: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100198 call ch_sendexpr(channel, {expr}, 0)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100199
200To send a message and letting the response handled by a specific function,
201asynchronously: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100202 call ch_sendexpr(channel, {expr}, {callback})
203
204Vim will match the response with the request using the message ID. Once the
205response is received the callback will be invoked. Further responses with the
206same ID will be ignored. If your server sends back multiple responses you
207need to send them with ID zero, they will be passed to the channel callback.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100208
209The {expr} is converted to JSON and wrapped in an array. An example of the
210message that the receiver will get when {expr} is the string "hello":
211 [12,"hello"] ~
212
213The format of the JSON sent is:
214 [{number},{expr}]
215
216In which {number} is different every time. It must be used in the response
217(if any):
218
219 [{number},{response}]
220
221This way Vim knows which sent message matches with which received message and
222can call the right handler. Also when the messages arrive out of order.
223
224The sender must always send valid JSON to Vim. Vim can check for the end of
225the message by parsing the JSON. It will only accept the message if the end
226was received.
227
228When the process wants to send a message to Vim without first receiving a
229message, it must use the number zero:
230 [0,{response}]
231
232Then channel handler will then get {response} converted to Vim types. If the
233channel does not have a handler the message is dropped.
234
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100235On read error or ch_close(), when using a socket, the string "DETACH" is sent,
236if still possible. The channel will then be inactive.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100237
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100238It is also possible to use ch_sendraw() on a JSON or JS channel. The caller
239is then completely responsible for correct encoding and decoding.
240
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100241==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01002425. Channel commands *channel-commands*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100243
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100244With a JSON channel the process can send commands to Vim that will be
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100245handled by Vim internally, it does not require a handler for the channel.
246
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100247Possible commands are: *E903* *E904* *E905*
248 ["redraw" {forced}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100249 ["ex", {Ex command}]
250 ["normal", {Normal mode command}]
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100251 ["eval", {expression}, {number}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100252 ["expr", {expression}]
253
254With all of these: Be careful what these commands do! You can easily
255interfere with what the user is doing. To avoid trouble use |mode()| to check
256that the editor is in the expected state. E.g., to send keys that must be
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100257inserted as text, not executed as a command:
258 ["ex","if mode() == 'i' | call feedkeys('ClassName') | endif"] ~
259
260Errors in these commands are normally not reported to avoid them messing up
261the display. If you do want to see them, set the 'verbose' option to 3 or
262higher.
263
264
265Command "redraw" ~
266
267The other commands do not update the screen, so that you can send a sequence
268of commands without the cursor moving around. You must end with the "redraw"
269command to show any changed text and show the cursor where it belongs.
270
271The argument is normally an empty string:
272 ["redraw", ""] ~
273To first clear the screen pass "force":
274 ["redraw", "force"] ~
275
276
277Command "ex" ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100278
279The "ex" command is executed as any Ex command. There is no response for
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100280completion or error. You could use functions in an |autoload| script:
281 ["ex","call myscript#MyFunc(arg)"]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100282
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100283You can also use "call |feedkeys()|" to insert any key sequence.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100284
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100285
286Command "normal" ~
287
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100288The "normal" command is executed like with ":normal!", commands are not
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100289mapped. Example to open the folds under the cursor:
290 ["normal" "zO"]
291
292
293Command "eval" ~
294
295The "eval" command an be used to get the result of an expression. For
296example, to get the number of lines in the current buffer:
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100297 ["eval","line('$')", -2] ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100298
299it will send back the result of the expression:
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100300 [-2, "last line"] ~
301The format is:
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100302 [{number}, {result}]
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100303Here {number} is the same as what was in the request. Use a negative number
304to avoid confusion with message that Vim sends.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100305
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100306{result} is the result of the evaluation and is JSON encoded. If the
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100307evaluation fails or the result can't be encoded in JSON it is the string
308"ERROR".
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100309
310
311Command "expr" ~
312
313The "expr" command is similar to "eval", but does not send back any response.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100314Example:
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100315 ["expr","setline('$', ['one', 'two', 'three'])"] ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100316
317==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003186. Using a RAW or NL channel *channel-raw*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100319
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100320If mode is RAW or NL then a message can be send like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100321 let response = ch_sendraw(channel, {string})
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100322
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100323The {string} is sent as-is. The response will be what can be read from the
324channel right away. Since Vim doesn't know how to recognize the end of the
Bram Moolenaar38a55632016-02-15 22:07:32 +0100325message you need to take care of it yourself. The timeout applies for reading
326the first byte, after that it will not wait for anything more.
327
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100328If mode is "nl" you can send a message in a similar way. You are expected
Bram Moolenaar38a55632016-02-15 22:07:32 +0100329to put in the NL after each message. Thus you can also send several messages
330ending in a NL at once. The response will be the text up to and including the
331first NL. This can also be just the NL for an empty response.
332If no NL was read before the channel timeout an empty string is returned.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100333
334To send a message, without expecting a response: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100335 call ch_sendraw(channel, {string}, 0)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100336The process can send back a response, the channel handler will be called with
337it.
338
339To send a message and letting the response handled by a specific function,
340asynchronously: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100341 call ch_sendraw(channel, {string}, {callback})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100342
Bram Moolenaar38a55632016-02-15 22:07:32 +0100343This {string} can also be JSON, use |json_encode()| to create it and
344|json_decode()| to handle a received JSON message.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100345
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100346It is not possible to use |ch_sendexpr()| on a raw channel.
347
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100348==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003497. More channel functions *channel-more*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100350
Bram Moolenaar38a55632016-02-15 22:07:32 +0100351To obtain the status of a channel: ch_status(channel). The possible results
352are:
353 "fail" Failed to open the channel.
354 "open" The channel can be used.
355 "closed" The channel was closed.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100356
357TODO:
Bram Moolenaar38a55632016-02-15 22:07:32 +0100358To objain the job associated with a channel: ch_getjob(channel)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100359
Bram Moolenaar38a55632016-02-15 22:07:32 +0100360TODO:
361To read one message from a channel: >
362 let output = ch_read(channel)
363This uses the channel timeout. To read without a timeout, just get any
364message that is available: >
365 let output = ch_read(channel, 0)
366When no message was available then the result is v:none for a JSON or JS mode
367channels, an empty string for a RAW or NL channel.
368
369To read all output from a RAW or NL channel that is available: >
370 let output = ch_readall(channel)
371To read the error output: >
372 let output = ch_readall(channel, "err")
373TODO: use channel timeout, no timeout or specify timeout?
374
375==============================================================================
3768. Starting a job with a channel *job-start* *job*
377
378To start a job and open a channel for stdin/stdout/stderr: >
379 let job = job_start(command, {options})
380
381You can get the channel with: >
382 let channel = job_getchannel(job)
383
384The channel will use NL mode. If you want another mode it's best to specify
385this in {options}. When changing the mode later some text may have already
386been received and not parsed correctly.
387
388If the command produces a line of output that you want to deal with, specify
389a handler for stdout: >
390 let job = job_start(command, {"out-cb": "MyHandler"})
391The function will be called with the channel and a message. You would define
392it like this: >
393 func MyHandler(channel, msg)
394
395Without the handler you need to read the output with ch_read().
396
397The handler defined for "out-cb" will also receive stderr. If you want to
398handle that separately, add an "err-cb" handler: >
399 let job = job_start(command, {"out-cb": "MyHandler",
400 \ "err-cb": "ErrHandler"})
401
402You can send a message to the command with ch_sendraw(). If the channel is in
403JSON or JS mode you can use ch_sendexpr().
404
405There are several options you can use, see |job-options|.
406
407TODO:
408To run a job and read its output once it is done: >
409
410 let job = job_start({command}, {'exit-cb': 'MyHandler'})
411 func MyHandler(job, status)
412 let channel = job_getchannel()
413 let output = ch_readall(channel)
414 " parse output
415 endfunc
416
417==============================================================================
4189. Starting a job without a channel *job-start-nochannel*
419
420To start another process without creating a channel: >
421 let job = job_start(command, {"in-io": "null", "out-io": "null"})
422
423This starts {command} in the background, Vim does not wait for it to finish.
424
425TODO:
426When Vim sees that neither stdin, stdout or stderr are connected, no channel
427will be created. Often you will want to include redirection in the command to
428avoid it getting stuck.
429
430There are several options you can use, see |job-options|.
431
432TODO: *job-may-start*
433To start a job only when connecting to an address does not work use
434job_maystart('command', {address}, {options}), For Example: >
435 let job = job_maystart(command, address, {"waittime": 1000})
436 let channel = job_gethandle(job)
437
438This comes down to: >
439 let channel = ch_open(address, {"waittime": 0})
440 if ch_status(channel) == "fail"
441 let job = job_start(command)
442 let channel = ch_open(address, {"waittime": 1000})
443 call job_sethandle(channel)
444 endif
445Note that the specified waittime applies to when the job has been started.
446This gives the job some time to make the port available.
447
448==============================================================================
44910. Job options *job-options*
450
451The {options} argument in job_start() is a dictionary. All entries are
452optional. The same options can be used with job_setoptions(job, {options}).
453
454TODO: *job-out-cb*
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100455"callback": handler
Bram Moolenaar38a55632016-02-15 22:07:32 +0100456"out-cb": handler Callback for when there is something to read on
457 stdout.
458TODO: *job-err-cb*
459"err-cb": handler Callback for when there is something to read on
460 stderr. Defaults to the same callback as "out-cb".
461TODO: *job-close-cb*
462"close-cb": handler Callback for when the channel is closed. Same as
463 "close-cb" on ch_open().
464TODO: *job-exit-cb*
465"exit-cb": handler Callback for when the job ends. The arguments are the
466 job and the exit status.
467TODO: *job-killonexit*
468"killonexit": 1 Stop the job when Vim exits.
469"killonexit": 0 Do not stop the job when Vim exits.
470 The default is 1.
471TODO: *job-term*
472"term": "open" Start a terminal and connect the job
473 stdin/stdout/stderr to it.
474
475TODO: *job-in-io*
476"in-io": "null" disconnect stdin
477"in-io": "pipe" stdin is connected to the channel (default)
478"in-io": "file" stdin reads from a file
479"in-file": "/path/file" the file to read from
480
481TODO: *job-out-io*
482"out-io": "null" disconnect stdout
483"out-io": "pipe" stdout is connected to the channel (default)
484"out-io": "file" stdout writes to a file
485"out-file": "/path/file" the file to write to
486"out-io": "buffer" stdout appends to a buffer
487"out-buffer": "name" buffer to append to
488
489TODO: *job-err-io*
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100490"err-io": "out" same type as stdout (default)
Bram Moolenaar38a55632016-02-15 22:07:32 +0100491"err-io": "null" disconnect stderr
492"err-io": "pipe" stderr is connected to the channel
493"err-io": "file" stderr writes to a file
494"err-file": "/path/file" the file to write to
495"err-io": "buffer" stderr appends to a buffer
496"err-buffer": "name" buffer to append to
497
498TODO: more options
499
500
501==============================================================================
50211. Controlling a job *job-control*
503
504To get the status of a job: >
505 echo job_status(job)
506
507To make a job stop running: >
508 job_stop(job)
509
510This is the normal way to end a job. On Unix it sends a SIGTERM to the job.
511It is possible to use other ways to stop the job, or even send arbitrary
512signals. E.g. to force a job to stop, "kill it": >
513 job_stop(job, "kill")
514
515For more options see |job_stop()|.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100516
517
518 vim:tw=78:ts=8:ft=help:norl: