aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/api/vim.c14
-rw-r--r--src/nvim/os/input.c7
2 files changed, 21 insertions, 0 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 9afefd6fa3..b6bac1588a 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -24,6 +24,7 @@
#include "nvim/misc2.h"
#include "nvim/term.h"
#include "nvim/getchar.h"
+#include "nvim/os/input.h"
#define LINE_BUFFER_SIZE 4096
@@ -51,6 +52,7 @@ void vim_command(String str, Error *err)
/// @param mode specifies the mapping options
/// @see feedkeys()
void vim_feedkeys(String keys, String mode)
+ FUNC_ATTR_DEFERRED
{
bool remap = true;
bool typed = false;
@@ -78,6 +80,18 @@ void vim_feedkeys(String keys, String mode)
typebuf_was_filled = true;
}
+/// Pass input keys to Neovim. Unlike `vim_feedkeys`, this will use a
+/// lower-level input buffer and the call is not deferred.
+/// This is the most reliable way to emulate real user input.
+///
+/// @param keys to be typed
+/// @return The number bytes actually written, which can be lower than
+/// requested if the buffer becomes full.
+Integer vim_input(String keys)
+{
+ return (Integer)input_enqueue(keys);
+}
+
/// Replace any terminal codes with the internal representation
///
/// @see replace_termcodes
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index 1b1a681a8b..d948a48b64 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -165,6 +165,13 @@ void input_buffer_restore(String str)
free(str.data);
}
+size_t input_enqueue(String keys)
+{
+ size_t rv = rbuffer_write(input_buffer, keys.data, keys.size);
+ process_interrupts();
+ return rv;
+}
+
static bool input_poll(int ms)
{
event_poll_until(ms, input_ready());