diff --git a/main.ts b/main.ts index e0c8a93..dc20e03 100644 --- a/main.ts +++ b/main.ts @@ -3,6 +3,17 @@ import { EditorSelection, Notice, App, MarkdownView, Plugin, PluginSettingTab, S declare const CodeMirror: any; +const enum vimStatus { + normal = 'normal', + insert = 'insert', + visual = 'visual', + replace = 'replace', +} +type VimStatusPrompt = string; +type VimStatusPromptMap = { + [status in vimStatus]: VimStatusPrompt; +}; + interface Settings { vimrcFileName: string, displayChord: boolean, @@ -10,6 +21,7 @@ interface Settings { fixedNormalModeLayout: boolean, capturedKeyboardMap: Record, supportJsCommands?: boolean + vimStatusPromptMap: VimStatusPromptMap; } const DEFAULT_SETTINGS: Settings = { @@ -18,14 +30,13 @@ const DEFAULT_SETTINGS: Settings = { displayVimMode: false, fixedNormalModeLayout: false, capturedKeyboardMap: {}, - supportJsCommands: false -} - -const enum vimStatus { - normal = "🟢", - insert = "🟠", - replace = "🔴", - visual = "🟡" + supportJsCommands: false, + vimStatusPromptMap: { + normal: '🟢', + insert: '🟠', + visual: '🟡', + replace: '🔴', + }, } // NOTE: to future maintainers, please make sure all mapping commands are included in this array. @@ -147,7 +158,9 @@ export default class VimrcPlugin extends Plugin { this.isInsertMode = false; this.currentVimStatus = vimStatus.normal; if (this.settings.displayVimMode) - this.vimStatusBar?.setText(this.currentVimStatus); + this.vimStatusBar?.setText( + this.settings.vimStatusPromptMap[this.currentVimStatus] + ); cmEditor.off('vim-mode-change', this.logVimModeChange); cmEditor.on('vim-mode-change', this.logVimModeChange); @@ -217,7 +230,9 @@ export default class VimrcPlugin extends Plugin { break; } if (this.settings.displayVimMode) - this.vimStatusBar?.setText(this.currentVimStatus); + this.vimStatusBar?.setText( + this.settings.vimStatusPromptMap[this.currentVimStatus] + ); } onunload() { @@ -583,7 +598,9 @@ export default class VimrcPlugin extends Plugin { prepareVimModeDisplay() { if (this.settings.displayVimMode) { this.vimStatusBar = this.addStatusBarItem() // Add status bar item - this.vimStatusBar.setText(vimStatus.normal) // Init the vimStatusBar with normal mode + this.vimStatusBar.setText( + this.settings.vimStatusPromptMap[vimStatus.normal] + ); // Init the vimStatusBar with normal mode } } @@ -744,5 +761,65 @@ class SettingsTab extends PluginSettingTab { this.plugin.saveSettings(); }) }); + + new Setting(containerEl) + .setName('Normal mode prompt') + .setDesc('Set the status prompt text for normal mode.') + .addText((text) => { + text.setPlaceholder('Default: 🟢'); + text.setValue( + this.plugin.settings.vimStatusPromptMap.normal || + DEFAULT_SETTINGS.vimStatusPromptMap.normal + ); + text.onChange((value) => { + this.plugin.settings.vimStatusPromptMap.normal = value; + this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('Insert mode prompt') + .setDesc('Set the status prompt text for insert mode.') + .addText((text) => { + text.setPlaceholder('Default: 🟠'); + text.setValue( + this.plugin.settings.vimStatusPromptMap.insert || + DEFAULT_SETTINGS.vimStatusPromptMap.insert + ); + text.onChange((value) => { + this.plugin.settings.vimStatusPromptMap.insert = value; + this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('Visual mode prompt') + .setDesc('Set the status prompt text for visual mode.') + .addText((text) => { + text.setPlaceholder('Default: 🟡'); + text.setValue( + this.plugin.settings.vimStatusPromptMap.visual || + DEFAULT_SETTINGS.vimStatusPromptMap.visual + ); + text.onChange((value) => { + this.plugin.settings.vimStatusPromptMap.visual = value; + this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('Replace mode prompt') + .setDesc('Set the status prompt text for replace mode.') + .addText((text) => { + text.setPlaceholder('Default: 🔴'); + text.setValue( + this.plugin.settings.vimStatusPromptMap.replace || + DEFAULT_SETTINGS.vimStatusPromptMap.replace + ); + text.onChange((value) => { + this.plugin.settings.vimStatusPromptMap.replace = value; + this.plugin.saveSettings(); + }); + }); } }