diff --git a/Filelist b/Filelist index 4fa57b2525..bff9501d32 100644 --- a/Filelist +++ b/Filelist @@ -262,7 +262,6 @@ SRC_DOS_UNIX = \ src/if_python3.c \ src/if_py_both.h \ src/if_ruby.c \ - src/if_sniff.h \ src/if_tcl.c \ src/proto/if_cscope.pro \ src/proto/if_lua.pro \ @@ -455,7 +454,6 @@ SRC_EXTRA = \ $(SRC_VMS) \ README_os390.txt \ src/Make_mint.mak \ - src/if_sniff.c \ src/infplist.xml \ src/link.390 \ src/os_beos.c \ diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt index 0f329648a3..80a269ad15 100644 --- a/runtime/doc/channel.txt +++ b/runtime/doc/channel.txt @@ -1,4 +1,4 @@ -*channel.txt* For Vim version 7.4. Last change: 2016 Feb 23 +*channel.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -74,7 +74,7 @@ In T1 you should see: === socket opened === ~ You can now send a message to the server: > - echo ch_sendexpr(channel, 'hello!') + echo ch_evalexpr(channel, 'hello!') The message is received in T1 and a response is sent back to Vim. You can see the raw messages in T1. What Vim sends is: @@ -101,7 +101,7 @@ Instead of giving a callback with every send call, it can also be specified when opening the channel: > call ch_close(channel) let channel = ch_open('localhost:8765', {'callback': "MyHandler"}) - call ch_sendexpr(channel, 'hello!', {'callback': 0}) + call ch_sendexpr(channel, 'hello!') ============================================================================== 3. Opening a channel *channel-open* @@ -130,6 +130,8 @@ Use |ch_status()| to see if the channel could be opened. overwritten. Therefore set "mode" first and the part specific mode later. + Note: when writing to a file or buffer NL mode is always used. + *channel-callback* "callback" A function that is called when a message is received that is not handled otherwise. It gets two arguments: the channel @@ -169,7 +171,7 @@ Use |ch_status()| to see if the channel could be opened. msec at least. "timeout" The time to wait for a request when blocking, E.g. when using - ch_sendexpr(). In milliseconds. The default is 2000 (2 + ch_evalexpr(). In milliseconds. The default is 2000 (2 seconds). *out-timeout* *err-timeout* "out-timeout" Timeout for stdout. Only when using pipes. @@ -198,6 +200,7 @@ Once done with the channel, disconnect it like this: > When a socket is used this will close the socket for both directions. When pipes are used (stdin/stdout/stderr) they are all closed. This might not be what you want! Stopping the job with job_stop() might be better. +All readahead is discarded, callbacks will no longer be invoked. When the channel can't be opened you will get an error message. There is a difference between MS-Windows and Unix: On Unix when the port doesn't exist @@ -211,7 +214,7 @@ If there is an error reading or writing a channel it will be closed. 4. Using a JSON or JS channel *channel-use* If mode is JSON then a message can be sent synchronously like this: > - let response = ch_sendexpr(channel, {expr}) + let response = ch_evalexpr(channel, {expr}) This awaits a response from the other side. When mode is JS this works the same, except that the messages use @@ -219,7 +222,7 @@ JavaScript encoding. See |js_encode()| for the difference. To send a message, without handling a response or letting the channel callback handle the response: > - call ch_sendexpr(channel, {expr}, {'callback': 0}) + call ch_sendexpr(channel, {expr}) To send a message and letting the response handled by a specific function, asynchronously: > @@ -260,8 +263,9 @@ On read error or ch_close(), when using a socket, the string "DETACH" is sent, if still possible. The channel will then be inactive. For a JSON and JS mode channel quotes are used around DETACH, otherwise there are no quotes. -It is also possible to use ch_sendraw() on a JSON or JS channel. The caller -is then completely responsible for correct encoding and decoding. +It is also possible to use ch_sendraw() and ch_evalraw() on a JSON or JS +channel. The caller is then completely responsible for correct encoding and +decoding. ============================================================================== 5. Channel commands *channel-commands* @@ -327,7 +331,7 @@ It will send back the result of the expression: [-2, "last line"] ~ The format is: [{number}, {result}] - *E915* + Here {number} is the same as what was in the request. Use a negative number to avoid confusion with message that Vim sends. Use a different number on every request to be able to match the request with the response. @@ -360,7 +364,7 @@ Leave out the fourth argument if no response is to be sent: 6. Using a RAW or NL channel *channel-raw* If mode is RAW or NL then a message can be send like this: > - let response = ch_sendraw(channel, {string}) + let response = ch_evalraw(channel, {string}) The {string} is sent as-is. The response will be what can be read from the channel right away. Since Vim doesn't know how to recognize the end of the @@ -374,18 +378,18 @@ first NL. This can also be just the NL for an empty response. If no NL was read before the channel timeout an empty string is returned. To send a message, without expecting a response: > - call ch_sendraw(channel, {string}, 0) + call ch_sendraw(channel, {string}) The process can send back a response, the channel handler will be called with it. To send a message and letting the response handled by a specific function, asynchronously: > - call ch_sendraw(channel, {string}, {callback}) + call ch_sendraw(channel, {string}, {'callback': 'MyHandler'}) This {string} can also be JSON, use |json_encode()| to create it and |json_decode()| to handle a received JSON message. -It is not possible to use |ch_sendexpr()| on a raw channel. +It is not possible to use |ch_evalexpr()| or |ch_sendexpr()| on a raw channel. ============================================================================== 7. More channel functions *channel-more* @@ -397,7 +401,7 @@ are: "closed" The channel was closed. TODO: -To objain the job associated with a channel: ch_getjob(channel) +To obtain the job associated with a channel: ch_getjob(channel) To read one message from a channel: > let output = ch_read(channel) @@ -444,14 +448,17 @@ If you want to handle both stderr and stdout with one handler use the "callback" option: > let job = job_start(command, {"callback": "MyHandler"}) -You can send a message to the command with ch_sendraw(). If the channel is in -JSON or JS mode you can use ch_sendexpr(). +You can send a message to the command with ch_evalraw(). If the channel is in +JSON or JS mode you can use ch_evalexpr(). There are several options you can use, see |job-options|. +For example, to start a job and write its output in buffer "dummy": > + let logjob = job_start("tail -f /tmp/log", + \ {'out-io': 'buffer', 'out-name': 'dummy'}) + sbuf dummy TODO: To run a job and read its output once it is done: > - let job = job_start({command}, {'exit-cb': 'MyHandler'}) func MyHandler(job, status) let channel = job_getchannel() @@ -508,7 +515,7 @@ See |job_setoptions()| and |ch_setoptions()|. *job-err-cb* "err-cb": handler Callback for when there is something to read on stderr. -TODO: *job-close-cb* + *job-close-cb* "close-cb": handler Callback for when the channel is closed. Same as "close-cb" on ch_open(). *job-exit-cb* @@ -527,28 +534,47 @@ TODO: *job-term* "term": "open" Start a terminal and connect the job stdin/stdout/stderr to it. -TODO: *job-in-io* -"in-io": "null" disconnect stdin + *job-in-io* +"in-io": "null" disconnect stdin TODO "in-io": "pipe" stdin is connected to the channel (default) -"in-io": "file" stdin reads from a file -"in-file": "/path/file" the file to read from +"in-io": "file" stdin reads from a file TODO +"in-io": "buffer" stdin reads from a buffer TODO +"in-name": "/path/file" the name of he file or buffer to read from +"in-buf": number the number of the buffer to read from TODO -TODO: *job-out-io* -"out-io": "null" disconnect stdout + *job-out-io* +"out-io": "null" disconnect stdout TODO "out-io": "pipe" stdout is connected to the channel (default) -"out-io": "file" stdout writes to a file -"out-file": "/path/file" the file to write to +"out-io": "file" stdout writes to a file TODO "out-io": "buffer" stdout appends to a buffer -"out-buffer": "name" buffer to append to - -TODO: *job-err-io* -"err-io": "out" same type as stdout (default) -"err-io": "null" disconnect stderr -"err-io": "pipe" stderr is connected to the channel -"err-io": "file" stderr writes to a file -"err-file": "/path/file" the file to write to -"err-io": "buffer" stderr appends to a buffer -"err-buffer": "name" buffer to append to +"out-name": "/path/file" the name of the file or buffer to write to +"out-buf": number the number of the buffer to write to TODO + + *job-err-io* +"err-io": "out" same as stdout TODO +"err-io": "null" disconnect stderr TODO +"err-io": "pipe" stderr is connected to the channel (default) +"err-io": "file" stderr writes to a file TODO +"err-io": "buffer" stderr appends to a buffer TODO +"err-name": "/path/file" the name of the file or buffer to write to +"err-buf": number the number of the buffer to write to TODO + +When the IO mode is "buffer" and there is a callback, the text is appended to +the buffer before invoking the callback. + +The name of the buffer is compared the full name of existing buffers. If +there is a match that buffer is used. Otherwise a new buffer is created. +Use an empty name to always create a new buffer. |ch_getbufnr()| can then be +used to get the buffer number. + +For a new buffer 'buftype' is set to "nofile" and 'bufhidden' to "hide". If +you prefer other settings, create the buffer first and pass the buffer number. + +When the buffer written to is displayed in a window and the cursor is in the +first column of the last line, the cursor will be moved to the newly added +line and the window is scrolled up to show the cursor if needed. + +Undo is synced for every added line. ============================================================================== 11. Controlling a job *job-control* diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index d55580366e..5df3c99749 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.4. Last change: 2016 Feb 23 +*eval.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1818,6 +1818,11 @@ call( {func}, {arglist} [, {dict}]) any call {func} with arguments {arglist} ceil( {expr}) Float round {expr} up ch_close( {channel}) none close {channel} +ch_evalexpr( {channel}, {expr} [, {options}]) + any evaluate {expr} on JSON {channel} +ch_evalraw( {channel}, {string} [, {options}]) + any evaluate {string} on raw {channel} +ch_getbufnr( {channel}, {what}) Number get buffer number for {channel}/{what} ch_getjob( {channel}) Job get the Job of {channel} ch_log( {msg} [, {channel}]) none write {msg} in the channel log file ch_logfile( {fname} [, {mode}]) none start logging channel activity @@ -2692,6 +2697,38 @@ ch_close({channel}) *ch_close()* Close {channel}. See |channel-close|. {only available when compiled with the |+channel| feature} +ch_evalexpr({channel}, {expr} [, {options}]) *ch_evalexpr()* + Send {expr} over {channel}. The {expr} is encoded + according to the type of channel. The function cannot be used + with a raw channel. See |channel-use|. + *E917* + {options} must be a Dictionary. It must not have a "callback" + entry. + + ch_evalexpr() waits for a response and returns the decoded + expression. When there is an error or timeout it returns an + empty string. + + {only available when compiled with the |+channel| feature} + +ch_evalraw({channel}, {string} [, {options}]) *ch_evalraw()* + Send {string} over {channel}. + Works like |ch_evalexpr()|, but does not encode the request or + decode the response. The caller is responsible for the + correct contents. Also does not add a newline for a channel + in NL mode, the caller must do that. The NL in the response + is removed. + See |channel-use|. + + {only available when compiled with the |+channel| feature} + +ch_getbufnr({channel}, {what}) *ch_getbufnr()* + Get the buffer number that {channel} is using for {what}. + {what} can be "err" for stderr, "out" for stdout or empty for + socket output. + Returns -1 when there is no buffer. + {only available when compiled with the |+channel| feature} + ch_getjob({channel}) *ch_getjob()* Get the Job associated with {channel}. If there is no job calling |job_status()| on the returned Job @@ -2767,18 +2804,13 @@ ch_readraw({channel} [, {options}]) *ch_readraw()* ch_sendexpr({channel}, {expr} [, {options}]) *ch_sendexpr()* Send {expr} over {channel}. The {expr} is encoded according to the type of channel. The function cannot be used - with a raw channel. See |channel-use|. *E912* - - {options} must be a Dictionary. - When "callback" is a Funcref or the name of a function, - ch_sendexpr() returns immediately. The callback is invoked - when the response is received. See |channel-callback|. - - Without "callback" ch_sendexpr() waits for a response and - returns the decoded expression. When there is an error or - timeout it returns an empty string. + with a raw channel. See |channel-use|. *E912* - When "callback" is zero no response is expected. + {options} must be a Dictionary. The "callback" item is a + Funcref or the name of a function it is invoked when the + response is received. See |channel-callback|. + Without "callback" the channel handler is invoked, otherwise + any received message is dropped. {only available when compiled with the |+channel| feature} @@ -4561,6 +4593,8 @@ json_encode({expr}) *json_encode()* Vim values are converted as follows: Number decimal number Float floating point number + Float nan "NaN" + Float inf "Infinity" String in double quotes (possibly null) Funcref not possible, error List as an array (possibly null); when @@ -4571,13 +4605,9 @@ json_encode({expr}) *json_encode()* v:true "true" v:none "null" v:null "null" - Note that using v:none is permitted, although the JSON - standard does not allow empty items. This can be useful for - omitting items in an array: - [0,,,,,5] ~ - This is much more efficient than: - [0,null,null,null,null,5] ~ - But a strict JSON parser will not accept it. + Note that NaN and Infinity are passed on as values. This is + missing in the JSON standard, but several implementations do + allow it. If not then you will get an error. keys({dict}) *keys()* Return a |List| with all the keys of {dict}. The |List| is in @@ -7396,7 +7426,6 @@ scrollbind Compiled with 'scrollbind' support. showcmd Compiled with 'showcmd' support. signs Compiled with |:sign| support. smartindent Compiled with 'smartindent' support. -sniff Compiled with SNiFF interface support. spell Compiled with spell checking support |spell|. startuptime Compiled with |--startuptime| support. statusline Compiled with support for 'statusline', 'rulerformat' diff --git a/runtime/doc/help.txt b/runtime/doc/help.txt index 8331d36a57..d7b0643b0a 100644 --- a/runtime/doc/help.txt +++ b/runtime/doc/help.txt @@ -1,4 +1,4 @@ -*help.txt* For Vim version 7.4. Last change: 2016 Feb 22 +*help.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM - main help file k @@ -165,7 +165,6 @@ Interfaces ~ |if_mzsch.txt| MzScheme interface |if_perl.txt| Perl interface |if_pyth.txt| Python interface -|if_sniff.txt| SNiFF+ interface |if_tcl.txt| Tcl interface |if_ole.txt| OLE automation interface for Win32 |if_ruby.txt| Ruby interface diff --git a/runtime/doc/if_sniff.txt b/runtime/doc/if_sniff.txt index a3d52085f2..6feaa53da5 100644 --- a/runtime/doc/if_sniff.txt +++ b/runtime/doc/if_sniff.txt @@ -1,95 +1,11 @@ -*if_sniff.txt* For Vim version 7.4. Last change: 2005 Mar 29 +*if_sniff.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Anton Leherbauer (toni@takefive.co.at) -SNiFF+ and Vim *sniff* - -1. Introduction |sniff-intro| -2. Commands |sniff-commands| -3. Compiling Vim with SNiFF+ interface |sniff-compiling| - -{Vi does not have any of these commands} *E275* *E274* *E276* *E278* *E279* - -The SNiFF+ interface only works, when Vim was compiled with the |+sniff| -feature. - -============================================================================== -1. Introduction *sniff-intro* - -The following features for the use with SNiFF+ are available: - - * Vim can be used for all editing requests - * SNiFF+ recognizes and updates all browsers when a file is saved in Vim - * SNiFF+ commands can be issued directly from Vim - -How to use Vim with SNiFF+ - 1. Make sure SNiFF+ is running. - 2. In the Editor view of the Preferences dialog set the Field named - 'External Editor' to 'Emacs/Vim'. - 4. Start Vim - 5. Connect to SNiFF+ (:sniff connect) - -Once a connection is established, SNiFF+ uses Vim for all requests to show or -edit source code. On the other hand, you can send queries to SNiFF+ with the -:sniff command. - -============================================================================== -2. Commands *sniff-commands* - - *:sniff* *:sni* -:sni[ff] request [symbol] Send request to sniff with optional symbol. - {not in Vi} -:sni[ff] Display all possible requests and the connection - status - -Most requests require a symbol (identifier) as parameter. If it is omitted, -Vim will use the current word under the cursor. -The available requests are listed below: - -request mapping description -------------------------------------------------------------------------------- -connect sc Establish connection with SNiFF+. - Make sure SNiFF+ is prepared for this in the - Preferences -disconnect sq Disconnect from SNiFF+. You can reconnect any - time with :sniff connect (or 'sc') -toggle st Toggle between implementation - and definition file -find-symbol sf Load the symbol into a Symbol Browser -browse-class sb Loads the class into a Class Browser -superclass ss Edit superclass of symbol -overridden so Edit overridden method of symbol -retrieve-file srf Retrieve symbol in current file -retrieve-project srp Retrieve symbol in current project -retrieve-all-projects srP Retrieve symbol in all projects -retrieve-next sR Retrieve symbol using current Retriever - settings -goto-symbol sg Goto definition or implementation of symbol -hierarchy sh Load symbol into the Hierarchy Browser -restr-hier sH same as above but show only related classes -xref-to sxt Start a refers-to query on symbol and - load the results into the Cross Referencer -xref-by sxb Start a referred-by query on symbol -xref-has sxh Start a refers-to components query on symbol -xref-used-by sxu Start a referred-by as component query on - symbol -show-docu sd Show documentation of symbol -gen-docu sD Generate documentation of symbol - -The mappings are defined in a file 'sniff.vim', which is part of every SNiFF+ -product ($SNIFF_DIR/config/sniff.vim). This file is sourced whenever Vim -connects to SNiFF+. - -============================================================================== -3. Compiling Vim with SNiFF+ interface *sniff-compiling* - -To compile Vim with SNiFF+ support, you need two source files of the extra -archive: if_sniff.c and if_sniff.h. -On Unix: Edit the Makefile and uncomment the line "--enable-sniff". Or run -configure manually with this argument. -On NT: Specify SNIFF=yes with your make command. +The SNiFF+ support was removed at patch 7.4.1433. If you want to check it out +sync to before that. vim:tw=78:ts=8:ft=help:norl: diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index f86f79ac00..6562f45248 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1,4 +1,4 @@ -*index.txt* For Vim version 7.4. Last change: 2016 Feb 24 +*index.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1501,7 +1501,6 @@ tag command action ~ |:smile| :smi[le] make the user happy |:snext| :sn[ext] split window and go to next file in the argument list -|:sniff| :sni[ff] send request to sniff |:snomagic| :sno[magic] :substitute with 'nomagic' |:snoremap| :snor[emap] like ":noremap" but for Select mode |:snoremenu| :snoreme[nu] like ":noremenu" but for Select mode diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt index 84afe2f2b1..56745f3967 100644 --- a/runtime/doc/message.txt +++ b/runtime/doc/message.txt @@ -1,4 +1,4 @@ -*message.txt* For Vim version 7.4. Last change: 2013 Feb 23 +*message.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -476,8 +476,6 @@ in memory, you can reduce that with these options: helps for a change that affects all lines. - 'undoreload' Set to zero to disable. -Also see |msdos-limitations|. - *E339* > Pattern too long diff --git a/runtime/doc/os_390.txt b/runtime/doc/os_390.txt index 5e564d8416..3bd1df9ce8 100644 --- a/runtime/doc/os_390.txt +++ b/runtime/doc/os_390.txt @@ -1,4 +1,4 @@ -*os_390.txt* For Vim version 7.4. Last change: 2010 May 30 +*os_390.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Ralf Schandl @@ -108,7 +108,6 @@ Never tested: - Langmap (|'langmap'|) - Python support (|Python|) - Right-to-left mode (|'rightleft'|) - - SNiFF+ interface (|sniff|) - TCL interface (|tcl|) ... diff --git a/runtime/doc/repeat.txt b/runtime/doc/repeat.txt index db1ec9bad0..711b138902 100644 --- a/runtime/doc/repeat.txt +++ b/runtime/doc/repeat.txt @@ -1,4 +1,4 @@ -*repeat.txt* For Vim version 7.4. Last change: 2016 Feb 24 +*repeat.txt* For Vim version 7.4. Last change: 2016 Feb 26 VIM REFERENCE MANUAL by Bram Moolenaar @@ -221,6 +221,10 @@ For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|. 'runtimepath'. And the directory found is added to 'runtimepath'. + If you have a directory under 'packpath' that doesn't + actually have a plugin file, just create an empty one. + This will still add the directory to 'runtimepath'. + Note that {name} is the directory name, not the name of the .vim file. If the "{name}/plugin" directory contains more than one file they are all sourced. @@ -564,7 +568,7 @@ Additionally, these commands can be used: About the additional commands in debug mode: - There is no command-line completion for them, you get the completion for the normal Ex commands only. -- You can shorten them, up to a single character, unless more then one command +- You can shorten them, up to a single character, unless more than one command starts with the same letter. "f" stands for "finish", use "fr" for "frame". - Hitting will repeat the previous one. When doing another command, this is reset (because it's not clear what you want to repeat). diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index 1548394c6a..7d3ece3684 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -1,4 +1,4 @@ -*starting.txt* For Vim version 7.4. Last change: 2016 Feb 21 +*starting.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -414,9 +414,10 @@ a slash. Thus "-R" means recovery and "-/R" readonly. not needed, because Vim will be able to find out what type of terminal you are using. (See |terminal-info|.) {not in Vi} + *--not-a-term* --not-a-term Tells Vim that the user knows that the input and/or output is not connected to a terminal. This will avoid the warning and - the two second delay that would happen. + the two second delay that would happen. {not in Vi} *-d* -d Start in diff mode, like |vimdiff|. @@ -1153,7 +1154,7 @@ There are several ways to exit Vim: - Use `:cquit`. Also when there are changes. When using `:cquit` or when there was an error message Vim exits with exit -code 1. Errors can be avoide by using `:silent!`. +code 1. Errors can be avoided by using `:silent!`. ============================================================================== 8. Saving settings *save-settings* diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index b6d52721b7..998abaa324 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 7.4. Last change: 2016 Feb 24 +*syntax.txt* For Vim version 7.4. Last change: 2016 Feb 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2890,7 +2890,7 @@ You may wish to embed languages into sh. I'll give an example courtesy of Lorance Stinson on how to do this with awk as an example. Put the following file into $HOME/.vim/after/syntax/sh/awkembed.vim: > - " AWK Embedding: {{{1 + " AWK Embedding: " ============== " Shamelessly ripped from aspperl.vim by Aaron Hope. if exists("b:current_syntax") diff --git a/runtime/doc/tags b/runtime/doc/tags index 42e1e244b9..6176cc0b27 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -1290,7 +1290,6 @@ $VIM_POSIX vi_diff.txt /*$VIM_POSIX* +scrollbind various.txt /*+scrollbind* +signs various.txt /*+signs* +smartindent various.txt /*+smartindent* -+sniff various.txt /*+sniff* +startuptime various.txt /*+startuptime* +statusline various.txt /*+statusline* +sun_workshop various.txt /*+sun_workshop* @@ -1342,6 +1341,7 @@ $VIM_POSIX vi_diff.txt /*$VIM_POSIX* --literal starting.txt /*--literal* --nofork starting.txt /*--nofork* --noplugin starting.txt /*--noplugin* +--not-a-term starting.txt /*--not-a-term* --remote remote.txt /*--remote* --remote-expr remote.txt /*--remote-expr* --remote-send remote.txt /*--remote-send* @@ -2883,8 +2883,6 @@ $VIM_POSIX vi_diff.txt /*$VIM_POSIX* :smile index.txt /*:smile* :sn windows.txt /*:sn* :snext windows.txt /*:snext* -:sni if_sniff.txt /*:sni* -:sniff if_sniff.txt /*:sniff* :sno change.txt /*:sno* :snomagic change.txt /*:snomagic* :snor map.txt /*:snor* @@ -3617,7 +3615,6 @@ D change.txt /*D* DOS os_dos.txt /*DOS* DOS-format editing.txt /*DOS-format* DOS-format-write editing.txt /*DOS-format-write* -DPMI os_msdos.txt /*DPMI* Dictionaries eval.txt /*Dictionaries* Dictionary eval.txt /*Dictionary* Dictionary-function eval.txt /*Dictionary-function* @@ -3810,12 +3807,7 @@ E270 if_ruby.txt /*E270* E271 if_ruby.txt /*E271* E272 if_ruby.txt /*E272* E273 if_ruby.txt /*E273* -E274 if_sniff.txt /*E274* -E275 if_sniff.txt /*E275* -E276 if_sniff.txt /*E276* E277 remote.txt /*E277* -E278 if_sniff.txt /*E278* -E279 if_sniff.txt /*E279* E28 syntax.txt /*E28* E280 if_tcl.txt /*E280* E281 if_tcl.txt /*E281* @@ -3998,11 +3990,6 @@ E447 editing.txt /*E447* E448 various.txt /*E448* E449 eval.txt /*E449* E45 message.txt /*E45* -E450 os_msdos.txt /*E450* -E451 os_msdos.txt /*E451* -E452 os_msdos.txt /*E452* -E453 os_msdos.txt /*E453* -E454 os_msdos.txt /*E454* E455 print.txt /*E455* E456 print.txt /*E456* E457 print.txt /*E457* @@ -4500,8 +4487,8 @@ E911 eval.txt /*E911* E912 eval.txt /*E912* E913 eval.txt /*E913* E914 eval.txt /*E914* -E915 channel.txt /*E915* E916 eval.txt /*E916* +E917 eval.txt /*E917* E92 message.txt /*E92* E93 windows.txt /*E93* E94 windows.txt /*E94* @@ -5228,6 +5215,9 @@ cc change.txt /*cc* ceil() eval.txt /*ceil()* ch.vim syntax.txt /*ch.vim* ch_close() eval.txt /*ch_close()* +ch_evalexpr() eval.txt /*ch_evalexpr()* +ch_evalraw() eval.txt /*ch_evalraw()* +ch_getbufnr() eval.txt /*ch_getbufnr()* ch_getjob() eval.txt /*ch_getjob()* ch_log() eval.txt /*ch_log()* ch_logfile() eval.txt /*ch_logfile()* @@ -5666,8 +5656,6 @@ dos-locations os_dos.txt /*dos-locations* dos-shell os_dos.txt /*dos-shell* dos-standard-mappings os_dos.txt /*dos-standard-mappings* dos-temp-files os_dos.txt /*dos-temp-files* -dos16 os_msdos.txt /*dos16* -dos32 os_msdos.txt /*dos32* dosbatch.vim syntax.txt /*dosbatch.vim* double-click term.txt /*double-click* download intro.txt /*download* @@ -7206,7 +7194,6 @@ message.txt message.txt /*message.txt* messages message.txt /*messages* meta intro.txt /*meta* min() eval.txt /*min()* -minimal-features os_msdos.txt /*minimal-features* missing-options vi_diff.txt /*missing-options* mkdir() eval.txt /*mkdir()* mlang.txt mlang.txt /*mlang.txt* @@ -7237,18 +7224,7 @@ mouse_win-variable eval.txt /*mouse_win-variable* movement intro.txt /*movement* ms-dos os_msdos.txt /*ms-dos* msdos os_msdos.txt /*msdos* -msdos-arrows os_msdos.txt /*msdos-arrows* -msdos-clipboard-limits os_msdos.txt /*msdos-clipboard-limits* -msdos-compiling os_msdos.txt /*msdos-compiling* -msdos-copy-paste os_msdos.txt /*msdos-copy-paste* -msdos-fname-extensions os_msdos.txt /*msdos-fname-extensions* -msdos-limitations os_msdos.txt /*msdos-limitations* -msdos-linked-files os_msdos.txt /*msdos-linked-files* -msdos-longfname os_msdos.txt /*msdos-longfname* msdos-mode gui_w32.txt /*msdos-mode* -msdos-problems os_msdos.txt /*msdos-problems* -msdos-termcap os_msdos.txt /*msdos-termcap* -msdos-versions os_msdos.txt /*msdos-versions* msql.vim syntax.txt /*msql.vim* mswin.vim gui_w32.txt /*mswin.vim* multi-byte mbyte.txt /*multi-byte* @@ -8138,10 +8114,6 @@ slice eval.txt /*slice* slow-fast-terminal term.txt /*slow-fast-terminal* slow-start starting.txt /*slow-start* slow-terminal term.txt /*slow-terminal* -sniff if_sniff.txt /*sniff* -sniff-commands if_sniff.txt /*sniff-commands* -sniff-compiling if_sniff.txt /*sniff-compiling* -sniff-intro if_sniff.txt /*sniff-intro* socket-interface channel.txt /*socket-interface* sort() eval.txt /*sort()* sorting change.txt /*sorting* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index f8f9104d8c..ecfc9e5170 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.4. Last change: 2016 Feb 24 +*todo.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -35,10 +35,6 @@ not be repeated below, unless there is extra information. -------------------- Known bugs and current work ----------------------- +channel: -- don't free channel if there are callbacks. - netbeans channel leaks? -- job_stop() on MS-Windows: "term" should probably do the same as "kill". -- Make JSON encode and decode NaN and Infinity. - A callback on ch_sendraw() should be put at the end of the list of callback handlers. When a message arrives invoke the first one and remove it. - implement TODO items in ":help channel": @@ -72,11 +68,14 @@ not be repeated below, unless there is extra information. - Add a test where ["eval","getline(123)"] gets a line with special characters (NUL, 0x80, etc.). Check that it isn't garbled. - make sure errors lead to a useful error msg. ["ex","foobar"] -- json: implement UTF-16 surrogate pair. - For connection to server, a "keep open" flag would be useful. Retry connecting in the main loop with zero timeout. -Remove the sniff interface? Looks like it's dead. +For Win32 isinf() should be inline. (ZyX) + +Add ":packadd"? Like :loadplugin but only adds the dir to 'runtimepath'. + +emoji patch from Yasuhiro Matsumoto. More plugin support: - Have a way to install a callback from the main loop. Called every second or @@ -169,6 +168,9 @@ Feb 9) Patch to put undo options together in undo window. (Gary Johnson, 2016 Jan 28) +Patch to have better check for {action} argument of setqflist(). +Nikolai Pavlov, Feb 25, #661. Can be even more strict. + Patch for clearing history. (Yegappan Lakshmanan, 2016 Jan 31, second message has tests) @@ -1563,8 +1565,6 @@ still delete them. Also convert all buffer file names? Update src/testdir/main.aap. -"vim -c 'sniff connect'" hangs Vim. (Dominique Pelle, 2008 Dec 7) - Something wrong with session that has "cd" commands and "badd", in such a way that Vim doesn't find the edited file in the buffer list, causing the ATTENTION message? (Tony Mechelynck, 2008 Dec 1) diff --git a/runtime/doc/usr_29.txt b/runtime/doc/usr_29.txt index dc71e71dd7..c6105cea98 100644 --- a/runtime/doc/usr_29.txt +++ b/runtime/doc/usr_29.txt @@ -1,4 +1,4 @@ -*usr_29.txt* For Vim version 7.4. Last change: 2008 Jun 28 +*usr_29.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM USER MANUAL - by Bram Moolenaar @@ -265,9 +265,6 @@ doesn't work if the tags file isn't sorted. The 'taglength' option can be used to tell Vim the number of significant characters in a tag. -When you use the SNiFF+ program, you can use the Vim interface to it |sniff|. -SNiFF+ is a commercial program. - Cscope is a free program. It does not only find places where an identifier is declared, but also where it is used. See |cscope|. diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index 174f8f1ce3..5f39af7d91 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -1,4 +1,4 @@ -*various.txt* For Vim version 7.4. Last change: 2016 Feb 18 +*various.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -413,7 +413,6 @@ m *+ruby/dyn* Ruby interface |ruby-dynamic| |/dyn| N *+scrollbind* |'scrollbind'| B *+signs* |:sign| N *+smartindent* |'smartindent'| -m *+sniff* SniFF interface |sniff| N *+startuptime* |--startuptime| argument N *+statusline* Options 'statusline', 'rulerformat' and special formats of 'titlestring' and 'iconstring' diff --git a/runtime/doc/version5.txt b/runtime/doc/version5.txt index e47fa43a41..5f2586dd20 100644 --- a/runtime/doc/version5.txt +++ b/runtime/doc/version5.txt @@ -1,4 +1,4 @@ -*version5.txt* For Vim version 7.4. Last change: 2016 Jan 03 +*version5.txt* For Vim version 7.4. Last change: 2016 Feb 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -934,7 +934,7 @@ Don't add "-L/usr/lib" to the link line, causes problems on a few systems. When compiling, allow a choice for minimal, normal or maximal features in an easy way, by changing a single line in src/feature.h. The DOS16 version has been compiled with minimal features to avoid running -out of memory too quickly. |dos16| +out of memory too quickly. The Win32, DJGPP, and OS/2 versions use maximal features, because they have enough memory. The Amiga version is available with normal and maximal features. diff --git a/runtime/syntax/fortran.vim b/runtime/syntax/fortran.vim index 26d063524e..b470e56f60 100644 --- a/runtime/syntax/fortran.vim +++ b/runtime/syntax/fortran.vim @@ -1,15 +1,16 @@ " Vim syntax file " Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77) -" Version: 0.96 -" Last Change: 2015 Nov. 30 +" Version: 0.97 +" Last Change: 2016 Feb. 26 " Maintainer: Ajit J. Thakkar ; " Usage: For instructions, do :help fortran-syntax from Vim " Credits: -" Version 0.1 was based on the fortran 77 syntax file by Mario Eusebio and -" Preben Guldberg. Useful suggestions and contributions were made by: Andrej Panjkov, -" Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile, +" Version 0.1 (April 2000) was based on the fortran 77 syntax file by Mario Eusebio and +" Preben Guldberg. Since then, useful suggestions and contributions have been made, +" in chronological order, by: +" Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile, " Walter Dieudonné, Alexander Wagner, Roman Bertle, Charles Rendleman, -" Andrew Griffiths, Joe Krahn, Hendrik Merx, and Matt Thompson. +" Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, and Jan Hermann. if exists("b:current_syntax") finish @@ -407,7 +408,7 @@ if exists("fortran_fold") else syn region fortran77Loop transparent fold keepend start="\ -# Last change: 2016 Jan 22 +# Last change: 2016 Feb 27 # # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 # with MMS and MMK @@ -66,7 +66,6 @@ CCVER = YES # VIM_PERL = YES # VIM_PYTHON = YES # VIM_RUBY = YES -# VIM_SNIFF = YES # X Input Method. For entering special languages like chinese and # Japanese. Please define just one: VIM_XIM or VIM_HANGULIN @@ -228,15 +227,6 @@ TCL_LIB = ,OS_VMS_TCL.OPT/OPT TCL_INC = ,dka0:[tcl80.generic] .ENDIF -.IFDEF VIM_SNIFF -# SNIFF related setup. -SNIFF_DEF = ,"FEAT_SNIFF" -SNIFF_SRC = if_sniff.c -SNIFF_OBJ = if_sniff.obj -SNIFF_LIB = -SNIFF_INC = -.ENDIF - .IFDEF VIM_RUBY # RUBY related setup. RUBY_DEF = ,"FEAT_RUBY" @@ -293,7 +283,7 @@ VIMHOST = "''F$TRNLNM("SYS$NODE")'''F$TRNLNM("UCX$INET_HOST")'.''F$TRNLNM("UCX$I .SUFFIXES : .obj .c ALL_CFLAGS = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) - - $(TCL_DEF)$(SNIFF_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) - + $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) - $(CFLAGS)$(GUI_FLAG) - /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC)$(PERL_INC)$(PYTHON_INC)$(TCL_INC)) @@ -302,12 +292,12 @@ ALL_CFLAGS = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) - # as $(GUI_INC) - replaced with $(GUI_INC_VER) # Otherwise should not be any other difference. ALL_CFLAGS_VER = /def=($(MODEL_DEF)$(DEFS)$(DEBUG_DEF)$(PERL_DEF)$(PYTHON_DEF) - - $(TCL_DEF)$(SNIFF_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) - + $(TCL_DEF)$(RUBY_DEF)$(XIM_DEF)$(HANGULIN_DEF)$(TAG_DEF)$(MZSCH_DEF)$(ICONV_DEF)) - $(CFLAGS)$(GUI_FLAG) - /include=($(C_INC)$(GUI_INC_DIR)$(GUI_INC_VER)$(PERL_INC)$(PYTHON_INC)$(TCL_INC)) ALL_LIBS = $(LIBS) $(GUI_LIB_DIR) $(GUI_LIB) \ - $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(SNIFF_LIB) $(RUBY_LIB) + $(PERL_LIB) $(PYTHON_LIB) $(TCL_LIB) $(RUBY_LIB) SRC = blowfish.c buffer.c charset.c crypt.c, crypt_zip.c diff.c digraph.c edit.c eval.c ex_cmds.c ex_cmds2.c \ ex_docmd.c ex_eval.c ex_getln.c if_xcmdsrv.c fileio.c fold.c getchar.c \ @@ -315,7 +305,7 @@ SRC = blowfish.c buffer.c charset.c crypt.c, crypt_zip.c diff.c digraph.c edit.c misc2.c move.c normal.c ops.c option.c popupmnu.c quickfix.c regexp.c search.c sha256.c\ spell.c syntax.c tag.c term.c termlib.c ui.c undo.c version.c screen.c \ window.c os_unix.c os_vms.c pathdef.c \ - $(GUI_SRC) $(PERL_SRC) $(PYTHON_SRC) $(TCL_SRC) $(SNIFF_SRC) \ + $(GUI_SRC) $(PERL_SRC) $(PYTHON_SRC) $(TCL_SRC) \ $(RUBY_SRC) $(HANGULIN_SRC) $(MZSCH_SRC) OBJ = blowfish.obj buffer.obj charset.obj crypt.obj, crypt_zip.obj diff.obj digraph.obj edit.obj eval.obj \ @@ -326,7 +316,7 @@ OBJ = blowfish.obj buffer.obj charset.obj crypt.obj, crypt_zip.obj diff.obj digr regexp.obj search.obj sha256.obj spell.obj syntax.obj tag.obj term.obj termlib.obj \ ui.obj undo.obj screen.obj version.obj window.obj os_unix.obj \ os_vms.obj pathdef.obj if_mzsch.obj\ - $(GUI_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(TCL_OBJ) $(SNIFF_OBJ) \ + $(GUI_OBJ) $(PERL_OBJ) $(PYTHON_OBJ) $(TCL_OBJ) \ $(RUBY_OBJ) $(HANGULIN_OBJ) $(MZSCH_OBJ) # Default target is making the executable @@ -778,10 +768,6 @@ if_ruby.obj : if_ruby.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h gui_beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ globals.h farsi.h arabic.h version.h -if_sniff.obj : if_sniff.c vim.h [.auto]config.h feature.h os_unix.h \ - ascii.h keymap.h term.h macros.h structs.h regexp.h \ - gui.h gui_beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ - globals.h farsi.h arabic.h os_unixx.h gui_beval.obj : gui_beval.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h gui_beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ diff --git a/src/Makefile b/src/Makefile index 5311e4f0a7..ca57f6453b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -466,9 +466,6 @@ CClink = $(CC) # Uncomment this when you do not want inter process communication. #CONF_OPT_CHANNEL = --disable-channel -# SNIFF - Include support for SNiFF+. -#CONF_OPT_SNIFF = --enable-sniff - # MULTIBYTE - To edit multi-byte characters. # Uncomment this when you want to edit a multibyte language. # It's automatically enabled with normal features, GTK or IME support. @@ -1408,7 +1405,7 @@ OSDEF_CFLAGS = $(PRE_DEFS) $(POST_DEFS) LINT_CFLAGS = -DLINT -I. $(PRE_DEFS) $(POST_DEFS) $(RUBY_CFLAGS) $(LUA_CFLAGS) $(PERL_CFLAGS) $(PYTHON_CFLAGS) $(PYTHON3_CFLAGS) $(TCL_CFLAGS) -Dinline= -D__extension__= -Dalloca=alloca -LINT_EXTRA = -DUSE_SNIFF -DHANGUL_INPUT -D"__attribute__(x)=" +LINT_EXTRA = -DHANGUL_INPUT -D"__attribute__(x)=" DEPEND_CFLAGS = -DPROTO -DDEPEND -DFEAT_GUI $(LINT_CFLAGS) @@ -1549,14 +1546,13 @@ SRC = $(BASIC_SRC) \ $(PYTHON_SRC) $(PYTHON3_SRC) \ $(TCL_SRC) \ $(RUBY_SRC) \ - $(SNIFF_SRC) \ $(WORKSHOP_SRC) \ $(WSDEBUG_SRC) TAGS_SRC = *.c *.cpp if_perl.xs EXTRA_SRC = hangulin.c if_lua.c if_mzsch.c auto/if_perl.c if_perlsfio.c \ - if_python.c if_python3.c if_tcl.c if_ruby.c if_sniff.c \ + if_python.c if_python3.c if_tcl.c if_ruby.c \ gui_beval.c workshop.c wsdebug.c integration.c \ netbeans.c channel.c \ $(GRESOURCE_SRC) @@ -1578,7 +1574,7 @@ ALL_SRC = $(BASIC_SRC) $(ALL_GUI_SRC) $(UNITTEST_SRC) $(EXTRA_SRC) # The perl sources also don't work well with lint. LINT_SRC = $(BASIC_SRC) $(GUI_SRC) $(HANGULIN_SRC) \ $(PYTHON_SRC) $(PYTHON3_SRC) $(TCL_SRC) \ - $(SNIFF_SRC) $(WORKSHOP_SRC) $(WSDEBUG_SRC) \ + $(WORKSHOP_SRC) $(WSDEBUG_SRC) \ $(NETBEANS_SRC) $(CHANNEL_SRC) #LINT_SRC = $(SRC) #LINT_SRC = $(ALL_SRC) @@ -1628,7 +1624,6 @@ OBJ_COMMON = \ objects/sha256.o \ objects/spell.o \ objects/syntax.o \ - $(SNIFF_OBJ) \ objects/tag.o \ objects/term.o \ objects/ui.o \ @@ -1767,7 +1762,7 @@ config auto/config.mk: auto/configure config.mk.in config.h.in $(CONF_OPT_TCL) $(CONF_OPT_RUBY) $(CONF_OPT_NLS) \ $(CONF_OPT_CSCOPE) $(CONF_OPT_MULTIBYTE) $(CONF_OPT_INPUT) \ $(CONF_OPT_OUTPUT) $(CONF_OPT_GPM) $(CONF_OPT_WORKSHOP) \ - $(CONF_OPT_SNIFF) $(CONF_OPT_FEAT) $(CONF_TERM_LIB) \ + $(CONF_OPT_FEAT) $(CONF_TERM_LIB) \ $(CONF_OPT_COMPBY) $(CONF_OPT_ACL) $(CONF_OPT_NETBEANS) \ $(CONF_OPT_CHANNEL) \ $(CONF_ARGS) $(CONF_OPT_MZSCHEME) $(CONF_OPT_PLTHOME) \ @@ -2841,9 +2836,6 @@ objects/if_python3.o: if_python3.c if_py_both.h objects/if_ruby.o: if_ruby.c $(CCC) $(RUBY_CFLAGS) -o $@ if_ruby.c -objects/if_sniff.o: if_sniff.c - $(CCC) -o $@ if_sniff.c - objects/if_tcl.o: if_tcl.c $(CCC) $(TCL_CFLAGS) -o $@ if_tcl.c @@ -3423,10 +3415,6 @@ objects/if_ruby.o: if_ruby.c auto/config.h vim.h feature.h os_unix.h auto/osdef. ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \ gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h proto.h globals.h \ farsi.h arabic.h version.h -objects/if_sniff.o: if_sniff.c vim.h auto/config.h feature.h os_unix.h \ - auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ - regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h proto.h \ - globals.h farsi.h arabic.h os_unixx.h objects/gui_beval.o: gui_beval.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro alloc.h ex_cmds.h proto.h \ diff --git a/src/alloc.h b/src/alloc.h index 7a992c689f..90a9878072 100644 --- a/src/alloc.h +++ b/src/alloc.h @@ -17,5 +17,5 @@ typedef enum { aid_qf_namebuf, aid_qf_errmsg, aid_qf_pattern, - aid_last, + aid_last } alloc_id_T; diff --git a/src/auto/configure b/src/auto/configure index 26da1e00a3..39986d946a 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -654,8 +654,6 @@ X_PRE_LIBS X_CFLAGS XMKMF xmkmfpath -SNIFF_OBJ -SNIFF_SRC CHANNEL_OBJ CHANNEL_SRC NETBEANS_OBJ @@ -816,7 +814,6 @@ enable_cscope enable_workshop enable_netbeans enable_channel -enable_sniff enable_multibyte enable_hangulinput enable_xim @@ -1483,7 +1480,6 @@ Optional Features: --enable-workshop Include Sun Visual Workshop support. --disable-netbeans Disable NetBeans integration support. --disable-channel Disable process communication support. - --enable-sniff Include Sniff interface. --enable-multibyte Include multibyte editing support. --enable-hangulinput Include Hangul input support. --enable-xim Include XIM input support. @@ -7523,26 +7519,6 @@ if test "$enable_channel" = "yes"; then fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-sniff argument" >&5 -$as_echo_n "checking --enable-sniff argument... " >&6; } -# Check whether --enable-sniff was given. -if test "${enable_sniff+set}" = set; then : - enableval=$enable_sniff; -else - enable_sniff="no" -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_sniff" >&5 -$as_echo "$enable_sniff" >&6; } -if test "$enable_sniff" = "yes"; then - $as_echo "#define FEAT_SNIFF 1" >>confdefs.h - - SNIFF_SRC="if_sniff.c" - - SNIFF_OBJ="objects/if_sniff.o" - -fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-multibyte argument" >&5 $as_echo_n "checking --enable-multibyte argument... " >&6; } # Check whether --enable-multibyte was given. @@ -11113,6 +11089,48 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rlim_t" >&5 $as_echo_n "checking for rlim_t... " >&6; } @@ -11951,7 +11969,7 @@ for ac_func in bcmp fchdir fchown fsync getcwd getpseudotty \ setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \ sigvec strcasecmp strerror strftime stricmp strncasecmp \ strnicmp strpbrk strtol tgetent towlower towupper iswupper \ - usleep utime utimes + usleep utime utimes isnan isinf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/src/channel.c b/src/channel.c index 209d9084ec..4c3cc1b34e 100644 --- a/src/channel.c +++ b/src/channel.c @@ -52,6 +52,10 @@ # define fd_close(sd) close(sd) #endif +/* Whether a redraw is needed for appending a line to a buffer. */ +static int channel_need_redraw = FALSE; + + #ifdef WIN32 static int fd_read(sock_T fd, char *buf, size_t len) @@ -345,6 +349,7 @@ channel_may_free(channel_T *channel) channel_free(channel_T *channel) { channel_close(channel, TRUE); + channel_clear(channel); if (channel->ch_next != NULL) channel->ch_next->ch_prev = channel->ch_prev; if (channel->ch_prev == NULL) @@ -795,6 +800,38 @@ channel_set_job(channel_T *channel, job_T *job) channel->ch_job = job; } +/* + * Find a buffer matching "name" or create a new one. + */ + static buf_T * +find_buffer(char_u *name) +{ + buf_T *buf = NULL; + buf_T *save_curbuf = curbuf; + + if (name != NULL && *name != NUL) + buf = buflist_findname(name); + if (buf == NULL) + { + buf = buflist_new(name == NULL || *name == NUL ? NULL : name, + NULL, (linenr_T)0, BLN_LISTED); + buf_copy_options(buf, BCO_ENTER); +#ifdef FEAT_QUICKFIX + clear_string_option(&buf->b_p_bt); + buf->b_p_bt = vim_strsave((char_u *)"nofile"); + clear_string_option(&buf->b_p_bh); + buf->b_p_bh = vim_strsave((char_u *)"hide"); +#endif + curbuf = buf; + ml_open(curbuf); + ml_replace(1, (char_u *)"Reading from channel output...", TRUE); + changed_bytes(1, 0); + curbuf = save_curbuf; + } + + return buf; +} + /* * Set various properties from an "opt" argument. */ @@ -858,6 +895,16 @@ channel_set_options(channel_T *channel, jobopt_T *opt) else *cbp = NULL; } + + if ((opt->jo_set & JO_OUT_IO) && opt->jo_io[PART_OUT] == JIO_BUFFER) + { + /* writing output to a buffer. Force mode to NL. */ + channel->ch_part[PART_OUT].ch_mode = MODE_NL; + channel->ch_part[PART_OUT].ch_buffer = + find_buffer(opt->jo_io_name[PART_OUT]); + ch_logs(channel, "writing to buffer '%s'", + (char *)channel->ch_part[PART_OUT].ch_buffer->b_ffname); + } } /* @@ -1322,6 +1369,7 @@ may_invoke_callback(channel_T *channel, int part) int seq_nr = -1; ch_mode_T ch_mode = channel->ch_part[part].ch_mode; char_u *callback = NULL; + buf_T *buffer = NULL; if (channel->ch_nb_close_cb != NULL) /* this channel is handled elsewhere (netbeans) */ @@ -1332,6 +1380,14 @@ may_invoke_callback(channel_T *channel, int part) else callback = channel->ch_callback; + buffer = channel->ch_part[part].ch_buffer; + if (buffer != NULL && !buf_valid(buffer)) + { + /* buffer was wiped out */ + channel->ch_part[part].ch_buffer = NULL; + buffer = NULL; + } + if (ch_mode == MODE_JSON || ch_mode == MODE_JS) { listitem_T *item; @@ -1380,8 +1436,8 @@ may_invoke_callback(channel_T *channel, int part) } else { - /* If there is no callback drop the message. */ - if (callback == NULL) + /* If there is no callback or buffer drop the message. */ + if (callback == NULL && buffer == NULL) { while ((msg = channel_get(channel, part)) != NULL) vim_free(msg); @@ -1405,8 +1461,11 @@ may_invoke_callback(channel_T *channel, int part) return FALSE; /* incomplete message */ } if (nl[1] == NUL) - /* get the whole buffer */ + { + /* get the whole buffer, drop the NL */ msg = channel_get(channel, part); + *nl = NUL; + } else { /* Copy the message into allocated memory and remove it from @@ -1450,11 +1509,54 @@ may_invoke_callback(channel_T *channel, int part) if (!done) ch_log(channel, "Dropping message without callback"); } - else if (callback != NULL) + else if (callback != NULL || buffer != NULL) { - /* invoke the channel callback */ - ch_log(channel, "Invoking channel callback"); - invoke_callback(channel, callback, argv); + if (buffer != NULL) + { + buf_T *save_curbuf = curbuf; + linenr_T lnum = buffer->b_ml.ml_line_count; + + /* Append to the buffer */ + ch_logn(channel, "appending line %d to buffer", (int)lnum + 1); + + curbuf = buffer; + u_sync(TRUE); + u_save(lnum, lnum + 1); + + ml_append(lnum, msg, 0, FALSE); + appended_lines_mark(lnum, 1L); + curbuf = save_curbuf; + + if (buffer->b_nwindows > 0) + { + win_T *wp; + win_T *save_curwin; + + FOR_ALL_WINDOWS(wp) + { + if (wp->w_buffer == buffer + && wp->w_cursor.lnum == lnum + && wp->w_cursor.col == 0) + { + ++wp->w_cursor.lnum; + save_curwin = curwin; + curwin = wp; + curbuf = curwin->w_buffer; + scroll_cursor_bot(0, FALSE); + curwin = save_curwin; + curbuf = curwin->w_buffer; + } + } + redraw_buf_later(buffer, VALID); + channel_need_redraw = TRUE; + } + } + if (callback != NULL) + { + /* invoke the channel callback */ + ch_log(channel, "Invoking channel callback"); + invoke_callback(channel, callback, argv); + } } else ch_log(channel, "Dropping message"); @@ -1512,6 +1614,7 @@ channel_status(channel_T *channel) /* * Close channel "channel". * Trigger the close callback if "invoke_close_cb" is TRUE. + * Does not clear the buffers. */ void channel_close(channel_T *channel, int invoke_close_cb) @@ -1567,7 +1670,6 @@ channel_close(channel_T *channel, int invoke_close_cb) } channel->ch_nb_close_cb = NULL; - channel_clear(channel); } /* @@ -2178,6 +2280,24 @@ channel_select_check(int ret_in, void *rfds_in) } # endif /* !WIN32 && HAVE_SELECT */ +/* + * Return TRUE if "channel" has JSON or other typeahead. + */ + static int +channel_has_readahead(channel_T *channel, int part) +{ + ch_mode_T ch_mode = channel->ch_part[part].ch_mode; + + if (ch_mode == MODE_JSON || ch_mode == MODE_JS) + { + jsonq_T *head = &channel->ch_part[part].ch_json_head; + jsonq_T *item = head->jq_next; + + return item != NULL; + } + return channel_peek(channel, part) != NULL; +} + /* * Execute queued up commands. * Invoked from the main loop when it's safe to execute received commands. @@ -2191,6 +2311,7 @@ channel_parse_messages(void) int r; int part = PART_SOCK; + ch_log(NULL, "looking for messages on channels"); while (channel != NULL) { if (channel->ch_refcount == 0 && !channel_still_useful(channel)) @@ -2201,7 +2322,8 @@ channel_parse_messages(void) part = PART_SOCK; continue; } - if (channel->ch_part[part].ch_fd != INVALID_FD) + if (channel->ch_part[part].ch_fd != INVALID_FD + || channel_has_readahead(channel, part)) { /* Increase the refcount, in case the handler causes the channel * to be unreferenced or closed. */ @@ -2227,6 +2349,16 @@ channel_parse_messages(void) part = PART_SOCK; } } + + if (channel_need_redraw && must_redraw) + { + channel_need_redraw = FALSE; + update_screen(0); + setcursor(); + cursor_on(); + out_flush(); + } + return ret; } diff --git a/src/charset.c b/src/charset.c index 2414b2a401..ad3f8bcfd7 100644 --- a/src/charset.c +++ b/src/charset.c @@ -1761,8 +1761,7 @@ skiptowhite(char_u *p) return p; } -#if defined(FEAT_LISTCMDS) || defined(FEAT_SIGNS) || defined(FEAT_SNIFF) \ - || defined(PROTO) +#if defined(FEAT_LISTCMDS) || defined(FEAT_SIGNS) || defined(PROTO) /* * skiptowhite_esc: Like skiptowhite(), but also skip escaped chars */ diff --git a/src/config.h.in b/src/config.h.in index fd45c7332b..f8475a14f8 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -362,9 +362,6 @@ /* Define for linking via dlopen() or LoadLibrary() */ #undef DYNAMIC_TCL -/* Define if you want to include the Sniff interface. */ -#undef FEAT_SNIFF - /* Define if you want to add support for ACL */ #undef HAVE_POSIX_ACL #undef HAVE_SOLARIS_ZFS_ACL @@ -463,3 +460,12 @@ /* Define if GTK+ GUI is to be linked against GTK+ 3 */ #undef USE_GTK3 + +/* Define if we have isinf() */ +#undef HAVE_ISINF + +/* Define if we have isnan() */ +#undef HAVE_ISNAN + +/* Define to inline symbol or empty */ +#undef inline diff --git a/src/config.mk.in b/src/config.mk.in index 15ac329d7a..c756da4f36 100644 --- a/src/config.mk.in +++ b/src/config.mk.in @@ -101,9 +101,6 @@ RUBY_PRO = @RUBY_PRO@ RUBY_CFLAGS = @RUBY_CFLAGS@ RUBY_LIBS = @RUBY_LIBS@ -SNIFF_SRC = @SNIFF_SRC@ -SNIFF_OBJ = @SNIFF_OBJ@ - AWK = @AWK@ STRIP = @STRIP@ diff --git a/src/configure.in b/src/configure.in index a7d2d2e9d0..818c7e1189 100644 --- a/src/configure.in +++ b/src/configure.in @@ -2074,19 +2074,6 @@ if test "$enable_channel" = "yes"; then AC_SUBST(CHANNEL_OBJ) fi -AC_MSG_CHECKING(--enable-sniff argument) -AC_ARG_ENABLE(sniff, - [ --enable-sniff Include Sniff interface.], , - [enable_sniff="no"]) -AC_MSG_RESULT($enable_sniff) -if test "$enable_sniff" = "yes"; then - AC_DEFINE(FEAT_SNIFF) - SNIFF_SRC="if_sniff.c" - AC_SUBST(SNIFF_SRC) - SNIFF_OBJ="objects/if_sniff.o" - AC_SUBST(SNIFF_OBJ) -fi - AC_MSG_CHECKING(--enable-multibyte argument) AC_ARG_ENABLE(multibyte, [ --enable-multibyte Include multibyte editing support.], , @@ -3233,6 +3220,7 @@ AC_HEADER_TIME AC_CHECK_TYPE(ino_t, long) AC_CHECK_TYPE(dev_t, unsigned) AC_C_BIGENDIAN(,,,) +AC_C_INLINE AC_MSG_CHECKING(for rlim_t) if eval "test \"`echo '$''{'ac_cv_type_rlim_t'+set}'`\" = set"; then @@ -3651,7 +3639,7 @@ AC_CHECK_FUNCS(bcmp fchdir fchown fsync getcwd getpseudotty \ setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \ sigvec strcasecmp strerror strftime stricmp strncasecmp \ strnicmp strpbrk strtol tgetent towlower towupper iswupper \ - usleep utime utimes) + usleep utime utimes isnan isinf) AC_FUNC_FSEEKO dnl define _LARGE_FILES, _FILE_OFFSET_BITS and _LARGEFILE_SOURCE when diff --git a/src/edit.c b/src/edit.c index d85bc1aa97..1d96c3e159 100644 --- a/src/edit.c +++ b/src/edit.c @@ -1052,12 +1052,6 @@ edit( case K_SELECT: /* end of Select mode mapping - ignore */ break; -#ifdef FEAT_SNIFF - case K_SNIFF: /* Sniff command received */ - stuffcharReadbuff(K_SNIFF); - goto doESCkey; -#endif - case K_HELP: /* Help key works like */ case K_F1: case K_XF1: diff --git a/src/eval.c b/src/eval.c index 99400c38a0..523c6364d6 100644 --- a/src/eval.c +++ b/src/eval.c @@ -10,6 +10,7 @@ /* * eval.c: Expression evaluation. */ +#define USING_FLOAT_STUFF #include "vim.h" @@ -27,16 +28,6 @@ # include /* for time_t */ #endif -#if defined(FEAT_FLOAT) -# include -# if defined(HAVE_MATH_H) -# include -# endif -# if defined(WIN32) && !defined(isnan) -# define isnan(x) _isnan(x) -# endif -#endif - #define DICT_MAXNEST 100 /* maximum nesting of lists and dicts */ #define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not @@ -507,6 +498,9 @@ static void f_ceil(typval_T *argvars, typval_T *rettv); #endif #ifdef FEAT_CHANNEL static void f_ch_close(typval_T *argvars, typval_T *rettv); +static void f_ch_evalexpr(typval_T *argvars, typval_T *rettv); +static void f_ch_evalraw(typval_T *argvars, typval_T *rettv); +static void f_ch_getbufnr(typval_T *argvars, typval_T *rettv); # ifdef FEAT_JOB static void f_ch_getjob(typval_T *argvars, typval_T *rettv); # endif @@ -8201,6 +8195,9 @@ static struct fst #endif #ifdef FEAT_CHANNEL {"ch_close", 1, 1, f_ch_close}, + {"ch_evalexpr", 2, 3, f_ch_evalexpr}, + {"ch_evalraw", 2, 3, f_ch_evalraw}, + {"ch_getbufnr", 2, 2, f_ch_getbufnr}, # ifdef FEAT_JOB {"ch_getjob", 1, 1, f_ch_getjob}, # endif @@ -9976,12 +9973,45 @@ handle_mode(typval_T *item, jobopt_T *opt, ch_mode_T *modep, int jo) return OK; } + static int +handle_io(typval_T *item, int part, jobopt_T *opt) +{ + char_u *val = get_tv_string(item); + + opt->jo_set |= JO_OUT_IO << (part - PART_OUT); + if (STRCMP(val, "null") == 0) + opt->jo_io[part] = JIO_NULL; + else if (STRCMP(val, "pipe") == 0) + opt->jo_io[part] = JIO_PIPE; + else if (STRCMP(val, "file") == 0) + opt->jo_io[part] = JIO_FILE; + else if (STRCMP(val, "buffer") == 0) + opt->jo_io[part] = JIO_BUFFER; + else if (STRCMP(val, "out") == 0 && part == PART_ERR) + opt->jo_io[part] = JIO_OUT; + else + { + EMSG2(_(e_invarg2), val); + return FAIL; + } + return OK; +} + static void clear_job_options(jobopt_T *opt) { vim_memset(opt, 0, sizeof(jobopt_T)); } +/* + * Get the PART_ number from the first character of an option name. + */ + static int +part_from_char(int c) +{ + return c == 'i' ? PART_IN : c == 'o' ? PART_OUT: PART_ERR; +} + /* * Get the option entries from the dict in "tv", parse them and put the result * in "opt". @@ -9996,6 +10026,7 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported) dict_T *dict; int todo; hashitem_T *hi; + int part; opt->jo_set = 0; if (tv->v_type == VAR_UNKNOWN) @@ -10046,6 +10077,27 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported) == FAIL) return FAIL; } + else if (STRCMP(hi->hi_key, "in-io") == 0 + || STRCMP(hi->hi_key, "out-io") == 0 + || STRCMP(hi->hi_key, "err-io") == 0) + { + if (!(supported & JO_OUT_IO)) + break; + if (handle_io(item, part_from_char(*hi->hi_key), opt) == FAIL) + return FAIL; + } + else if (STRCMP(hi->hi_key, "in-name") == 0 + || STRCMP(hi->hi_key, "out-name") == 0 + || STRCMP(hi->hi_key, "err-name") == 0) + { + part = part_from_char(*hi->hi_key); + + if (!(supported & JO_OUT_IO)) + break; + opt->jo_set |= JO_OUT_NAME << (part - PART_OUT); + opt->jo_io_name[part] = + get_tv_string_buf_chk(item, opt->jo_io_name_buf[part]); + } else if (STRCMP(hi->hi_key, "callback") == 0) { if (!(supported & JO_CALLBACK)) @@ -10216,7 +10268,37 @@ f_ch_close(typval_T *argvars, typval_T *rettv UNUSED) channel_T *channel = get_channel_arg(&argvars[0]); if (channel != NULL) + { channel_close(channel, FALSE); + channel_clear(channel); + } +} + +/* + * "ch_getbufnr()" function + */ + static void +f_ch_getbufnr(typval_T *argvars, typval_T *rettv) +{ + channel_T *channel = get_channel_arg(&argvars[0]); + + rettv->vval.v_number = -1; + if (channel != NULL) + { + char_u *what = get_tv_string(&argvars[1]); + int part; + + if (STRCMP(what, "err") == 0) + part = PART_ERR; + else if (STRCMP(what, "out") == 0) + part = PART_OUT; + else if (STRCMP(what, "in") == 0) + part = PART_IN; + else + part = PART_SOCK; + if (channel->ch_part[part].ch_buffer != NULL) + rettv->vval.v_number = channel->ch_part[part].ch_buffer->b_fnum; + } } # ifdef FEAT_JOB @@ -10420,7 +10502,13 @@ f_ch_readraw(typval_T *argvars, typval_T *rettv) * Otherwise returns NULL. */ static channel_T * -send_common(typval_T *argvars, char_u *text, int id, char *fun, int *part_read) +send_common( + typval_T *argvars, + char_u *text, + int id, + int eval, + char *fun, + int *part_read) { channel_T *channel; jobopt_T opt; @@ -10437,9 +10525,17 @@ send_common(typval_T *argvars, char_u *text, int id, char *fun, int *part_read) return NULL; /* Set the callback. An empty callback means no callback and not reading - * the response. */ + * the response. With "ch_evalexpr()" and "ch_evalraw()" a callback is not + * allowed. */ if (opt.jo_callback != NULL && *opt.jo_callback != NUL) + { + if (eval) + { + EMSG2(_("E917: Cannot use a callback with %s()"), fun); + return NULL; + } channel_set_req_callback(channel, part_send, opt.jo_callback, id); + } if (channel_send(channel, part_send, text, fun) == OK && opt.jo_callback == NULL) @@ -10448,10 +10544,10 @@ send_common(typval_T *argvars, char_u *text, int id, char *fun, int *part_read) } /* - * "ch_sendexpr()" function + * common for "ch_evalexpr()" and "ch_sendexpr()" */ static void -f_ch_sendexpr(typval_T *argvars, typval_T *rettv) +ch_expr_common(typval_T *argvars, typval_T *rettv, int eval) { char_u *text; typval_T *listtv; @@ -10474,7 +10570,7 @@ f_ch_sendexpr(typval_T *argvars, typval_T *rettv) ch_mode = channel_get_mode(channel, part_send); if (ch_mode == MODE_RAW || ch_mode == MODE_NL) { - EMSG(_("E912: cannot use ch_sendexpr() with a raw or nl channel")); + EMSG(_("E912: cannot use ch_evalexpr()/ch_sendexpr() with a raw or nl channel")); return; } @@ -10484,9 +10580,10 @@ f_ch_sendexpr(typval_T *argvars, typval_T *rettv) if (text == NULL) return; - channel = send_common(argvars, text, id, "sendexpr", &part_read); + channel = send_common(argvars, text, id, eval, + eval ? "ch_evalexpr" : "ch_sendexpr", &part_read); vim_free(text); - if (channel != NULL) + if (channel != NULL && eval) { /* TODO: timeout from options */ timeout = channel_get_timeout(channel, part_read); @@ -10505,10 +10602,28 @@ f_ch_sendexpr(typval_T *argvars, typval_T *rettv) } /* - * "ch_sendraw()" function + * "ch_evalexpr()" function */ static void -f_ch_sendraw(typval_T *argvars, typval_T *rettv) +f_ch_evalexpr(typval_T *argvars, typval_T *rettv) +{ + ch_expr_common(argvars, rettv, TRUE); +} + +/* + * "ch_sendexpr()" function + */ + static void +f_ch_sendexpr(typval_T *argvars, typval_T *rettv) +{ + ch_expr_common(argvars, rettv, FALSE); +} + +/* + * common for "ch_evalraw()" and "ch_sendraw()" + */ + static void +ch_raw_common(typval_T *argvars, typval_T *rettv, int eval) { char_u buf[NUMBUFLEN]; char_u *text; @@ -10521,8 +10636,9 @@ f_ch_sendraw(typval_T *argvars, typval_T *rettv) rettv->vval.v_string = NULL; text = get_tv_string_buf(&argvars[1], buf); - channel = send_common(argvars, text, 0, "sendraw", &part_read); - if (channel != NULL) + channel = send_common(argvars, text, 0, eval, + eval ? "ch_evalraw" : "ch_sendraw", &part_read); + if (channel != NULL && eval) { /* TODO: timeout from options */ timeout = channel_get_timeout(channel, part_read); @@ -10530,6 +10646,24 @@ f_ch_sendraw(typval_T *argvars, typval_T *rettv) } } +/* + * "ch_evalraw()" function + */ + static void +f_ch_evalraw(typval_T *argvars, typval_T *rettv) +{ + ch_raw_common(argvars, rettv, TRUE); +} + +/* + * "ch_sendraw()" function + */ + static void +f_ch_sendraw(typval_T *argvars, typval_T *rettv) +{ + ch_raw_common(argvars, rettv, FALSE); +} + /* * "ch_setoptions()" function */ @@ -13878,9 +14012,6 @@ f_has(typval_T *argvars, typval_T *rettv) #ifdef FEAT_SMARTINDENT "smartindent", #endif -#ifdef FEAT_SNIFF - "sniff", -#endif #ifdef STARTUPTIME "startuptime", #endif @@ -14967,7 +15098,7 @@ f_job_start(typval_T *argvars UNUSED, typval_T *rettv) opt.jo_mode = MODE_NL; if (get_job_options(&argvars[1], &opt, JO_MODE_ALL + JO_CB_ALL + JO_TIMEOUT_ALL - + JO_STOPONEXIT + JO_EXIT_CB) == FAIL) + + JO_STOPONEXIT + JO_EXIT_CB + JO_OUT_IO) == FAIL) return; job_set_options(job, &opt); diff --git a/src/ex_cmds.h b/src/ex_cmds.h index d47c892d9f..719d7d8482 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -1287,9 +1287,6 @@ EX(CMD_smenu, "smenu", ex_menu, EX(CMD_snext, "snext", ex_next, RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR, ADDR_LINES), -EX(CMD_sniff, "sniff", ex_sniff, - EXTRA|TRLBAR, - ADDR_LINES), EX(CMD_snomagic, "snomagic", ex_submagic, RANGE|WHOLEFOLD|EXTRA|CMDWIN, ADDR_LINES), diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 4a45637db7..36e74ea383 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -131,9 +131,6 @@ do_debug(char_u *cmd) redir_off = TRUE; /* don't redirect debug commands */ State = NORMAL; -#ifdef FEAT_SNIFF - want_sniff_request = 0; /* No K_SNIFF wanted */ -#endif if (!debug_did_msg) MSG(_("Entering Debug mode. Type \"cont\" to continue.")); @@ -151,9 +148,7 @@ do_debug(char_u *cmd) { msg_scroll = TRUE; need_wait_return = FALSE; -#ifdef FEAT_SNIFF - ProcessSniffRequests(); -#endif + /* Save the current typeahead buffer and replace it with an empty one. * This makes sure we get input from the user here and don't interfere * with the commands being executed. Reset "ex_normal_busy" to avoid diff --git a/src/ex_docmd.c b/src/ex_docmd.c index bffb20b727..28f368c25d 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -298,9 +298,6 @@ static void ex_popup(exarg_T *eap); # define ex_rubydo ex_ni # define ex_rubyfile ex_ni #endif -#ifndef FEAT_SNIFF -# define ex_sniff ex_ni -#endif #ifndef FEAT_KEYMAP # define ex_loadkeymap ex_ni #endif @@ -648,9 +645,6 @@ do_exmode( /* Ignore scrollbar and mouse events in Ex mode */ ++hold_gui_events; #endif -#ifdef FEAT_SNIFF - want_sniff_request = 0; /* No K_SNIFF wanted */ -#endif MSG(_("Entering Ex mode. Type \"visual\" to go to Normal mode.")); while (exmode_active) @@ -668,9 +662,6 @@ do_exmode( changedtick = curbuf->b_changedtick; prev_msg_row = msg_row; prev_line = curwin->w_cursor.lnum; -#ifdef FEAT_SNIFF - ProcessSniffRequests(); -#endif if (improved) { cmdline_row = msg_row; diff --git a/src/ex_getln.c b/src/ex_getln.c index 8a009fb0d9..3265ad2e97 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -206,9 +206,6 @@ getcmdline( struct cmdline_info save_ccline; #endif -#ifdef FEAT_SNIFF - want_sniff_request = 0; -#endif #ifdef FEAT_EVAL if (firstc == -1) { diff --git a/src/feature.h b/src/feature.h index c4154ddf0b..e3dbfcdb84 100644 --- a/src/feature.h +++ b/src/feature.h @@ -1235,7 +1235,6 @@ * +perl Perl interface: "--enable-perlinterp" * +python Python interface: "--enable-pythoninterp" * +tcl TCL interface: "--enable-tclinterp" - * +sniff Sniff interface: "--enable-sniff" * +sun_workshop Sun Workshop integration * +netbeans_intg Netbeans integration * +channel Inter process communication diff --git a/src/gui_dwrite.cpp b/src/gui_dwrite.cpp index 08b81c4470..07685eb09b 100644 --- a/src/gui_dwrite.cpp +++ b/src/gui_dwrite.cpp @@ -237,7 +237,8 @@ class GdiTextRenderer : public IDWriteTextRenderer AddRef(); } - ~GdiTextRenderer() + // add "virtual" to avoid a compiler warning + virtual ~GdiTextRenderer() { SafeRelease(&pRenderTarget_); SafeRelease(&pRenderingParams_); @@ -255,7 +256,7 @@ class GdiTextRenderer : public IDWriteTextRenderer __maybenull void* clientDrawingContext, __out DWRITE_MATRIX* transform) { - //forward the render target's transform + // forward the render target's transform pRenderTarget_->GetCurrentTransform(transform); return S_OK; } diff --git a/src/gui_gtk.c b/src/gui_gtk.c index 6decec0df3..55d10002a9 100644 --- a/src/gui_gtk.c +++ b/src/gui_gtk.c @@ -1661,7 +1661,7 @@ dialog_add_buttons(GtkDialog *dialog, char_u *button_string) else if (button_equal(label, "Ok")) label = _("OK"); else if (button_equal(label, "Yes")) label = _("Yes"); else if (button_equal(label, "No")) label = _("No"); - else if (button_equal(label, "Cancel")) label = _("Canccl"); + else if (button_equal(label, "Cancel")) label = _("Cancel"); # else if (button_equal(label, ok[0])) label = GTK_STOCK_OK; else if (button_equal(label, ync[0])) label = GTK_STOCK_YES; diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 440b401ab1..cd8cc60e1c 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -1543,7 +1543,7 @@ selection_get_cb(GtkWidget *widget UNUSED, length += 2; #if !GTK_CHECK_VERSION(3,0,0) - /* Looks redandunt even for GTK2 because these values are + /* Looks redundant even for GTK2 because these values are * overwritten by gtk_selection_data_set() that follows. */ selection_data->type = selection_data->target; selection_data->format = 16; /* 16 bits per char */ @@ -1597,7 +1597,7 @@ selection_get_cb(GtkWidget *widget UNUSED, if (string != NULL) { #if !GTK_CHECK_VERSION(3,0,0) - /* Looks redandunt even for GTK2 because these values are + /* Looks redundant even for GTK2 because these values are * overwritten by gtk_selection_data_set() that follows. */ selection_data->type = selection_data->target; selection_data->format = 8; /* 8 bits per char */ @@ -3921,7 +3921,7 @@ gui_mch_init(void) */ /* some aesthetics on the toolbar */ # ifdef USE_GTK3 - /* TODO: Add GTK+ 3 code here using GtkCssProvider if neccessary. */ + /* TODO: Add GTK+ 3 code here using GtkCssProvider if necessary. */ /* N.B. Since the default value of GtkToolbar::button-relief is * GTK_RELIEF_NONE, there's no need to specify that, probably. */ # else @@ -4447,8 +4447,8 @@ mainwin_destroy_cb(GtkObject *object UNUSED, gpointer data UNUSED) * plug's window 'min hints to set *it's* minimum size, but that's also the * only way we have of making ourselves bigger (by set lines/columns). * Thus set hints at start-up to ensure correct init. size, then a - * second after the final attempt to reset the real minimum hinst (done by - * scrollbar init.), actually do the standard hinst and stop the timer. + * second after the final attempt to reset the real minimum hints (done by + * scrollbar init.), actually do the standard hints and stop the timer. * We'll not let the default hints be set while this timer's active. */ static gboolean @@ -6460,22 +6460,6 @@ input_timer_cb(gpointer data) return FALSE; /* don't happen again */ } -#ifdef FEAT_SNIFF -/* - * Callback function, used when data is available on the SNiFF connection. - */ - static void -sniff_request_cb( - gpointer data UNUSED, - gint source_fd UNUSED, - GdkInputCondition condition UNUSED) -{ - static char_u bytes[3] = {CSI, (int)KS_EXTRA, (int)KE_SNIFF}; - - add_to_input_buf(bytes, 3); -} -#endif - /* * GUI input routine called by gui_wait_for_chars(). Waits for a character * from the keyboard. @@ -6491,26 +6475,6 @@ gui_mch_wait_for_chars(long wtime) int focus; guint timer; static int timed_out; -#ifdef FEAT_SNIFF - static int sniff_on = 0; - static gint sniff_input_id = 0; -#endif - -#ifdef FEAT_SNIFF - if (sniff_on && !want_sniff_request) - { - if (sniff_input_id) - gdk_input_remove(sniff_input_id); - sniff_on = 0; - } - else if (!sniff_on && want_sniff_request) - { - /* Add fd_from_sniff to watch for available data in main loop. */ - sniff_input_id = gdk_input_add(fd_from_sniff, - GDK_INPUT_READ, sniff_request_cb, NULL); - sniff_on = 1; - } -#endif timed_out = FALSE; @@ -7114,6 +7078,8 @@ gui_mch_mousehide(int hide) else #ifdef FEAT_MOUSESHAPE mch_set_mouse_shape(last_shape); +#elif GTK_CHECK_VERSION(3,0,0) + gdk_window_set_cursor(gtk_widget_get_window(gui.drawarea), NULL); #else gdk_window_set_cursor(gui.drawarea->window, NULL); #endif diff --git a/src/gui_mac.c b/src/gui_mac.c index c766ed035b..c87456e1f6 100644 --- a/src/gui_mac.c +++ b/src/gui_mac.c @@ -6513,7 +6513,7 @@ im_get_status(void) static MenuRef contextMenu = NULL; enum { - kTabContextMenuId = 42, + kTabContextMenuId = 42 }; // the caller has to CFRelease() the returned string diff --git a/src/gui_w32.c b/src/gui_w32.c index edfe24e560..6cc2e06988 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -326,7 +326,7 @@ static int s_findrep_is_find; /* TRUE for find dialog, FALSE #endif static HINSTANCE s_hinst = NULL; -#if !defined(FEAT_SNIFF) && !defined(FEAT_GUI) +#if !defined(FEAT_GUI) static #endif HWND s_hwnd = NULL; @@ -1927,23 +1927,6 @@ process_message(void) } #endif -#ifdef FEAT_SNIFF - if (sniff_request_waiting && want_sniff_request) - { - static char_u bytes[3] = {CSI, (char_u)KS_EXTRA, (char_u)KE_SNIFF}; - add_to_input_buf(bytes, 3); /* K_SNIFF */ - sniff_request_waiting = 0; - want_sniff_request = 0; - /* request is handled in normal.c */ - } - if (msg.message == WM_USER) - { - MyTranslateMessage(&msg); - pDispatchMessage(&msg); - return; - } -#endif - #ifdef MSWIN_FIND_REPLACE /* Don't process messages used by the dialog */ if (s_findrep_hwnd != NULL && pIsDialogMessage(s_findrep_hwnd, &msg)) @@ -6658,7 +6641,13 @@ gui_mch_draw_string( /* Use unicodepdy to make characters fit as we expect, even * when the font uses different widths (e.g., bold character * is wider). */ - unicodepdy[clen] = cw * gui.char_width; + if (c >= 0x10000) + { + unicodepdy[wlen - 2] = cw * gui.char_width; + unicodepdy[wlen - 1] = 0; + } + else + unicodepdy[wlen - 1] = cw * gui.char_width; } cells += cw; i += utfc_ptr2len_len(text + i, len - i); diff --git a/src/gui_x11.c b/src/gui_x11.c index 5a0fe8d527..b525cf7a68 100644 --- a/src/gui_x11.c +++ b/src/gui_x11.c @@ -145,9 +145,6 @@ static void gui_x11_focus_change_cb(Widget w, XtPointer data, XEvent *event, Boo static void gui_x11_enter_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum); static void gui_x11_leave_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum); static void gui_x11_mouse_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum); -#ifdef FEAT_SNIFF -static void gui_x11_sniff_request_cb(XtPointer closure, int *source, XtInputId *id); -#endif static void gui_x11_check_copy_area(void); #ifdef FEAT_CLIENTSERVER static void gui_x11_send_event_handler(Widget, XtPointer, XEvent *, Boolean *); @@ -1163,20 +1160,6 @@ gui_x11_mouse_cb( gui_send_mouse_event(button, x, y, repeated_click, vim_modifiers); } -#ifdef FEAT_SNIFF -/* ARGSUSED */ - static void -gui_x11_sniff_request_cb( - XtPointer closure UNUSED, - int *source UNUSED, - XtInputId *id UNUSED) -{ - static char_u bytes[3] = {CSI, (int)KS_EXTRA, (int)KE_SNIFF}; - - add_to_input_buf(bytes, 3); -} -#endif - /* * End of call-back routines */ @@ -2818,28 +2801,9 @@ gui_mch_wait_for_chars(long wtime) static int timed_out; XtIntervalId timer = (XtIntervalId)0; XtInputMask desired; -#ifdef FEAT_SNIFF - static int sniff_on = 0; - static XtInputId sniff_input_id = 0; -#endif timed_out = FALSE; -#ifdef FEAT_SNIFF - if (sniff_on && !want_sniff_request) - { - if (sniff_input_id) - XtRemoveInput(sniff_input_id); - sniff_on = 0; - } - else if (!sniff_on && want_sniff_request) - { - sniff_input_id = XtAppAddInput(app_context, fd_from_sniff, - (XtPointer)XtInputReadMask, gui_x11_sniff_request_cb, 0); - sniff_on = 1; - } -#endif - if (wtime > 0) timer = XtAppAddTimeOut(app_context, (long_u)wtime, gui_x11_timer_cb, &timed_out); diff --git a/src/if_cscope.h b/src/if_cscope.h index b597170179..a572f7385e 100644 --- a/src/if_cscope.h +++ b/src/if_cscope.h @@ -11,16 +11,11 @@ #if defined(FEAT_CSCOPE) || defined(PROTO) -#if defined(UNIX) -# include /* pid_t */ -# include /* dev_t, ino_t */ -#else -# if defined (WIN32) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include +#if defined (WIN32) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN # endif +# include #endif #define CSCOPE_SUCCESS 0 diff --git a/src/if_ole.cpp b/src/if_ole.cpp index aabf6bb84b..a93abe0a85 100644 --- a/src/if_ole.cpp +++ b/src/if_ole.cpp @@ -96,7 +96,7 @@ static CVim *app = 0; class CVim : public IVim { public: - ~CVim(); + virtual ~CVim(); static CVim *Create(int *pbDoRestart); // IUnknown members @@ -432,6 +432,7 @@ class CVimCF : public IClassFactory { public: static CVimCF *Create(); + virtual ~CVimCF() {}; STDMETHOD(QueryInterface)(REFIID riid, void ** ppv); STDMETHOD_(unsigned long, AddRef)(void); diff --git a/src/if_sniff.c b/src/if_sniff.c deleted file mode 100644 index 85c4755afb..0000000000 --- a/src/if_sniff.c +++ /dev/null @@ -1,1201 +0,0 @@ -/* vi:set ts=8 sts=4 sw=4: - * - * if_sniff.c Interface between Vim and SNiFF+ - * - * See README.txt for an overview of the Vim source code. - */ - -#include "vim.h" - -#ifdef WIN32 -# include -# include -# include -# include -#else -# ifdef FEAT_GUI_X11 -# include "gui_x11.pro" -# endif -# include "os_unixx.h" -#endif - -static int sniffemacs_pid; - -int fd_from_sniff; -int sniff_connected = 0; -int sniff_request_waiting = 0; -int want_sniff_request = 0; - -#define MAX_REQUEST_LEN 512 - -#define NEED_SYMBOL 2 -#define EMPTY_SYMBOL 4 -#define NEED_FILE 8 -#define SILENT 16 -#define DISCONNECT 32 -#define CONNECT 64 - -#define RQ_NONE 0 -#define RQ_SIMPLE 1 -#define RQ_CONTEXT NEED_FILE + NEED_SYMBOL -#define RQ_SCONTEXT NEED_FILE + NEED_SYMBOL + EMPTY_SYMBOL -#define RQ_NOSYMBOL NEED_FILE -#define RQ_SILENT RQ_NOSYMBOL + SILENT -#define RQ_CONNECT RQ_NONE + CONNECT -#define RQ_DISCONNECT RQ_SIMPLE + DISCONNECT - -struct sn_cmd -{ - char *cmd_name; - char cmd_code; - char *cmd_msg; - int cmd_type; -}; - -struct sn_cmd_list -{ - struct sn_cmd* sniff_cmd; - struct sn_cmd_list* next_cmd; -}; - -static struct sn_cmd sniff_cmds[] = -{ - { "toggle", 'e', N_("Toggle implementation/definition"),RQ_SCONTEXT }, - { "superclass", 's', N_("Show base class of"), RQ_CONTEXT }, - { "overridden", 'm', N_("Show overridden member function"),RQ_SCONTEXT }, - { "retrieve-file", 'r', N_("Retrieve from file"), RQ_CONTEXT }, - { "retrieve-project",'p', N_("Retrieve from project"), RQ_CONTEXT }, - { "retrieve-all-projects", - 'P', N_("Retrieve from all projects"), RQ_CONTEXT }, - { "retrieve-next", 'R', N_("Retrieve"), RQ_CONTEXT }, - { "goto-symbol", 'g', N_("Show source of"), RQ_CONTEXT }, - { "find-symbol", 'f', N_("Find symbol"), RQ_CONTEXT }, - { "browse-class", 'w', N_("Browse class"), RQ_CONTEXT }, - { "hierarchy", 't', N_("Show class in hierarchy"), RQ_CONTEXT }, - { "restr-hier", 'T', N_("Show class in restricted hierarchy"),RQ_CONTEXT }, - { "xref-to", 'x', N_("Xref refers to"), RQ_CONTEXT }, - { "xref-by", 'X', N_("Xref referred by"), RQ_CONTEXT }, - { "xref-has", 'c', N_("Xref has a"), RQ_CONTEXT }, - { "xref-used-by", 'C', N_("Xref used by"), RQ_CONTEXT }, - { "show-docu", 'd', N_("Show docu of"), RQ_CONTEXT }, - { "gen-docu", 'D', N_("Generate docu for"), RQ_CONTEXT }, - { "connect", 'y', NULL, RQ_CONNECT }, - { "disconnect", 'q', NULL, RQ_DISCONNECT }, - { "font-info", 'z', NULL, RQ_SILENT }, - { "update", 'u', NULL, RQ_SILENT }, - { NULL, '\0', NULL, 0} -}; - - -static char *SniffEmacs[2] = {"sniffemacs", (char *)NULL}; /* Yes, Emacs! */ -static int fd_to_sniff; -static int sniff_will_disconnect = 0; -static char msg_sniff_disconnect[] = N_("Cannot connect to SNiFF+. Check environment (sniffemacs must be found in $PATH).\n"); -static char sniff_rq_sep[] = " "; -static struct sn_cmd_list *sniff_cmd_ext = NULL; - -/* Initializing vim commands - * executed each time vim connects to Sniff - */ -static char *init_cmds[]= { - "augroup sniff", - "autocmd BufWritePost * sniff update", - "autocmd BufReadPost * sniff font-info", - "autocmd VimLeave * sniff disconnect", - "augroup END", - - "let g:sniff_connected = 1", - - "if ! exists('g:sniff_mappings_sourced')|" - "if ! exists('g:sniff_mappings')|" - "if exists('$SNIFF_DIR4')|" - "let g:sniff_mappings='$SNIFF_DIR4/config/integrations/vim/sniff.vim'|" - "else|" - "let g:sniff_mappings='$SNIFF_DIR/config/sniff.vim'|" - "endif|" - "endif|" - "let g:sniff_mappings=expand(g:sniff_mappings)|" - "if filereadable(g:sniff_mappings)|" - "execute 'source' g:sniff_mappings|" - "let g:sniff_mappings_sourced=1|" - "endif|" - "endif", - - NULL -}; - -/*-------- Function Prototypes ----------------------------------*/ - -static int ConnectToSniffEmacs(void); -static void sniff_connect(void); -static void HandleSniffRequest(char* buffer); -static int get_request(int fd, char *buf, int maxlen); -static void WriteToSniff(char *str); -static void SendRequest(struct sn_cmd *command, char* symbol); -static void vi_msg(char *); -static void vi_error_msg(char *); -static char *vi_symbol_under_cursor(void); -static void vi_open_file(char *); -static char *vi_buffer_name(void); -static buf_T *vi_find_buffer(char *); -static void vi_exec_cmd(char *); -static void vi_set_cursor_pos(long char_nr); -static long vi_cursor_pos(void); - -/* debug trace */ -#if 0 -static FILE* _tracefile = NULL; -#define SNIFF_TRACE_OPEN(file) if (!_tracefile) _tracefile = fopen(file, "w") -#define SNIFF_TRACE(msg) fprintf(_tracefile, msg); fflush(_tracefile); -#define SNIFF_TRACE1(msg, arg) fprintf(_tracefile, msg,arg); fflush(_tracefile); -#define SNIFF_TRACE_CLOSE fclose(_tracefile); _tracefile=NULL; -#else -#define SNIFF_TRACE_OPEN(file) -#define SNIFF_TRACE(msg) -#define SNIFF_TRACE1(msg, arg) -#define SNIFF_TRACE_CLOSE -#endif - -/*-------- Windows Only Declarations -----------------------------*/ -#ifdef WIN32 - -static int sniff_request_processed=1; -static HANDLE sniffemacs_handle=NULL; -static HANDLE readthread_handle=NULL; -static HANDLE handle_to_sniff=NULL; -static HANDLE handle_from_sniff=NULL; - -struct sniffBufNode -{ - struct sniffBufNode *next; - int bufLen; - char buf[MAX_REQUEST_LEN]; -}; -static struct sniffBufNode *sniffBufStart=NULL; -static struct sniffBufNode *sniffBufEnd=NULL; -static HANDLE hBufferMutex=NULL; - -# ifdef FEAT_GUI_W32 - extern HWND s_hwnd; /* gvim's Window handle */ -# endif -/* - * some helper functions for Windows port only - */ - - static HANDLE -ExecuteDetachedProgram(char *szBinary, char *szCmdLine, - HANDLE hStdInput, HANDLE hStdOutput) -{ - BOOL bResult; - DWORD nError; - PROCESS_INFORMATION aProcessInformation; - PROCESS_INFORMATION *pProcessInformation= &aProcessInformation; - STARTUPINFO aStartupInfo; - STARTUPINFO *pStartupInfo= &aStartupInfo; - DWORD dwCreationFlags= 0; - char szPath[512]; - HINSTANCE hResult; - - hResult = FindExecutable(szBinary, ".", szPath); - if ((int)hResult <= 32) - { - /* can't find the exe file */ - return NULL; - } - - ZeroMemory(pStartupInfo, sizeof(*pStartupInfo)); - pStartupInfo->dwFlags= STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; - pStartupInfo->hStdInput = hStdInput; - pStartupInfo->hStdOutput = hStdOutput; - pStartupInfo->wShowWindow= SW_HIDE; - pStartupInfo->cb = sizeof(STARTUPINFO); - - bResult= CreateProcess( - szPath, - szCmdLine, - NULL, /* security attr for process */ - NULL, /* security attr for primary thread */ - TRUE, /* DO inherit stdin and stdout */ - dwCreationFlags, /* creation flags */ - NULL, /* environment */ - ".", /* current directory */ - pStartupInfo, /* startup info: NULL crashes */ - pProcessInformation /* process information: NULL crashes */ - ); - nError= GetLastError(); - if (bResult) - { - CloseHandle(pProcessInformation->hThread); - CloseHandle(hStdInput); - CloseHandle(hStdOutput); - return(pProcessInformation->hProcess); - } - else - return(NULL); -} - -/* - * write to the internal Thread / Thread communications buffer. - * Return TRUE if successful, FALSE else. - */ - static BOOL -writeToBuffer(char *msg, int len) -{ - DWORD dwWaitResult; /* Request ownership of mutex. */ - struct sniffBufNode *bn; - int bnSize; - - SNIFF_TRACE1("writeToBuffer %d\n", len); - bnSize = sizeof(struct sniffBufNode) - MAX_REQUEST_LEN + len + 1; - if (bnSize < 128) bnSize = 128; /* minimum length to avoid fragmentation */ - bn = (struct sniffBufNode *)malloc(bnSize); - if (!bn) - return FALSE; - - memcpy(bn->buf, msg, len); - bn->buf[len]='\0'; /* terminate CString for added safety */ - bn->next = NULL; - bn->bufLen = len; - /* now, acquire a Mutex for adding the string to our linked list */ - dwWaitResult = WaitForSingleObject( - hBufferMutex, /* handle of mutex */ - 1000L); /* one-second time-out interval */ - if (dwWaitResult == WAIT_OBJECT_0) - { - /* The thread got mutex ownership. */ - if (sniffBufEnd) - { - sniffBufEnd->next = bn; - sniffBufEnd = bn; - } - else - sniffBufStart = sniffBufEnd = bn; - /* Release ownership of the mutex object. */ - if (! ReleaseMutex(hBufferMutex)) - { - /* Deal with error. */ - } - return TRUE; - } - - /* Cannot get mutex ownership due to time-out or mutex object abandoned. */ - free(bn); - return FALSE; -} - -/* - * read from the internal Thread / Thread communications buffer. - * Return TRUE if successful, FALSE else. - */ - static int -ReadFromBuffer(char *buf, int maxlen) -{ - DWORD dwWaitResult; /* Request ownership of mutex. */ - int theLen; - struct sniffBufNode *bn; - - dwWaitResult = WaitForSingleObject( - hBufferMutex, /* handle of mutex */ - 1000L); /* one-second time-out interval */ - if (dwWaitResult == WAIT_OBJECT_0) - { - if (!sniffBufStart) - { - /* all pending Requests Processed */ - theLen = 0; - } - else - { - bn = sniffBufStart; - theLen = bn->bufLen; - SNIFF_TRACE1("ReadFromBuffer %d\n", theLen); - if (theLen >= maxlen) - { - /* notify the user of buffer overflow? */ - theLen = maxlen-1; - } - memcpy(buf, bn->buf, theLen); - buf[theLen] = '\0'; - if (! (sniffBufStart = bn->next)) - { - sniffBufEnd = NULL; - sniff_request_processed = 1; - } - free(bn); - } - if (! ReleaseMutex(hBufferMutex)) - { - /* Deal with error. */ - } - return theLen; - } - - /* Cannot get mutex ownership due to time-out or mutex object abandoned. */ - return -1; -} - -/* on Win32, a separate Thread reads the input pipe. get_request is not needed here. */ - static void __cdecl -SniffEmacsReadThread(void *dummy) -{ - static char ReadThreadBuffer[MAX_REQUEST_LEN]; - int ReadThreadLen=0; - int result=0; - int msgLen=0; - char *msgStart, *msgCur; - - SNIFF_TRACE("begin thread\n"); - /* Read from the pipe to SniffEmacs */ - while (sniff_connected) - { - if (!ReadFile(handle_from_sniff, - ReadThreadBuffer + ReadThreadLen, /* acknowledge rest in buffer */ - MAX_REQUEST_LEN - ReadThreadLen, - &result, - NULL)) - { - DWORD err = GetLastError(); - result = -1; - } - - if (result < 0) - { - /* probably sniffemacs died... log the Error? */ - sniff_disconnect(1); - } - else if (result > 0) - { - ReadThreadLen += result-1; /* total length of valid chars */ - for(msgCur=msgStart=ReadThreadBuffer; ReadThreadLen > 0; msgCur++, ReadThreadLen--) - { - if (*msgCur == '\0' || *msgCur == '\r' || *msgCur == '\n') - { - msgLen = msgCur-msgStart; /* don't add the CR/LF chars */ - if (msgLen > 0) - writeToBuffer(msgStart, msgLen); - msgStart = msgCur + 1; /* over-read single CR/LF chars */ - } - } - - /* move incomplete message to beginning of buffer */ - ReadThreadLen = msgCur - msgStart; - if (ReadThreadLen > 0) - mch_memmove(ReadThreadBuffer, msgStart, ReadThreadLen); - - if (sniff_request_processed) - { - /* notify others that new data has arrived */ - sniff_request_processed = 0; - sniff_request_waiting = 1; -#ifdef FEAT_GUI_W32 - PostMessage(s_hwnd, WM_USER, (WPARAM)0, (LPARAM)0); -#endif - } - } - } - SNIFF_TRACE("end thread\n"); -} -#endif /* WIN32 */ -/*-------- End of Windows Only Declarations ------------------------*/ - - -/* ProcessSniffRequests - * Function that should be called from outside - * to process the waiting sniff requests - */ - void -ProcessSniffRequests(void) -{ - static char buf[MAX_REQUEST_LEN]; - int len; - - while (sniff_connected) - { -#ifdef WIN32 - len = ReadFromBuffer(buf, sizeof(buf)); -#else - len = get_request(fd_from_sniff, buf, sizeof(buf)); -#endif - if (len < 0) - { - vi_error_msg(_("E274: Sniff: Error during read. Disconnected")); - sniff_disconnect(1); - break; - } - else if (len > 0) - HandleSniffRequest( buf ); - else - break; - } - - if (sniff_will_disconnect) /* Now the last msg has been processed */ - sniff_disconnect(1); -} - - static struct sn_cmd * -find_sniff_cmd(char *cmd) -{ - struct sn_cmd *sniff_cmd = NULL; - int i; - for(i=0; sniff_cmds[i].cmd_name; i++) - { - if (!strcmp(cmd, sniff_cmds[i].cmd_name)) - { - sniff_cmd = &sniff_cmds[i]; - break; - } - } - if (!sniff_cmd) - { - struct sn_cmd_list *list = sniff_cmd_ext; - while (list) - { - if (!strcmp(cmd, list->sniff_cmd->cmd_name)) - { - sniff_cmd = list->sniff_cmd; - break; - } - list = list->next_cmd; - } - } - return sniff_cmd; -} - - static int -add_sniff_cmd(char *cmd, char *def, char *msg) -{ - int rc = 0; - if (def != NULL && def[0] != NUL && find_sniff_cmd(cmd) == NULL) - { - struct sn_cmd_list *list = sniff_cmd_ext; - struct sn_cmd *sniff_cmd = (struct sn_cmd*)malloc(sizeof(struct sn_cmd)); - struct sn_cmd_list *cmd_node = (struct sn_cmd_list*)malloc(sizeof(struct sn_cmd_list)); - int rq_type = 0; - - /* unescape message text */ - char *p = msg; - char *end = p+strlen(msg); - while (*p) - { - if (*p == '\\') - mch_memmove(p,p+1,end-p); - p++; - } - SNIFF_TRACE1("request name = %s\n",cmd); - SNIFF_TRACE1("request def = %s\n",def); - SNIFF_TRACE1("request msg = %s\n",msg); - - while (list && list->next_cmd) - list = list->next_cmd; - if (!list) - sniff_cmd_ext = cmd_node; - else - list->next_cmd = cmd_node; - - sniff_cmd->cmd_name = cmd; - sniff_cmd->cmd_code = def[0]; - sniff_cmd->cmd_msg = msg; - switch(def[1]) - { - case 'f': - rq_type = RQ_NOSYMBOL; - break; - case 's': - rq_type = RQ_CONTEXT; - break; - case 'S': - rq_type = RQ_SCONTEXT; - break; - default: - rq_type = RQ_SIMPLE; - break; - } - sniff_cmd->cmd_type = rq_type; - cmd_node->sniff_cmd = sniff_cmd; - cmd_node->next_cmd = NULL; - rc = 1; - } - return rc; -} - -/* ex_sniff - * Handle ":sniff" command - */ - void -ex_sniff(exarg_T *eap) -{ - char_u *arg = eap->arg; - char_u *symbol = NULL; - char_u *cmd = NULL; - - SNIFF_TRACE_OPEN("if_sniff.log"); - if (ends_excmd(*arg)) /* no request: print available commands */ - { - int i; - msg_start(); - msg_outtrans_attr((char_u *)"-- SNiFF+ commands --", hl_attr(HLF_T)); - for(i=0; sniff_cmds[i].cmd_name; i++) - { - msg_putchar('\n'); - msg_outtrans((char_u *)":sniff "); - msg_outtrans((char_u *)sniff_cmds[i].cmd_name); - } - msg_putchar('\n'); - msg_outtrans((char_u *)_("SNiFF+ is currently ")); - if (!sniff_connected) - msg_outtrans((char_u *)_("not ")); - msg_outtrans((char_u *)_("connected")); - msg_end(); - } - else /* extract command name and symbol if present */ - { - symbol = skiptowhite(arg); - cmd = vim_strnsave(arg, (int)(symbol-arg)); - symbol = skipwhite(symbol); - if (ends_excmd(*symbol)) - symbol = NULL; - if (!strcmp((char *)cmd, "addcmd")) - { - char_u *def = skiptowhite(symbol); - char_u *name = vim_strnsave(symbol, (int)(def-symbol)); - char_u *msg; - def = skipwhite(def); - msg = skiptowhite(def); - def = vim_strnsave(def, (int)(msg-def)); - msg = skipwhite(msg); - if (ends_excmd(*msg)) - msg = vim_strsave(name); - else - msg = vim_strnsave(msg, (int)(skiptowhite_esc(msg)-msg)); - if (!add_sniff_cmd((char*)name, (char*)def, (char*)msg)) - { - vim_free(msg); - vim_free(def); - vim_free(name); - } - } - else - { - struct sn_cmd* sniff_cmd = find_sniff_cmd((char*)cmd); - if (sniff_cmd) - SendRequest(sniff_cmd, (char *)symbol); - else - EMSG2(_("E275: Unknown SNiFF+ request: %s"), cmd); - } - vim_free(cmd); - } -} - - - static void -sniff_connect(void) -{ - if (sniff_connected) - return; - if (ConnectToSniffEmacs()) - vi_error_msg(_("E276: Error connecting to SNiFF+")); - else - { - int i; - - for (i = 0; init_cmds[i]; i++) - vi_exec_cmd(init_cmds[i]); - } -} - - void -sniff_disconnect(int immediately) -{ - if (!sniff_connected) - return; - if (immediately) - { - vi_exec_cmd("augroup sniff"); - vi_exec_cmd("au!"); - vi_exec_cmd("augroup END"); - vi_exec_cmd("unlet g:sniff_connected"); - sniff_connected = 0; - want_sniff_request = 0; - sniff_will_disconnect = 0; -#ifdef FEAT_GUI - if (gui.in_use) - gui_mch_wait_for_chars(0L); -#endif -#ifdef WIN32 - while (sniffBufStart != NULL) - { - struct sniffBufNode *node = sniffBufStart; - sniffBufStart = sniffBufStart->next; - free(node); - } - sniffBufStart = sniffBufEnd = NULL; - sniff_request_processed = 1; - CloseHandle(handle_to_sniff); - CloseHandle(handle_from_sniff); - WaitForSingleObject(sniffemacs_handle, 1000L); - CloseHandle(sniffemacs_handle); - sniffemacs_handle = NULL; - WaitForSingleObject(readthread_handle, 1000L); - readthread_handle = NULL; - CloseHandle(hBufferMutex); - hBufferMutex = NULL; - SNIFF_TRACE_CLOSE; -#else - close(fd_to_sniff); - close(fd_from_sniff); - wait(NULL); -#endif - } - else - { -#ifdef WIN32 -# if (defined(_MSC_VER) && _MSC_VER >= 1400) - Sleep(2); -# else - _sleep(2); -# endif - if (!sniff_request_processed) - ProcessSniffRequests(); -#else - sleep(2); /* Incoming msg could disturb edit */ -#endif - sniff_will_disconnect = 1; /* We expect disconnect msg in 2 secs */ - } -} - - -/* ConnectToSniffEmacs - * Connect to Sniff: returns 1 on error - */ - static int -ConnectToSniffEmacs(void) -{ -#ifdef WIN32 /* Windows Version of the Code */ - HANDLE ToSniffEmacs[2], FromSniffEmacs[2]; - SECURITY_ATTRIBUTES sa; - - sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; - - if (! CreatePipe(&ToSniffEmacs[0], &ToSniffEmacs[1], &sa, 0)) - return 1; - if (! CreatePipe(&FromSniffEmacs[0], &FromSniffEmacs[1], &sa, 0)) - return 1; - - sniffemacs_handle = ExecuteDetachedProgram(SniffEmacs[0], SniffEmacs[0], - ToSniffEmacs[0], FromSniffEmacs[1]); - - if (sniffemacs_handle) - { - handle_to_sniff = ToSniffEmacs[1]; - handle_from_sniff = FromSniffEmacs[0]; - sniff_connected = 1; - hBufferMutex = CreateMutex( - NULL, /* no security attributes */ - FALSE, /* initially not owned */ - "SniffReadBufferMutex"); /* name of mutex */ - if (hBufferMutex == NULL) - { - /* Check for error. */ - } - readthread_handle = (HANDLE)_beginthread(SniffEmacsReadThread, 0, NULL); - return 0; - } - else - { - /* error in spawn() */ - return 1; - } - -#else /* UNIX Version of the Code */ - int ToSniffEmacs[2], FromSniffEmacs[2]; - - if (pipe(ToSniffEmacs) != 0) - return 1; - if (pipe(FromSniffEmacs) != 0) - return 1; - - /* fork */ - if ((sniffemacs_pid=fork()) == 0) - { - /* child */ - - /* prepare communication pipes */ - close(ToSniffEmacs[1]); - close(FromSniffEmacs[0]); - - dup2(ToSniffEmacs[0],fileno(stdin)); /* write to ToSniffEmacs[1] */ - dup2(FromSniffEmacs[1],fileno(stdout));/* read from FromSniffEmacs[0] */ - - close(ToSniffEmacs[0]); - close(FromSniffEmacs[1]); - - /* start sniffemacs */ - execvp (SniffEmacs[0], SniffEmacs); - { -/* FILE *out = fdopen(FromSniffEmacs[1], "w"); */ - sleep(1); - fputs(_(msg_sniff_disconnect), stdout); - fflush(stdout); - sleep(3); -#ifdef FEAT_GUI - if (gui.in_use) - gui_exit(1); -#endif - exit(1); - } - return 1; - } - else if (sniffemacs_pid > 0) - { - /* parent process */ - close(ToSniffEmacs[0]); - fd_to_sniff = ToSniffEmacs[1]; - close(FromSniffEmacs[1]); - fd_from_sniff = FromSniffEmacs[0]; - sniff_connected = 1; - return 0; - } - else /* error in fork() */ - return 1; -#endif /* UNIX Version of the Code */ -} - - -/* HandleSniffRequest - * Handle one request from SNiFF+ - */ - static void -HandleSniffRequest(char *buffer) -{ - char VICommand[MAX_REQUEST_LEN]; - char command; - char *arguments; - char *token; - char *argv[3]; - int argc = 0; - buf_T *buf; - - const char *SetTab = "set tabstop=%d"; - const char *SelectBuf = "buf %s"; - const char *DeleteBuf = "bd %s"; - const char *UnloadBuf = "bun %s"; - const char *GotoLine = "%d"; - - command = buffer[0]; - arguments = &buffer[1]; - token = strtok(arguments, sniff_rq_sep); - while (argc <3) - { - if (token) - { - argv[argc] = (char*)vim_strsave((char_u *)token); - token = strtok(0, sniff_rq_sep); - } - else - argv[argc] = strdup(""); - argc++; - } - - switch (command) - { - case 'o' : /* visit file at char pos */ - case 'O' : /* visit file at line number */ - { - char *file = argv[0]; - int position = atoi(argv[1]); - - buf = vi_find_buffer(file); - setpcmark(); /* insert current pos in jump list [mark.c]*/ - if (!buf) - vi_open_file(file); - else if (buf!=curbuf) - { - vim_snprintf(VICommand, sizeof(VICommand), - (char *)SelectBuf, file); - vi_exec_cmd(VICommand); - } - if (command == 'o') - vi_set_cursor_pos((long)position); - else - { - vim_snprintf(VICommand, sizeof(VICommand), - (char *)GotoLine, (int)position); - vi_exec_cmd(VICommand); - } - checkpcmark(); /* [mark.c] */ -#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_W32) - if (gui.in_use && !gui.in_focus) /* Raise Vim Window */ - { -# ifdef FEAT_GUI_W32 - SetForegroundWindow(s_hwnd); -# else - extern Widget vimShell; - - XSetInputFocus(gui.dpy, XtWindow(vimShell), RevertToNone, - CurrentTime); - XRaiseWindow(gui.dpy, XtWindow(vimShell)); -# endif - } -#endif - break; - } - case 'p' : /* path of file has changed */ - /* when changing from shared to private WS (checkout) */ - { - char *file = argv[0]; - char *new_path = argv[1]; - - buf = vi_find_buffer(file); - if (buf && !buf->b_changed) /* delete buffer only if not modified */ - { - vim_snprintf(VICommand, sizeof(VICommand), - (char *)DeleteBuf, file); - vi_exec_cmd(VICommand); - } - vi_open_file(new_path); - break; - } - case 'w' : /* writability has changed */ - /* Sniff sends request twice, - * but only the last one is the right one */ - { - char *file = argv[0]; - int writable = atoi(argv[1]); - - buf = vi_find_buffer(file); - if (buf) - { - buf->b_p_ro = !writable; - if (buf != curbuf) - { - buf->b_flags |= BF_CHECK_RO + BF_NEVERLOADED; - if (writable && !buf->b_changed) - { - vim_snprintf(VICommand, sizeof(VICommand), - (char *)UnloadBuf, file); - vi_exec_cmd(VICommand); - } - } - else if (writable && !buf->b_changed) - { - vi_exec_cmd("e"); - } - } - break; - } - case 'h' : /* highlight info */ - break; /* not implemented */ - - case 't' : /* Set tab width */ - { - int tab_width = atoi(argv[1]); - - if (tab_width > 0 && tab_width <= 16) - { - vim_snprintf(VICommand, sizeof(VICommand), - (char *)SetTab, tab_width); - vi_exec_cmd(VICommand); - } - break; - } - case '|': - { - /* change the request separator */ - sniff_rq_sep[0] = arguments[0]; - /* echo the request */ - WriteToSniff(buffer); - break; - } - case 'A' : /* Warning/Info msg */ - vi_msg(arguments); - if (!strncmp(arguments, "Disconnected", 12)) - sniff_disconnect(1); /* unexpected disconnection */ - break; - case 'a' : /* Error msg */ - vi_error_msg(arguments); - if (!strncmp(arguments, "Cannot connect", 14)) - sniff_disconnect(1); - break; - - default : - break; - } - while (argc) - vim_free(argv[--argc]); -} - - -#ifndef WIN32 -/* get_request - * read string from fd up to next newline (excluding the nl), - * returns length of string - * 0 if no data available or no complete line - * <0 on error - */ - static int -get_request(int fd, char *buf, int maxlen) -{ - static char inbuf[1024]; - static int pos = 0, bytes = 0; - int len; -#ifdef HAVE_SELECT - struct timeval tval; - fd_set rfds; - - FD_ZERO(&rfds); - FD_SET(fd, &rfds); - tval.tv_sec = 0; - tval.tv_usec = 0; -#else - struct pollfd fds; - - fds.fd = fd; - fds.events = POLLIN; -#endif - - for (len = 0; len < maxlen; len++) - { - if (pos >= bytes) /* end of buffer reached? */ - { -#ifdef HAVE_SELECT - if (select(fd + 1, &rfds, NULL, NULL, &tval) > 0) -#else - if (poll(&fds, 1, 0) > 0) -#endif - { - pos = 0; - bytes = read(fd, inbuf, sizeof(inbuf)); - if (bytes <= 0) - return bytes; - } - else - { - pos = pos-len; - buf[0] = '\0'; - return 0; - } - } - if ((buf[len] = inbuf[pos++]) =='\n') - break; - } - buf[len] = '\0'; - return len; -} -#endif /* WIN32 */ - - - static void -SendRequest(struct sn_cmd *command, char *symbol) -{ - int cmd_type = command->cmd_type; - static char cmdstr[MAX_REQUEST_LEN]; - static char msgtxt[MAX_REQUEST_LEN]; - char *buffer_name = NULL; - - if (cmd_type == RQ_CONNECT) - { - sniff_connect(); - return; - } - if (!sniff_connected && !(cmd_type & SILENT)) - { - vi_error_msg(_("E278: SNiFF+ not connected")); - return; - } - - if (cmd_type & NEED_FILE) - { - if (!curbuf->b_sniff) - { - if (!(cmd_type & SILENT)) - vi_error_msg(_("E279: Not a SNiFF+ buffer")); - return; - } - buffer_name = vi_buffer_name(); - if (buffer_name == NULL) - return; - if (cmd_type & NEED_SYMBOL) - { - if (cmd_type & EMPTY_SYMBOL) - symbol = " "; - else if (!symbol && !(symbol = vi_symbol_under_cursor())) - return; /* error msg already displayed */ - } - - if (symbol) - vim_snprintf(cmdstr, sizeof(cmdstr), "%c%s%s%ld%s%s\n", - command->cmd_code, - buffer_name, - sniff_rq_sep, - vi_cursor_pos(), - sniff_rq_sep, - symbol - ); - else - vim_snprintf(cmdstr, sizeof(cmdstr), "%c%s\n", - command->cmd_code, buffer_name); - } - else /* simple request */ - { - cmdstr[0] = command->cmd_code; - cmdstr[1] = '\n'; - cmdstr[2] = '\0'; - } - if (command->cmd_msg && !(cmd_type & SILENT)) - { - if ((cmd_type & NEED_SYMBOL) && !(cmd_type & EMPTY_SYMBOL)) - { - vim_snprintf(msgtxt, sizeof(msgtxt), "%s: %s", - _(command->cmd_msg), symbol); - vi_msg(msgtxt); - } - else - vi_msg(_(command->cmd_msg)); - } - WriteToSniff(cmdstr); - if (cmd_type & DISCONNECT) - sniff_disconnect(0); -} - - - - static void -WriteToSniff(char *str) -{ - int bytes; -#ifdef WIN32 - if (! WriteFile(handle_to_sniff, str, strlen(str), &bytes, NULL)) - { - DWORD err=GetLastError(); - bytes = -1; - } -#else - bytes = write(fd_to_sniff, str, strlen(str)); -#endif - if (bytes<0) - { - vi_msg(_("Sniff: Error during write. Disconnected")); - sniff_disconnect(1); - } -} - -/*-------- vim helping functions --------------------------------*/ - - static void -vi_msg(char *str) -{ - if (str != NULL && *str != NUL) - MSG((char_u *)str); -} - - static void -vi_error_msg(char *str) -{ - if (str != NULL && *str != NUL) - EMSG((char_u *)str); -} - - static void -vi_open_file(char *fname) -{ - ++no_wait_return; - do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF, - curwin); - curbuf->b_sniff = TRUE; - --no_wait_return; /* [ex_docmd.c] */ -} - - static buf_T * -vi_find_buffer(char *fname) -{ /* derived from buflist_findname() [buffer.c] */ - buf_T *buf; - - for (buf = firstbuf; buf != NULL; buf = buf->b_next) - if (buf->b_sfname != NULL && fnamecmp(fname, buf->b_sfname) == 0) - return (buf); - return NULL; -} - - - static char * -vi_symbol_under_cursor(void) -{ - int len; - char *symbolp; - char *p; - static char sniff_symbol[256]; - - len = find_ident_under_cursor((char_u **)&symbolp, FIND_IDENT); - /* [normal.c] */ - if (len <= 0) - return NULL; - for (p=sniff_symbol; len; len--) - *p++ = *symbolp++; - *p = '\0'; - return sniff_symbol; -} - - - static char * -vi_buffer_name(void) -{ - return (char *)curbuf->b_sfname; -} - - static void -vi_exec_cmd(char *vicmd) -{ - do_cmdline_cmd((char_u *)vicmd); /* [ex_docmd.c] */ -} - -/* - * Set cursor on character position - * derived from cursor_pos_info() [buffer.c] - */ - static void -vi_set_cursor_pos(long char_pos) -{ - linenr_T lnum; - long char_count = 1; /* first position = 1 */ - int line_size; - int eol_size; - - if (char_pos == 0) - { - char_pos = 1; - } - if (get_fileformat(curbuf) == EOL_DOS) - eol_size = 2; - else - eol_size = 1; - for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum) - { - line_size = STRLEN(ml_get(lnum)) + eol_size; - if (char_count+line_size > char_pos) break; - char_count += line_size; - } - curwin->w_cursor.lnum = lnum; - curwin->w_cursor.col = char_pos - char_count; -} - - static long -vi_cursor_pos(void) -{ - linenr_T lnum; - long char_count=1; /* sniff starts with pos 1 */ - int line_size; - int eol_size; - - if (curbuf->b_p_tx) - eol_size = 2; - else - eol_size = 1; - for (lnum = 1; lnum < curwin->w_cursor.lnum; ++lnum) - { - line_size = STRLEN(ml_get(lnum)) + eol_size; - char_count += line_size; - } - return char_count + curwin->w_cursor.col; -} diff --git a/src/if_sniff.h b/src/if_sniff.h deleted file mode 100644 index 50186b80e8..0000000000 --- a/src/if_sniff.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * if_sniff.h Interface between Vim and SNiFF+ - */ - -#ifndef __if_sniff_h__ -#define __if_sniff_h__ - -extern int want_sniff_request; -extern int sniff_request_waiting; -extern int sniff_connected; -extern int fd_from_sniff; -extern void sniff_disconnect(int immediately); -extern void ProcessSniffRequests(void); -extern void ex_sniff(exarg_T *eap); - -#endif diff --git a/src/json.c b/src/json.c index 1a3dea1e5b..bbc27b4401 100644 --- a/src/json.c +++ b/src/json.c @@ -12,27 +12,12 @@ * * Follows this standard: https://tools.ietf.org/html/rfc7159.html */ +#define USING_FLOAT_STUFF #include "vim.h" #if defined(FEAT_EVAL) || defined(PROTO) -#if defined(FEAT_FLOAT) -# include -# if defined(HAVE_MATH_H) - /* for isnan() and isinf() */ -# include -# endif -# if defined(WIN32) && !defined(isnan) -# define isnan(x) _isnan(x) -# define isinf(x) (!_finite(x) && !_isnan(x)) -# endif -# if defined(_MSC_VER) && !defined(INFINITY) -# define INFINITY (DBL_MAX+DBL_MAX) -# define NAN (INFINITY-INFINITY) -# endif -#endif - static int json_encode_item(garray_T *gap, typval_T *val, int copyID, int options); static int json_decode_item(js_read_T *reader, typval_T *res, int options); @@ -95,10 +80,29 @@ write_string(garray_T *gap, char_u *str) ga_concat(gap, (char_u *)"null"); else { +#if defined(FEAT_MBYTE) && defined(USE_ICONV) + vimconv_T conv; + char_u *converted = NULL; + + if (!enc_utf8) + { + conv.vc_type = CONV_NONE; + convert_setup(&conv, p_enc, (char_u*)"utf-8"); + if (conv.vc_type != CONV_NONE) + converted = res = string_convert(&conv, res, NULL); + convert_setup(&conv, NULL, NULL); + } +#endif ga_append(gap, '"'); while (*res != NUL) { - int c = PTR2CHAR(res); + int c; +#ifdef FEAT_MBYTE + /* always use utf-8 encoding, ignore 'encoding' */ + c = utf_ptr2char(res); +#else + c = *res; +#endif switch (c) { @@ -121,7 +125,7 @@ write_string(garray_T *gap, char_u *str) if (c >= 0x20) { #ifdef FEAT_MBYTE - numbuf[mb_char2bytes(c, numbuf)] = NUL; + numbuf[utf_char2bytes(c, numbuf)] = NUL; #else numbuf[0] = c; numbuf[1] = NUL; @@ -135,9 +139,16 @@ write_string(garray_T *gap, char_u *str) ga_concat(gap, numbuf); } } - mb_cptr_adv(res); +#ifdef FEAT_MBYTE + res += utf_ptr2len(res); +#else + ++res; +#endif } ga_append(gap, '"'); +#if defined(FEAT_MBYTE) && defined(USE_ICONV) + vim_free(converted); +#endif } } @@ -285,12 +296,10 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID, int options) case VAR_FLOAT: #ifdef FEAT_FLOAT # if defined(HAVE_MATH_H) - if ((options & JSON_JS) && isnan(val->vval.v_float)) + if (isnan(val->vval.v_float)) ga_concat(gap, (char_u *)"NaN"); - else if ((options & JSON_JS) && isinf(val->vval.v_float)) + else if (isinf(val->vval.v_float)) ga_concat(gap, (char_u *)"Infinity"); - else if (isnan(val->vval.v_float) || isinf(val->vval.v_float)) - ga_concat(gap, (char_u *)"null"); else # endif { @@ -525,11 +534,25 @@ json_decode_string(js_read_T *reader, typval_T *res) int c; long nr; char_u buf[NUMBUFLEN]; +#if defined(FEAT_MBYTE) && defined(USE_ICONV) + vimconv_T conv; + char_u *converted = NULL; +#endif if (res != NULL) ga_init2(&ga, 1, 200); p = reader->js_buf + reader->js_used + 1; /* skip over " */ +#if defined(FEAT_MBYTE) && defined(USE_ICONV) + if (!enc_utf8) + { + conv.vc_type = CONV_NONE; + convert_setup(&conv, (char_u*)"utf-8", p_enc); + if (conv.vc_type != CONV_NONE) + converted = p = string_convert(&conv, p, NULL); + convert_setup(&conv, NULL, NULL); + } +#endif while (*p != '"') { if (*p == NUL || p[1] == NUL @@ -573,13 +596,32 @@ json_decode_string(js_read_T *reader, typval_T *res) + STRLEN(reader->js_buf); } } + nr = 0; + len = 0; vim_str2nr(p + 2, NULL, &len, STR2NR_HEX + STR2NR_FORCE, &nr, NULL, 4); p += len + 2; + if (0xd800 <= nr && nr <= 0xdfff + && (int)(reader->js_end - p) >= 6 + && *p == '\\' && *(p+1) == 'u') + { + long nr2 = 0; + + /* decode surrogate pair: \ud812\u3456 */ + len = 0; + vim_str2nr(p + 2, NULL, &len, + STR2NR_HEX + STR2NR_FORCE, &nr2, NULL, 4); + if (0xdc00 <= nr2 && nr2 <= 0xdfff) + { + p += len + 2; + nr = (((nr - 0xd800) << 10) | + ((nr2 - 0xdc00) & 0x3ff)) + 0x10000; + } + } if (res != NULL) { #ifdef FEAT_MBYTE - buf[(*mb_char2bytes)((int)nr, buf)] = NUL; + buf[utf_char2bytes((int)nr, buf)] = NUL; ga_concat(&ga, buf); #else ga_append(&ga, nr); @@ -600,12 +642,19 @@ json_decode_string(js_read_T *reader, typval_T *res) } else { - len = MB_PTR2LEN(p); +#ifdef FEAT_MBYTE + len = utf_ptr2len(p); +#else + len = 1; +#endif if (res != NULL) { if (ga_grow(&ga, len) == FAIL) { ga_clear(&ga); +#if defined(FEAT_MBYTE) && defined(USE_ICONV) + vim_free(converted); +#endif return FAIL; } mch_memmove((char *)ga.ga_data + ga.ga_len, p, (size_t)len); @@ -614,6 +663,9 @@ json_decode_string(js_read_T *reader, typval_T *res) p += len; } } +#if defined(FEAT_MBYTE) && defined(USE_ICONV) + vim_free(converted); +#endif reader->js_used = (int)(p - reader->js_buf); if (*p == '"') diff --git a/src/keymap.h b/src/keymap.h index 4dcfa65b25..6777c8402d 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -211,8 +211,6 @@ enum key_extra , KE_TAB /* unshifted TAB key */ , KE_S_TAB_OLD /* shifted TAB key (no longer used) */ - , KE_SNIFF /* SNiFF+ input waiting */ - , KE_XF1 /* extra vt100 function keys for xterm */ , KE_XF2 , KE_XF3 @@ -456,8 +454,6 @@ enum key_extra #define K_IGNORE TERMCAP2KEY(KS_EXTRA, KE_IGNORE) #define K_NOP TERMCAP2KEY(KS_EXTRA, KE_NOP) -#define K_SNIFF TERMCAP2KEY(KS_EXTRA, KE_SNIFF) - #define K_MOUSEDOWN TERMCAP2KEY(KS_EXTRA, KE_MOUSEDOWN) #define K_MOUSEUP TERMCAP2KEY(KS_EXTRA, KE_MOUSEUP) #define K_MOUSELEFT TERMCAP2KEY(KS_EXTRA, KE_MOUSELEFT) diff --git a/src/macros.h b/src/macros.h index 6e2c94ff15..b86c479e72 100644 --- a/src/macros.h +++ b/src/macros.h @@ -320,3 +320,36 @@ #if defined(FEAT_CHANNEL) || defined(FEAT_JOB) || defined(FEAT_CLIENTSERVER) # define MESSAGE_QUEUE #endif + +#if defined(FEAT_EVAL) && defined(FEAT_FLOAT) +# include +# if defined(HAVE_MATH_H) + /* for isnan() and isinf() */ +# include +# endif +# ifdef USING_FLOAT_STUFF +# if defined(WIN32) +# ifndef isnan +# define isnan(x) _isnan(x) +# define isinf(x) (!_finite(x) && !_isnan(x)) +# endif +# else +# ifndef HAVE_ISNAN + static inline int isnan(double x) { return x != x; } +# endif +# ifndef HAVE_ISINF + static inline int isinf(double x) { return !isnan(x) && isnan(x - x); } +# endif +# endif +# if !defined(INFINITY) +# if defined(DBL_MAX) +# define INFINITY (DBL_MAX+DBL_MAX) +# else +# define INFINITY (1.0 / 0.0) +# endif +# endif +# if !defined(NAN) +# define NAN (INFINITY-INFINITY) +# endif +# endif +#endif diff --git a/src/message.c b/src/message.c index f8c890e356..903c00f9be 100644 --- a/src/message.c +++ b/src/message.c @@ -15,10 +15,6 @@ #include "vim.h" -#if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) -# include -#endif - static int other_sourcing_name(void); static char_u *get_emsg_source(void); static char_u *get_emsg_lnum(void); diff --git a/src/netbeans.c b/src/netbeans.c index 0703a56515..712471bf4e 100644 --- a/src/netbeans.c +++ b/src/netbeans.c @@ -99,8 +99,11 @@ netbeans_close(void) { netbeans_send_disconnect(); if (nb_channel != NULL) + { /* Close the socket and remove the input handlers. */ channel_close(nb_channel, TRUE); + channel_clear(nb_channel); + } nb_channel = NULL; } diff --git a/src/normal.c b/src/normal.c index eab436f507..63576eeac4 100644 --- a/src/normal.c +++ b/src/normal.c @@ -163,9 +163,6 @@ static void nv_halfpage(cmdarg_T *cap); static void nv_join(cmdarg_T *cap); static void nv_put(cmdarg_T *cap); static void nv_open(cmdarg_T *cap); -#ifdef FEAT_SNIFF -static void nv_sniff(cmdarg_T *cap); -#endif #ifdef FEAT_NETBEANS_INTG static void nv_nbcmd(cmdarg_T *cap); #endif @@ -420,9 +417,6 @@ static const struct nv_cmd {K_F8, farsi_fkey, 0, 0}, {K_F9, farsi_fkey, 0, 0}, #endif -#ifdef FEAT_SNIFF - {K_SNIFF, nv_sniff, 0, 0}, -#endif #ifdef FEAT_NETBEANS_INTG {K_F21, nv_nbcmd, NV_NCH_ALW, 0}, #endif @@ -570,10 +564,6 @@ normal_cmd( * remembered in "opcount". */ ca.opcount = opcount; -#ifdef FEAT_SNIFF - want_sniff_request = sniff_connected; -#endif - /* * If there is an operator pending, then the command we take this time * will terminate it. Finish_op tells us to finish the operation before @@ -9422,14 +9412,6 @@ nv_open(cmdarg_T *cap) n_opencmd(cap); } -#ifdef FEAT_SNIFF - static void -nv_sniff(cmdarg_T *cap UNUSED) -{ - ProcessSniffRequests(); -} -#endif - #ifdef FEAT_NETBEANS_INTG static void nv_nbcmd(cmdarg_T *cap) diff --git a/src/os_unix.c b/src/os_unix.c index 978aa36756..34270f6d06 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -5362,7 +5362,6 @@ WaitForChar(long msec) * "msec" == 0 will check for characters once. * "msec" == -1 will block until a character is available. * When a GUI is being used, this will not be used for input -- webb - * Returns also, when a request from Sniff is waiting -- toni. * Or when a Linux GPM mouse event is waiting. * Or when a clientserver message is on the queue. */ @@ -5449,15 +5448,6 @@ RealWaitForChar(int fd, long msec, int *check_for_gpm UNUSED) fds[0].events = POLLIN; nfd = 1; -# ifdef FEAT_SNIFF -# define SNIFF_IDX 1 - if (want_sniff_request) - { - fds[SNIFF_IDX].fd = fd_from_sniff; - fds[SNIFF_IDX].events = POLLIN; - nfd++; - } -# endif # ifdef FEAT_XCLIPBOARD may_restore_clipboard(); if (xterm_Shell != (Widget)0) @@ -5500,17 +5490,6 @@ RealWaitForChar(int fd, long msec, int *check_for_gpm UNUSED) finished = FALSE; # endif -# ifdef FEAT_SNIFF - if (ret < 0) - sniff_disconnect(1); - else if (want_sniff_request) - { - if (fds[SNIFF_IDX].revents & POLLHUP) - sniff_disconnect(1); - if (fds[SNIFF_IDX].revents & POLLIN) - sniff_request_waiting = 1; - } -# endif # ifdef FEAT_XCLIPBOARD if (xterm_Shell != (Widget)0 && (fds[xterm_idx].revents & POLLIN)) { @@ -5596,15 +5575,6 @@ RealWaitForChar(int fd, long msec, int *check_for_gpm UNUSED) # endif maxfd = fd; -# ifdef FEAT_SNIFF - if (want_sniff_request) - { - FD_SET(fd_from_sniff, &rfds); - FD_SET(fd_from_sniff, &efds); - if (maxfd < fd_from_sniff) - maxfd = fd_from_sniff; - } -# endif # ifdef FEAT_XCLIPBOARD may_restore_clipboard(); if (xterm_Shell != (Widget)0) @@ -5674,17 +5644,6 @@ RealWaitForChar(int fd, long msec, int *check_for_gpm UNUSED) finished = FALSE; # endif -# ifdef FEAT_SNIFF - if (ret < 0 ) - sniff_disconnect(1); - else if (ret > 0 && want_sniff_request) - { - if (FD_ISSET(fd_from_sniff, &efds)) - sniff_disconnect(1); - if (FD_ISSET(fd_from_sniff, &rfds)) - sniff_request_waiting = 1; - } -# endif # ifdef FEAT_XCLIPBOARD if (ret > 0 && xterm_Shell != (Widget)0 && FD_ISSET(ConnectionNumber(xterm_dpy), &rfds)) diff --git a/src/os_win32.c b/src/os_win32.c index b7b393083a..28c0263088 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -1683,27 +1683,6 @@ mch_inchar( if (typeaheadlen > 0) goto theend; -#ifdef FEAT_SNIFF - if (want_sniff_request) - { - if (sniff_request_waiting) - { - /* return K_SNIFF */ - typeahead[typeaheadlen++] = CSI; - typeahead[typeaheadlen++] = (char_u)KS_EXTRA; - typeahead[typeaheadlen++] = (char_u)KE_SNIFF; - sniff_request_waiting = 0; - want_sniff_request = 0; - goto theend; - } - else if (time < 0 || time > 250) - { - /* don't wait too long, a request might be pending */ - time = 250; - } - } -#endif - if (time >= 0) { if (!WaitForChar(time)) /* no character available */ diff --git a/src/structs.h b/src/structs.h index 9b4701bc88..f798e2d34a 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1350,6 +1350,7 @@ typedef struct { cbq_T ch_cb_head; /* dummy node for per-request callbacks */ char_u *ch_callback; /* call when a msg is not handled */ + buf_T *ch_buffer; /* buffer to read from or write to */ } chanpart_T; struct channel_S { @@ -1398,6 +1399,12 @@ struct channel_S { #define JO_ID 0x2000 /* "id" */ #define JO_STOPONEXIT 0x4000 /* "stoponexit" */ #define JO_EXIT_CB 0x8000 /* "exit-cb" */ +#define JO_OUT_IO 0x10000 /* "out-io" */ +#define JO_ERR_IO 0x20000 /* "err-io" (JO_OUT_IO << 1) */ +#define JO_IN_IO 0x40000 /* "in-io" (JO_OUT_IO << 2) */ +#define JO_OUT_NAME 0x80000 /* "out-name" */ +#define JO_ERR_NAME 0x100000 /* "err-name" (JO_OUT_NAME << 1) */ +#define JO_IN_NAME 0x200000 /* "in-name" (JO_OUT_NAME << 2) */ #define JO_ALL 0xffffff #define JO_MODE_ALL (JO_MODE + JO_IN_MODE + JO_OUT_MODE + JO_ERR_MODE) @@ -1405,6 +1412,14 @@ struct channel_S { (JO_CALLBACK + JO_OUT_CALLBACK + JO_ERR_CALLBACK + JO_CLOSE_CALLBACK) #define JO_TIMEOUT_ALL (JO_TIMEOUT + JO_OUT_TIMEOUT + JO_ERR_TIMEOUT) +typedef enum { + JIO_NULL, + JIO_PIPE, + JIO_FILE, + JIO_BUFFER, + JIO_OUT +} job_io_T; + /* * Options for job and channel commands. */ @@ -1416,6 +1431,11 @@ typedef struct ch_mode_T jo_in_mode; ch_mode_T jo_out_mode; ch_mode_T jo_err_mode; + + job_io_T jo_io[4]; /* PART_OUT, PART_ERR, PART_IN */ + char_u jo_io_name_buf[4][NUMBUFLEN]; + char_u *jo_io_name[4]; /* not allocated! */ + char_u *jo_callback; /* not allocated! */ char_u *jo_out_cb; /* not allocated! */ char_u *jo_err_cb; /* not allocated! */ @@ -1622,10 +1642,6 @@ struct file_buffer char b_fab_rat; /* Record attribute */ unsigned int b_fab_mrs; /* Max record size */ #endif -#ifdef FEAT_SNIFF - int b_sniff; /* file was loaded through Sniff */ -#endif - int b_fnum; /* buffer number for this file. */ int b_changed; /* 'modified': Set to TRUE if something in the diff --git a/src/term.c b/src/term.c index a97fe54848..d6ba5373b7 100644 --- a/src/term.c +++ b/src/term.c @@ -1796,16 +1796,6 @@ set_termname(char_u *term) # endif #endif /* FEAT_MOUSE */ -#ifdef FEAT_SNIFF - { - char_u name[2]; - - name[0] = (int)KS_EXTRA; - name[1] = (int)KE_SNIFF; - add_termcode(name, (char_u *)"\233sniff", FALSE); - } -#endif - #ifdef USE_TERM_CONSOLE /* DEFAULT_TERM indicates that it is the machine console. */ if (STRCMP(term, DEFAULT_TERM) != 0) diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index 69922b1402..b214fa9885 100644 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -110,17 +110,17 @@ func s:communicate(port) endif " Simple string request and reply. - call assert_equal('got it', ch_sendexpr(handle, 'hello!')) + call assert_equal('got it', ch_evalexpr(handle, 'hello!')) " Request that triggers sending two ex commands. These will usually be " handled before getting the response, but it's not guaranteed, thus wait a " tiny bit for the commands to get executed. - call assert_equal('ok', ch_sendexpr(handle, 'make change')) + call assert_equal('ok', ch_evalexpr(handle, 'make change')) sleep 10m call assert_equal('added1', getline(line('$') - 1)) call assert_equal('added2', getline('$')) - call assert_equal('ok', ch_sendexpr(handle, 'do normal')) + call assert_equal('ok', ch_evalexpr(handle, 'do normal')) sleep 10m call assert_equal('added more', getline('$')) @@ -154,37 +154,37 @@ func s:communicate(port) call ch_setoptions(handle, {'callback': ''}) " Send an eval request that works. - call assert_equal('ok', ch_sendexpr(handle, 'eval-works')) + call assert_equal('ok', ch_evalexpr(handle, 'eval-works')) sleep 10m - call assert_equal([-1, 'foo123'], ch_sendexpr(handle, 'eval-result')) + call assert_equal([-1, 'foo123'], ch_evalexpr(handle, 'eval-result')) " Send an eval request that fails. - call assert_equal('ok', ch_sendexpr(handle, 'eval-fails')) + call assert_equal('ok', ch_evalexpr(handle, 'eval-fails')) sleep 10m - call assert_equal([-2, 'ERROR'], ch_sendexpr(handle, 'eval-result')) + call assert_equal([-2, 'ERROR'], ch_evalexpr(handle, 'eval-result')) " Send an eval request that works but can't be encoded. - call assert_equal('ok', ch_sendexpr(handle, 'eval-error')) + call assert_equal('ok', ch_evalexpr(handle, 'eval-error')) sleep 10m - call assert_equal([-3, 'ERROR'], ch_sendexpr(handle, 'eval-result')) + call assert_equal([-3, 'ERROR'], ch_evalexpr(handle, 'eval-result')) " Send a bad eval request. There will be no response. - call assert_equal('ok', ch_sendexpr(handle, 'eval-bad')) + call assert_equal('ok', ch_evalexpr(handle, 'eval-bad')) sleep 10m - call assert_equal([-3, 'ERROR'], ch_sendexpr(handle, 'eval-result')) + call assert_equal([-3, 'ERROR'], ch_evalexpr(handle, 'eval-result')) " Send an expr request - call assert_equal('ok', ch_sendexpr(handle, 'an expr')) + call assert_equal('ok', ch_evalexpr(handle, 'an expr')) sleep 10m call assert_equal('one', getline(line('$') - 2)) call assert_equal('two', getline(line('$') - 1)) call assert_equal('three', getline('$')) " Request a redraw, we don't check for the effect. - call assert_equal('ok', ch_sendexpr(handle, 'redraw')) - call assert_equal('ok', ch_sendexpr(handle, 'redraw!')) + call assert_equal('ok', ch_evalexpr(handle, 'redraw')) + call assert_equal('ok', ch_evalexpr(handle, 'redraw!')) - call assert_equal('ok', ch_sendexpr(handle, 'empty-request')) + call assert_equal('ok', ch_evalexpr(handle, 'empty-request')) " Reading while there is nothing available. call assert_equal(v:none, ch_read(handle, {'timeout': 0})) @@ -195,14 +195,14 @@ func s:communicate(port) call assert_true(reltimefloat(elapsed) < 0.6) " Send without waiting for a response, then wait for a response. - call ch_sendexpr(handle, 'wait a bit', {'callback': 0}) + call ch_sendexpr(handle, 'wait a bit') let resp = ch_read(handle) call assert_equal(type([]), type(resp)) call assert_equal(type(11), type(resp[0])) call assert_equal('waited', resp[1]) " make the server quit, can't check if this works, should not hang. - call ch_sendexpr(handle, '!quit!', {'callback': 0}) + call ch_sendexpr(handle, '!quit!') endfunc func Test_communicate() @@ -218,18 +218,18 @@ func s:two_channels(port) return endif - call assert_equal('got it', ch_sendexpr(handle, 'hello!')) + call assert_equal('got it', ch_evalexpr(handle, 'hello!')) let newhandle = ch_open('localhost:' . a:port, s:chopt) if ch_status(newhandle) == "fail" call assert_false(1, "Can't open second channel") return endif - call assert_equal('got it', ch_sendexpr(newhandle, 'hello!')) - call assert_equal('got it', ch_sendexpr(handle, 'hello!')) + call assert_equal('got it', ch_evalexpr(newhandle, 'hello!')) + call assert_equal('got it', ch_evalexpr(handle, 'hello!')) call ch_close(handle) - call assert_equal('got it', ch_sendexpr(newhandle, 'hello!')) + call assert_equal('got it', ch_evalexpr(newhandle, 'hello!')) call ch_close(newhandle) endfunc @@ -247,7 +247,7 @@ func s:server_crash(port) return endif - call ch_sendexpr(handle, '!crash!') + call ch_evalexpr(handle, '!crash!') sleep 10m endfunc @@ -271,12 +271,12 @@ func s:channel_handler(port) endif " Test that it works while waiting on a numbered message. - call assert_equal('ok', ch_sendexpr(handle, 'call me')) + call assert_equal('ok', ch_evalexpr(handle, 'call me')) sleep 10m call assert_equal('we called you', s:reply) " Test that it works while not waiting on a numbered message. - call ch_sendexpr(handle, 'call me again', {'callback': 0}) + call ch_sendexpr(handle, 'call me again') sleep 10m call assert_equal('we did call you', s:reply) endfunc @@ -334,15 +334,15 @@ func Test_raw_pipe() call assert_equal("run", job_status(job)) try let handle = job_getchannel(job) - call ch_sendraw(handle, "echo something\n", {'callback': 0}) + call ch_sendraw(handle, "echo something\n") let msg = ch_readraw(handle) call assert_equal("something\n", substitute(msg, "\r", "", 'g')) - call ch_sendraw(handle, "double this\n", {'callback': 0}) + call ch_sendraw(handle, "double this\n") let msg = ch_readraw(handle) call assert_equal("this\nAND this\n", substitute(msg, "\r", "", 'g')) - let reply = ch_sendraw(handle, "quit\n") + let reply = ch_evalraw(handle, "quit\n") call assert_equal("Goodbye!\n", substitute(reply, "\r", "", 'g')) finally call job_stop(job) @@ -358,20 +358,74 @@ func Test_nl_pipe() call assert_equal("run", job_status(job)) try let handle = job_getchannel(job) - call ch_sendraw(handle, "echo something\n", {'callback': 0}) + call ch_sendraw(handle, "echo something\n") call assert_equal("something", ch_readraw(handle)) - call ch_sendraw(handle, "double this\n", {'callback': 0}) + call ch_sendraw(handle, "double this\n") call assert_equal("this", ch_readraw(handle)) call assert_equal("AND this", ch_readraw(handle)) - let reply = ch_sendraw(handle, "quit\n") + let reply = ch_evalraw(handle, "quit\n") call assert_equal("Goodbye!", reply) finally call job_stop(job) endtry endfunc +func Test_pipe_to_buffer() + if !has('job') + return + endif + call ch_log('Test_pipe_to_buffer()') + let job = job_start(s:python . " test_channel_pipe.py", + \ {'out-io': 'buffer', 'out-name': 'pipe-output'}) + call assert_equal("run", job_status(job)) + try + let handle = job_getchannel(job) + call ch_sendraw(handle, "echo line one\n") + call ch_sendraw(handle, "echo line two\n") + call ch_sendraw(handle, "double this\n") + call ch_sendraw(handle, "quit\n") + sp pipe-output + for i in range(100) + sleep 10m + if line('$') >= 6 + break + endif + endfor + call assert_equal(['Reading from channel output...', 'line one', 'line two', 'this', 'AND this', 'Goodbye!'], getline(1, '$')) + bwipe! + finally + call job_stop(job) + endtry +endfunc + +func Test_pipe_to_nameless_buffer() + if !has('job') + return + endif + call ch_log('Test_pipe_to_nameless_buffer()') + let job = job_start(s:python . " test_channel_pipe.py", + \ {'out-io': 'buffer'}) + call assert_equal("run", job_status(job)) + try + let handle = job_getchannel(job) + call ch_sendraw(handle, "echo line one\n") + call ch_sendraw(handle, "echo line two\n") + exe ch_getbufnr(handle, "out") . 'sbuf' + for i in range(100) + sleep 10m + if line('$') >= 3 + break + endif + endfor + call assert_equal(['Reading from channel output...', 'line one', 'line two'], getline(1, '$')) + bwipe! + finally + call job_stop(job) + endtry +endfunc + """""""""" let s:unletResponse = '' @@ -434,7 +488,7 @@ func s:open_delay(port) call assert_false(1, "Can't open channel") return endif - call assert_equal('got it', ch_sendexpr(channel, 'hello!')) + call assert_equal('got it', ch_evalexpr(channel, 'hello!')) call ch_close(channel) endfunc @@ -457,7 +511,7 @@ function s:test_call(port) return endif - call assert_equal('ok', ch_sendexpr(handle, 'call-func')) + call assert_equal('ok', ch_evalexpr(handle, 'call-func')) sleep 20m call assert_equal([1, 2, 3], s:call_ret) endfunc @@ -507,7 +561,7 @@ function s:test_close_callback(port) endif call ch_setoptions(handle, {'close-cb': 'MyCloseCb'}) - call assert_equal('', ch_sendexpr(handle, 'close me')) + call assert_equal('', ch_evalexpr(handle, 'close me')) sleep 20m call assert_equal('closed', s:ch_close_ret) endfunc diff --git a/src/testdir/test_json.vim b/src/testdir/test_json.vim index bde7321739..369bdde2fa 100644 --- a/src/testdir/test_json.vim +++ b/src/testdir/test_json.vim @@ -12,6 +12,12 @@ let s:var4 = "\x10\x11\x12\x13\x14\x15\x16\x17" let s:json5 = '"\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f"' let s:var5 = "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +" surrogate pair +let s:jsonsp1 = '"\ud83c\udf63"' +let s:varsp1 = "\xf0\x9f\x8d\xa3" +let s:jsonsp2 = '"\ud83c\u00a0"' +let s:varsp2 = "\ud83c\u00a0" + let s:jsonmb = '"s¢cÄ´gÑ‘"' let s:varmb = "s¢cÄ´gÑ‘" let s:jsonnr = '1234' @@ -19,11 +25,9 @@ let s:varnr = 1234 if has('float') let s:jsonfl = '12.34' let s:varfl = 12.34 - let s:jsoninf = 'null' - let s:jsinf = 'Infinity' + let s:jsoninf = 'Infinity' let s:varinf = 1.0 / 0.0 - let s:jsonnan = 'null' - let s:jsnan = 'NaN' + let s:jsonnan = 'NaN' let s:varnan = 0.0 / 0.0 endif @@ -71,6 +75,8 @@ func Test_json_encode() if has('multi_byte') call assert_equal(s:jsonmb, json_encode(s:varmb)) + call assert_equal(s:varsp1, json_decode(s:jsonsp1)) + call assert_equal(s:varsp2, json_decode(s:jsonsp2)) endif call assert_equal(s:jsonnr, json_encode(s:varnr)) @@ -107,6 +113,8 @@ func Test_json_decode() if has('multi_byte') call assert_equal(s:varmb, json_decode(s:jsonmb)) + call assert_equal(s:varsp1, js_decode(s:jsonsp1)) + call assert_equal(s:varsp2, js_decode(s:jsonsp2)) endif call assert_equal(s:varnr, json_decode(s:jsonnr)) @@ -175,8 +183,8 @@ func Test_js_encode() call assert_equal(s:jsonnr, js_encode(s:varnr)) if has('float') call assert_equal(s:jsonfl, js_encode(s:varfl)) - call assert_equal(s:jsinf, js_encode(s:varinf)) - call assert_equal(s:jsnan, js_encode(s:varnan)) + call assert_equal(s:jsoninf, js_encode(s:varinf)) + call assert_equal(s:jsonnan, js_encode(s:varnan)) endif call assert_equal(s:jsonl1, js_encode(s:varl1)) @@ -213,8 +221,8 @@ func Test_js_decode() call assert_equal(s:varnr, js_decode(s:jsonnr)) if has('float') call assert_equal(s:varfl, js_decode(s:jsonfl)) - call assert_equal(s:varinf, js_decode(s:jsinf)) - call assert_true(isnan(js_decode(s:jsnan))) + call assert_equal(s:varinf, js_decode(s:jsoninf)) + call assert_true(isnan(js_decode(s:jsonnan))) endif call assert_equal(s:varl1, js_decode(s:jsonl1)) diff --git a/src/ui.c b/src/ui.c index 39c1ceefc7..7844bc6cc2 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1647,7 +1647,7 @@ set_input_buf(char_u *p) #if defined(FEAT_GUI) \ || defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE) \ || defined(FEAT_XCLIPBOARD) || defined(VMS) \ - || defined(FEAT_SNIFF) || defined(FEAT_CLIENTSERVER) \ + || defined(FEAT_CLIENTSERVER) \ || defined(PROTO) /* * Add the given bytes to the input buffer @@ -1792,17 +1792,7 @@ fill_input_buf(int exit_on_error UNUSED) inbufcount = 0; # else -# ifdef FEAT_SNIFF - if (sniff_request_waiting) - { - add_to_input_buf((char_u *)"\233sniff",6); /* results in K_SNIFF */ - sniff_request_waiting = 0; - want_sniff_request = 0; - return; - } -# endif - -# ifdef FEAT_MBYTE +# ifdef FEAT_MBYTE if (rest != NULL) { /* Use remainder of previous call, starts with an invalid character @@ -1826,7 +1816,7 @@ fill_input_buf(int exit_on_error UNUSED) } else unconverted = 0; -#endif +# endif len = 0; /* to avoid gcc warning */ for (try = 0; try < 100; ++try) diff --git a/src/version.c b/src/version.c index 25f17eac05..419731df71 100644 --- a/src/version.c +++ b/src/version.c @@ -564,11 +564,6 @@ static char *(features[]) = #else "-smartindent", #endif -#ifdef FEAT_SNIFF - "+sniff", -#else - "-sniff", -#endif #ifdef STARTUPTIME "+startuptime", #else @@ -763,6 +758,44 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1444, +/**/ + 1443, +/**/ + 1442, +/**/ + 1441, +/**/ + 1440, +/**/ + 1439, +/**/ + 1438, +/**/ + 1437, +/**/ + 1436, +/**/ + 1435, +/**/ + 1434, +/**/ + 1433, +/**/ + 1432, +/**/ + 1431, +/**/ + 1430, +/**/ + 1429, +/**/ + 1428, +/**/ + 1427, +/**/ + 1426, /**/ 1425, /**/ diff --git a/src/vim.h b/src/vim.h index 94ebc3385b..3f567c7baf 100644 --- a/src/vim.h +++ b/src/vim.h @@ -1975,10 +1975,6 @@ typedef int VimClipboard; /* This is required for the prototypes. */ #include "globals.h" /* global variables and messages */ -#ifdef FEAT_SNIFF -# include "if_sniff.h" -#endif - #ifndef FEAT_VIRTUALEDIT # define getvvcol(w, p, s, c, e) getvcol(w, p, s, c, e) # define virtual_active() FALSE