blob: 0f329648a3f9399211c12452f81fb99d23f3b848 [file] [log] [blame]
Bram Moolenaarf3913272016-02-25 00:00:01 +01001*channel.txt* For Vim version 7.4. Last change: 2016 Feb 23
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 Moolenaar02e83b42016-02-21 20:10:26 +010096 call ch_sendexpr(channel, 'hello!', {'callback': "MyHandler"})
Bram Moolenaar38a55632016-02-15 22:07:32 +010097Vim 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"})
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100104 call ch_sendexpr(channel, 'hello!', {'callback': 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}])
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100111 if ch_status(channel) == "open"
112 " use the channel
Bram Moolenaar38a55632016-02-15 22:07:32 +0100113
114Use |ch_status()| to see if the channel could be opened.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100115
116{address} has the form "hostname:port". E.g., "localhost:8765".
117
Bram Moolenaar38a55632016-02-15 22:07:32 +0100118{options} is a dictionary with optional entries:
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100119
120"mode" can be: *channel-mode*
121 "json" - Use JSON, see below; most convenient way. Default.
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100122 "js" - Use JS (JavaScript) encoding, more efficient than JSON.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100123 "nl" - Use messages that end in a NL character
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100124 "raw" - Use raw messages
125
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100126"in-mode" mode specifically for stdin, only when using pipes
127"out-mode" mode specifically for stdout, only when using pipes
128"err-mode" mode specifically for stderr, only when using pipes
129 Note: when setting "mode" the part specific mode is
130 overwritten. Therefore set "mode" first and the part specific
131 mode later.
132
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100133 *channel-callback*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100134"callback" A function that is called when a message is received that is
135 not handled otherwise. It gets two arguments: the channel
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100136 and the received message. Example: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100137 func Handle(channel, msg)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100138 echo 'Received: ' . a:msg
139 endfunc
Bram Moolenaar38a55632016-02-15 22:07:32 +0100140 let channel = ch_open("localhost:8765", {"callback": "Handle"})
141<
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100142 When "mode" is "json" or "js" the "msg" argument is the body
143 of the received message, converted to Vim types.
144 When "mode" is "nl" the "msg" argument is one message,
145 excluding the NL.
146 When "mode" is "raw" the "msg" argument is the whole message
147 as a string.
148 *out-cb*
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100149"out-cb" A function like "callback" but used for stdout. Only for when
150 the channel uses pipes. When "out-cb" wasn't set the channel
151 callback is used.
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100152 *err-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100153"err-cb" A function like "callback" but used for stderr. Only for when
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100154 the channel uses pipes. When "err-cb" wasn't set the channel
155 callback is used.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100156
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100157 TODO: *close-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100158"close-cb" A function that is called when the channel gets closed, other
159 than by calling ch_close(). It should be defined like this: >
160 func MyCloseHandler(channel)
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100161< *waittime*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100162"waittime" The time to wait for the connection to be made in
Bram Moolenaarf3913272016-02-25 00:00:01 +0100163 milliseconds. A negative number waits forever.
164
165 The default is zero, don't wait, which is useful if a local
166 server is supposed to be running already. On Unix Vim
167 actually uses a 1 msec timeout, that is required on many
168 systems. Use a larger value for a remote server, e.g. 10
169 msec at least.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100170
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100171"timeout" The time to wait for a request when blocking, E.g. when using
172 ch_sendexpr(). In milliseconds. The default is 2000 (2
Bram Moolenaar38a55632016-02-15 22:07:32 +0100173 seconds).
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100174 *out-timeout* *err-timeout*
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100175"out-timeout" Timeout for stdout. Only when using pipes.
176"err-timeout" Timeout for stderr. Only when using pipes.
177 Note: when setting "timeout" the part specific mode is
178 overwritten. Therefore set "timeout" first and the part
179 specific mode later.
180
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100181When "mode" is "json" or "js" the "callback" is optional. When omitted it is
182only possible to receive a message after sending one.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100183
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100184To change the channel options after opening it use |ch_setoptions()|. The
185arguments are similar to what is passed to |ch_open()|, but "waittime" cannot
186be given, since that only applies to opening the channel.
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100187
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100188For example, the handler can be added or changed: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100189 call ch_setoptions(channel, {'callback': callback})
190When "callback" is empty (zero or an empty string) the handler is removed.
191
192The timeout can be changed: >
193 call ch_setoptions(channel, {'timeout': msec})
194<
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100195 *channel-close* *E906*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100196Once done with the channel, disconnect it like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100197 call ch_close(channel)
198When a socket is used this will close the socket for both directions. When
199pipes are used (stdin/stdout/stderr) they are all closed. This might not be
200what you want! Stopping the job with job_stop() might be better.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100201
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100202When the channel can't be opened you will get an error message. There is a
203difference between MS-Windows and Unix: On Unix when the port doesn't exist
204ch_open() fails quickly. On MS-Windows "waittime" applies.
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100205*E898* *E899* *E900* *E901* *E902*
206
207If there is an error reading or writing a channel it will be closed.
208*E896* *E630* *E631*
209
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100210==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01002114. Using a JSON or JS channel *channel-use*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100212
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100213If mode is JSON then a message can be sent synchronously like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100214 let response = ch_sendexpr(channel, {expr})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100215This awaits a response from the other side.
216
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100217When mode is JS this works the same, except that the messages use
Bram Moolenaar38a55632016-02-15 22:07:32 +0100218JavaScript encoding. See |js_encode()| for the difference.
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100219
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100220To send a message, without handling a response or letting the channel callback
221handle the response: >
222 call ch_sendexpr(channel, {expr}, {'callback': 0})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100223
224To send a message and letting the response handled by a specific function,
225asynchronously: >
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100226 call ch_sendexpr(channel, {expr}, {'callback': Handler})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100227
228Vim will match the response with the request using the message ID. Once the
229response is received the callback will be invoked. Further responses with the
230same ID will be ignored. If your server sends back multiple responses you
231need to send them with ID zero, they will be passed to the channel callback.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100232
233The {expr} is converted to JSON and wrapped in an array. An example of the
234message that the receiver will get when {expr} is the string "hello":
235 [12,"hello"] ~
236
237The format of the JSON sent is:
238 [{number},{expr}]
239
240In which {number} is different every time. It must be used in the response
241(if any):
242
243 [{number},{response}]
244
245This way Vim knows which sent message matches with which received message and
246can call the right handler. Also when the messages arrive out of order.
247
248The sender must always send valid JSON to Vim. Vim can check for the end of
249the message by parsing the JSON. It will only accept the message if the end
250was received.
251
252When the process wants to send a message to Vim without first receiving a
253message, it must use the number zero:
254 [0,{response}]
255
256Then channel handler will then get {response} converted to Vim types. If the
257channel does not have a handler the message is dropped.
258
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100259On read error or ch_close(), when using a socket, the string "DETACH" is sent,
Bram Moolenaarf3913272016-02-25 00:00:01 +0100260if still possible. The channel will then be inactive. For a JSON and JS mode
261channel quotes are used around DETACH, otherwise there are no quotes.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100262
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100263It is also possible to use ch_sendraw() on a JSON or JS channel. The caller
264is then completely responsible for correct encoding and decoding.
265
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100266==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01002675. Channel commands *channel-commands*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100268
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100269With a JSON channel the process can send commands to Vim that will be
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100270handled by Vim internally, it does not require a handler for the channel.
271
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100272Possible commands are: *E903* *E904* *E905*
273 ["redraw" {forced}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100274 ["ex", {Ex command}]
275 ["normal", {Normal mode command}]
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100276 ["expr", {expression}, {number}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100277 ["expr", {expression}]
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100278 ["call", {func name}, {argument list}, {number}]
279 ["call", {func name}, {argument list}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100280
281With all of these: Be careful what these commands do! You can easily
282interfere with what the user is doing. To avoid trouble use |mode()| to check
283that the editor is in the expected state. E.g., to send keys that must be
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100284inserted as text, not executed as a command:
285 ["ex","if mode() == 'i' | call feedkeys('ClassName') | endif"] ~
286
287Errors in these commands are normally not reported to avoid them messing up
288the display. If you do want to see them, set the 'verbose' option to 3 or
289higher.
290
291
292Command "redraw" ~
293
294The other commands do not update the screen, so that you can send a sequence
295of commands without the cursor moving around. You must end with the "redraw"
296command to show any changed text and show the cursor where it belongs.
297
298The argument is normally an empty string:
299 ["redraw", ""] ~
300To first clear the screen pass "force":
301 ["redraw", "force"] ~
302
303
304Command "ex" ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100305
306The "ex" command is executed as any Ex command. There is no response for
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100307completion or error. You could use functions in an |autoload| script:
308 ["ex","call myscript#MyFunc(arg)"]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100309
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100310You can also use "call |feedkeys()|" to insert any key sequence.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100311
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100312
313Command "normal" ~
314
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100315The "normal" command is executed like with ":normal!", commands are not
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100316mapped. Example to open the folds under the cursor:
317 ["normal" "zO"]
318
319
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100320Command "expr" with response ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100321
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100322The "expr" command can be used to get the result of an expression. For
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100323example, to get the number of lines in the current buffer:
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100324 ["expr","line('$')", -2] ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100325
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100326It will send back the result of the expression:
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100327 [-2, "last line"] ~
328The format is:
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100329 [{number}, {result}]
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100330 *E915*
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100331Here {number} is the same as what was in the request. Use a negative number
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100332to avoid confusion with message that Vim sends. Use a different number on
333every request to be able to match the request with the response.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100334
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100335{result} is the result of the evaluation and is JSON encoded. If the
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100336evaluation fails or the result can't be encoded in JSON it is the string
337"ERROR".
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100338
339
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100340Command "expr" without a response ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100341
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100342This command is similar to "expr" above, but does not send back any response.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100343Example:
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100344 ["expr","setline('$', ['one', 'two', 'three'])"] ~
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100345There is no third argument in the request.
346
347
348Command "call" ~
349
350This is similar to "expr", but instead of passing the whole expression as a
351string this passes the name of a function and a list of arguments. This
352avoids the conversion of the arguments to a string and escaping and
353concatenating them. Example:
354 ["call", "line", ["$"], -2] ~
355
356Leave out the fourth argument if no response is to be sent:
357 ["call", "setline", ["$", ["one", "two", "three"]]] ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100358
359==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003606. Using a RAW or NL channel *channel-raw*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100361
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100362If mode is RAW or NL then a message can be send like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100363 let response = ch_sendraw(channel, {string})
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100364
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100365The {string} is sent as-is. The response will be what can be read from the
366channel right away. Since Vim doesn't know how to recognize the end of the
Bram Moolenaar38a55632016-02-15 22:07:32 +0100367message you need to take care of it yourself. The timeout applies for reading
368the first byte, after that it will not wait for anything more.
369
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100370If mode is "nl" you can send a message in a similar way. You are expected
Bram Moolenaar38a55632016-02-15 22:07:32 +0100371to put in the NL after each message. Thus you can also send several messages
372ending in a NL at once. The response will be the text up to and including the
373first NL. This can also be just the NL for an empty response.
374If no NL was read before the channel timeout an empty string is returned.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100375
376To send a message, without expecting a response: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100377 call ch_sendraw(channel, {string}, 0)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100378The process can send back a response, the channel handler will be called with
379it.
380
381To send a message and letting the response handled by a specific function,
382asynchronously: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100383 call ch_sendraw(channel, {string}, {callback})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100384
Bram Moolenaar38a55632016-02-15 22:07:32 +0100385This {string} can also be JSON, use |json_encode()| to create it and
386|json_decode()| to handle a received JSON message.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100387
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100388It is not possible to use |ch_sendexpr()| on a raw channel.
389
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100390==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003917. More channel functions *channel-more*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100392
Bram Moolenaar38a55632016-02-15 22:07:32 +0100393To obtain the status of a channel: ch_status(channel). The possible results
394are:
395 "fail" Failed to open the channel.
396 "open" The channel can be used.
397 "closed" The channel was closed.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100398
399TODO:
Bram Moolenaar38a55632016-02-15 22:07:32 +0100400To objain the job associated with a channel: ch_getjob(channel)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100401
Bram Moolenaar38a55632016-02-15 22:07:32 +0100402To read one message from a channel: >
403 let output = ch_read(channel)
404This uses the channel timeout. To read without a timeout, just get any
405message that is available: >
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100406 let output = ch_read(channel, {'timeout': 0})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100407When no message was available then the result is v:none for a JSON or JS mode
408channels, an empty string for a RAW or NL channel.
409
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100410To read all output from a RAW channel that is available: >
411 let output = ch_readraw(channel)
Bram Moolenaar38a55632016-02-15 22:07:32 +0100412To read the error output: >
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100413 let output = ch_readraw(channel, {"part": "err"})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100414
415==============================================================================
4168. Starting a job with a channel *job-start* *job*
417
418To start a job and open a channel for stdin/stdout/stderr: >
419 let job = job_start(command, {options})
420
421You can get the channel with: >
422 let channel = job_getchannel(job)
423
424The channel will use NL mode. If you want another mode it's best to specify
425this in {options}. When changing the mode later some text may have already
426been received and not parsed correctly.
427
428If the command produces a line of output that you want to deal with, specify
429a handler for stdout: >
430 let job = job_start(command, {"out-cb": "MyHandler"})
431The function will be called with the channel and a message. You would define
432it like this: >
433 func MyHandler(channel, msg)
434
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100435Without the handler you need to read the output with |ch_read()| or
436|ch_readraw()|.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100437
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100438The handler defined for "out-cb" will not receive stderr. If you want to
Bram Moolenaar38a55632016-02-15 22:07:32 +0100439handle that separately, add an "err-cb" handler: >
440 let job = job_start(command, {"out-cb": "MyHandler",
441 \ "err-cb": "ErrHandler"})
442
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100443If you want to handle both stderr and stdout with one handler use the
444"callback" option: >
445 let job = job_start(command, {"callback": "MyHandler"})
446
Bram Moolenaar38a55632016-02-15 22:07:32 +0100447You can send a message to the command with ch_sendraw(). If the channel is in
448JSON or JS mode you can use ch_sendexpr().
449
450There are several options you can use, see |job-options|.
451
452TODO:
453To run a job and read its output once it is done: >
454
455 let job = job_start({command}, {'exit-cb': 'MyHandler'})
456 func MyHandler(job, status)
457 let channel = job_getchannel()
458 let output = ch_readall(channel)
459 " parse output
460 endfunc
461
462==============================================================================
4639. Starting a job without a channel *job-start-nochannel*
464
465To start another process without creating a channel: >
466 let job = job_start(command, {"in-io": "null", "out-io": "null"})
467
468This starts {command} in the background, Vim does not wait for it to finish.
469
470TODO:
471When Vim sees that neither stdin, stdout or stderr are connected, no channel
472will be created. Often you will want to include redirection in the command to
473avoid it getting stuck.
474
475There are several options you can use, see |job-options|.
476
477TODO: *job-may-start*
478To start a job only when connecting to an address does not work use
479job_maystart('command', {address}, {options}), For Example: >
480 let job = job_maystart(command, address, {"waittime": 1000})
481 let channel = job_gethandle(job)
482
483This comes down to: >
484 let channel = ch_open(address, {"waittime": 0})
485 if ch_status(channel) == "fail"
486 let job = job_start(command)
487 let channel = ch_open(address, {"waittime": 1000})
488 call job_sethandle(channel)
489 endif
490Note that the specified waittime applies to when the job has been started.
491This gives the job some time to make the port available.
492
493==============================================================================
49410. Job options *job-options*
495
496The {options} argument in job_start() is a dictionary. All entries are
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100497optional. Some options can be used after the job has started, using
498job_setoptions(job, {options}). Many options can be used with the channel
499related to the job, using ch_setoptions(channel, {options}).
500See |job_setoptions()| and |ch_setoptions()|.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100501
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100502 *job-callback*
503"callback": handler Callback for something to read on any part of the
504 channel.
505 *job-out-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100506"out-cb": handler Callback for when there is something to read on
507 stdout.
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100508 *job-err-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100509"err-cb": handler Callback for when there is something to read on
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100510 stderr.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100511TODO: *job-close-cb*
512"close-cb": handler Callback for when the channel is closed. Same as
513 "close-cb" on ch_open().
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100514 *job-exit-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100515"exit-cb": handler Callback for when the job ends. The arguments are the
516 job and the exit status.
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100517 Vim checks about every 10 seconds for jobs that ended.
518 The callback can also be triggered by calling
519 |job_status()|.
520 *job-stoponexit*
521"stoponexit": {signal} Send {signal} to the job when Vim exits. See
522 |job_stop()| for possible values.
523"stoponexit": "" Do not stop the job when Vim exits.
524 The default is "term".
525
Bram Moolenaar38a55632016-02-15 22:07:32 +0100526TODO: *job-term*
527"term": "open" Start a terminal and connect the job
528 stdin/stdout/stderr to it.
529
530TODO: *job-in-io*
531"in-io": "null" disconnect stdin
532"in-io": "pipe" stdin is connected to the channel (default)
533"in-io": "file" stdin reads from a file
534"in-file": "/path/file" the file to read from
535
536TODO: *job-out-io*
537"out-io": "null" disconnect stdout
538"out-io": "pipe" stdout is connected to the channel (default)
539"out-io": "file" stdout writes to a file
540"out-file": "/path/file" the file to write to
541"out-io": "buffer" stdout appends to a buffer
542"out-buffer": "name" buffer to append to
543
544TODO: *job-err-io*
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100545"err-io": "out" same type as stdout (default)
Bram Moolenaar38a55632016-02-15 22:07:32 +0100546"err-io": "null" disconnect stderr
547"err-io": "pipe" stderr is connected to the channel
548"err-io": "file" stderr writes to a file
549"err-file": "/path/file" the file to write to
550"err-io": "buffer" stderr appends to a buffer
551"err-buffer": "name" buffer to append to
552
Bram Moolenaar38a55632016-02-15 22:07:32 +0100553==============================================================================
55411. Controlling a job *job-control*
555
556To get the status of a job: >
557 echo job_status(job)
558
559To make a job stop running: >
560 job_stop(job)
561
562This is the normal way to end a job. On Unix it sends a SIGTERM to the job.
563It is possible to use other ways to stop the job, or even send arbitrary
564signals. E.g. to force a job to stop, "kill it": >
565 job_stop(job, "kill")
566
567For more options see |job_stop()|.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100568
569
570 vim:tw=78:ts=8:ft=help:norl: