1*channel.txt* For Vim version 8.2. Last change: 2020 Oct 17 2 3 4 VIM REFERENCE MANUAL by Bram Moolenaar 5 6 7 Inter-process communication *channel* 8 9Vim uses channels to communicate with other processes. 10A channel uses a socket or pipes. *socket-interface* 11Jobs can be used to start processes and communicate with them. 12The Netbeans interface also uses a channel. |netbeans| 13 141. Overview |job-channel-overview| 152. Channel demo |channel-demo| 163. Opening a channel |channel-open| 174. Using a JSON or JS channel |channel-use| 185. Channel commands |channel-commands| 196. Using a RAW or NL channel |channel-raw| 207. More channel functions |channel-more| 218. Channel functions details |channel-functions-details| 229. Starting a job with a channel |job-start| 2310. Starting a job without a channel |job-start-nochannel| 2411. Job functions |job-functions-details| 2512. Job options |job-options| 2613. Controlling a job |job-control| 2714. Using a prompt buffer |prompt-buffer| 28 29{only when compiled with the |+channel| feature for channel stuff} 30 You can check this with: `has('channel')` 31{only when compiled with the |+job| feature for job stuff} 32 You can check this with: `has('job')` 33 34============================================================================== 351. Overview *job-channel-overview* 36 37There are four main types of jobs: 381. A daemon, 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-start-nochannel| and 48|channel-open|. For 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 daemon, connecting over a socket in JSON mode. E.g. to lookup 61 cross-references in a database. 62 63============================================================================== 642. Channel demo *channel-demo* *demoserver.py* 65 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: > 71 let channel = ch_open('localhost:8765') 72 73In T1 you should see: 74 === socket opened === ~ 75 76You can now send a message to the server: > 77 echo ch_evalexpr(channel, 'hello!') 78 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 87the 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"] ~ 91 92To handle asynchronous communication a callback needs to be used: > 93 func MyHandler(channel, msg) 94 echo "from the handler: " . a:msg 95 endfunc 96 call ch_sendexpr(channel, 'hello!', {'callback': "MyHandler"}) 97Vim will not wait for a response. Now the server can send the response later 98and MyHandler will be invoked. 99 100Instead of giving a callback with every send call, it can also be specified 101when opening the channel: > 102 call ch_close(channel) 103 let channel = ch_open('localhost:8765', {'callback': "MyHandler"}) 104 call ch_sendexpr(channel, 'hello!') 105 106When 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 111============================================================================== 1123. Opening a channel *channel-open* 113 114To open a channel: > 115 let channel = ch_open({address} [, {options}]) 116 if ch_status(channel) == "open" 117 " use the channel 118 119Use |ch_status()| to see if the channel could be opened. 120 121{address} has the form "hostname:port". E.g., "localhost:8765". 122 123When using an IPv6 address, enclose it within square brackets. E.g., 124"[2001:db8::1]:8765". 125 126{options} is a dictionary with optional entries: *channel-open-options* 127 128"mode" can be: *channel-mode* 129 "json" - Use JSON, see below; most convenient way. Default. 130 "js" - Use JS (JavaScript) encoding, more efficient than JSON. 131 "nl" - Use messages that end in a NL character 132 "raw" - Use raw messages 133 *channel-callback* *E921* 134"callback" A function that is called when a message is received that is 135 not handled otherwise. It gets two arguments: the channel 136 and the received message. Example: > 137 func Handle(channel, msg) 138 echo 'Received: ' . a:msg 139 endfunc 140 let channel = ch_open("localhost:8765", {"callback": "Handle"}) 141< 142 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 149 For all callbacks: Use |function()| to bind it to arguments 150 and/or a Dictionary. Or use the form "dict.function" to bind 151 the Dictionary. 152 153 Callbacks are only called at a "safe" moment, usually when Vim 154 is waiting for the user to type a character. Vim does not use 155 multi-threading. 156 157 *close_cb* 158"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) 161< Vim will invoke callbacks that handle data before invoking 162 close_cb, thus when this function is called no more data will 163 be passed to the callbacks. However, if a callback causes Vim 164 to check for messages, the close_cb may be invoked while still 165 in the callback. The plugin must handle this somehow, it can 166 be useful to know that no more data is coming. 167 *channel-drop* 168"drop" Specifies when to drop messages: 169 "auto" When there is no callback to handle a message. 170 The "close_cb" is also considered for this. 171 "never" All messages will be kept. 172 173 *channel-noblock* 174"noblock" Same effect as |job-noblock|. Only matters for writing. 175 176 *waittime* 177"waittime" The time to wait for the connection to be made in 178 milliseconds. A negative number waits forever. 179 180 The default is zero, don't wait, which is useful if a local 181 server is supposed to be running already. On Unix Vim 182 actually uses a 1 msec timeout, that is required on many 183 systems. Use a larger value for a remote server, e.g. 10 184 msec at least. 185 *channel-timeout* 186"timeout" The time to wait for a request when blocking, E.g. when using 187 ch_evalexpr(). In milliseconds. The default is 2000 (2 188 seconds). 189 190When "mode" is "json" or "js" the "callback" is optional. When omitted it is 191only possible to receive a message after sending one. 192 193To change the channel options after opening it use |ch_setoptions()|. The 194arguments are similar to what is passed to |ch_open()|, but "waittime" cannot 195be given, since that only applies to opening the channel. 196 197For example, the handler can be added or changed: > 198 call ch_setoptions(channel, {'callback': callback}) 199When "callback" is empty (zero or an empty string) the handler is removed. 200 201After a callback has been invoked Vim will update the screen and put the 202cursor back where it belongs. Thus the callback should not need to do 203`:redraw`. 204 205The timeout can be changed: > 206 call ch_setoptions(channel, {'timeout': msec}) 207< 208 *channel-close* *E906* 209Once done with the channel, disconnect it like this: > 210 call ch_close(channel) 211When a socket is used this will close the socket for both directions. When 212pipes are used (stdin/stdout/stderr) they are all closed. This might not be 213what you want! Stopping the job with job_stop() might be better. 214All readahead is discarded, callbacks will no longer be invoked. 215 216Note that a channel is closed in three stages: 217 - The I/O ends, log message: "Closing channel". There can still be queued 218 messages to read or callbacks to invoke. 219 - The readahead is cleared, log message: "Clearing channel". Some variables 220 may still reference the channel. 221 - The channel is freed, log message: "Freeing channel". 222 223When the channel can't be opened you will get an error message. There is a 224difference between MS-Windows and Unix: On Unix when the port doesn't exist 225ch_open() fails quickly. On MS-Windows "waittime" applies. 226*E898* *E901* *E902* 227 228If there is an error reading or writing a channel it will be closed. 229*E630* *E631* 230 231============================================================================== 2324. Using a JSON or JS channel *channel-use* 233 234If mode is JSON then a message can be sent synchronously like this: > 235 let response = ch_evalexpr(channel, {expr}) 236This awaits a response from the other side. 237 238When mode is JS this works the same, except that the messages use 239JavaScript encoding. See |js_encode()| for the difference. 240 241To send a message, without handling a response or letting the channel callback 242handle the response: > 243 call ch_sendexpr(channel, {expr}) 244 245To send a message and letting the response handled by a specific function, 246asynchronously: > 247 call ch_sendexpr(channel, {expr}, {'callback': Handler}) 248 249Vim will match the response with the request using the message ID. Once the 250response is received the callback will be invoked. Further responses with the 251same ID will be ignored. If your server sends back multiple responses you 252need to send them with ID zero, they will be passed to the channel callback. 253 254The {expr} is converted to JSON and wrapped in an array. An example of the 255message that the receiver will get when {expr} is the string "hello": 256 [12,"hello"] ~ 257 258The format of the JSON sent is: 259 [{number},{expr}] 260 261In which {number} is different every time. It must be used in the response 262(if any): 263 264 [{number},{response}] 265 266This way Vim knows which sent message matches with which received message and 267can call the right handler. Also when the messages arrive out of order. 268 269A newline character is terminating the JSON text. This can be used to 270separate the read text. For example, in Python: 271 splitidx = read_text.find('\n') 272 message = read_text[:splitidx] 273 rest = read_text[splitidx + 1:] 274 275The sender must always send valid JSON to Vim. Vim can check for the end of 276the message by parsing the JSON. It will only accept the message if the end 277was received. A newline after the message is optional. 278 279When the process wants to send a message to Vim without first receiving a 280message, it must use the number zero: 281 [0,{response}] 282 283Then channel handler will then get {response} converted to Vim types. If the 284channel does not have a handler the message is dropped. 285 286It is also possible to use ch_sendraw() and ch_evalraw() on a JSON or JS 287channel. The caller is then completely responsible for correct encoding and 288decoding. 289 290============================================================================== 2915. Channel commands *channel-commands* 292 293With a JSON channel the process can send commands to Vim that will be 294handled by Vim internally, it does not require a handler for the channel. 295 296Possible commands are: *E903* *E904* *E905* 297 ["redraw", {forced}] 298 ["ex", {Ex command}] 299 ["normal", {Normal mode command}] 300 ["expr", {expression}, {number}] 301 ["expr", {expression}] 302 ["call", {func name}, {argument list}, {number}] 303 ["call", {func name}, {argument list}] 304 305With all of these: Be careful what these commands do! You can easily 306interfere with what the user is doing. To avoid trouble use |mode()| to check 307that the editor is in the expected state. E.g., to send keys that must be 308inserted as text, not executed as a command: 309 ["ex","if mode() == 'i' | call feedkeys('ClassName') | endif"] ~ 310 311Errors in these commands are normally not reported to avoid them messing up 312the display. If you do want to see them, set the 'verbose' option to 3 or 313higher. 314 315 316Command "redraw" ~ 317 318The other commands do not explicitly update the screen, so that you can send a 319sequence of commands without the cursor moving around. A redraw can happen as 320a side effect of some commands. You must end with the "redraw" command to 321show any changed text and show the cursor where it belongs. 322 323The argument is normally an empty string: 324 ["redraw", ""] ~ 325To first clear the screen pass "force": 326 ["redraw", "force"] ~ 327 328 329Command "ex" ~ 330 331The "ex" command is executed as any Ex command. There is no response for 332completion or error. You could use functions in an |autoload| script: 333 ["ex","call myscript#MyFunc(arg)"] 334 335You can also use "call |feedkeys()|" to insert any key sequence. 336 337When there is an error a message is written to the channel log, if it exists, 338and v:errmsg is set to the error. 339 340 341Command "normal" ~ 342 343The "normal" command is executed like with ":normal!", commands are not 344mapped. Example to open the folds under the cursor: 345 ["normal" "zO"] 346 347 348Command "expr" with response ~ 349 350The "expr" command can be used to get the result of an expression. For 351example, to get the number of lines in the current buffer: 352 ["expr","line('$')", -2] ~ 353 354It will send back the result of the expression: 355 [-2, "last line"] ~ 356The format is: 357 [{number}, {result}] 358 359Here {number} is the same as what was in the request. Use a negative number 360to avoid confusion with message that Vim sends. Use a different number on 361every request to be able to match the request with the response. 362 363{result} is the result of the evaluation and is JSON encoded. If the 364evaluation fails or the result can't be encoded in JSON it is the string 365"ERROR". 366 367 368Command "expr" without a response ~ 369 370This command is similar to "expr" above, but does not send back any response. 371Example: 372 ["expr","setline('$', ['one', 'two', 'three'])"] ~ 373There is no third argument in the request. 374 375 376Command "call" ~ 377 378This is similar to "expr", but instead of passing the whole expression as a 379string this passes the name of a function and a list of arguments. This 380avoids the conversion of the arguments to a string and escaping and 381concatenating them. Example: 382 ["call", "line", ["$"], -2] ~ 383 384Leave out the fourth argument if no response is to be sent: 385 ["call", "setline", ["$", ["one", "two", "three"]]] ~ 386 387============================================================================== 3886. Using a RAW or NL channel *channel-raw* 389 390If mode is RAW or NL then a message can be sent like this: > 391 let response = ch_evalraw(channel, {string}) 392 393The {string} is sent as-is. The response will be what can be read from the 394channel right away. Since Vim doesn't know how to recognize the end of the 395message you need to take care of it yourself. The timeout applies for reading 396the first byte, after that it will not wait for anything more. 397 398If mode is "nl" you can send a message in a similar way. You are expected 399to put in the NL after each message. Thus you can also send several messages 400ending in a NL at once. The response will be the text up to and including the 401first NL. This can also be just the NL for an empty response. 402If no NL was read before the channel timeout an empty string is returned. 403 404To send a message, without expecting a response: > 405 call ch_sendraw(channel, {string}) 406The process can send back a response, the channel handler will be called with 407it. 408 409To send a message and letting the response handled by a specific function, 410asynchronously: > 411 call ch_sendraw(channel, {string}, {'callback': 'MyHandler'}) 412 413This {string} can also be JSON, use |json_encode()| to create it and 414|json_decode()| to handle a received JSON message. 415 416It is not possible to use |ch_evalexpr()| or |ch_sendexpr()| on a raw channel. 417 418A String in Vim cannot contain NUL bytes. To send or receive NUL bytes read 419or write from a buffer. See |in_io-buffer| and |out_io-buffer|. 420 421============================================================================== 4227. More channel functions *channel-more* 423 424To obtain the status of a channel: ch_status(channel). The possible results 425are: 426 "fail" Failed to open the channel. 427 "open" The channel can be used. 428 "buffered" The channel was closed but there is data to read. 429 "closed" The channel was closed. 430 431To obtain the job associated with a channel: ch_getjob(channel) 432 433To read one message from a channel: > 434 let output = ch_read(channel) 435This uses the channel timeout. To read without a timeout, just get any 436message that is available: > 437 let output = ch_read(channel, {'timeout': 0}) 438When no message was available then the result is v:none for a JSON or JS mode 439channels, an empty string for a RAW or NL channel. You can use |ch_canread()| 440to check if there is something to read. 441 442Note that when there is no callback, messages are dropped. To avoid that add 443a close callback to the channel. 444 445To read all output from a RAW channel that is available: > 446 let output = ch_readraw(channel) 447To read the error output: > 448 let output = ch_readraw(channel, {"part": "err"}) 449 450ch_read() and ch_readraw() use the channel timeout. When there is nothing to 451read within that time an empty string is returned. To specify a different 452timeout in msec use the "timeout" option: 453 {"timeout": 123} ~ 454To read from the error output use the "part" option: 455 {"part": "err"} ~ 456To read a message with a specific ID, on a JS or JSON channel: 457 {"id": 99} ~ 458When no ID is specified or the ID is -1, the first message is returned. This 459overrules any callback waiting for this message. 460 461For a RAW channel this returns whatever is available, since Vim does not know 462where a message ends. 463For a NL channel this returns one message. 464For a JS or JSON channel this returns one decoded message. 465This includes any sequence number. 466 467============================================================================== 4688. Channel functions details *channel-functions-details* 469 470ch_canread({handle}) *ch_canread()* 471 Return non-zero when there is something to read from {handle}. 472 {handle} can be a Channel or a Job that has a Channel. 473 474 This is useful to read from a channel at a convenient time, 475 e.g. from a timer. 476 477 Note that messages are dropped when the channel does not have 478 a callback. Add a close callback to avoid that. 479 480 Can also be used as a |method|: > 481 GetChannel()->ch_canread() 482 483ch_close({handle}) *ch_close()* 484 Close {handle}. See |channel-close|. 485 {handle} can be a Channel or a Job that has a Channel. 486 A close callback is not invoked. 487 488 Can also be used as a |method|: > 489 GetChannel()->ch_close() 490 491ch_close_in({handle}) *ch_close_in()* 492 Close the "in" part of {handle}. See |channel-close-in|. 493 {handle} can be a Channel or a Job that has a Channel. 494 A close callback is not invoked. 495 496 Can also be used as a |method|: > 497 GetChannel()->ch_close_in() 498 499 500ch_evalexpr({handle}, {expr} [, {options}]) *ch_evalexpr()* 501 Send {expr} over {handle}. The {expr} is encoded 502 according to the type of channel. The function cannot be used 503 with a raw channel. See |channel-use|. 504 {handle} can be a Channel or a Job that has a Channel. 505 *E917* 506 {options} must be a Dictionary. It must not have a "callback" 507 entry. It can have a "timeout" entry to specify the timeout 508 for this specific request. 509 510 ch_evalexpr() waits for a response and returns the decoded 511 expression. When there is an error or timeout it returns an 512 empty string. 513 514 Note that while waiting for the response, Vim handles other 515 messages. You need to make sure this doesn't cause trouble. 516 517 Can also be used as a |method|: > 518 GetChannel()->ch_evalexpr(expr) 519 520 521ch_evalraw({handle}, {string} [, {options}]) *ch_evalraw()* 522 Send {string} over {handle}. 523 {handle} can be a Channel or a Job that has a Channel. 524 525 Works like |ch_evalexpr()|, but does not encode the request or 526 decode the response. The caller is responsible for the 527 correct contents. Also does not add a newline for a channel 528 in NL mode, the caller must do that. The NL in the response 529 is removed. 530 Note that Vim does not know when the text received on a raw 531 channel is complete, it may only return the first part and you 532 need to use |ch_readraw()| to fetch the rest. 533 See |channel-use|. 534 535 Can also be used as a |method|: > 536 GetChannel()->ch_evalraw(rawstring) 537 538ch_getbufnr({handle}, {what}) *ch_getbufnr()* 539 Get the buffer number that {handle} is using for String {what}. 540 {handle} can be a Channel or a Job that has a Channel. 541 {what} can be "err" for stderr, "out" for stdout or empty for 542 socket output. 543 Returns -1 when there is no buffer. 544 545 Can also be used as a |method|: > 546 GetChannel()->ch_getbufnr(what) 547 548ch_getjob({channel}) *ch_getjob()* 549 Get the Job associated with {channel}. 550 If there is no job calling |job_status()| on the returned Job 551 will result in "fail". 552 553 Can also be used as a |method|: > 554 GetChannel()->ch_getjob() 555 556 557ch_info({handle}) *ch_info()* 558 Returns a Dictionary with information about {handle}. The 559 items are: 560 "id" number of the channel 561 "status" "open", "buffered" or "closed", like 562 ch_status() 563 When opened with ch_open(): 564 "hostname" the hostname of the address 565 "port" the port of the address 566 "sock_status" "open" or "closed" 567 "sock_mode" "NL", "RAW", "JSON" or "JS" 568 "sock_io" "socket" 569 "sock_timeout" timeout in msec 570 When opened with job_start(): 571 "out_status" "open", "buffered" or "closed" 572 "out_mode" "NL", "RAW", "JSON" or "JS" 573 "out_io" "null", "pipe", "file" or "buffer" 574 "out_timeout" timeout in msec 575 "err_status" "open", "buffered" or "closed" 576 "err_mode" "NL", "RAW", "JSON" or "JS" 577 "err_io" "out", "null", "pipe", "file" or "buffer" 578 "err_timeout" timeout in msec 579 "in_status" "open" or "closed" 580 "in_mode" "NL", "RAW", "JSON" or "JS" 581 "in_io" "null", "pipe", "file" or "buffer" 582 "in_timeout" timeout in msec 583 584 Can also be used as a |method|: > 585 GetChannel()->ch_info() 586 587 588ch_log({msg} [, {handle}]) *ch_log()* 589 Write String {msg} in the channel log file, if it was opened 590 with |ch_logfile()|. 591 When {handle} is passed the channel number is used for the 592 message. 593 {handle} can be a Channel or a Job that has a Channel. The 594 Channel must be open for the channel number to be used. 595 596 Can also be used as a |method|: > 597 'did something'->ch_log() 598 599 600ch_logfile({fname} [, {mode}]) *ch_logfile()* 601 Start logging channel activity to {fname}. 602 When {fname} is an empty string: stop logging. 603 604 When {mode} is omitted or "a" append to the file. 605 When {mode} is "w" start with an empty file. 606 607 Use |ch_log()| to write log messages. The file is flushed 608 after every message, on Unix you can use "tail -f" to see what 609 is going on in real time. 610 611 To enable the log very early, to see what is received from a 612 terminal during startup, use |--cmd|: > 613 vim --cmd "call ch_logfile('logfile', 'w')" 614< 615 This function is not available in the |sandbox|. 616 NOTE: the channel communication is stored in the file, be 617 aware that this may contain confidential and privacy sensitive 618 information, e.g. a password you type in a terminal window. 619 620 Can also be used as a |method|: > 621 'logfile'->ch_logfile('w') 622 623 624ch_open({address} [, {options}]) *ch_open()* 625 Open a channel to {address}. See |channel|. 626 Returns a Channel. Use |ch_status()| to check for failure. 627 628 {address} is a String and has the form "hostname:port", e.g., 629 "localhost:8765". 630 631 When using an IPv6 address, enclose it within square brackets. 632 E.g., "[2001:db8::1]:8765". 633 634 If {options} is given it must be a |Dictionary|. 635 See |channel-open-options|. 636 637 Can also be used as a |method|: > 638 GetAddress()->ch_open() 639 640 641ch_read({handle} [, {options}]) *ch_read()* 642 Read from {handle} and return the received message. 643 {handle} can be a Channel or a Job that has a Channel. 644 For a NL channel this waits for a NL to arrive, except when 645 there is nothing more to read (channel was closed). 646 See |channel-more|. 647 648 Can also be used as a |method|: > 649 GetChannel()->ch_read() 650 651 652ch_readblob({handle} [, {options}]) *ch_readblob()* 653 Like ch_read() but reads binary data and returns a |Blob|. 654 See |channel-more|. 655 656 Can also be used as a |method|: > 657 GetChannel()->ch_readblob() 658 659 660ch_readraw({handle} [, {options}]) *ch_readraw()* 661 Like ch_read() but for a JS and JSON channel does not decode 662 the message. For a NL channel it does not block waiting for 663 the NL to arrive, but otherwise works like ch_read(). 664 See |channel-more|. 665 666 Can also be used as a |method|: > 667 GetChannel()->ch_readraw() 668 669 670ch_sendexpr({handle}, {expr} [, {options}]) *ch_sendexpr()* 671 Send {expr} over {handle}. The {expr} is encoded 672 according to the type of channel. The function cannot be used 673 with a raw channel. 674 See |channel-use|. *E912* 675 {handle} can be a Channel or a Job that has a Channel. 676 677 Can also be used as a |method|: > 678 GetChannel()->ch_sendexpr(expr) 679 680 681ch_sendraw({handle}, {expr} [, {options}]) *ch_sendraw()* 682 Send |String| or |Blob| {expr} over {handle}. 683 Works like |ch_sendexpr()|, but does not encode the request or 684 decode the response. The caller is responsible for the 685 correct contents. Also does not add a newline for a channel 686 in NL mode, the caller must do that. The NL in the response 687 is removed. 688 See |channel-use|. 689 690 Can also be used as a |method|: > 691 GetChannel()->ch_sendraw(rawexpr) 692 693 694ch_setoptions({handle}, {options}) *ch_setoptions()* 695 Set options on {handle}: 696 "callback" the channel callback 697 "timeout" default read timeout in msec 698 "mode" mode for the whole channel 699 See |ch_open()| for more explanation. 700 {handle} can be a Channel or a Job that has a Channel. 701 702 Note that changing the mode may cause queued messages to be 703 lost. 704 705 These options cannot be changed: 706 "waittime" only applies to |ch_open()| 707 708 Can also be used as a |method|: > 709 GetChannel()->ch_setoptions(options) 710 711 712ch_status({handle} [, {options}]) *ch_status()* 713 Return the status of {handle}: 714 "fail" failed to open the channel 715 "open" channel can be used 716 "buffered" channel can be read, not written to 717 "closed" channel can not be used 718 {handle} can be a Channel or a Job that has a Channel. 719 "buffered" is used when the channel was closed but there is 720 still data that can be obtained with |ch_read()|. 721 722 If {options} is given it can contain a "part" entry to specify 723 the part of the channel to return the status for: "out" or 724 "err". For example, to get the error status: > 725 ch_status(job, {"part": "err"}) 726< 727 Can also be used as a |method|: > 728 GetChannel()->ch_status() 729 730============================================================================== 7319. Starting a job with a channel *job-start* *job* 732 733To start a job and open a channel for stdin/stdout/stderr: > 734 let job = job_start(command, {options}) 735 736You can get the channel with: > 737 let channel = job_getchannel(job) 738 739The channel will use NL mode. If you want another mode it's best to specify 740this in {options}. When changing the mode later some text may have already 741been received and not parsed correctly. 742 743If the command produces a line of output that you want to deal with, specify 744a handler for stdout: > 745 let job = job_start(command, {"out_cb": "MyHandler"}) 746The function will be called with the channel and a message. You would define 747it like this: > 748 func MyHandler(channel, msg) 749 750Without the handler you need to read the output with |ch_read()| or 751|ch_readraw()|. You can do this in the close callback, see |read-in-close-cb|. 752 753Note that if the job exits before you read the output, the output may be lost. 754This depends on the system (on Unix this happens because closing the write end 755of a pipe causes the read end to get EOF). To avoid this make the job sleep 756for a short while before it exits. 757 758The handler defined for "out_cb" will not receive stderr. If you want to 759handle that separately, add an "err_cb" handler: > 760 let job = job_start(command, {"out_cb": "MyHandler", 761 \ "err_cb": "ErrHandler"}) 762 763If you want to handle both stderr and stdout with one handler use the 764"callback" option: > 765 let job = job_start(command, {"callback": "MyHandler"}) 766 767Depending on the system, starting a job can put Vim in the background, the 768started job gets the focus. To avoid that, use the `foreground()` function. 769This might not always work when called early, put in the callback handler or 770use a timer to call it after the job has started. 771 772You can send a message to the command with ch_evalraw(). If the channel is in 773JSON or JS mode you can use ch_evalexpr(). 774 775There are several options you can use, see |job-options|. 776For example, to start a job and write its output in buffer "dummy": > 777 let logjob = job_start("tail -f /tmp/log", 778 \ {'out_io': 'buffer', 'out_name': 'dummy'}) 779 sbuf dummy 780 781 782Job input from a buffer ~ 783 *in_io-buffer* 784To run a job that reads from a buffer: > 785 let job = job_start({command}, 786 \ {'in_io': 'buffer', 'in_name': 'mybuffer'}) 787< 788 *E915* *E918* 789The buffer is found by name, similar to |bufnr()|. The buffer must exist and 790be loaded when job_start() is called. 791 792By default this reads the whole buffer. This can be changed with the "in_top" 793and "in_bot" options. 794 795A special mode is when "in_top" is set to zero and "in_bot" is not set: Every 796time a line is added to the buffer, the last-but-one line will be sent to the 797job stdin. This allows for editing the last line and sending it when pressing 798Enter. 799 *channel-close-in* 800When not using the special mode the pipe or socket will be closed after the 801last line has been written. This signals the reading end that the input 802finished. You can also use |ch_close_in()| to close it sooner. 803 804NUL bytes in the text will be passed to the job (internally Vim stores these 805as NL bytes). 806 807 808Reading job output in the close callback ~ 809 *read-in-close-cb* 810If the job can take some time and you don't need intermediate results, you can 811add a close callback and read the output there: > 812 813 func! CloseHandler(channel) 814 while ch_status(a:channel, {'part': 'out'}) == 'buffered' 815 echomsg ch_read(a:channel) 816 endwhile 817 endfunc 818 let job = job_start(command, {'close_cb': 'CloseHandler'}) 819 820You will want to do something more useful than "echomsg". 821 822============================================================================== 82310. Starting a job without a channel *job-start-nochannel* 824 825To start another process without creating a channel: > 826 let job = job_start(command, 827 \ {"in_io": "null", "out_io": "null", "err_io": "null"}) 828 829This starts {command} in the background, Vim does not wait for it to finish. 830 831When Vim sees that neither stdin, stdout or stderr are connected, no channel 832will be created. Often you will want to include redirection in the command to 833avoid it getting stuck. 834 835There are several options you can use, see |job-options|. 836 837 *job-start-if-needed* 838To start a job only when connecting to an address does not work, do something 839like this: > 840 let channel = ch_open(address, {"waittime": 0}) 841 if ch_status(channel) == "fail" 842 let job = job_start(command) 843 let channel = ch_open(address, {"waittime": 1000}) 844 endif 845 846Note that the waittime for ch_open() gives the job one second to make the port 847available. 848 849============================================================================== 85011. Job functions *job-functions-details* 851 852job_getchannel({job}) *job_getchannel()* 853 Get the channel handle that {job} is using. 854 To check if the job has no channel: > 855 if string(job_getchannel(job)) == 'channel fail' 856< 857 Can also be used as a |method|: > 858 GetJob()->job_getchannel() 859 860job_info([{job}]) *job_info()* 861 Returns a Dictionary with information about {job}: 862 "status" what |job_status()| returns 863 "channel" what |job_getchannel()| returns 864 "cmd" List of command arguments used to start the job 865 "process" process ID 866 "tty_in" terminal input name, empty when none 867 "tty_out" terminal output name, empty when none 868 "exitval" only valid when "status" is "dead" 869 "exit_cb" function to be called on exit 870 "stoponexit" |job-stoponexit| 871 872 Only in Unix: 873 "termsig" the signal which terminated the process 874 (See |job_stop()| for the values) 875 only valid when "status" is "dead" 876 877 Only in MS-Windows: 878 "tty_type" Type of virtual console in use. 879 Values are "winpty" or "conpty". 880 See 'termwintype'. 881 882 Without any arguments, returns a List with all Job objects. 883 884 Can also be used as a |method|: > 885 GetJob()->job_info() 886 887 888job_setoptions({job}, {options}) *job_setoptions()* 889 Change options for {job}. Supported are: 890 "stoponexit" |job-stoponexit| 891 "exit_cb" |job-exit_cb| 892 893 Can also be used as a |method|: > 894 GetJob()->job_setoptions(options) 895 896 897job_start({command} [, {options}]) *job_start()* 898 Start a job and return a Job object. Unlike |system()| and 899 |:!cmd| this does not wait for the job to finish. 900 To start a job in a terminal window see |term_start()|. 901 902 If the job fails to start then |job_status()| on the returned 903 Job object results in "fail" and none of the callbacks will be 904 invoked. 905 906 {command} can be a String. This works best on MS-Windows. On 907 Unix it is split up in white-separated parts to be passed to 908 execvp(). Arguments in double quotes can contain white space. 909 910 {command} can be a List, where the first item is the executable 911 and further items are the arguments. All items are converted 912 to String. This works best on Unix. 913 914 On MS-Windows, job_start() makes a GUI application hidden. If 915 want to show it, Use |:!start| instead. 916 917 The command is executed directly, not through a shell, the 918 'shell' option is not used. To use the shell: > 919 let job = job_start(["/bin/sh", "-c", "echo hello"]) 920< Or: > 921 let job = job_start('/bin/sh -c "echo hello"') 922< Note that this will start two processes, the shell and the 923 command it executes. If you don't want this use the "exec" 924 shell command. 925 926 On Unix $PATH is used to search for the executable only when 927 the command does not contain a slash. 928 929 The job will use the same terminal as Vim. If it reads from 930 stdin the job and Vim will be fighting over input, that 931 doesn't work. Redirect stdin and stdout to avoid problems: > 932 let job = job_start(['sh', '-c', "myserver </dev/null >/dev/null"]) 933< 934 The returned Job object can be used to get the status with 935 |job_status()| and stop the job with |job_stop()|. 936 937 Note that the job object will be deleted if there are no 938 references to it. This closes the stdin and stderr, which may 939 cause the job to fail with an error. To avoid this keep a 940 reference to the job. Thus instead of: > 941 call job_start('my-command') 942< use: > 943 let myjob = job_start('my-command') 944< and unlet "myjob" once the job is not needed or is past the 945 point where it would fail (e.g. when it prints a message on 946 startup). Keep in mind that variables local to a function 947 will cease to exist if the function returns. Use a 948 script-local variable if needed: > 949 let s:myjob = job_start('my-command') 950< 951 {options} must be a Dictionary. It can contain many optional 952 items, see |job-options|. 953 954 Can also be used as a |method|: > 955 BuildCommand()->job_start() 956 957 958job_status({job}) *job_status()* *E916* 959 Returns a String with the status of {job}: 960 "run" job is running 961 "fail" job failed to start 962 "dead" job died or was stopped after running 963 964 On Unix a non-existing command results in "dead" instead of 965 "fail", because a fork happens before the failure can be 966 detected. 967 968 If in Vim9 script a variable is declared with type "job" but 969 never assigned to, passing that variable to job_status() 970 returns "fail". 971 972 If an exit callback was set with the "exit_cb" option and the 973 job is now detected to be "dead" the callback will be invoked. 974 975 For more information see |job_info()|. 976 977 Can also be used as a |method|: > 978 GetJob()->job_status() 979 980 981job_stop({job} [, {how}]) *job_stop()* 982 Stop the {job}. This can also be used to signal the job. 983 984 When {how} is omitted or is "term" the job will be terminated. 985 For Unix SIGTERM is sent. On MS-Windows the job will be 986 terminated forcedly (there is no "gentle" way). 987 This goes to the process group, thus children may also be 988 affected. 989 990 Effect for Unix: 991 "term" SIGTERM (default) 992 "hup" SIGHUP 993 "quit" SIGQUIT 994 "int" SIGINT 995 "kill" SIGKILL (strongest way to stop) 996 number signal with that number 997 998 Effect for MS-Windows: 999 "term" terminate process forcedly (default) 1000 "hup" CTRL_BREAK 1001 "quit" CTRL_BREAK 1002 "int" CTRL_C 1003 "kill" terminate process forcedly 1004 Others CTRL_BREAK 1005 1006 On Unix the signal is sent to the process group. This means 1007 that when the job is "sh -c command" it affects both the shell 1008 and the command. 1009 1010 The result is a Number: 1 if the operation could be executed, 1011 0 if "how" is not supported on the system. 1012 Note that even when the operation was executed, whether the 1013 job was actually stopped needs to be checked with 1014 |job_status()|. 1015 1016 If the status of the job is "dead", the signal will not be 1017 sent. This is to avoid to stop the wrong job (esp. on Unix, 1018 where process numbers are recycled). 1019 1020 When using "kill" Vim will assume the job will die and close 1021 the channel. 1022 1023 Can also be used as a |method|: > 1024 GetJob()->job_stop() 1025 1026 1027============================================================================== 102812. Job options *job-options* 1029 1030The {options} argument in job_start() is a dictionary. All entries are 1031optional. Some options can be used after the job has started, using 1032job_setoptions(job, {options}). Many options can be used with the channel 1033related to the job, using ch_setoptions(channel, {options}). 1034See |job_setoptions()| and |ch_setoptions()|. 1035 1036 *in_mode* *out_mode* *err_mode* 1037"in_mode" mode specifically for stdin, only when using pipes 1038"out_mode" mode specifically for stdout, only when using pipes 1039"err_mode" mode specifically for stderr, only when using pipes 1040 See |channel-mode| for the values. 1041 1042 Note: when setting "mode" the part specific mode is 1043 overwritten. Therefore set "mode" first and the part 1044 specific mode later. 1045 1046 Note: when writing to a file or buffer and when 1047 reading from a buffer NL mode is used by default. 1048 1049 *job-noblock* 1050"noblock": 1 When writing use a non-blocking write call. This 1051 avoids getting stuck if Vim should handle other 1052 messages in between, e.g. when a job sends back data 1053 to Vim. It implies that when `ch_sendraw()` returns 1054 not all data may have been written yet. 1055 This option was added in patch 8.1.0350, test with: > 1056 if has("patch-8.1.350") 1057 let options['noblock'] = 1 1058 endif 1059< 1060 *job-callback* 1061"callback": handler Callback for something to read on any part of the 1062 channel. 1063 *job-out_cb* *out_cb* 1064"out_cb": handler Callback for when there is something to read on 1065 stdout. Only for when the channel uses pipes. When 1066 "out_cb" wasn't set the channel callback is used. 1067 The two arguments are the channel and the message. 1068 1069 *job-err_cb* *err_cb* 1070"err_cb": handler Callback for when there is something to read on 1071 stderr. Only for when the channel uses pipes. When 1072 "err_cb" wasn't set the channel callback is used. 1073 The two arguments are the channel and the message. 1074 *job-close_cb* 1075"close_cb": handler Callback for when the channel is closed. Same as 1076 "close_cb" on |ch_open()|, see |close_cb|. 1077 *job-drop* 1078"drop": when Specifies when to drop messages. Same as "drop" on 1079 |ch_open()|, see |channel-drop|. For "auto" the 1080 exit_cb is not considered. 1081 *job-exit_cb* 1082"exit_cb": handler Callback for when the job ends. The arguments are the 1083 job and the exit status. 1084 Vim checks up to 10 times per second for jobs that 1085 ended. The check can also be triggered by calling 1086 |job_status()|, which may then invoke the exit_cb 1087 handler. 1088 Note that data can be buffered, callbacks may still be 1089 called after the process ends. 1090 *job-timeout* 1091"timeout": time The time to wait for a request when blocking, E.g. 1092 when using ch_evalexpr(). In milliseconds. The 1093 default is 2000 (2 seconds). 1094 *out_timeout* *err_timeout* 1095"out_timeout": time Timeout for stdout. Only when using pipes. 1096"err_timeout": time Timeout for stderr. Only when using pipes. 1097 Note: when setting "timeout" the part specific mode is 1098 overwritten. Therefore set "timeout" first and the 1099 part specific mode later. 1100 1101 *job-stoponexit* 1102"stoponexit": {signal} Send {signal} to the job when Vim exits. See 1103 |job_stop()| for possible values. 1104"stoponexit": "" Do not stop the job when Vim exits. 1105 The default is "term". 1106 1107 *job-term* 1108"term": "open" Start a terminal in a new window and connect the job 1109 stdin/stdout/stderr to it. Similar to using 1110 `:terminal`. 1111 NOTE: Not implemented yet! 1112 1113"channel": {channel} Use an existing channel instead of creating a new one. 1114 The parts of the channel that get used for the new job 1115 will be disconnected from what they were used before. 1116 If the channel was still used by another job this may 1117 cause I/O errors. 1118 Existing callbacks and other settings remain. 1119 1120"pty": 1 Use a pty (pseudo-tty) instead of a pipe when 1121 possible. This is most useful in combination with a 1122 terminal window, see |terminal|. 1123 {only on Unix and Unix-like systems} 1124 1125 *job-in_io* *in_top* *in_bot* *in_name* *in_buf* 1126"in_io": "null" disconnect stdin (read from /dev/null) 1127"in_io": "pipe" stdin is connected to the channel (default) 1128"in_io": "file" stdin reads from a file 1129"in_io": "buffer" stdin reads from a buffer 1130"in_top": number when using "buffer": first line to send (default: 1) 1131"in_bot": number when using "buffer": last line to send (default: last) 1132"in_name": "/path/file" the name of the file or buffer to read from 1133"in_buf": number the number of the buffer to read from 1134 1135 *job-out_io* *out_name* *out_buf* 1136"out_io": "null" disconnect stdout (goes to /dev/null) 1137"out_io": "pipe" stdout is connected to the channel (default) 1138"out_io": "file" stdout writes to a file 1139"out_io": "buffer" stdout appends to a buffer (see below) 1140"out_name": "/path/file" the name of the file or buffer to write to 1141"out_buf": number the number of the buffer to write to 1142"out_modifiable": 0 when writing to a buffer, 'modifiable' will be off 1143 (see below) 1144"out_msg": 0 when writing to a new buffer, the first line will be 1145 set to "Reading from channel output..." 1146 1147 *job-err_io* *err_name* *err_buf* 1148"err_io": "out" stderr messages to go to stdout 1149"err_io": "null" disconnect stderr (goes to /dev/null) 1150"err_io": "pipe" stderr is connected to the channel (default) 1151"err_io": "file" stderr writes to a file 1152"err_io": "buffer" stderr appends to a buffer (see below) 1153"err_name": "/path/file" the name of the file or buffer to write to 1154"err_buf": number the number of the buffer to write to 1155"err_modifiable": 0 when writing to a buffer, 'modifiable' will be off 1156 (see below) 1157"err_msg": 0 when writing to a new buffer, the first line will be 1158 set to "Reading from channel error..." 1159 1160"block_write": number only for testing: pretend every other write to stdin 1161 will block 1162 1163"env": dict environment variables for the new process 1164"cwd": "/path/to/dir" current working directory for the new process; 1165 if the directory does not exist an error is given 1166 1167 1168Writing to a buffer ~ 1169 *out_io-buffer* 1170When the out_io or err_io mode is "buffer" and there is a callback, the text 1171is appended to the buffer before invoking the callback. 1172 1173When a buffer is used both for input and output, the output lines are put 1174above the last line, since the last line is what is written to the channel 1175input. Otherwise lines are appended below the last line. 1176 1177When using JS or JSON mode with "buffer", only messages with zero or negative 1178ID will be added to the buffer, after decoding + encoding. Messages with a 1179positive number will be handled by a callback, commands are handled as usual. 1180 1181The name of the buffer from "out_name" or "err_name" is compared the full name 1182of existing buffers, also after expanding the name for the current directory. 1183E.g., when a buffer was created with ":edit somename" and the buffer name is 1184"somename" it will use that buffer. 1185 1186If there is no matching buffer a new buffer is created. Use an empty name to 1187always create a new buffer. |ch_getbufnr()| can then be used to get the 1188buffer number. 1189 1190For a new buffer 'buftype' is set to "nofile" and 'bufhidden' to "hide". If 1191you prefer other settings, create the buffer first and pass the buffer number. 1192 *out_modifiable* *err_modifiable* 1193The "out_modifiable" and "err_modifiable" options can be used to set the 1194'modifiable' option off, or write to a buffer that has 'modifiable' off. That 1195means that lines will be appended to the buffer, but the user can't easily 1196change the buffer. 1197 *out_msg* *err_msg* 1198The "out_msg" option can be used to specify whether a new buffer will have the 1199first line set to "Reading from channel output...". The default is to add the 1200message. "err_msg" does the same for channel error. 1201 1202When an existing buffer is to be written where 'modifiable' is off and the 1203"out_modifiable" or "err_modifiable" options is not zero, an error is given 1204and the buffer will not be written to. 1205 1206When the buffer written to is displayed in a window and the cursor is in the 1207first column of the last line, the cursor will be moved to the newly added 1208line and the window is scrolled up to show the cursor if needed. 1209 1210Undo is synced for every added line. NUL bytes are accepted (internally Vim 1211stores these as NL bytes). 1212 1213 1214Writing to a file ~ 1215 *E920* 1216The file is created with permissions 600 (read-write for the user, not 1217accessible for others). Use |setfperm()| to change this. 1218 1219If the file already exists it is truncated. 1220 1221============================================================================== 122213. Controlling a job *job-control* 1223 1224To get the status of a job: > 1225 echo job_status(job) 1226 1227To make a job stop running: > 1228 job_stop(job) 1229 1230This is the normal way to end a job. On Unix it sends a SIGTERM to the job. 1231It is possible to use other ways to stop the job, or even send arbitrary 1232signals. E.g. to force a job to stop, "kill it": > 1233 job_stop(job, "kill") 1234 1235For more options see |job_stop()|. 1236 1237============================================================================== 123814. Using a prompt buffer *prompt-buffer* 1239 1240If you want to type input for the job in a Vim window you have a few options: 1241- Use a normal buffer and handle all possible commands yourself. 1242 This will be complicated, since there are so many possible commands. 1243- Use a terminal window. This works well if what you type goes directly to 1244 the job and the job output is directly displayed in the window. 1245 See |terminal-window|. 1246- Use a window with a prompt buffer. This works well when entering a line for 1247 the job in Vim while displaying (possibly filtered) output from the job. 1248 1249A prompt buffer is created by setting 'buftype' to "prompt". You would 1250normally only do that in a newly created buffer. 1251 1252The user can edit and enter one line of text at the very last line of the 1253buffer. When pressing Enter in the prompt line the callback set with 1254|prompt_setcallback()| is invoked. It would normally send the line to a job. 1255Another callback would receive the output from the job and display it in the 1256buffer, below the prompt (and above the next prompt). 1257 1258Only the text in the last line, after the prompt, is editable. The rest of the 1259buffer is not modifiable with Normal mode commands. It can be modified by 1260calling functions, such as |append()|. Using other commands may mess up the 1261buffer. 1262 1263After setting 'buftype' to "prompt" Vim does not automatically start Insert 1264mode, use `:startinsert` if you want to enter Insert mode, so that the user 1265can start typing a line. 1266 1267The text of the prompt can be set with the |prompt_setprompt()| function. If 1268no prompt is set with |prompt_setprompt()|, "% " is used. You can get the 1269effective prompt text for a buffer, with |prompt_getprompt()|. 1270 1271The user can go to Normal mode and navigate through the buffer. This can be 1272useful to see older output or copy text. 1273 1274The CTRL-W key can be used to start a window command, such as CTRL-W w to 1275switch to the next window. This also works in Insert mode (use Shift-CTRL-W 1276to delete a word). When leaving the window Insert mode will be stopped. When 1277coming back to the prompt window Insert mode will be restored. 1278 1279Any command that starts Insert mode, such as "a", "i", "A" and "I", will move 1280the cursor to the last line. "A" will move to the end of the line, "I" to the 1281start of the line. 1282 1283Here is an example for Unix. It starts a shell in the background and prompts 1284for the next shell command. Output from the shell is displayed above the 1285prompt. > 1286 1287 " Create a channel log so we can see what happens. 1288 call ch_logfile('logfile', 'w') 1289 1290 " Function handling a line of text has been typed. 1291 func TextEntered(text) 1292 " Send the text to a shell with Enter appended. 1293 call ch_sendraw(g:shell_job, a:text .. "\n") 1294 endfunc 1295 1296 " Function handling output from the shell: Added above the prompt. 1297 func GotOutput(channel, msg) 1298 call append(line("$") - 1, "- " . a:msg) 1299 endfunc 1300 1301 " Function handling the shell exist: close the window. 1302 func JobExit(job, status) 1303 quit! 1304 endfunc 1305 1306 " Start a shell in the background. 1307 let shell_job = job_start(["/bin/sh"], #{ 1308 \ out_cb: function('GotOutput'), 1309 \ err_cb: function('GotOutput'), 1310 \ exit_cb: function('JobExit'), 1311 \ }) 1312 let shell_ch = job_getchannel(shell_job) 1313 1314 new 1315 set buftype=prompt 1316 let buf = bufnr('') 1317 call prompt_setcallback(buf, function("TextEntered")) 1318 eval prompt_setprompt(buf, "shell command: ") 1319 1320 " start accepting shell commands 1321 startinsert 1322< 1323 1324 1325 vim:tw=78:ts=8:noet:ft=help:norl: 1326