blob: c28b90ed2cf9c2345ce8a803b301aec442a6f78e [file] [log] [blame]
Bram Moolenaar9f5842e2016-05-29 16:17:08 +02001*channel.txt* For Vim version 7.4. Last change: 2016 May 29
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
Bram Moolenaar77cdfd12016-03-12 12:57:59 +010047For when using sockets See |job-start|, |job-start-nochannel| and
48|channel-open|. For 2 and 3, one or more jobs using pipes, see |job-start|.
Bram Moolenaar38a55632016-02-15 22:07:32 +010049For 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==============================================================================
Bram Moolenaar26852122016-05-24 20:02:38 +0200642. Channel demo *channel-demo* *demoserver.py*
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 Moolenaar8b1862a2016-02-27 19:21:24 +010077 echo ch_evalexpr(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 Moolenaar8b1862a2016-02-27 19:21:24 +0100104 call ch_sendexpr(channel, 'hello!')
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100105
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100106When trying out channels it's useful to see what is going on. You can tell
107Vim to write lines in log file: >
108 call ch_logfile('channellog', 'w')
109See |ch_logfile()|.
110
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100111==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01001123. Opening a channel *channel-open*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100113
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100114To open a channel: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100115 let channel = ch_open({address} [, {options}])
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100116 if ch_status(channel) == "open"
117 " use the channel
Bram Moolenaar38a55632016-02-15 22:07:32 +0100118
119Use |ch_status()| to see if the channel could be opened.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100120
121{address} has the form "hostname:port". E.g., "localhost:8765".
122
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100123{options} is a dictionary with optional entries: *channel-open-options*
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100124
125"mode" can be: *channel-mode*
126 "json" - Use JSON, see below; most convenient way. Default.
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100127 "js" - Use JS (JavaScript) encoding, more efficient than JSON.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100128 "nl" - Use messages that end in a NL character
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100129 "raw" - Use raw messages
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100130 *channel-callback* *E921*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100131"callback" A function that is called when a message is received that is
132 not handled otherwise. It gets two arguments: the channel
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100133 and the received message. Example: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100134 func Handle(channel, msg)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100135 echo 'Received: ' . a:msg
136 endfunc
Bram Moolenaar38a55632016-02-15 22:07:32 +0100137 let channel = ch_open("localhost:8765", {"callback": "Handle"})
138<
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100139 When "mode" is "json" or "js" the "msg" argument is the body
140 of the received message, converted to Vim types.
141 When "mode" is "nl" the "msg" argument is one message,
142 excluding the NL.
143 When "mode" is "raw" the "msg" argument is the whole message
144 as a string.
Bram Moolenaare18c0b32016-03-20 21:08:34 +0100145
146 For all callbacks: Use |function()| to bind it to arguments
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100147 and/or a Dictionary. Or use the form "dict.function" to bind
148 the Dictionary.
Bram Moolenaar06d2d382016-05-20 17:24:11 +0200149
150 Callbacks are only called at a "safe" moment, usually when Vim
151 is waiting for the user to type a character. Vim does not use
152 multi-threading.
153
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100154 *close_cb*
155"close_cb" A function that is called when the channel gets closed, other
Bram Moolenaar38a55632016-02-15 22:07:32 +0100156 than by calling ch_close(). It should be defined like this: >
157 func MyCloseHandler(channel)
Bram Moolenaar06d2d382016-05-20 17:24:11 +0200158< Vim will invoke callbacks that handle data before invoking
159 close_cb, thus when this function is called no more data will
160 be received.
161 *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 Moolenaar4f3f6682016-03-26 23:01:59 +0100170 *channel-timeout*
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100171"timeout" The time to wait for a request when blocking, E.g. when using
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100172 ch_evalexpr(). In milliseconds. The default is 2000 (2
Bram Moolenaar38a55632016-02-15 22:07:32 +0100173 seconds).
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100174
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100175When "mode" is "json" or "js" the "callback" is optional. When omitted it is
176only possible to receive a message after sending one.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100177
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100178To change the channel options after opening it use |ch_setoptions()|. The
179arguments are similar to what is passed to |ch_open()|, but "waittime" cannot
180be given, since that only applies to opening the channel.
Bram Moolenaar4d919d72016-02-05 22:36:41 +0100181
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100182For example, the handler can be added or changed: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100183 call ch_setoptions(channel, {'callback': callback})
184When "callback" is empty (zero or an empty string) the handler is removed.
185
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100186After a callback has been invoked Vim will update the screen and put the
187cursor back where it belongs. Thus the callback should not need to do
188`:redraw`.
189
Bram Moolenaar38a55632016-02-15 22:07:32 +0100190The timeout can be changed: >
191 call ch_setoptions(channel, {'timeout': msec})
192<
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100193 *channel-close* *E906*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100194Once done with the channel, disconnect it like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100195 call ch_close(channel)
196When a socket is used this will close the socket for both directions. When
197pipes are used (stdin/stdout/stderr) they are all closed. This might not be
198what you want! Stopping the job with job_stop() might be better.
Bram Moolenaar187db502016-02-27 14:44:26 +0100199All readahead is discarded, callbacks will no longer be invoked.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100200
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100201Note that a channel is closed in three stages:
202 - The I/O ends, log message: "Closing channel". There can still be queued
203 messages to read or callbacks to invoke.
204 - The readahead is cleared, log message: "Clearing channel". Some variables
205 may still reference the channel.
206 - The channel is freed, log message: "Freeing channel".
207
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100208When the channel can't be opened you will get an error message. There is a
209difference between MS-Windows and Unix: On Unix when the port doesn't exist
210ch_open() fails quickly. On MS-Windows "waittime" applies.
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +0200211*E898* *E901* *E902*
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100212
213If there is an error reading or writing a channel it will be closed.
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +0200214*E630* *E631*
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100215
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100216==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01002174. Using a JSON or JS channel *channel-use*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100218
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100219If mode is JSON then a message can be sent synchronously like this: >
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100220 let response = ch_evalexpr(channel, {expr})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100221This awaits a response from the other side.
222
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100223When mode is JS this works the same, except that the messages use
Bram Moolenaar38a55632016-02-15 22:07:32 +0100224JavaScript encoding. See |js_encode()| for the difference.
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100225
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100226To send a message, without handling a response or letting the channel callback
227handle the response: >
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100228 call ch_sendexpr(channel, {expr})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100229
230To send a message and letting the response handled by a specific function,
231asynchronously: >
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100232 call ch_sendexpr(channel, {expr}, {'callback': Handler})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100233
234Vim will match the response with the request using the message ID. Once the
235response is received the callback will be invoked. Further responses with the
236same ID will be ignored. If your server sends back multiple responses you
237need to send them with ID zero, they will be passed to the channel callback.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100238
239The {expr} is converted to JSON and wrapped in an array. An example of the
240message that the receiver will get when {expr} is the string "hello":
241 [12,"hello"] ~
242
243The format of the JSON sent is:
244 [{number},{expr}]
245
246In which {number} is different every time. It must be used in the response
247(if any):
248
249 [{number},{response}]
250
251This way Vim knows which sent message matches with which received message and
252can call the right handler. Also when the messages arrive out of order.
253
254The sender must always send valid JSON to Vim. Vim can check for the end of
255the message by parsing the JSON. It will only accept the message if the end
256was received.
257
258When the process wants to send a message to Vim without first receiving a
259message, it must use the number zero:
260 [0,{response}]
261
262Then channel handler will then get {response} converted to Vim types. If the
263channel does not have a handler the message is dropped.
264
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100265It is also possible to use ch_sendraw() and ch_evalraw() on a JSON or JS
266channel. The caller is then completely responsible for correct encoding and
267decoding.
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100268
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 Moolenaar4f3f6682016-03-26 23:01:59 +0100315When there is an error a message is written to the channel log, if it exists,
316and v:errmsg is set to the error.
317
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100318
319Command "normal" ~
320
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100321The "normal" command is executed like with ":normal!", commands are not
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100322mapped. Example to open the folds under the cursor:
323 ["normal" "zO"]
324
325
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100326Command "expr" with response ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100327
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100328The "expr" command can be used to get the result of an expression. For
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100329example, to get the number of lines in the current buffer:
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100330 ["expr","line('$')", -2] ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100331
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100332It will send back the result of the expression:
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100333 [-2, "last line"] ~
334The format is:
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100335 [{number}, {result}]
Bram Moolenaar187db502016-02-27 14:44:26 +0100336
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100337Here {number} is the same as what was in the request. Use a negative number
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100338to avoid confusion with message that Vim sends. Use a different number on
339every request to be able to match the request with the response.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100340
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100341{result} is the result of the evaluation and is JSON encoded. If the
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100342evaluation fails or the result can't be encoded in JSON it is the string
343"ERROR".
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100344
345
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100346Command "expr" without a response ~
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100347
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100348This command is similar to "expr" above, but does not send back any response.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100349Example:
Bram Moolenaarfb1f6262016-01-31 20:24:32 +0100350 ["expr","setline('$', ['one', 'two', 'three'])"] ~
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100351There is no third argument in the request.
352
353
354Command "call" ~
355
356This is similar to "expr", but instead of passing the whole expression as a
357string this passes the name of a function and a list of arguments. This
358avoids the conversion of the arguments to a string and escaping and
359concatenating them. Example:
360 ["call", "line", ["$"], -2] ~
361
362Leave out the fourth argument if no response is to be sent:
363 ["call", "setline", ["$", ["one", "two", "three"]]] ~
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100364
365==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003666. Using a RAW or NL channel *channel-raw*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100367
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100368If mode is RAW or NL then a message can be send like this: >
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100369 let response = ch_evalraw(channel, {string})
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100370
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100371The {string} is sent as-is. The response will be what can be read from the
372channel right away. Since Vim doesn't know how to recognize the end of the
Bram Moolenaar38a55632016-02-15 22:07:32 +0100373message you need to take care of it yourself. The timeout applies for reading
374the first byte, after that it will not wait for anything more.
375
Bram Moolenaar910b8aa2016-02-16 21:03:07 +0100376If mode is "nl" you can send a message in a similar way. You are expected
Bram Moolenaar38a55632016-02-15 22:07:32 +0100377to put in the NL after each message. Thus you can also send several messages
378ending in a NL at once. The response will be the text up to and including the
379first NL. This can also be just the NL for an empty response.
380If no NL was read before the channel timeout an empty string is returned.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100381
382To send a message, without expecting a response: >
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100383 call ch_sendraw(channel, {string})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100384The process can send back a response, the channel handler will be called with
385it.
386
387To send a message and letting the response handled by a specific function,
388asynchronously: >
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100389 call ch_sendraw(channel, {string}, {'callback': 'MyHandler'})
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100390
Bram Moolenaar38a55632016-02-15 22:07:32 +0100391This {string} can also be JSON, use |json_encode()| to create it and
392|json_decode()| to handle a received JSON message.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100393
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100394It is not possible to use |ch_evalexpr()| or |ch_sendexpr()| on a raw channel.
Bram Moolenaarcbebd482016-02-07 23:02:56 +0100395
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100396==============================================================================
Bram Moolenaar38a55632016-02-15 22:07:32 +01003977. More channel functions *channel-more*
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100398
Bram Moolenaar38a55632016-02-15 22:07:32 +0100399To obtain the status of a channel: ch_status(channel). The possible results
400are:
401 "fail" Failed to open the channel.
402 "open" The channel can be used.
Bram Moolenaar06481422016-04-30 15:13:38 +0200403 "buffered" The channel was closed but there is data to read.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100404 "closed" The channel was closed.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100405
Bram Moolenaar187db502016-02-27 14:44:26 +0100406To obtain the job associated with a channel: ch_getjob(channel)
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100407
Bram Moolenaar38a55632016-02-15 22:07:32 +0100408To read one message from a channel: >
409 let output = ch_read(channel)
410This uses the channel timeout. To read without a timeout, just get any
411message that is available: >
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100412 let output = ch_read(channel, {'timeout': 0})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100413When no message was available then the result is v:none for a JSON or JS mode
414channels, an empty string for a RAW or NL channel.
415
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100416To read all output from a RAW channel that is available: >
417 let output = ch_readraw(channel)
Bram Moolenaar38a55632016-02-15 22:07:32 +0100418To read the error output: >
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100419 let output = ch_readraw(channel, {"part": "err"})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100420
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100421ch_read() and ch_readraw() use the channel timeout. When there is nothing to
422read within that time an empty string is returned. To specify a different
423timeout in msec use the "timeout" option:
424 {"timeout": 123} ~
425To read from the error output use the "part" option:
426 {"part": "err"} ~
427To read a message with a specific ID, on a JS or JSON channel:
428 {"id": 99} ~
429When no ID is specified or the ID is -1, the first message is returned. This
430overrules any callback waiting for this message.
431
432For a RAW channel this returns whatever is available, since Vim does not know
433where a message ends.
434For a NL channel this returns one message.
435For a JS or JSON channel this returns one decoded message.
436This includes any sequence number.
437
Bram Moolenaar38a55632016-02-15 22:07:32 +0100438==============================================================================
4398. Starting a job with a channel *job-start* *job*
440
441To start a job and open a channel for stdin/stdout/stderr: >
442 let job = job_start(command, {options})
443
444You can get the channel with: >
445 let channel = job_getchannel(job)
446
447The channel will use NL mode. If you want another mode it's best to specify
448this in {options}. When changing the mode later some text may have already
449been received and not parsed correctly.
450
451If the command produces a line of output that you want to deal with, specify
452a handler for stdout: >
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100453 let job = job_start(command, {"out_cb": "MyHandler"})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100454The function will be called with the channel and a message. You would define
455it like this: >
456 func MyHandler(channel, msg)
457
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100458Without the handler you need to read the output with |ch_read()| or
Bram Moolenaar06481422016-04-30 15:13:38 +0200459|ch_readraw()|. You can do this in the close callback, see |read-in-close-cb|.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100460
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100461The handler defined for "out_cb" will not receive stderr. If you want to
462handle that separately, add an "err_cb" handler: >
463 let job = job_start(command, {"out_cb": "MyHandler",
464 \ "err_cb": "ErrHandler"})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100465
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100466If you want to handle both stderr and stdout with one handler use the
467"callback" option: >
468 let job = job_start(command, {"callback": "MyHandler"})
469
Bram Moolenaar8b1862a2016-02-27 19:21:24 +0100470You can send a message to the command with ch_evalraw(). If the channel is in
471JSON or JS mode you can use ch_evalexpr().
Bram Moolenaar38a55632016-02-15 22:07:32 +0100472
473There are several options you can use, see |job-options|.
Bram Moolenaar187db502016-02-27 14:44:26 +0100474For example, to start a job and write its output in buffer "dummy": >
475 let logjob = job_start("tail -f /tmp/log",
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100476 \ {'out_io': 'buffer', 'out_name': 'dummy'})
Bram Moolenaar187db502016-02-27 14:44:26 +0100477 sbuf dummy
Bram Moolenaar38a55632016-02-15 22:07:32 +0100478
Bram Moolenaar5f148ec2016-03-07 22:59:26 +0100479
480Job input from a buffer ~
481
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100482To run a job that reads from a buffer: >
483 let job = job_start({command},
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100484 \ {'in_io': 'buffer', 'in_name': 'mybuffer'})
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100485<
486 *E915* *E918*
487The buffer is found by name, similar to |bufnr()|. The buffer must exist and
488be loaded when job_start() is called.
489
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100490By default this reads the whole buffer. This can be changed with the "in_top"
491and "in_bot" options.
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100492
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100493A special mode is when "in_top" is set to zero and "in_bot" is not set: Every
Bram Moolenaar5f148ec2016-03-07 22:59:26 +0100494time a line is added to the buffer, the last-but-one line will be send to the
495job stdin. This allows for editing the last line and sending it when pressing
496Enter.
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100497
Bram Moolenaar06481422016-04-30 15:13:38 +0200498
499Reading job output in the close callback ~
500 *read-in-close-cb*
501If the job can take some time and you don't need intermediate results, you can
502add a close callback and read the output there: >
503
504 func! CloseHandler(channel)
505 while ch_status(a:channel) == 'buffered'
506 echomsg ch_read(a:channel)
507 endwhile
508 endfunc
509 let job = job_start(command, {'close_cb': 'CloseHandler'})
510
511You will want to do something more useful than "echomsg".
512
Bram Moolenaar38a55632016-02-15 22:07:32 +0100513==============================================================================
5149. Starting a job without a channel *job-start-nochannel*
515
516To start another process without creating a channel: >
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100517 let job = job_start(command,
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100518 \ {"in_io": "null", "out_io": "null", "err_io": "null"})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100519
520This starts {command} in the background, Vim does not wait for it to finish.
521
Bram Moolenaar38a55632016-02-15 22:07:32 +0100522When Vim sees that neither stdin, stdout or stderr are connected, no channel
523will be created. Often you will want to include redirection in the command to
524avoid it getting stuck.
525
526There are several options you can use, see |job-options|.
527
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100528 *job-start-if-needed*
529To start a job only when connecting to an address does not work, do something
530like this: >
Bram Moolenaar38a55632016-02-15 22:07:32 +0100531 let channel = ch_open(address, {"waittime": 0})
532 if ch_status(channel) == "fail"
533 let job = job_start(command)
534 let channel = ch_open(address, {"waittime": 1000})
Bram Moolenaar38a55632016-02-15 22:07:32 +0100535 endif
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100536
537Note that the waittime for ch_open() gives the job one second to make the port
538available.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100539
540==============================================================================
54110. Job options *job-options*
542
543The {options} argument in job_start() is a dictionary. All entries are
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100544optional. Some options can be used after the job has started, using
545job_setoptions(job, {options}). Many options can be used with the channel
546related to the job, using ch_setoptions(channel, {options}).
547See |job_setoptions()| and |ch_setoptions()|.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100548
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100549 *in_mode* *out_mode* *err_mode*
550"in_mode" mode specifically for stdin, only when using pipes
551"out_mode" mode specifically for stdout, only when using pipes
552"err_mode" mode specifically for stderr, only when using pipes
553 See |channel-mode| for the values.
554
555 Note: when setting "mode" the part specific mode is
556 overwritten. Therefore set "mode" first and the part
557 specific mode later.
558
559 Note: when writing to a file or buffer and when
560 reading from a buffer NL mode is used by default.
561
Bram Moolenaardecb14d2016-02-20 23:32:02 +0100562 *job-callback*
563"callback": handler Callback for something to read on any part of the
564 channel.
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100565 *job-out_cb* *out_cb*
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100566"out_cb": handler Callback for when there is something to read on
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100567 stdout. Only for when the channel uses pipes. When
568 "out_cb" wasn't set the channel callback is used.
569
570 *job-err_cb* *err_cb*
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100571"err_cb": handler Callback for when there is something to read on
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100572 stderr. Only for when the channel uses pipes. When
573 "err_cb" wasn't set the channel callback is used.
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100574 *job-close_cb*
575"close_cb": handler Callback for when the channel is closed. Same as
576 "close_cb" on ch_open().
577 *job-exit_cb*
578"exit_cb": handler Callback for when the job ends. The arguments are the
Bram Moolenaar38a55632016-02-15 22:07:32 +0100579 job and the exit status.
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100580 Vim checks about every 10 seconds for jobs that ended.
Bram Moolenaar9f5842e2016-05-29 16:17:08 +0200581 The check also be triggered by calling |job_status()|,
582 which may then invoke the exit_cb handler.
Bram Moolenaar06d2d382016-05-20 17:24:11 +0200583 Note that data can be buffered, callbacks may still be
584 called after the process ends.
Bram Moolenaar4f3f6682016-03-26 23:01:59 +0100585 *job-timeout*
586"timeout" The time to wait for a request when blocking, E.g.
587 when using ch_evalexpr(). In milliseconds. The
588 default is 2000 (2 seconds).
589 *out_timeout* *err_timeout*
590"out_timeout" Timeout for stdout. Only when using pipes.
591"err_timeout" Timeout for stderr. Only when using pipes.
592 Note: when setting "timeout" the part specific mode is
593 overwritten. Therefore set "timeout" first and the
594 part specific mode later.
595
Bram Moolenaar02e83b42016-02-21 20:10:26 +0100596 *job-stoponexit*
597"stoponexit": {signal} Send {signal} to the job when Vim exits. See
598 |job_stop()| for possible values.
599"stoponexit": "" Do not stop the job when Vim exits.
600 The default is "term".
601
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100602 *job-term*
Bram Moolenaar38a55632016-02-15 22:07:32 +0100603"term": "open" Start a terminal and connect the job
604 stdin/stdout/stderr to it.
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100605 NOTE: Not implemented yet!
Bram Moolenaar38a55632016-02-15 22:07:32 +0100606
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100607"channel": {channel} Use an existing channel instead of creating a new one.
608 The parts of the channel that get used for the new job
609 will be disconnected from what they were used before.
610 If the channel was still use by another job this may
611 cause I/O errors.
612 Existing callbacks and other settings remain.
613
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100614 *job-in_io* *in_top* *in_bot* *in_name* *in_buf*
615"in_io": "null" disconnect stdin (read from /dev/null)
616"in_io": "pipe" stdin is connected to the channel (default)
617"in_io": "file" stdin reads from a file
618"in_io": "buffer" stdin reads from a buffer
619"in_top": number when using "buffer": first line to send (default: 1)
620"in_bot": number when using "buffer": last line to send (default: last)
621"in_name": "/path/file" the name of the file or buffer to read from
622"in_buf": number the number of the buffer to read from
Bram Moolenaar38a55632016-02-15 22:07:32 +0100623
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100624 *job-out_io* *out_name* *out_buf*
625"out_io": "null" disconnect stdout (goes to /dev/null)
626"out_io": "pipe" stdout is connected to the channel (default)
627"out_io": "file" stdout writes to a file
Bram Moolenaar9f5842e2016-05-29 16:17:08 +0200628"out_io": "buffer" stdout appends to a buffer (see below)
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100629"out_name": "/path/file" the name of the file or buffer to write to
630"out_buf": number the number of the buffer to write to
Bram Moolenaar9f5842e2016-05-29 16:17:08 +0200631"out_modifiable": 0 when writing to a buffer, 'modifiable' will be off
632 (see below)
Bram Moolenaar38a55632016-02-15 22:07:32 +0100633
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100634 *job-err_io* *err_name* *err_buf*
635"err_io": "out" stderr messages to go to stdout
636"err_io": "null" disconnect stderr (goes to /dev/null)
637"err_io": "pipe" stderr is connected to the channel (default)
638"err_io": "file" stderr writes to a file
Bram Moolenaar9f5842e2016-05-29 16:17:08 +0200639"err_io": "buffer" stderr appends to a buffer (see below)
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100640"err_name": "/path/file" the name of the file or buffer to write to
641"err_buf": number the number of the buffer to write to
Bram Moolenaar9f5842e2016-05-29 16:17:08 +0200642"err_modifiable": 0 when writing to a buffer, 'modifiable' will be off
643 (see below)
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100644
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +0200645"block_write": number only for testing: pretend every other write to stdin
646 will block
647
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100648
649Writing to a buffer ~
Bram Moolenaar187db502016-02-27 14:44:26 +0100650
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100651When the out_io or err_io mode is "buffer" and there is a callback, the text
Bram Moolenaar5f148ec2016-03-07 22:59:26 +0100652is appended to the buffer before invoking the callback.
653
654When a buffer is used both for input and output, the output lines are put
655above the last line, since the last line is what is written to the channel
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100656input. Otherwise lines are appended below the last line.
Bram Moolenaarc7f0ebc2016-02-27 21:10:09 +0100657
Bram Moolenaar328da0d2016-03-04 22:22:32 +0100658When using JS or JSON mode with "buffer", only messages with zero or negative
659ID will be added to the buffer, after decoding + encoding. Messages with a
660positive number will be handled by a callback, commands are handled as usual.
661
Bram Moolenaar187db502016-02-27 14:44:26 +0100662The name of the buffer is compared the full name of existing buffers. If
Bram Moolenaarc7f0ebc2016-02-27 21:10:09 +0100663there is a match that buffer is used. Otherwise a new buffer is created.
664Use an empty name to always create a new buffer. |ch_getbufnr()| can then be
665used to get the buffer number.
666
667For a new buffer 'buftype' is set to "nofile" and 'bufhidden' to "hide". If
668you prefer other settings, create the buffer first and pass the buffer number.
Bram Moolenaar187db502016-02-27 14:44:26 +0100669
Bram Moolenaar9f5842e2016-05-29 16:17:08 +0200670The "out_modifiable" and "err_modifiable" options can be used to set the
671'modifiable' option off, or write to a buffer that has 'modifiable' off. That
672means that lines will be appended to the buffer, but the user can't easily
673change the buffer.
674
675When an existing buffer is to be written where 'modifiable' is off and the
676"out_modifiable" or "err_modifiable" options is not zero, an error is given
677and the buffer will not be written to.
678
Bram Moolenaar187db502016-02-27 14:44:26 +0100679When the buffer written to is displayed in a window and the cursor is in the
680first column of the last line, the cursor will be moved to the newly added
681line and the window is scrolled up to show the cursor if needed.
682
683Undo is synced for every added line.
Bram Moolenaar38a55632016-02-15 22:07:32 +0100684
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100685
686Writing to a file ~
Bram Moolenaard6c2f052016-03-14 23:22:59 +0100687 *E920*
Bram Moolenaar77cdfd12016-03-12 12:57:59 +0100688The file is created with permissions 600 (read-write for the user, not
689accessible for others). Use |setfperm()| to change this.
690
691If the file already exists it is truncated.
692
Bram Moolenaar38a55632016-02-15 22:07:32 +0100693==============================================================================
69411. Controlling a job *job-control*
695
696To get the status of a job: >
697 echo job_status(job)
698
699To make a job stop running: >
700 job_stop(job)
701
702This is the normal way to end a job. On Unix it sends a SIGTERM to the job.
703It is possible to use other ways to stop the job, or even send arbitrary
704signals. E.g. to force a job to stop, "kill it": >
705 job_stop(job, "kill")
706
707For more options see |job_stop()|.
Bram Moolenaar3b5f9292016-01-28 22:37:01 +0100708
709
710 vim:tw=78:ts=8:ft=help:norl: