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',