aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/vim.c
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-10-29 23:06:18 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-10-29 23:33:10 -0300
commit3800b24c5abecfb9d1ed1d5d36ddcd5a31a45609 (patch)
treeffeddd33831cea86a0feb6eb521a1da36c302891 /src/nvim/api/vim.c
parent94527245a5749b50c20cb057cc53ea4b1b2c624f (diff)
downloadrneovim-3800b24c5abecfb9d1ed1d5d36ddcd5a31a45609.tar.gz
rneovim-3800b24c5abecfb9d1ed1d5d36ddcd5a31a45609.tar.bz2
rneovim-3800b24c5abecfb9d1ed1d5d36ddcd5a31a45609.zip
api: Add vim_input function and mark vim_feedkeys as deferred
The `vim_feedkeys` must be deferred because it can potentially free the buffer passed to `os_inchar`(which in turns calls `vim_feedkeys` indirectly). The new `vim_input` function can be used to emulate user input(Since it does not mess with the typeahead, it is safe to execute without deferring).
Diffstat (limited to 'src/nvim/api/vim.c')
-rw-r--r--src/nvim/api/vim.c14
1 files changed, 14 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