diff --git a/src/modals.ts b/src/modals.ts index 8ba6c85..768a49e 100644 --- a/src/modals.ts +++ b/src/modals.ts @@ -2,6 +2,7 @@ import { App, Modal, TFile } from 'obsidian' import ModalVault from './components/ModalVault.svelte' import ModalInFile from './components/ModalInFile.svelte' import { eventBus, isInputComposition } from './globals' +import { settings } from './settings' abstract class OmnisearchModal extends Modal { constructor(app: App) { @@ -17,6 +18,9 @@ abstract class OmnisearchModal extends Modal { this.modalEl.tabIndex = -1 // Setup events that can be listened through the event bus + + // #region Up/Down navigation + this.scope.register([], 'ArrowDown', e => { e.preventDefault() eventBus.emit('arrow-down') @@ -25,6 +29,39 @@ abstract class OmnisearchModal extends Modal { e.preventDefault() eventBus.emit('arrow-up') }) + + // Ctrl+j/k + for (const key of [ + { k: 'j', dir: 'down' }, + { k: 'k', dir: 'up' }, + ] as const) { + for (const modifier of ['Ctrl', 'Meta'] as const) { + this.scope.register([modifier], key.k, e => { + if (settings.CtrlJK) { + e.preventDefault() + eventBus.emit('arrow-' + key.dir) + } + }) + } + } + + // Ctrl+n/p + for (const key of [ + { k: 'n', dir: 'down' }, + { k: 'p', dir: 'up' }, + ] as const) { + for (const modifier of ['Ctrl', 'Meta'] as const) { + this.scope.register([modifier], key.k, e => { + if (settings.CtrlNP) { + e.preventDefault() + eventBus.emit('arrow-' + key.dir) + } + }) + } + } + + // #endregion Up/Down navigation + this.scope.register(['Ctrl'], 'Enter', e => { e.preventDefault() eventBus.emit('ctrl-enter') // Open in new pane @@ -33,16 +70,20 @@ abstract class OmnisearchModal extends Modal { e.preventDefault() eventBus.emit('ctrl-enter') // Open in new pane (but on Mac) }) + this.scope.register(['Alt'], 'Enter', e => { e.preventDefault() eventBus.emit('alt-enter') // Open the InFile modal }) + this.scope.register(['Shift'], 'Enter', e => { e.preventDefault() eventBus.emit('shift-enter') // Create a new note }) + this.scope.register([], 'Enter', e => { - if (!isInputComposition()) { // Check if the user is still typing + if (!isInputComposition()) { + // Check if the user is still typing e.preventDefault() eventBus.emit('enter') // Open in current pane } diff --git a/src/settings.ts b/src/settings.ts index 799406b..eceb548 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -12,6 +12,8 @@ export interface OmnisearchSettings extends WeightingSettings { showIndexingNotices: boolean respectExcluded: boolean reindexInRealTime: boolean + CtrlJK: boolean + CtrlNP: boolean } export class SettingsTab extends PluginSettingTab { @@ -72,6 +74,8 @@ export class SettingsTab extends PluginSettingTab { settings.reindexInRealTime = false } + // #region Results Weighting + new Setting(containerEl).setName('Results weighting').setHeading() new Setting(containerEl) @@ -91,6 +95,32 @@ export class SettingsTab extends PluginSettingTab { new Setting(containerEl) .setName(`Headings level 3 (default: ${DEFAULT_SETTINGS.weightH3})`) .addSlider(cb => this.weightSlider(cb, 'weightH3')) + + // #endregion Results Weighting + + // #region Shortcuts + + new Setting(containerEl).setName('Shortcuts').setHeading() + + new Setting(containerEl) + .setName('Use [Ctrl/Cmd]+j/k to navigate up/down in the results') + .addToggle(toggle => + toggle.setValue(settings.CtrlJK).onChange(async v => { + settings.CtrlJK = v + await saveSettings(this.plugin) + }), + ) + + new Setting(containerEl) + .setName('Use [Ctrl/Cmd]+n/p to navigate up/down in the results') + .addToggle(toggle => + toggle.setValue(settings.CtrlNP).onChange(async v => { + settings.CtrlNP = v + await saveSettings(this.plugin) + }), + ) + + // #endregion Shortcuts } weightSlider(cb: SliderComponent, key: keyof WeightingSettings): void { @@ -108,10 +138,14 @@ export const DEFAULT_SETTINGS: OmnisearchSettings = { showIndexingNotices: false, respectExcluded: true, reindexInRealTime: false, + weightBasename: 2, weightH1: 1.5, weightH2: 1.3, weightH3: 1.1, + + CtrlJK: false, + CtrlNP: false, } as const export let settings: OmnisearchSettings = Object.assign({}, DEFAULT_SETTINGS)