From 7627f52825013fa51c144c87c01e067a50c60b26 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Fri, 6 Nov 2020 00:59:40 -0800 Subject: [PATCH] Add callback to listen to let expression --- src/apitest/eval.c | 25 +++++++++++++++++++++++++ src/eval.c | 8 +++++++- src/globals.h | 1 + src/libvim.c | 5 +++++ src/libvim.h | 2 ++ src/structs.h | 2 ++ 6 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/apitest/eval.c b/src/apitest/eval.c index 8cb5cf9ad..988c32222 100644 --- a/src/apitest/eval.c +++ b/src/apitest/eval.c @@ -2,6 +2,19 @@ #include "libvim.h" #include "minunit.h" +void onEvalVariableSet(char_u *name, typval_T *val) +{ + if (val->v_type == VAR_STRING) + { + printf("%s set: %s\n", name, val->vval.v_string); + } + else if (val->v_type == VAR_NUMBER) + { + + printf("%s set: %ld\n", name, val->vval.v_number); + } +} + void test_setup(void) { vimKey(""); @@ -30,18 +43,30 @@ MU_TEST(test_empty) mu_check(result == NULL); } +MU_TEST(test_let_expression) +{ + vimExecute("let mapleader = \"\""); + vimExecute("let g:mapleader = \"\""); + vimExecute("let mapleader = 1"); + + mu_check(TRUE); +} + MU_TEST_SUITE(test_suite) { MU_SUITE_CONFIGURE(&test_setup, &test_teardown); MU_RUN_TEST(test_simple_addition); MU_RUN_TEST(test_empty); + MU_RUN_TEST(test_let_expression); } int main(int argc, char **argv) { vimInit(argc, argv); + vimSetEvalVariableSetCallback(&onEvalVariableSet); + win_setwidth(5); win_setheight(100); diff --git a/src/eval.c b/src/eval.c index 858483056..944b54185 100644 --- a/src/eval.c +++ b/src/eval.c @@ -2341,7 +2341,6 @@ set_var_lval( int cc; listitem_T *ri; dictitem_T *di; - if (lp->ll_tv == NULL) { cc = *endp; @@ -7893,6 +7892,13 @@ void set_var( typval_T *tv, int copy) /* make copy of value in "tv" */ { + + if (name != NULL && tv != NULL) + { + //printf("lp->ll_exp_name: %s\n", lp->ll_exp_name); + evalVariableSetCallback(name, tv); + } + dictitem_T *v; char_u *varname; hashtab_T *ht; diff --git a/src/globals.h b/src/globals.h index 9f025d5bd..d72708d65 100644 --- a/src/globals.h +++ b/src/globals.h @@ -50,6 +50,7 @@ EXTERN BufferUpdateCallback bufferUpdateCallback INIT(= NULL); EXTERN ClipboardGetCallback clipboardGetCallback INIT(= NULL); EXTERN FileWriteFailureCallback fileWriteFailureCallback INIT(= NULL); EXTERN DirectoryChangedCallback directoryChangedCallback INIT(= NULL); +EXTERN EvalVariableSetCallback evalVariableSetCallback INIT(= NULL); EXTERN FormatCallback formatCallback INIT(= NULL); EXTERN GotoCallback gotoCallback INIT(= NULL); EXTERN TabPageCallback tabPageCallback INIT(= NULL); diff --git a/src/libvim.c b/src/libvim.c index 041eaa31c..1eca7545f 100644 --- a/src/libvim.c +++ b/src/libvim.c @@ -175,6 +175,11 @@ void vimSetDirectoryChangedCallback(DirectoryChangedCallback f) directoryChangedCallback = f; } +void vimSetEvalVariableSetCallback(EvalVariableSetCallback f) +{ + evalVariableSetCallback = f; +} + void vimSetOptionSetCallback(OptionSetCallback f) { optionSetCallback = f; diff --git a/src/libvim.h b/src/libvim.h index 200870633..a0885f610 100644 --- a/src/libvim.h +++ b/src/libvim.h @@ -107,6 +107,8 @@ void vimCommandLineGetCompletions(char_u ***completions, int *count); */ char_u *vimEval(char_u *str); +void vimSetEvalVariableSetCallback(EvalVariableSetCallback callback); + /*** * Cursor Methods ***/ diff --git a/src/structs.h b/src/structs.h index c7a64c373..8c0fb1529 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1390,6 +1390,8 @@ typedef struct } vval; } typval_T; +typedef void (*EvalVariableSetCallback)(char_u *name, typval_T *tv); + /* Values for "dv_scope". */ #define VAR_SCOPE 1 /* a:, v:, s:, etc. scope dictionaries */