Björn Linse
6e5cb0debd
ui: refactor ui options
2018-02-13 20:48:51 +01:00
Justin M. Keyes
352a51e831
test: :! print binary data, control chars
...
closes #5442
closes #4142
ref #6618
ref #4376
ref #7844
ref #2958
ref #4338
2018-02-07 09:25:51 +01:00
Björn Linse
4e7d85e635
shell: update execute('!cmd')
test to new behavior
...
And similarly nvim_command_output test
2018-02-06 20:16:38 +01:00
ZyX
a2dfeb8a16
functests: Improve error reporting in _check_parsing function
...
May be needed for unit tests as well though.
2018-02-02 07:28:56 -05:00
Justin M. Keyes
5055d4a755
api: nvim_command_output: direct impl
2018-01-10 23:58:56 +01:00
Justin M. Keyes
c095f83116
api: change nvim_command_output behavior
...
Implement nvim_command_output with `execute({cmd},"silent")`.
Behavior changes:
- does not provoke any hit-enter prompt
- no longer prepends a newline char
- does not capture some noise (like the "[New File]" message, see the
change to tabnewentered_spec.lua)
Technically ("bug-for-bug") this a breaking change. But the previous
behavior of nvim_command_output meant that it probably wasn't used for
anything outside of tests.
Also remove the undocumented `v:command_output` variable which was
a hack introduced only for the purposes of nvim_command_output.
closes #7726
2018-01-10 23:45:44 +01:00
ZyX
5ab0f988ca
*: Replace all occurrences of NVim with Nvim
2017-11-30 11:53:25 +03:00
ZyX
17077b6813
viml/parser/expressions: Make $ENV not depend on &isident
2017-11-26 16:08:53 +03:00
ZyX
b9c7813058
Merge branch 'master' into expression-parser
2017-11-26 15:54:03 +03:00
Björn Linse
91b856ccce
channels: tests
2017-11-26 09:17:04 +01:00
ZyX
ebb33eddd9
tests: Stabilize float format and %e in format_luav and format_string
2017-11-19 22:00:59 +03:00
ZyX
f20f97c936
*: Fix linter errors
2017-11-19 21:13:27 +03:00
ZyX
a94255a7ac
tests: Use single test file for unit and functional parser tests
2017-11-19 20:20:06 +03:00
ZyX
24a353364d
Merge branch 'master' into expression-parser
2017-11-06 20:23:35 +03:00
ZyX
ebb5977837
api/vim: Add “len” dictionary key
...
This allows determining where parsing ended which may be needed for e.g. parsing
`:echo` with that API function.
2017-11-06 01:17:39 +03:00
ZyX
7849070f99
tests: Add missing test cases
2017-11-06 01:17:39 +03:00
ZyX
7bc6de7526
api/vim,functests: Add tests for nvim_parse_expression, fix found bugs
2017-11-06 01:17:39 +03:00
ZyX
b9d5aea073
api/vim: Create part of nvim_parse_expression function
2017-11-06 01:17:38 +03:00
James McCoy
a39c8b7ce3
test: server_spec: Tolerate missing protocol ( #7478 )
...
Travis disabled IPv6:
[ RUN ] serverstart(), serverstop() parses endpoints correctly: FAIL
...build/neovim/neovim/test/functional/eval/server_spec.lua:83: Expected objects to be the same.
Passed in:
(table) {
[1] = '127.0.0.1:12345' }
Expected:
(table) {
[1] = '127.0.0.1:12345'
*[2] = '::1:12345' }
Change all tests to ensure a server was actually started before
expecting it to be returned from serverlist().
2017-11-02 10:45:38 +01:00
Björn Linse
2a3bcd1ff8
rpc: Don't delay notifications when request is pending ( #6544 )
...
With the old behavior, if a GUI makes a blocking request that requires user
interaction (like nvim_input()), it would not get any screen updates.
The client, not nvim, should decide how to handle notifications during a
pending request. If an rplugin wants to avoid async calls while a sync call is
busy, it likely wants to avoid processing async calls while another async call
also is handled as well.
This may break the expectation of some existing rplugins. For compatibility,
remote/define.vim reimplements the old behavior. Clients can opt-out by
specifying `sync=urgent`.
- Legacy hosts should be updated to use `sync=urgent`. They could add a flag
indicating which async methods are always safe to call and which must wait
until the main loop returns.
- New hosts can expose the full asyncness, they don't need to offer both
behaviors.
ref #6532
ref #1398 d83868fe90
2017-10-29 03:06:53 +01:00
Justin M. Keyes
52517321d1
test: nvim_get_hl_by_name/by_id #7082
...
- test all properties
- test failure modes
2017-10-08 21:17:20 +02:00
Justin M. Keyes
04187a1c74
Merge #7082 'api: nvim_get_hl_by_name/by_id'
2017-10-08 19:09:14 +02:00
Matthieu Coudron
3a00648639
Changed prototypes to accept a boolean "rgb"
2017-09-30 11:43:26 +09:00
Matthieu Coudron
e3a2cca387
Increased test coverage for RGB and cterm
2017-09-30 11:43:26 +09:00
Matthieu Coudron
ba7277cfb4
Adds nvim_get_hl_by_name/by_id
...
...in order to retrieve highlights.
Added test/functional/api/highlight_spec.lua
HL_NORMAL is not really a good name, since it's more like an empty attribute than the normal's one.
If one pays attention, syn_cterm_attr2entry is never called with attr=0 because it's always special cased before.
I suggest in subsequent PRs we remove the ATTR_OFF and just insert an EMPTY ATTR/RESET_ATTR/UNINITIALIZED for id 0.
2017-09-30 11:43:26 +09:00
Justin M. Keyes
9d6bac3219
test: more coverage for RPC + op-pending #3732
2017-09-16 12:21:31 +02:00
Justin M. Keyes
ce852bab04
eventloop: K_EVENT does not finish mapping
...
The "mapping" tests added in 541dde36e3
were flawed:
- Unlike op-pending mode, RPCs are _blocked_ during map-pending. So
a synchronous RPC like nvim_get_current_buf() waits until
'timeoutlen', then the mapping is canceled.
- helpers.expect() also performs a blocking RPC, so again that must not
intervene the two nvim_input() calls.
closes #6166
2017-09-04 22:51:04 +02:00
Justin M. Keyes
3922237b14
test: lint
2017-09-04 10:46:10 +02:00
Matthew Malcomson
541dde36e3
eventloop: K_EVENT should not finish operator
...
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)
2017-09-04 08:20:04 +02:00
Justin M. Keyes
af993da435
rpc: close channel if stream was closed
...
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)
2017-08-21 01:04:28 +02:00
Justin M. Keyes
0ea7e45bc1
'cpoptions': remove "<" flag; ignore <special>
...
Closes #6937 "nvim_get_keymap output is unreliable"
2017-07-08 16:34:35 +02:00
ZyX
d5916a823a
functests: Test how spaces appear in get_keymap output
2017-07-02 20:08:00 +03:00
ZyX
5fe5d712aa
functests: Use more extensive testing
...
Fixes #6937
2017-07-02 19:50:03 +03:00
ZyX
24f0056ca5
message: Add support for replacing <
to str2special
2017-07-02 19:37:21 +03:00
ZyX
a1fee487ba
functests: Add tests for new behaviour
...
Apparently it is not working yet.
2017-07-02 19:28:44 +03:00
ZyX
4b8bdd953e
functests: Remove local_copy function
2017-07-02 19:21:21 +03:00
Justin M. Keyes
ca4633bfe4
ci/quickbuild: XXX: disable server_requests test ( #6851 )
...
Temporarily disable this test which hangs quickbuild.
From #6905 : The hang occurs when calling nvim_set_current_line.
References #6594 5a151555c8
2017-07-02 00:30:00 +02:00
Justin M. Keyes
f34befe74c
Merge #6789 from ZyX-I/lua-path
...
lua: Add paths from &runtimepath to package.path and package.cpath
2017-06-27 02:29:15 +02:00
Björn Linse
5a151555c8
sockets: don't deadlock when connecting to own pipe address
2017-05-29 19:02:49 +02:00
Björn Linse
6a75938758
channels: implement sockopen() to connect to socket
...
Helped-By: oni-link <knil.ino@gmail.com >
2017-05-29 19:02:49 +02:00
TJ DeVries
45626de63f
get_keymap API ( #6236 )
...
* Add api function get keymap
nvim_get_keymap(mode)
nvim_buf_get_keymap(buffer, mode)
2017-05-25 12:41:53 +02:00
ZyX
a5a5c83608
api/vim: Fix nvim_list_runtimepaths
...
It used to
1. Always omit last component in runtimepath.
2. Always omit trailing empty item and leave uninitialized memory in place of
it.
2017-05-23 00:16:23 +03:00
Justin M. Keyes
bdd73fc07f
api/nvim_replace_termcodes: Document keycodes behavior
2017-05-20 22:20:32 +02:00
Björn Linse
f424189093
api: execute lua directly from the remote api
2017-05-13 15:03:42 +02:00
ZyX
5b6d598ca8
functests: Fix tests
2017-05-08 21:21:03 +03:00
ZyX
09f849b600
Merge branch 'master' into luaviml'/lua
2017-05-08 15:43:45 +03:00
Justin M. Keyes
acfd2a2a29
input.c: Process only safe events before blocking.
...
Introduce multiqueue_process_priority() to process only events at or
above a certain priority.
2017-04-28 19:19:51 +02:00
Justin M. Keyes
3ea1007753
api: nvim_get_mode()
...
Asynchronous API functions are served immediately, which means pending
input could change the state of Nvim shortly after an async API function
result is returned.
nvim_get_mode() is different:
- If RPCs are known to be blocked, it responds immediately (without
flushing the input/event queue)
- else it is handled just-in-time before waiting for input, after
pending input was processed. This makes the result more reliable
(but not perfect).
Internally this is handled as a special case, but _semantically_ nothing
has changed: API users never know when input flushes, so this internal
special-case doesn't violate that. As far as API users are concerned,
nvim_get_mode() is just another asynchronous API function.
In all cases nvim_get_mode() never blocks for more than the time it
takes to flush the input/event queue (~µs).
Note: This doesn't address #6166 ; nvim_get_mode() will provoke #6166 if
e.g. `d` is operator-pending.
Closes #6159
2017-04-28 19:14:34 +02:00
Justin M. Keyes
086c354a0a
api: Do not translate error messages.
...
Also re-word some error messages:
- "Key does not exist: %s"
- "Invalid channel: %<PRIu64>"
- "Request array size must be 4 (request) or 3 (notification)"
- "String cannot contain newlines"
References #6150
2017-04-24 00:11:27 +02:00
Justin M. Keyes
4524053874
test: api: Do not truncate errors <1 MB.
2017-04-23 23:24:16 +02:00