diff --git a/src/renderer/components/SvgIcon.vue b/src/renderer/components/SvgIcon.vue index c83a6b0b..136e2e01 100644 --- a/src/renderer/components/SvgIcon.vue +++ b/src/renderer/components/SvgIcon.vue @@ -39,6 +39,7 @@ export default defineComponent({ 'edit-solid': '', 'eye-regular': '', 'text-width-solid': '', + 'keyboard-solid': '', } const name = props.name! diff --git a/src/renderer/plugins/status-bar-control-center.ts b/src/renderer/plugins/status-bar-control-center.ts index ab25392e..58cfb986 100644 --- a/src/renderer/plugins/status-bar-control-center.ts +++ b/src/renderer/plugins/status-bar-control-center.ts @@ -46,6 +46,18 @@ export default { ctx.layout.toggleView() } }, + { + type: 'btn', + icon: 'paint-roller', + title: ctx.i18n.t('control-center.switch.sync-rendering'), + checked: ctx.store.state.autoPreview, + onClick: () => { + ctx.view.toggleAutoPreview() + if (ctx.store.state.autoPreview) { + ctx.view.refresh() + } + } + }, { type: 'btn', icon: 'text-width-solid', @@ -57,14 +69,11 @@ export default { }, { type: 'btn', - icon: 'paint-roller', - title: ctx.i18n.t('control-center.switch.sync-rendering'), - checked: ctx.store.state.autoPreview, + icon: 'keyboard-solid', + title: ctx.i18n.t('control-center.switch.typewriter-mode'), + checked: ctx.store.state.typewriterMode, onClick: () => { - ctx.view.toggleAutoPreview() - if (ctx.store.state.autoPreview) { - ctx.view.refresh() - } + ctx.editor.toggleTypewriterMode() } }, ) diff --git a/src/renderer/services/editor.ts b/src/renderer/services/editor.ts index 765b41c3..35d19d90 100644 --- a/src/renderer/services/editor.ts +++ b/src/renderer/services/editor.ts @@ -234,6 +234,10 @@ export function toggleWrap () { store.commit('setWordWrap', (isWrapping ? 'off' : 'on')) } +export function toggleTypewriterMode () { + store.commit('setTypewriterMode', !store.state.typewriterMode) +} + registerAction({ name: 'editor.toggle-wrap', handler: toggleWrap, keys: [Alt, 'w'] }) registerHook('MONACO_BEFORE_INIT', ({ monaco }) => { @@ -282,3 +286,15 @@ store.watch(state => state.wordWrap, (wordWrap) => { editor.updateOptions({ wordWrap }) }) }) + +whenEditorReady().then(({ editor }) => { + // typewriter mode + editor.onDidChangeCursorPosition(e => { + if (store.state.typewriterMode) { + const sources = ['deleteLeft', 'keyboard'] + if (sources.includes(e.source) && e.reason === 0) { + editor.revealPositionInCenter(e.position) + } + } + }) +}) diff --git a/src/renderer/support/store.ts b/src/renderer/support/store.ts index 90ebfa7f..0807242d 100644 --- a/src/renderer/support/store.ts +++ b/src/renderer/support/store.ts @@ -6,6 +6,7 @@ import type { Components, Doc, Repo } from '@fe/types' export const initState = { tree: null, wordWrap: storage.get<'off' | 'on'>('wordWrap', 'off'), + typewriterMode: storage.get('typewriterMode', false), showSide: storage.get('showSide', true), showView: storage.get('showView', true), showEditor: storage.get('showEditor', true), @@ -42,6 +43,10 @@ export default createStore({ state.wordWrap = data storage.set('wordWrap', data) }, + setTypewriterMode (state, data: boolean) { + state.typewriterMode = data + storage.set('typewriterMode', data) + }, setShowView (state, data) { state.showView = data storage.set('showView', data) diff --git a/src/share/i18n/languages/en.ts b/src/share/i18n/languages/en.ts index d8b940f8..40e2634f 100644 --- a/src/share/i18n/languages/en.ts +++ b/src/share/i18n/languages/en.ts @@ -411,8 +411,9 @@ const data = { 'side-bar': 'Side Bar %s', 'editor': 'Editor %s', 'view': 'Editor %s', - 'word-wrap': 'Word Wrap %s', 'sync-rendering': 'Synchronous rendering', + 'word-wrap': 'Word Wrap %s', + 'typewriter-mode': 'Typewriter Mode', }, 'navigation': { 'goto': 'Goto %s', diff --git a/src/share/i18n/languages/zh-CN.ts b/src/share/i18n/languages/zh-CN.ts index 60f3affd..46b77c70 100644 --- a/src/share/i18n/languages/zh-CN.ts +++ b/src/share/i18n/languages/zh-CN.ts @@ -412,8 +412,9 @@ const data: BaseLanguage = { 'side-bar': '侧栏 %s', 'editor': '编辑器 %s', 'view': '预览 %s', - 'word-wrap': '编辑器换行 %s', 'sync-rendering': '同步渲染', + 'word-wrap': '编辑器换行 %s', + 'typewriter-mode': '打字机模式', }, 'navigation': { 'goto': '跳转 %s',