aboutsummaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAge
* vim-patch:8.0.0101ckelsel2017-09-24
| | | | | | | Problem: Some options are not strictly checked. Solution: Add flags for strickter checks. https://github.com/vim/vim/commit/031cb743ae154cfb727a9b7787bdcb61202ff1c8
* Move definition of cstrchr above the functions which call itJames McCoy2017-09-23
| | | | | | | | | | Functions with FUNC_ATTR_ALWAYS_INLINE need to be defined before they are called to work around bugs with some compiler versions. When the body is after the use of the function, compilation will fail with /home/niko/build/neovim/src/nvim/regexp.c: In function 'regmatch': /home/niko/build/neovim/build/src/nvim/auto/regexp.c.generated.h:77: sorry, unimplemented: inlining failed in call to 'cstrchr': function body not available /home/niko/build/neovim/src/nvim/regexp.c:4193: sorry, unimplemented: called from here
* vim-patch:8.0.0294 (#7305)Michael Schupikov2017-09-23
| | | | | | | | | | Problem: Argument list is not stored correctly in a session file. (lgpasquale) Solution: Use "$argadd" instead of "argadd". (closes vim/vim#1434) https://github.com/vim/vim/commit/79da563cf9220b9abb83455a68d995684133ea56 Signed-off-by: Michael Schupikov <michael@schupikov.de>
* Merge pull request #7277 from jamessan/deprecated-unibilium-APIsJames McCoy2017-09-17
|\ | | | | tui: Use unibi_var_from_num when available
| * tui: Use unibi_var_from_num when availableJames McCoy2017-09-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As of unibilium 1.2.1, directly manipulating unibi_var_t is deprecated. ../src/nvim/tui/tui.c: In function 'update_attrs': ../src/nvim/tui/tui.c:321:7: warning: 'i' is deprecated: use unibi_var_from_num or unibi_num_from_var instead [-Wdeprecated-declarations] data->params[0].i = (fg >> 16) & 0xff; // red ^~~~ In file included from ../src/nvim/tui/tui.c:12:0: /usr/include/unibilium.h:632:9: note: declared here int i UNIBI_DEPRECATED("use unibi_var_from_num or unibi_num_from_var instead"); ^ All use should go through unibi_{num,str}_from_var and unibi_var_from_{num,str}. Wrap access of unibi_var_t behind a new UNIBI_SET_NUM_VAR macro which uses the new functions when they're available.
* | vim-patch:8.0.0327 (#7281)KunMing Xie2017-09-17
| | | | | | | | | | | | | | Problem: The E11 error message in the command line window is not translated. Solution: use _(). (Hirohito Higashi) https://github.com/vim/vim/commit/75c19464ed7fb6024af64747379e61abc4e4a483
* | vim-patch:8.0.0324 (#7279)KunMing Xie2017-09-17
| | | | | | | | | | | | | | Problem: Illegal memory access with "1;y". Solution: Call check_cursor() instead of check_cursor_lnum(). (Dominique Pelle, closes vim/vim#1455) https://github.com/vim/vim/commit/f1f6f3f7df2938b3583e341482d96c1d53124c51
* | vim-patch:8.0.0302 NA (#7264)KunMing Xie2017-09-17
| | | | | | | | | | | | | | | | | | (NA: Nvim removed the ability to set termcodes directly.) Problem: Cannot set terminal key codes with :let. Solution: Make it work. https://github.com/vim/vim/commit/e353c402e63b9b0a0bc06acf390e352d9e7eeaeb
* | vim-patch:8.0.0305 (#7265)KunMing Xie2017-09-17
|/ | | | | | Problem: Invalid memory access when option has duplicate flag. Solution: Correct pointer computation. (Dominique Pelle, closes vim/vim#1442) https://github.com/vim/vim/commit/aaaf57d8a936efe420190c077e4a74041cc6c72e
* getchar.c: add TERM_FOCUS to MAP_HASH (#7271)Justin M. Keyes2017-09-16
| | | | | vim-patch:8.0.1108 https://github.com/vim/vim/commit/69fbc9e1dab176f345719436cd89d854df0a2abd
* ex_cmds.c:do_sub(): macroize duplicate codeJustin M. Keyes2017-09-13
|
* 'inccommand': fix 'gdefault' lockup #7261KillTheMule2017-09-12
| | | | | closes #7244 ref #7249
* Vim-patch 8.0.0300 (#7258)KunMing Xie2017-09-11
| | | | | | | | | vim-patch:8.0.0300 Problem: Cannot stop diffing hidden buffers. (Daniel Hahler) Solution: When using :diffoff! make the whole list if diffed buffers empty. (closes vim/vim#736) https://github.com/vim/vim/commit/25ea0544587dd45088512fec9d7a685e35fea679
* vim-patch:8.0.0186 (#7154)KunMing Xie2017-09-10
| | | | | | | Problem: The error message from assert_notequal() is confusing. Solution: Only mention the expected value. https://github.com/vim/vim/commit/5869cf060e60cc09e71b2b3bd85f0576ec78f9f5
* vim-patch:8.0.0282 vim-patch:8.0.0291 (#7255)KunMing Xie2017-09-10
| | | | | | | | | | | | | | | | | | | | vim-patch:8.0.0291 Problem: Visual block insertion does not insert in all lines. Solution: Don't bail out of insert too early. Add a test. (Christian Brabandt, closes vim/vim#1290) https://github.com/vim/vim/commit/23fa81d2223cd9bb7c51829c48047b2976bc2d11 vim-patch:8.0.0282 Problem: When doing a Visual selection and using "I" to go to insert mode, CTRL-O needs to be used twice to go to Normal mode. (Coacher) Solution: Check for the return value of edit(). (Christian Brabandt, closes #1290) https://github.com/vim/vim/commit/0b5c93a7f266cd8c90ea27bdaf9f7214a95d64d7
* inccommand: fix optimization logic #7224KillTheMule2017-09-09
| | | | | | | Before this change the preview changes in the buffer viewport were limited to the size of the preview window ('cmdwinheight'). closes #7220
* terminal.c: need maketitle() in terminal-modeJustin M. Keyes2017-09-09
| | | | | | | | | | | normal_redraw() usually takes care of this, but that doesn't happen during terminal-mode. regression by c484323dc67f steps to reproduce: nvim -u NORC --cmd 'execute("set titlestring=" . $NVIM_LISTEN_ADDRESS) | set title | startinsert | !sleep 1' term://sh closes #7248
* Merge #7241 ':terminal : handle F1-F12, other keys'Justin M. Keyes2017-09-06
|\
| * Merge #5014 ':terminal : handle F1-F12, other keys'Justin M. Keyes2017-09-05
| |\ | | | | | | | | | | | | | | | | | | closes #3101 closes #4343 closes #5024 closes #5925
| | * terminal.c: label fallthrough on big switchRJ Miller2017-01-10
| | |
| | * terminal.c: handle ctrl+space and ctrl+@RJ Miller2017-01-10
| | |
| | * terminal.c: add more arrow key supportRJ Miller2017-01-10
| | |
| | * terminal.c: move mod logic into convert_modifiersRJ Miller2017-01-10
| | |
| | * terminal.c: Handle more special keysRJ Miller2017-01-10
| | |
* | | Merge #7221 from justinmk/ev-focusgainedJustin M. Keyes2017-09-06
|\ \ \ | | | | | | | | tui: schedule event instead of <FocusGained> pseudokey
| * | | doc: channel, eventloopJustin M. Keyes2017-09-05
| | | |
| * | | eventloop: loop_schedule_deferred()Justin M. Keyes2017-09-05
| | | | | | | | | | | | | | | | Generalize the "schedule schedule" technique.
| * | | lintJustin M. Keyes2017-09-05
| | | |
| * | | log: introduce `context`Justin M. Keyes2017-09-05
| | | |
| * | | eventloop: restore redraw in cmdline K_EVENT handlerJustin M. Keyes2017-09-05
| | | | | | | | | | | | | | | | Restores behavior from commit: 02e86ef04cc1
| * | | eventloop: do not redraw in cmdline K_EVENT handlerJustin M. Keyes2017-09-05
| | | | | | | | | | | | | | | | | | | | If :echo is done by an timer or event (such as FocusGained/FocusLost), redrawcmdline() clobbers it.
| * | | eventloop: FocusGained: schedule the scheduleJustin M. Keyes2017-09-05
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | main_loop.fast_events does not manifest as K_EVENT, because it is processed at a different stage than main_loop.events. In order to queue into main_loop.events, we need to go through the threadsafe loop_schedule(), which queues into main_loop.thread_events and eventually main_loop.fast_events. _Then_ it is safe to directly queue into main_loop.events. This makes it more likely that the event is treated as K_EVENT.
| * | | doc: eventloopJustin M. Keyes2017-09-05
| | | |
| * | | eventloop: FocusGained: schedule event instead of pseudokeyJustin M. Keyes2017-09-05
| |/ / | | | | | | | | | | | | closes #4840 closes #6164
* / / vim-patch: 8.0.0{181,182,188} (#7152)KunMing Xie2017-09-05
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | vim-patch:8.0.0181 Problem: When 'cursorbind' and 'cursorcolumn' are both on, the column highlignt in non-current windows is wrong. Solution: Add validate_cursor(). (Masanori Misono, closes vim/vim#1372) https://github.com/vim/vim/commit/519d7785f4437762c07b2e04217f83a069a8c663 vim-patch:8.0.0182 Problem: When 'cursorbind' and 'cursorline' are set, but 'cursorcolumn' is not, then the cursor line highlighting is not updated. (Hirohito Higashi) Solution: Call redraw_later() with NOT_VALID. https://github.com/vim/vim/commit/e47683a0913f102b6ae08c8848d5aa675d99b188 vim-patch:8.0.0188 Problem: Using NOT_VALID for redraw_later() to update the cursor line/column highlighting is not efficient. Solution: Call validate_cursor() when 'cul' or 'cuc' is set. https://github.com/vim/vim/commit/9506cad7a1a6e52a613f356de969cbd980815777
* | tui: DECSCUSR workaround for Konsole (#7236)Vadim A. Misbakh-Soloviov2017-09-04
| | | | | | closes #7235
* | eventloop: K_EVENT should not finish operatorMatthew Malcomson2017-09-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | normal_finish_command() and normal_prepare() assume that any pending operator needs to be finished after any subsequent key. Set `finish_op = false` in nv_event() to indicate that the pending operator shouldn't be finished in normal_execute(). This is how nv_visual() indicates that 'v' or 'V' in operator-pending mode should not finish the current pending operator. fixes #5398 fixes #6166 (partially; mappings are still interrupted)
* | vim-patch:8.0.0125Albert Han2017-09-03
| | | | | | | | | | | | | | Problem: Not enough testing for entering Ex commands. Solution: Add test for CTRL-\ e {expr}. (Dominique Pelle) https://github.com/vim/vim/commit/eaaa9bbda6ec0a8589a9b23720f95bffe01dc267
* | vim-patch:8.0.0247 (#7232)KunMing Xie2017-09-03
| | | | | | | | | | | | | | Problem: Under some circumstances, one needs to type Ctrl-N or Ctrl-P twice to have a menu entry selected. (Lifepillar) Solution: call ins_compl_free(). (Christian Brabandt, closes vim/vim#1411) https://github.com/vim/vim/commit/aed6d0b81a14a81433c0f3c2c65cef935100db33
* | vim-patch:8.0.0209ckelsel2017-08-30
| | | | | | | | | | | | | | | | Problem: When using :substitute with the "c" flag and 'cursorbind' is set the cursor is not updated in other windows. Solution: Call do_check_cursorbind(). (Masanori Misono) https://github.com/vim/vim/commit/41baa7983aa81b0343b053e6a672cf8224a10245
* | tui: support new iterm2, iTerm2.app terminfo entriesLeonardo Brondani Schenkel2017-08-26
| | | | | | | | | | | | | | | | iTerm2 got its own entry in Thomas Dickey's terminfo.src on 2017-08-16. Make sure that the new entry is handled in the same way as the old entry. closes #7209 closes #7214
* | Merge #7081 from justinmk/rpcstopJustin M. Keyes2017-08-26
|\ \ | | | | | | rpc: close channel if stream was closed
| * | channel.c:call_set_error(): fix memory leakJustin M. Keyes2017-08-21
| | |
| * | rpc: close channel if stream was closedJustin M. Keyes2017-08-21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | f_jobstop()/f_rpcstop() .. process_stop() .. process_close_in(proc) closes the write-stream of a RPC channel. But there might be a pending RPC notification on the queue, which may get processed just before the channel is closed. To handle that case, check the Stream.closed in channel.c:receive_msgpack(). Before this change, the above scenario could trigger this assert(!stream->closed) in wstream_write(): 0x00007f96e1cd3428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54 0x00007f96e1cd502a in __GI_abort () at abort.c:89 0x00007f96e1ccbbd7 in __assert_fail_base (fmt=<optimized out>, assertion=assertion@entry=0x768f9b "!stream->closed", file=file@entry=0x768f70 "../src/nvim/event/wstream.c", line=line@entry=77, function=function@entry=0x768fb0 <__PRETTY_FUNCTION__.13735> "wstream_write") at assert.c:92 0x00007f96e1ccbc82 in __GI___assert_fail (assertion=0x768f9b "!stream->closed", file=0x768f70 "../src/nvim/event/wstream.c", line=77, function=0x768fb0 <__PRETTY_FUNCTION__.13735> "wstream_write") at assert.c:101 0x00000000004d2c1f in wstream_write (stream=0x7f96e0a35078, buffer=0x7f96e09f9b40) at ../src/nvim/event/wstream.c:77 0x00000000005857b2 in channel_write (channel=0x7f96e0ae5800, buffer=0x7f96e09f9b40) at ../src/nvim/msgpack_rpc/channel.c:551 0x000000000058567d in on_request_event (argv=0x7ffed792efa0) at ../src/nvim/msgpack_rpc/channel.c:523 0x00000000005854c8 in handle_request (channel=0x7f96e0ae5800, request=0x7ffed792f1b8) at ../src/nvim/msgpack_rpc/channel.c:503 0x00000000005850cb in parse_msgpack (channel=0x7f96e0ae5800) at ../src/nvim/msgpack_rpc/channel.c:423 0x0000000000584f90 in receive_msgpack (stream=0x7f96e0a35218, rbuf=0x7f96e0d1d4c0, c=22, data=0x7f96e0ae5800, eof=false) at ../src/nvim/msgpack_rpc/channel.c:389 0x00000000004d0b20 in read_event (argv=0x7ffed792f4a8) at ../src/nvim/event/rstream.c:190 0x00000000004ce462 in multiqueue_process_events (this=0x7f96e18172d0) at ../src/nvim/event/multiqueue.c:150 0x000000000059b630 in nv_event (cap=0x7ffed792f620) at ../src/nvim/normal.c:7908 0x000000000058be69 in normal_execute (state=0x7ffed792f580, key=-25341) at ../src/nvim/normal.c:1137 0x0000000000652463 in state_enter (s=0x7ffed792f580) at ../src/nvim/state.c:61 0x000000000058a1fe in normal_enter (cmdwin=false, noexmode=false) at ../src/nvim/normal.c:467 0x00000000005500c2 in main (argc=2, argv=0x7ffed792f8d8) at ../src/nvim/main.c:554 Alternative approach suggested by bfredl is to use close_cb of the process. My unsuccessful attempt is below. (It seems close_cb is queued too late, which is the similar problem addressed by this commit): commit 75fc12c6ab15711bdb7b18c6d42ec9d157f5145e Author: Justin M. Keyes <justinkz@gmail.com> Date: Fri Aug 18 01:30:41 2017 +0200 rpc: use Stream's close_cb instead of explicit check in receive_msgpack() diff --git a/src/nvim/event/process.c b/src/nvim/event/process.c index 8371d3cd482e..e52da23cdc40 100644 --- a/src/nvim/event/process.c +++ b/src/nvim/event/process.c @@ -416,6 +416,10 @@ static void on_process_exit(Process *proc) static void on_process_stream_close(Stream *stream, void *data) { Process *proc = data; + ILOG("on_process_stream_close"); + if (proc->stream_close_cb != NULL) { + proc->stream_close_cb(stream, proc->stream_close_data); + } decref(proc); } diff --git a/src/nvim/event/process.h b/src/nvim/event/process.h index 5c00e8e7ecd5..34a8d54f6f8c 100644 --- a/src/nvim/event/process.h +++ b/src/nvim/event/process.h @@ -26,6 +26,11 @@ struct process { Stream *in, *out, *err; process_exit_cb cb; internal_process_cb internal_exit_cb, internal_close_cb; + + // Called when any of the process streams (in/out/err) closes. + stream_close_cb stream_close_cb; + void *stream_close_data; + bool closed, detach; MultiQueue *events; }; @@ -50,6 +55,8 @@ static inline Process process_init(Loop *loop, ProcessType type, void *data) .closed = false, .internal_close_cb = NULL, .internal_exit_cb = NULL, + .stream_close_cb = NULL, + .stream_close_data = NULL, .detach = false }; } diff --git a/src/nvim/event/stream.c b/src/nvim/event/stream.c index 7c865bfe1e8c..c8720d1e45d9 100644 --- a/src/nvim/event/stream.c +++ b/src/nvim/event/stream.c @@ -95,7 +95,11 @@ void stream_close(Stream *stream, stream_close_cb on_stream_close, void *data) void stream_close_handle(Stream *stream) FUNC_ATTR_NONNULL_ALL { + ILOG("stream=%d", stream); + // LOG_CALLSTACK(); if (stream->uvstream) { + // problem: this schedules on the queue, but channel.c:receive_msgpack may + // be processed before close_cb is called by libuv. uv_close((uv_handle_t *)stream->uvstream, close_cb); } else { uv_close((uv_handle_t *)&stream->uv.idle, close_cb); @@ -105,6 +109,7 @@ void stream_close_handle(Stream *stream) static void close_cb(uv_handle_t *handle) { Stream *stream = handle->data; + ILOG(">>>>>>>>>>>>>>>>>>>>>>> stream=%p stream->internal_close_cb=%p", stream, stream->internal_close_cb); if (stream->buffer) { rbuffer_free(stream->buffer); } diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index 782eabe04e4a..dc2b794e366a 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -128,6 +128,8 @@ uint64_t channel_from_process(Process *proc, uint64_t id, char *source) source); incref(channel); // process channels are only closed by the exit_cb channel->data.proc = proc; + channel->data.proc->stream_close_cb = close_cb2; + channel->data.proc->stream_close_data = channel; wstream_init(proc->in, 0); rstream_init(proc->out, 0); @@ -387,17 +389,6 @@ static void receive_msgpack(Stream *stream, RBuffer *rbuf, size_t c, goto end; } - if ((chan_wstream(channel) != NULL && chan_wstream(channel)->closed) - || (chan_rstream(channel) != NULL && chan_rstream(channel)->closed)) { - char buf[256]; - snprintf(buf, sizeof(buf), - "ch %" PRIu64 ": stream closed unexpectedly. " - "closing channel", - channel->id); - call_set_error(channel, buf, WARN_LOG_LEVEL); - goto end; - } - size_t count = rbuffer_size(rbuf); DLOG("ch %" PRIu64 ": parsing %u bytes from msgpack Stream: %p", channel->id, count, stream); @@ -571,23 +562,6 @@ static Stream *chan_wstream(Channel *chan) abort(); } -/// Returns the Stream that a Channel reads from. -static Stream *chan_rstream(Channel *chan) -{ - switch (chan->type) { - case kChannelTypeSocket: - return &chan->data.stream; - case kChannelTypeProc: - return chan->data.proc->out; - case kChannelTypeStdio: - return &chan->data.std.in; - case kChannelTypeInternal: - return NULL; - } - abort(); -} - - static bool channel_write(Channel *channel, WBuffer *buffer) { bool success = false; @@ -799,6 +773,12 @@ static void close_cb(Stream *stream, void *data) decref(data); } +static void close_cb2(Stream *stream, void *data) +{ + ILOG("close_cb2"); + close_channel(data); +} + /// @param source description of source function, rplugin name, TCP addr, etc static Channel *register_channel(ChannelType type, uint64_t id, MultiQueue *events, char *source)
| * | log: some DEBUG-level stream loggingJustin M. Keyes2017-08-21
| | |
* | | Merge pull request #7192 from llorens/vim-8.0.0092James McCoy2017-08-25
|\ \ \ | | | | | | | | vim-patch:8.0.0092
| * | | vim-patch:8.0.0092Lech Lorens2017-08-21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: C indenting does not support nested namespaces that C++ 17 has. Solution: Add check that passes double colon inside a name. (Pauli, closes vim/vim#1214) https://github.com/vim/vim/commit/ca8b8d6956dd881de6446fc32c38e817a364a6cc
* | | | Merge #7205 from justinmk/win-wmainJustin M. Keyes2017-08-24
|\ \ \ \
| * | | | win: expect utf8-encoded `argv` when built as a libraryJustin M. Keyes2017-08-24
| | | | |
| * | | | win: wmain(): use utf16_to_utf8() #7060Justin M. Keyes2017-08-24
| | | | |