Skip to content

Commit f3d4aa7

Browse files
committed
feat: support multiple previewers
1 parent f74bd56 commit f3d4aa7

File tree

5 files changed

+65
-5
lines changed

5 files changed

+65
-5
lines changed

denops/fall/event.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ export type Event =
2727
| { type: "switch-sorter-at"; index: number | "$" }
2828
| { type: "switch-renderer"; amount: number; cycle?: boolean }
2929
| { type: "switch-renderer-at"; index: number | "$" }
30+
| { type: "switch-previewer"; amount: number; cycle?: boolean }
31+
| { type: "switch-previewer-at"; index: number | "$" }
3032
| { type: "action-invoke"; name: string }
3133
| { type: "list-component-execute"; command: string }
3234
| { type: "preview-component-execute"; command: string }

denops/fall/main/event.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ const isEventComplement = is.UnionOf([
6969
type: is.LiteralOf("switch-renderer-at"),
7070
index: is.UnionOf([is.Number, is.LiteralOf("$")]),
7171
}),
72+
is.ObjectOf({
73+
type: is.LiteralOf("switch-previewer"),
74+
amount: is.Number,
75+
cycle: as.Optional(is.Boolean),
76+
}),
77+
is.ObjectOf({
78+
type: is.LiteralOf("switch-previewer-at"),
79+
index: is.UnionOf([is.Number, is.LiteralOf("$")]),
80+
}),
7281
// Action
7382
is.ObjectOf({
7483
type: is.LiteralOf("action-invoke"),

denops/fall/picker.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ export class Picker<T extends Detail> implements AsyncDisposable {
110110
),
111111
);
112112
this.#previewProcessor = this.#stack.use(
113-
// TODO: Support multiple previewers
114-
new PreviewProcessor(params.previewers?.at(0)),
113+
new PreviewProcessor(params.previewers ?? []),
115114
);
116115
}
117116

@@ -426,6 +425,29 @@ export class Picker<T extends Detail> implements AsyncDisposable {
426425
items: this.#matchProcessor.items,
427426
});
428427
break;
428+
case "switch-previewer": {
429+
if (!this.#previewProcessor) break;
430+
let index = this.#previewProcessor.previewerIndex + event.amount;
431+
if (event.cycle) {
432+
if (index < 0) {
433+
index = this.#previewProcessor.previewerCount - 1;
434+
} else if (index >= this.#previewProcessor.previewerCount) {
435+
index = 0;
436+
}
437+
}
438+
this.#previewProcessor.previewerIndex = index;
439+
this.#previewProcessor.start(denops, {
440+
item: this.#matchProcessor.items[this.#visualizeProcessor.cursor],
441+
});
442+
break;
443+
}
444+
case "switch-previewer-at":
445+
if (!this.#previewProcessor) break;
446+
this.#previewProcessor.previewerIndex = event.index;
447+
this.#previewProcessor.start(denops, {
448+
item: this.#matchProcessor.items[this.#visualizeProcessor.cursor],
449+
});
450+
break;
429451
case "action-invoke":
430452
accept(event.name);
431453
break;

denops/fall/processor/preview.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,36 @@ import type {
88
import { dispatch } from "../event.ts";
99

1010
export class PreviewProcessor<T extends Detail> {
11-
#previewer?: Previewer<T>;
11+
#previewers: Previewer<T>[];
1212
#controller: AbortController = new AbortController();
1313
#processing?: Promise<void>;
1414
#reserved?: () => void;
1515
#item: PreviewItem | undefined = undefined;
16+
#previewerIndex = 0;
1617

17-
constructor(previewer: Previewer<T> | undefined) {
18-
this.#previewer = previewer;
18+
constructor(previewers: Previewer<T>[]) {
19+
this.#previewers = previewers;
20+
}
21+
22+
get #previewer(): Previewer<T> | undefined {
23+
return this.#previewers[this.#previewerIndex];
24+
}
25+
26+
get previewerCount(): number {
27+
return this.#previewers.length;
28+
}
29+
30+
get previewerIndex(): number {
31+
return this.#previewerIndex;
32+
}
33+
34+
set previewerIndex(index: number | "$") {
35+
if (index === "$" || index >= this.#previewers.length) {
36+
index = this.#previewers.length - 1;
37+
} else if (index < 0) {
38+
index = 0;
39+
}
40+
this.#previewerIndex = index;
1941
}
2042

2143
get item(): PreviewItem | undefined {

plugin/fall/mapping.vim

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ cnoremap <silent> <Plug>(fall-switch-renderer-first) <Cmd>call fall#internal#dis
3232
cnoremap <silent> <Plug>(fall-switch-renderer-last) <Cmd>call fall#internal#dispatch(#{type: 'switch-renderer-at', index: '$'})<CR>
3333
cnoremap <silent> <Plug>(fall-switch-renderer-prev) <Cmd>call fall#internal#dispatch(#{type: 'switch-renderer', amount: -1, cycle: v:true})<CR>
3434
cnoremap <silent> <Plug>(fall-switch-renderer-next) <Cmd>call fall#internal#dispatch(#{type: 'switch-renderer', amount: 1, cycle: v:true})<CR>
35+
cnoremap <silent> <Plug>(fall-switch-previewer-first) <Cmd>call fall#internal#dispatch(#{type: 'switch-previewer-at', index: 0})<CR>
36+
cnoremap <silent> <Plug>(fall-switch-previewer-last) <Cmd>call fall#internal#dispatch(#{type: 'switch-previewer-at', index: '$'})<CR>
37+
cnoremap <silent> <Plug>(fall-switch-previewer-prev) <Cmd>call fall#internal#dispatch(#{type: 'switch-previewer', amount: -1, cycle: v:true})<CR>
38+
cnoremap <silent> <Plug>(fall-switch-previewer-next) <Cmd>call fall#internal#dispatch(#{type: 'switch-previewer', amount: 1, cycle: v:true})<CR>
3539
3640
" Preview
3741
cnoremap <silent> <Plug>(fall-preview-first) <Cmd>call fall#internal#dispatch(#{type: 'preview-component-execute', command: 'silent! normal! gg'})<CR>
@@ -82,6 +86,7 @@ if !get(g:, 'fall_disable_default_mapping')
8286
cnoremap <nowait> <F2> <Plug>(fall-switch-matcher-next)
8387
cnoremap <nowait> <F3> <Plug>(fall-switch-sorter-next)
8488
cnoremap <nowait> <F4> <Plug>(fall-switch-renderer-next)
89+
cnoremap <nowait> <F5> <Plug>(fall-switch-previewer-next)
8590
endfunction
8691

8792
augroup fall_mapping_plugin

0 commit comments

Comments
 (0)