blob: 1e6eaf5f6444368d649f99bffd45faf539c10e21 [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 Moolenaar187db502016-02-27 14:44:26 +0100133 Note: when writing to a file or buffer NL mode is always used.
134
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100135 *channel-callback*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100136"callback" A function that is called when a message is received that is
137 not handled otherwise. It gets two arguments: the channel
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100138 and the received message. Example: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100139 func Handle(channel, msg)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100140 echo 'Received: ' . a:msg
141 endfunc
Bram Moolenaar38a55632016-02-15 22:07:32 +0100142 let channel = ch_open("localhost:8765", {"callback": "Handle"})
143<
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100144 When "mode" is "json" or "js" the "msg" argument is the body
145 of the received message, converted to Vim types.
146 When "mode" is "nl" the "msg" argument is one message,
147 excluding the NL.
148 When "mode" is "raw" the "msg" argument is the whole message
149 as a string.
150 *out-cb*
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100151"out-cb" A function like "callback" but used for stdout. Only for when
152 the channel uses pipes. When "out-cb" wasn't set the channel
153 callback is used.
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100154 *err-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100155"err-cb" A function like "callback" but used for stderr. Only for when
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100156 the channel uses pipes. When "err-cb" wasn't set the channel
157 callback is used.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100158
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100159 TODO: *close-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100160"close-cb" A function that is called when the channel gets closed, other
161 than by calling ch_close(). It should be defined like this: >
162 func MyCloseHandler(channel)
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100163< *waittime*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100164"waittime" The time to wait for the connection to be made in
Bram Moolenaarf3913272016-02-25 00:00:01 +0100165 milliseconds. A negative number waits forever.
166
167 The default is zero, don't wait, which is useful if a local
168 server is supposed to be running already. On Unix Vim
169 actually uses a 1 msec timeout, that is required on many
170 systems. Use a larger value for a remote server, e.g. 10
171 msec at least.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100172
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100173"timeout" The time to wait for a request when blocking, E.g. when using
174 ch_sendexpr(). In milliseconds. The default is 2000 (2
Bram Moolenaar38a55632016-02-15 22:07:32 +0100175 seconds).
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100176 *out-timeout* *err-timeout*
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100177"out-timeout" Timeout for stdout. Only when using pipes.
178"err-timeout" Timeout for stderr. Only when using pipes.
179 Note: when setting "timeout" the part specific mode is
180 overwritten. Therefore set "timeout" first and the part
181 specific mode later.
182
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100183When "mode" is "json" or "js" the "callback" is optional. When omitted it is
184only possible to receive a message after sending one.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100185
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100186To change the channel options after opening it use |ch_setoptions()|. The
187arguments are similar to what is passed to |ch_open()|, but "waittime" cannot
188be given, since that only applies to opening the channel.
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100189
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100190For example, the handler can be added or changed: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100191 call ch_setoptions(channel, {'callback': callback})
192When "callback" is empty (zero or an empty string) the handler is removed.
193
194The timeout can be changed: >
195 call ch_setoptions(channel, {'timeout': msec})
196<
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100197 *channel-close* *E906*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100198Once done with the channel, disconnect it like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100199 call ch_close(channel)
200When a socket is used this will close the socket for both directions. When
201pipes are used (stdin/stdout/stderr) they are all closed. This might not be
202what you want! Stopping the job with job_stop() might be better.
Bram Moolenaar187db502016-02-27 14:44:26 +0100203All readahead is discarded, callbacks will no longer be invoked.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100204
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100205When the channel can't be opened you will get an error message. There is a
206difference between MS-Windows and Unix: On Unix when the port doesn't exist
207ch_open() fails quickly. On MS-Windows "waittime" applies.
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100208*E898* *E899* *E900* *E901* *E902*
209
210If there is an error reading or writing a channel it will be closed.
211*E896* *E630* *E631*
212
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100213==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01002144. Using a JSON or JS channel *channel-use*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100215
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100216If mode is JSON then a message can be sent synchronously like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100217 let response = ch_sendexpr(channel, {expr})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100218This awaits a response from the other side.
219
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100220When mode is JS this works the same, except that the messages use
Bram Moolenaar38a55632016-02-15 22:07:32 +0100221JavaScript encoding. See |js_encode()| for the difference.
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100222
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100223To send a message, without handling a response or letting the channel callback
224handle the response: >
225 call ch_sendexpr(channel, {expr}, {'callback': 0})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100226
227To send a message and letting the response handled by a specific function,
228asynchronously: >
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100229 call ch_sendexpr(channel, {expr}, {'callback': Handler})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100230
231Vim will match the response with the request using the message ID. Once the
232response is received the callback will be invoked. Further responses with the
233same ID will be ignored. If your server sends back multiple responses you
234need to send them with ID zero, they will be passed to the channel callback.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100235
236The {expr} is converted to JSON and wrapped in an array. An example of the
237message that the receiver will get when {expr} is the string "hello":
238 [12,"hello"] ~
239
240The format of the JSON sent is:
241 [{number},{expr}]
242
243In which {number} is different every time. It must be used in the response
244(if any):
245
246 [{number},{response}]
247
248This way Vim knows which sent message matches with which received message and
249can call the right handler. Also when the messages arrive out of order.
250
251The sender must always send valid JSON to Vim. Vim can check for the end of
252the message by parsing the JSON. It will only accept the message if the end
253was received.
254
255When the process wants to send a message to Vim without first receiving a
256message, it must use the number zero:
257 [0,{response}]
258
259Then channel handler will then get {response} converted to Vim types. If the
260channel does not have a handler the message is dropped.
261
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100262On read error or ch_close(), when using a socket, the string "DETACH" is sent,
Bram Moolenaarf3913272016-02-25 00:00:01 +0100263if still possible. The channel will then be inactive. For a JSON and JS mode
264channel quotes are used around DETACH, otherwise there are no quotes.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100265
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100266It is also possible to use ch_sendraw() on a JSON or JS channel. The caller
267is then completely responsible for correct encoding and decoding.
268
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100269==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01002705. Channel commands *channel-commands*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100271
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100272With a JSON channel the process can send commands to Vim that will be
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100273handled by Vim internally, it does not require a handler for the channel.
274
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100275Possible commands are: *E903* *E904* *E905*
276 ["redraw" {forced}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100277 ["ex", {Ex command}]
278 ["normal", {Normal mode command}]
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100279 ["expr", {expression}, {number}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100280 ["expr", {expression}]
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100281 ["call", {func name}, {argument list}, {number}]
282 ["call", {func name}, {argument list}]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100283
284With all of these: Be careful what these commands do! You can easily
285interfere with what the user is doing. To avoid trouble use |mode()| to check
286that the editor is in the expected state. E.g., to send keys that must be
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100287inserted as text, not executed as a command:
288 ["ex","if mode() == 'i' | call feedkeys('ClassName') | endif"] ~
289
290Errors in these commands are normally not reported to avoid them messing up
291the display. If you do want to see them, set the 'verbose' option to 3 or
292higher.
293
294
295Command "redraw" ~
296
297The other commands do not update the screen, so that you can send a sequence
298of commands without the cursor moving around. You must end with the "redraw"
299command to show any changed text and show the cursor where it belongs.
300
301The argument is normally an empty string:
302 ["redraw", ""] ~
303To first clear the screen pass "force":
304 ["redraw", "force"] ~
305
306
307Command "ex" ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100308
309The "ex" command is executed as any Ex command. There is no response for
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100310completion or error. You could use functions in an |autoload| script:
311 ["ex","call myscript#MyFunc(arg)"]
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100312
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100313You can also use "call |feedkeys()|" to insert any key sequence.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100314
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100315
316Command "normal" ~
317
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100318The "normal" command is executed like with ":normal!", commands are not
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100319mapped. Example to open the folds under the cursor:
320 ["normal" "zO"]
321
322
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100323Command "expr" with response ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100324
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100325The "expr" command can be used to get the result of an expression. For
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100326example, to get the number of lines in the current buffer:
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100327 ["expr","line('$')", -2] ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100328
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100329It will send back the result of the expression:
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100330 [-2, "last line"] ~
331The format is:
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100332 [{number}, {result}]
Bram Moolenaar187db502016-02-27 14:44:26 +0100333
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100334Here {number} is the same as what was in the request. Use a negative number
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100335to avoid confusion with message that Vim sends. Use a different number on
336every request to be able to match the request with the response.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100337
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100338{result} is the result of the evaluation and is JSON encoded. If the
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100339evaluation fails or the result can't be encoded in JSON it is the string
340"ERROR".
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100341
342
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100343Command "expr" without a response ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100344
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100345This command is similar to "expr" above, but does not send back any response.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100346Example:
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100347 ["expr","setline('$', ['one', 'two', 'three'])"] ~
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100348There is no third argument in the request.
349
350
351Command "call" ~
352
353This is similar to "expr", but instead of passing the whole expression as a
354string this passes the name of a function and a list of arguments. This
355avoids the conversion of the arguments to a string and escaping and
356concatenating them. Example:
357 ["call", "line", ["$"], -2] ~
358
359Leave out the fourth argument if no response is to be sent:
360 ["call", "setline", ["$", ["one", "two", "three"]]] ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100361
362==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003636. Using a RAW or NL channel *channel-raw*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100364
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100365If mode is RAW or NL then a message can be send like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100366 let response = ch_sendraw(channel, {string})
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100367
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100368The {string} is sent as-is. The response will be what can be read from the
369channel right away. Since Vim doesn't know how to recognize the end of the
Bram Moolenaar38a55632016-02-15 22:07:32 +0100370message you need to take care of it yourself. The timeout applies for reading
371the first byte, after that it will not wait for anything more.
372
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100373If mode is "nl" you can send a message in a similar way. You are expected
Bram Moolenaar38a55632016-02-15 22:07:32 +0100374to put in the NL after each message. Thus you can also send several messages
375ending in a NL at once. The response will be the text up to and including the
376first NL. This can also be just the NL for an empty response.
377If no NL was read before the channel timeout an empty string is returned.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100378
379To send a message, without expecting a response: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100380 call ch_sendraw(channel, {string}, 0)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100381The process can send back a response, the channel handler will be called with
382it.
383
384To send a message and letting the response handled by a specific function,
385asynchronously: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100386 call ch_sendraw(channel, {string}, {callback})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100387
Bram Moolenaar38a55632016-02-15 22:07:32 +0100388This {string} can also be JSON, use |json_encode()| to create it and
389|json_decode()| to handle a received JSON message.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100390
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100391It is not possible to use |ch_sendexpr()| on a raw channel.
392
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100393==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003947. More channel functions *channel-more*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100395
Bram Moolenaar38a55632016-02-15 22:07:32 +0100396To obtain the status of a channel: ch_status(channel). The possible results
397are:
398 "fail" Failed to open the channel.
399 "open" The channel can be used.
400 "closed" The channel was closed.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100401
402TODO:
Bram Moolenaar187db502016-02-27 14:44:26 +0100403To obtain the job associated with a channel: ch_getjob(channel)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100404
Bram Moolenaar38a55632016-02-15 22:07:32 +0100405To read one message from a channel: >
406 let output = ch_read(channel)
407This uses the channel timeout. To read without a timeout, just get any
408message that is available: >
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100409 let output = ch_read(channel, {'timeout': 0})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100410When no message was available then the result is v:none for a JSON or JS mode
411channels, an empty string for a RAW or NL channel.
412
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100413To read all output from a RAW channel that is available: >
414 let output = ch_readraw(channel)
Bram Moolenaar38a55632016-02-15 22:07:32 +0100415To read the error output: >
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100416 let output = ch_readraw(channel, {"part": "err"})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100417
418==============================================================================
4198. Starting a job with a channel *job-start* *job*
420
421To start a job and open a channel for stdin/stdout/stderr: >
422 let job = job_start(command, {options})
423
424You can get the channel with: >
425 let channel = job_getchannel(job)
426
427The channel will use NL mode. If you want another mode it's best to specify
428this in {options}. When changing the mode later some text may have already
429been received and not parsed correctly.
430
431If the command produces a line of output that you want to deal with, specify
432a handler for stdout: >
433 let job = job_start(command, {"out-cb": "MyHandler"})
434The function will be called with the channel and a message. You would define
435it like this: >
436 func MyHandler(channel, msg)
437
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100438Without the handler you need to read the output with |ch_read()| or
439|ch_readraw()|.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100440
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100441The handler defined for "out-cb" will not receive stderr. If you want to
Bram Moolenaar38a55632016-02-15 22:07:32 +0100442handle that separately, add an "err-cb" handler: >
443 let job = job_start(command, {"out-cb": "MyHandler",
444 \ "err-cb": "ErrHandler"})
445
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100446If you want to handle both stderr and stdout with one handler use the
447"callback" option: >
448 let job = job_start(command, {"callback": "MyHandler"})
449
Bram Moolenaar38a55632016-02-15 22:07:32 +0100450You can send a message to the command with ch_sendraw(). If the channel is in
451JSON or JS mode you can use ch_sendexpr().
452
453There are several options you can use, see |job-options|.
Bram Moolenaar187db502016-02-27 14:44:26 +0100454For example, to start a job and write its output in buffer "dummy": >
455 let logjob = job_start("tail -f /tmp/log",
456 \ {'out-io': 'buffer', 'out-name': 'dummy'})
457 sbuf dummy
Bram Moolenaar38a55632016-02-15 22:07:32 +0100458
459TODO:
460To run a job and read its output once it is done: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100461 let job = job_start({command}, {'exit-cb': 'MyHandler'})
462 func MyHandler(job, status)
463 let channel = job_getchannel()
464 let output = ch_readall(channel)
465 " parse output
466 endfunc
467
468==============================================================================
4699. Starting a job without a channel *job-start-nochannel*
470
471To start another process without creating a channel: >
472 let job = job_start(command, {"in-io": "null", "out-io": "null"})
473
474This starts {command} in the background, Vim does not wait for it to finish.
475
476TODO:
477When Vim sees that neither stdin, stdout or stderr are connected, no channel
478will be created. Often you will want to include redirection in the command to
479avoid it getting stuck.
480
481There are several options you can use, see |job-options|.
482
483TODO: *job-may-start*
484To start a job only when connecting to an address does not work use
485job_maystart('command', {address}, {options}), For Example: >
486 let job = job_maystart(command, address, {"waittime": 1000})
487 let channel = job_gethandle(job)
488
489This comes down to: >
490 let channel = ch_open(address, {"waittime": 0})
491 if ch_status(channel) == "fail"
492 let job = job_start(command)
493 let channel = ch_open(address, {"waittime": 1000})
494 call job_sethandle(channel)
495 endif
496Note that the specified waittime applies to when the job has been started.
497This gives the job some time to make the port available.
498
499==============================================================================
50010. Job options *job-options*
501
502The {options} argument in job_start() is a dictionary. All entries are
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100503optional. Some options can be used after the job has started, using
504job_setoptions(job, {options}). Many options can be used with the channel
505related to the job, using ch_setoptions(channel, {options}).
506See |job_setoptions()| and |ch_setoptions()|.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100507
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100508 *job-callback*
509"callback": handler Callback for something to read on any part of the
510 channel.
511 *job-out-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100512"out-cb": handler Callback for when there is something to read on
513 stdout.
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100514 *job-err-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100515"err-cb": handler Callback for when there is something to read on
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100516 stderr.
Bram Moolenaar187db502016-02-27 14:44:26 +0100517 *job-close-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100518"close-cb": handler Callback for when the channel is closed. Same as
519 "close-cb" on ch_open().
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100520 *job-exit-cb*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100521"exit-cb": handler Callback for when the job ends. The arguments are the
522 job and the exit status.
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100523 Vim checks about every 10 seconds for jobs that ended.
524 The callback can also be triggered by calling
525 |job_status()|.
526 *job-stoponexit*
527"stoponexit": {signal} Send {signal} to the job when Vim exits. See
528 |job_stop()| for possible values.
529"stoponexit": "" Do not stop the job when Vim exits.
530 The default is "term".
531
Bram Moolenaar38a55632016-02-15 22:07:32 +0100532TODO: *job-term*
533"term": "open" Start a terminal and connect the job
534 stdin/stdout/stderr to it.
535
Bram Moolenaar187db502016-02-27 14:44:26 +0100536 *job-in-io*
537"in-io": "null" disconnect stdin TODO
Bram Moolenaar38a55632016-02-15 22:07:32 +0100538"in-io": "pipe" stdin is connected to the channel (default)
Bram Moolenaar187db502016-02-27 14:44:26 +0100539"in-io": "file" stdin reads from a file TODO
540"in-io": "buffer" stdin reads from a buffer TODO
541"in-name": "/path/file" the name of he file or buffer to read from
542"in-buf": number the number of the buffer to read from TODO
Bram Moolenaar38a55632016-02-15 22:07:32 +0100543
Bram Moolenaar187db502016-02-27 14:44:26 +0100544 *job-out-io*
545"out-io": "null" disconnect stdout TODO
Bram Moolenaar38a55632016-02-15 22:07:32 +0100546"out-io": "pipe" stdout is connected to the channel (default)
Bram Moolenaar187db502016-02-27 14:44:26 +0100547"out-io": "file" stdout writes to a file TODO
Bram Moolenaar38a55632016-02-15 22:07:32 +0100548"out-io": "buffer" stdout appends to a buffer
Bram Moolenaar187db502016-02-27 14:44:26 +0100549"out-name": "/path/file" the name of the file or buffer to write to
550"out-buf": number the number of the buffer to write to TODO
Bram Moolenaar38a55632016-02-15 22:07:32 +0100551
Bram Moolenaar187db502016-02-27 14:44:26 +0100552 *job-err-io*
553"err-io": "out" same as stdout TODO
554"err-io": "null" disconnect stderr TODO
555"err-io": "pipe" stderr is connected to the channel (default)
556"err-io": "file" stderr writes to a file TODO
557"err-io": "buffer" stderr appends to a buffer TODO
558"err-name": "/path/file" the name of the file or buffer to write to
559"err-buf": number the number of the buffer to write to TODO
560
561When the IO mode is "buffer" and there is a callback, the text is appended to
562the buffer before invoking the callback.
563 *E915*
564The name of the buffer is compared the full name of existing buffers. If
565there is a match that buffer is used. Otherwise a new buffer is created,
566where 'buftype' is set to "nofile" and 'bufhidden' to "hide". If you prefer
567other settings, create the buffer first and pass the buffer number.
568
569When the buffer written to is displayed in a window and the cursor is in the
570first column of the last line, the cursor will be moved to the newly added
571line and the window is scrolled up to show the cursor if needed.
572
573Undo is synced for every added line.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100574
Bram Moolenaar38a55632016-02-15 22:07:32 +0100575==============================================================================
57611. Controlling a job *job-control*
577
578To get the status of a job: >
579 echo job_status(job)
580
581To make a job stop running: >
582 job_stop(job)
583
584This is the normal way to end a job. On Unix it sends a SIGTERM to the job.
585It is possible to use other ways to stop the job, or even send arbitrary
586signals. E.g. to force a job to stop, "kill it": >
587 job_stop(job, "kill")
588
589For more options see |job_stop()|.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100590
591
592 vim:tw=78:ts=8:ft=help:norl: