diff --git a/src/lib/components/Editor.svelte b/src/lib/components/Editor.svelte
index a42170d..b8cbf49 100644
--- a/src/lib/components/Editor.svelte
+++ b/src/lib/components/Editor.svelte
@@ -116,6 +116,7 @@
scrollBeyondLastLine: false,
wordWrap: settings.wordWrap as 'on' | 'off' | 'wordWrapColumn' | 'bounded',
lineNumbers: settings.lineNumbers as 'on' | 'off' | 'relative' | 'interval',
+ renderLineHighlight: settings.renderLineHighlight ? 'line' : 'none',
});
if (tabManager.activeTab?.editorViewState) {
@@ -187,6 +188,32 @@
},
});
+ editor.addAction({
+ id: 'toggle-line-highlight',
+ label: 'Toggle Line Highlight',
+ run: () => {
+ settings.toggleLineHighlight();
+ },
+ });
+
+ editor.addAction({
+ id: 'toggle-tabs',
+ label: 'Toggle Tabs',
+ keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyB],
+ run: () => {
+ settings.toggleTabs();
+ },
+ });
+
+ editor.addAction({
+ id: 'toggle-zen-mode',
+ label: 'Toggle Zen Mode',
+ keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyZ],
+ run: () => {
+ settings.toggleZenMode();
+ },
+ });
+
const updateTheme = () => {
monaco.editor.setTheme(getTheme());
};
@@ -498,6 +525,7 @@
minimap: { enabled: settings.minimap },
wordWrap: settings.wordWrap as 'on' | 'off' | 'wordWrapColumn' | 'bounded',
lineNumbers: settings.lineNumbers as 'on' | 'off' | 'relative' | 'interval',
+ renderLineHighlight: settings.renderLineHighlight as 'line' | 'none',
fontSize: 14 * (zoomLevel / 100),
});
}
diff --git a/src/lib/components/TitleBar.svelte b/src/lib/components/TitleBar.svelte
index 3b030db..c11e321 100644
--- a/src/lib/components/TitleBar.svelte
+++ b/src/lib/components/TitleBar.svelte
@@ -6,6 +6,7 @@
import iconUrl from '../../assets/icon.png';
import TabList from './TabList.svelte';
import { tabManager } from '../stores/tabs.svelte.js';
+ import { settings } from '../stores/settings.svelte.js';
let {
isFocused,
@@ -198,7 +199,7 @@
- {#if tabManager.tabs.length > 0}
+ {#if tabManager.tabs.length > 0 && settings.showTabs}
tabManager.addNewTab()} {ondetach} {showHome} {ontabclick} {oncloseTab} />
diff --git a/src/lib/stores/settings.svelte.ts b/src/lib/stores/settings.svelte.ts
index 46cbfd4..4e8888f 100644
--- a/src/lib/stores/settings.svelte.ts
+++ b/src/lib/stores/settings.svelte.ts
@@ -5,6 +5,16 @@ export class SettingsStore {
vimMode = $state(false);
statusBar = $state(true);
wordCount = $state(false);
+ renderLineHighlight = $state('none');
+ showTabs = $state(true);
+ zenMode = $state(false);
+ preZenState = $state<{
+ renderLineHighlight: string;
+ showTabs: boolean;
+ statusBar: boolean;
+ minimap: boolean;
+ lineNumbers: string;
+ } | null>(null);
constructor() {
if (typeof localStorage !== 'undefined') {
@@ -13,14 +23,30 @@ export class SettingsStore {
const savedLineNumbers = localStorage.getItem('editor.lineNumbers');
const savedVimMode = localStorage.getItem('editor.vimMode');
const savedStatusBar = localStorage.getItem('editor.statusBar');
+
const savedWordCount = localStorage.getItem('editor.wordCount');
+ const savedRenderLineHighlight = localStorage.getItem('editor.renderLineHighlight');
+ const savedShowTabs = localStorage.getItem('editor.showTabs');
+ const savedZenMode = localStorage.getItem('editor.zenMode');
+ const savedPreZenState = localStorage.getItem('editor.preZenState');
if (savedMinimap !== null) this.minimap = savedMinimap === 'true';
if (savedWordWrap !== null) this.wordWrap = savedWordWrap;
if (savedLineNumbers !== null) this.lineNumbers = savedLineNumbers;
if (savedVimMode !== null) this.vimMode = savedVimMode === 'true';
if (savedStatusBar !== null) this.statusBar = savedStatusBar === 'true';
+
if (savedWordCount !== null) this.wordCount = savedWordCount === 'true';
+ if (savedRenderLineHighlight !== null) this.renderLineHighlight = savedRenderLineHighlight;
+ if (savedShowTabs !== null) this.showTabs = savedShowTabs === 'true';
+ if (savedZenMode !== null) this.zenMode = savedZenMode === 'true';
+ if (savedPreZenState !== null) {
+ try {
+ this.preZenState = JSON.parse(savedPreZenState);
+ } catch (e) {
+ console.error('Failed to parse preZenState', e);
+ }
+ }
$effect.root(() => {
$effect(() => {
@@ -29,7 +55,16 @@ export class SettingsStore {
localStorage.setItem('editor.lineNumbers', this.lineNumbers);
localStorage.setItem('editor.vimMode', String(this.vimMode));
localStorage.setItem('editor.statusBar', String(this.statusBar));
+
localStorage.setItem('editor.wordCount', String(this.wordCount));
+ localStorage.setItem('editor.renderLineHighlight', this.renderLineHighlight);
+ localStorage.setItem('editor.showTabs', String(this.showTabs));
+ localStorage.setItem('editor.zenMode', String(this.zenMode));
+ if (this.preZenState) {
+ localStorage.setItem('editor.preZenState', JSON.stringify(this.preZenState));
+ } else {
+ localStorage.removeItem('editor.preZenState');
+ }
});
});
}
@@ -58,6 +93,41 @@ export class SettingsStore {
toggleWordCount() {
this.wordCount = !this.wordCount;
}
+
+ toggleLineHighlight() {
+ this.renderLineHighlight = this.renderLineHighlight === 'line' ? 'none' : 'line';
+ }
+
+ toggleTabs() {
+ this.showTabs = !this.showTabs;
+ }
+
+ toggleZenMode() {
+ this.zenMode = !this.zenMode;
+ if (this.zenMode) {
+ this.preZenState = {
+ renderLineHighlight: this.renderLineHighlight,
+ showTabs: this.showTabs,
+ statusBar: this.statusBar,
+ minimap: this.minimap,
+ lineNumbers: this.lineNumbers,
+ };
+ this.renderLineHighlight = 'none';
+ this.showTabs = false;
+ this.statusBar = false;
+ this.minimap = false;
+ this.lineNumbers = 'off';
+ } else {
+ if (this.preZenState) {
+ this.renderLineHighlight = this.preZenState.renderLineHighlight;
+ this.showTabs = this.preZenState.showTabs;
+ this.statusBar = this.preZenState.statusBar;
+ this.minimap = this.preZenState.minimap;
+ this.lineNumbers = this.preZenState.lineNumbers;
+ this.preZenState = null;
+ }
+ }
+ }
}
export const settings = new SettingsStore();