Fixed #26 - Added ctrl+j/k and ctrl+n/p support

This commit is contained in:
Simon Cambier
2022-06-03 19:07:56 +02:00
parent 53a0ec8670
commit d625ae38e1
2 changed files with 76 additions and 1 deletions

View File

@@ -2,6 +2,7 @@ import { App, Modal, TFile } from 'obsidian'
import ModalVault from './components/ModalVault.svelte' import ModalVault from './components/ModalVault.svelte'
import ModalInFile from './components/ModalInFile.svelte' import ModalInFile from './components/ModalInFile.svelte'
import { eventBus, isInputComposition } from './globals' import { eventBus, isInputComposition } from './globals'
import { settings } from './settings'
abstract class OmnisearchModal extends Modal { abstract class OmnisearchModal extends Modal {
constructor(app: App) { constructor(app: App) {
@@ -17,6 +18,9 @@ abstract class OmnisearchModal extends Modal {
this.modalEl.tabIndex = -1 this.modalEl.tabIndex = -1
// Setup events that can be listened through the event bus // Setup events that can be listened through the event bus
// #region Up/Down navigation
this.scope.register([], 'ArrowDown', e => { this.scope.register([], 'ArrowDown', e => {
e.preventDefault() e.preventDefault()
eventBus.emit('arrow-down') eventBus.emit('arrow-down')
@@ -25,6 +29,39 @@ abstract class OmnisearchModal extends Modal {
e.preventDefault() e.preventDefault()
eventBus.emit('arrow-up') 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 => { this.scope.register(['Ctrl'], 'Enter', e => {
e.preventDefault() e.preventDefault()
eventBus.emit('ctrl-enter') // Open in new pane eventBus.emit('ctrl-enter') // Open in new pane
@@ -33,16 +70,20 @@ abstract class OmnisearchModal extends Modal {
e.preventDefault() e.preventDefault()
eventBus.emit('ctrl-enter') // Open in new pane (but on Mac) eventBus.emit('ctrl-enter') // Open in new pane (but on Mac)
}) })
this.scope.register(['Alt'], 'Enter', e => { this.scope.register(['Alt'], 'Enter', e => {
e.preventDefault() e.preventDefault()
eventBus.emit('alt-enter') // Open the InFile modal eventBus.emit('alt-enter') // Open the InFile modal
}) })
this.scope.register(['Shift'], 'Enter', e => { this.scope.register(['Shift'], 'Enter', e => {
e.preventDefault() e.preventDefault()
eventBus.emit('shift-enter') // Create a new note eventBus.emit('shift-enter') // Create a new note
}) })
this.scope.register([], 'Enter', e => { 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() e.preventDefault()
eventBus.emit('enter') // Open in current pane eventBus.emit('enter') // Open in current pane
} }

View File

@@ -12,6 +12,8 @@ export interface OmnisearchSettings extends WeightingSettings {
showIndexingNotices: boolean showIndexingNotices: boolean
respectExcluded: boolean respectExcluded: boolean
reindexInRealTime: boolean reindexInRealTime: boolean
CtrlJK: boolean
CtrlNP: boolean
} }
export class SettingsTab extends PluginSettingTab { export class SettingsTab extends PluginSettingTab {
@@ -72,6 +74,8 @@ export class SettingsTab extends PluginSettingTab {
settings.reindexInRealTime = false settings.reindexInRealTime = false
} }
// #region Results Weighting
new Setting(containerEl).setName('Results weighting').setHeading() new Setting(containerEl).setName('Results weighting').setHeading()
new Setting(containerEl) new Setting(containerEl)
@@ -91,6 +95,32 @@ export class SettingsTab extends PluginSettingTab {
new Setting(containerEl) new Setting(containerEl)
.setName(`Headings level 3 (default: ${DEFAULT_SETTINGS.weightH3})`) .setName(`Headings level 3 (default: ${DEFAULT_SETTINGS.weightH3})`)
.addSlider(cb => this.weightSlider(cb, '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 { weightSlider(cb: SliderComponent, key: keyof WeightingSettings): void {
@@ -108,10 +138,14 @@ export const DEFAULT_SETTINGS: OmnisearchSettings = {
showIndexingNotices: false, showIndexingNotices: false,
respectExcluded: true, respectExcluded: true,
reindexInRealTime: false, reindexInRealTime: false,
weightBasename: 2, weightBasename: 2,
weightH1: 1.5, weightH1: 1.5,
weightH2: 1.3, weightH2: 1.3,
weightH3: 1.1, weightH3: 1.1,
CtrlJK: false,
CtrlNP: false,
} as const } as const
export let settings: OmnisearchSettings = Object.assign({}, DEFAULT_SETTINGS) export let settings: OmnisearchSettings = Object.assign({}, DEFAULT_SETTINGS)