aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vis-core.h4
-rw-r--r--vis.c8
-rw-r--r--vis.h3
3 files changed, 14 insertions, 1 deletions
diff --git a/vis-core.h b/vis-core.h
index debd994..cc8636d 100644
--- a/vis-core.h
+++ b/vis-core.h
@@ -174,7 +174,9 @@ struct Vis {
Map *options; /* ":set"-options */
Map *keymap; /* key translation before any bindings are matched */
bool keymap_disabled; /* ignore key map for next key press, gets automatically re-enabled */
- char key[64]; /* last pressed key as reported from the UI */
+ char key[VIS_KEY_LENGTH_MAX]; /* last pressed key as reported from the UI */
+ char key_current[VIS_KEY_LENGTH_MAX];/* current key being processed by the input queue */
+ char key_prev[VIS_KEY_LENGTH_MAX]; /* previous key which was processed by the input queue */
Buffer input_queue; /* holds pending input keys */
Buffer *keys; /* currently active keys buffer (either the input_queue or a macro) */
bool errorhandler; /* whether we are currently in an error handler, used to avoid recursion */
diff --git a/vis.c b/vis.c
index 12d364a..790069a 100644
--- a/vis.c
+++ b/vis.c
@@ -995,6 +995,10 @@ static void vis_keys_process(Vis *vis, size_t pos) {
end = start;
} else if (binding) { /* exact match */
if (binding->action) {
+ size_t len = binding_end - start;
+ strcpy(vis->key_prev, vis->key_current);
+ strncpy(vis->key_current, start, len);
+ vis->key_current[len] = '\0';
end = (char*)binding->action->func(vis, binding_end, &binding->action->arg);
if (!end) {
end = start;
@@ -1017,6 +1021,10 @@ static void vis_keys_process(Vis *vis, size_t pos) {
action = map_get(vis->actions, start+1);
end[-1] = tmp;
if (action) {
+ size_t len = end - start;
+ strcpy(vis->key_prev, vis->key_current);
+ strncpy(vis->key_current, start, len);
+ vis->key_current[len] = '\0';
end = (char*)action->func(vis, end, &action->arg);
if (!end) {
end = start;
diff --git a/vis.h b/vis.h
index a57ff94..6ea3d1d 100644
--- a/vis.h
+++ b/vis.h
@@ -27,6 +27,9 @@ typedef struct Win Win;
#define VIS_COMPLETE "vis-complete"
#endif
+/* maximum bytes needed for string representation of a (pseudo) key */
+#define VIS_KEY_LENGTH_MAX 64
+
typedef struct {
void (*init)(Vis*);
void (*start)(Vis*);