aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2023-04-04 23:59:39 +0100
committerGitHub <noreply@github.com>2023-04-04 23:59:39 +0100
commit9e7426718b678e299f3fd03ef94f81b1e2d01ab0 (patch)
tree52a5825f377f76adb21d83c30d6795f635bc0424
parente826d09c18ab8840592b6cdbbcfe3e311a047174 (diff)
downloadrneovim-9e7426718b678e299f3fd03ef94f81b1e2d01ab0.tar.gz
rneovim-9e7426718b678e299f3fd03ef94f81b1e2d01ab0.tar.bz2
rneovim-9e7426718b678e299f3fd03ef94f81b1e2d01ab0.zip
feat(vim.diff): allow passing an integer for linematch
-rw-r--r--runtime/doc/lua.txt7
-rw-r--r--src/nvim/lua/xdiff.c16
2 files changed, 14 insertions, 9 deletions
diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt
index ba83b18d07..6084a625ba 100644
--- a/runtime/doc/lua.txt
+++ b/runtime/doc/lua.txt
@@ -685,9 +685,10 @@ vim.diff({a}, {b}, {opts}) *vim.diff()*
• "unified": (default) String in unified format.
• "indices": Array of hunk locations.
Note: This option is ignored if `on_hunk` is used.
- • `linematch` (boolean): Run linematch on the resulting hunks
- from xdiff. Requires `result_type = indices`, ignored
- otherwise.
+ • `linematch` (boolean|integer): Run linematch on the resulting hunks
+ from xdiff. When integer, only hunks upto this size in
+ lines are run through linematch. Requires `result_type = indices`,
+ ignored otherwise.
• `algorithm` (string):
Diff algorithm to use. Values:
• "myers" the default algorithm
diff --git a/src/nvim/lua/xdiff.c b/src/nvim/lua/xdiff.c
index 9a7ae5c146..e0bbdb8942 100644
--- a/src/nvim/lua/xdiff.c
+++ b/src/nvim/lua/xdiff.c
@@ -32,7 +32,7 @@ typedef struct {
Error *err;
mmfile_t *ma;
mmfile_t *mb;
- bool linematch;
+ int64_t linematch;
bool iwhite;
} hunkpriv_t;
@@ -128,7 +128,7 @@ static int hunk_locations_cb(long start_a, long count_a, long start_b, long coun
{
hunkpriv_t *priv = (hunkpriv_t *)cb_data;
lua_State *lstate = priv->lstate;
- if (priv->linematch) {
+ if (priv->linematch > 0 && count_a + count_b <= priv->linematch) {
get_linematch_results(lstate, priv->ma, priv->mb, start_a, count_a, start_b, count_b,
priv->iwhite);
} else {
@@ -208,7 +208,7 @@ static bool check_xdiff_opt(ObjectType actType, ObjectType expType, const char *
}
static NluaXdiffMode process_xdl_diff_opts(lua_State *lstate, xdemitconf_t *cfg, xpparam_t *params,
- bool *linematch, Error *err)
+ int64_t *linematch, Error *err)
{
const DictionaryOf(LuaRef) opts = nlua_pop_Dictionary(lstate, true, err);
@@ -265,8 +265,12 @@ static NluaXdiffMode process_xdl_diff_opts(lua_State *lstate, xdemitconf_t *cfg,
}
cfg->interhunkctxlen = (long)v->data.integer;
} else if (strequal("linematch", k.data)) {
- *linematch = api_object_to_bool(*v, "linematch", false, err);
- if (ERROR_SET(err)) {
+ if (v->type == kObjectTypeBoolean) {
+ *linematch = v->data.boolean ? INT64_MAX : 0;
+ } else if (v->type == kObjectTypeInteger) {
+ *linematch = v->data.integer;
+ } else {
+ api_set_error(err, kErrorTypeValidation, "linematch must be a boolean or integer");
goto exit_1;
}
} else {
@@ -330,7 +334,7 @@ int nlua_xdl_diff(lua_State *lstate)
xdemitconf_t cfg;
xpparam_t params;
xdemitcb_t ecb;
- bool linematch = false;
+ int64_t linematch = 0;
CLEAR_FIELD(cfg);
CLEAR_FIELD(params);