/** 在高亮着的名字的各处出现之间跳:两条命令、快捷键的 when 子句用的上下文键。 */ export const NEXT_OCCURRENCE = 'superpowers.codeReader.nextOccurrence' export const PREVIOUS_OCCURRENCE = 'superpowers.codeReader.previousOccurrence' /** 活动的预览里能用键盘跳(有高亮、页面有焦点、焦点不在输入框里)。 */ export const OCCURRENCES_CONTEXT = 'superpowers.codeReader.hasOccurrences' /** * 上下文键跟着各预览报来的状态走:有一个预览能跳就是真(同一时刻只有一个页面有焦点),变了才设。 * 预览关掉时当它不能跳;标签页切走时页面失了焦点,自己会报不能跳。 */ export class NavigationContext { private readonly available = new Set() private value = false constructor(private readonly set: (value: boolean) => void) {} update(owner: Owner, available: boolean): void { if (available) this.available.add(owner) else this.available.delete(owner) const value = this.available.size > 0 if (value === this.value) return this.value = value this.set(value) } /** 命令发给哪个预览:报了能跳的那个;从命令面板运行时页面没焦点,就发给活动的那个。 */ target(owners: Iterable, active: (owner: Owner) => boolean): Owner | undefined { const list = [...owners] return list.find(owner => this.available.has(owner)) ?? list.find(active) } }