mirror of
https://github.com/neovim/neovim.git
synced 2026-05-03 12:35:00 +00:00
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
This commit is contained in:
@@ -28,7 +28,9 @@
|
||||
#include "nvim/map.h"
|
||||
#include "nvim/log.h"
|
||||
#include "nvim/misc1.h"
|
||||
#include "nvim/state.h"
|
||||
#include "nvim/lib/kvec.h"
|
||||
#include "nvim/os/input.h"
|
||||
|
||||
#define CHANNEL_BUFFER_SIZE 0xffff
|
||||
|
||||
@@ -433,6 +435,14 @@ static void handle_request(Channel *channel, msgpack_object *request)
|
||||
handler.async = true;
|
||||
}
|
||||
|
||||
if (handler.async) {
|
||||
char buf[256] = { 0 };
|
||||
memcpy(buf, method->via.bin.ptr, MIN(255, method->via.bin.size));
|
||||
if (strcmp("nvim_get_mode", buf) == 0) {
|
||||
handler.async = input_blocking();
|
||||
}
|
||||
}
|
||||
|
||||
RequestEvent *event_data = xmalloc(sizeof(RequestEvent));
|
||||
event_data->channel = channel;
|
||||
event_data->handler = handler;
|
||||
|
||||
@@ -76,7 +76,7 @@ typedef struct {
|
||||
size_t idx;
|
||||
} MPToAPIObjectStackItem;
|
||||
|
||||
/// Convert type used by msgpack parser to Neovim own API type
|
||||
/// Convert type used by msgpack parser to Nvim API type.
|
||||
///
|
||||
/// @param[in] obj Msgpack value to convert.
|
||||
/// @param[out] arg Location where result of conversion will be saved.
|
||||
|
||||
Reference in New Issue
Block a user