Skip to content

Commit 5b6410c

Browse files
committed
Add dynamicFilters
1 parent 4568a98 commit 5b6410c

File tree

4 files changed

+52
-4
lines changed

4 files changed

+52
-4
lines changed

denops/ddc/base/source.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ export function defaultSourceOptions(): SourceOptions {
123123
cacheTimeout: 0,
124124
converters: [],
125125
dup: "ignore",
126+
dynamicFilters: "",
126127
enabledIf: "",
127128
forceCompletionPattern: "",
128129
hideTimeout: 200,

denops/ddc/ext.ts

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import { isDdcCallbackCancelError } from "./callback.ts";
3131
import { type BaseUi, defaultUiOptions } from "./base/ui.ts";
3232
import { type BaseSource, defaultSourceOptions } from "./base/source.ts";
3333
import { type BaseFilter, defaultFilterOptions } from "./base/filter.ts";
34-
import { printError } from "./utils.ts";
34+
import { callCallback, printError } from "./utils.ts";
3535

3636
import type { Denops } from "@denops/std";
3737

@@ -260,7 +260,42 @@ export async function filterItems(
260260
));
261261
}
262262

263-
cdd = await callFilters(loader, sourceOptions.matchers);
263+
type Filters = {
264+
matchers: UserFilter[];
265+
sorters: UserFilter[];
266+
converters: UserFilter[];
267+
};
268+
269+
const filters: Filters = {
270+
matchers: sourceOptions.matchers,
271+
sorters: sourceOptions.sorters,
272+
converters: sourceOptions.converters,
273+
};
274+
275+
const dynamicFilters = await callCallback(
276+
denops,
277+
sourceOptions.dynamicFilters,
278+
{
279+
context,
280+
options,
281+
sourceOptions,
282+
completeStr,
283+
items: cdd,
284+
},
285+
) as Filters | null;
286+
if (dynamicFilters) {
287+
if (dynamicFilters.matchers) {
288+
filters.matchers = dynamicFilters.matchers;
289+
}
290+
if (dynamicFilters.sorters) {
291+
filters.sorters = dynamicFilters.sorters;
292+
}
293+
if (dynamicFilters.converters) {
294+
filters.converters = dynamicFilters.converters;
295+
}
296+
}
297+
298+
cdd = await callFilters(loader, filters.matchers);
264299

265300
if (sourceOptions.matcherKey !== "") {
266301
cdd = cdd.map((c) => (
@@ -272,12 +307,12 @@ export async function filterItems(
272307
));
273308
}
274309

275-
cdd = await callFilters(loader, sourceOptions.sorters);
310+
cdd = await callFilters(loader, filters.sorters);
276311

277312
// Filter by maxItems
278313
cdd = cdd.slice(0, sourceOptions.maxItems);
279314

280-
cdd = await callFilters(loader, sourceOptions.converters);
315+
cdd = await callFilters(loader, filters.converters);
281316

282317
return cdd;
283318
}

denops/ddc/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ export type SourceOptions = {
9595
cacheTimeout: number;
9696
converters: UserFilter[];
9797
dup: "keep" | "force" | "ignore";
98+
dynamicFilters: Callback;
9899
enabledIf: string;
99100
forceCompletionPattern: string;
100101
hideTimeout: number;

doc/ddc.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,17 @@ cmdlineSources
142142
\ '=': ['input'],
143143
\ })
144144
<
145+
*ddc-option-dynamicFilters*
146+
dynamicFilters
147+
It is the function which overwrites
148+
|ddc-source-option-matchers| and |ddc-source-option-sorters|
149+
and |ddc-source-option-converters| after gather items.
150+
The function returns new |ddc-source-options| or |v:null|.
151+
NOTE: {func} is evaluated after user input and it affects
152+
completion performance.
153+
154+
Default: ""
155+
145156
*ddc-option-dynamicSources*
146157
dynamicSources
147158
It is the function which overwrites |ddc-option-sources| after

0 commit comments

Comments
 (0)