✨ feat(vscode): 代码阅读函数块默认折叠,函数说明进属性表「说明」行

This commit is contained in:
cruldra committed 2026-09-25 13:09:53 +08:00
1 parent 62f48fe67c
commit 9b32d4b5a8
17 files changed
+489 -100

No files matched your search

+15 -8
View File
@@ -9,17 +9,18 @@ import { BlockLevel } from './BlockTree'
import { useDefinitionLinks } from './useDefinitionLinks'
import { useReveal } from './useReveal'
import { useScrollPosition } from './useScrollPosition'
import { collapsedIds } from './viewState'
import { onMessage, postMessage, viewState } from './vscode'
type BlockModes = Pick<ViewState, 'editing' | 'collapsed'>
type BlockModes = Pick<ViewState, 'editing' | 'folds'>
function toggled(ids: string[], id: string): string[] {
return ids.includes(id) ? ids.filter(x => x !== id) : [...ids, id]
}
function savedBlockModes(): BlockModes {
const { editing, collapsed } = viewState.get()
return { editing, collapsed }
const { editing, folds } = viewState.get()
return { editing, folds }
}
export function App(): ReactElement | null {
@@ -28,10 +29,16 @@ export function App(): ReactElement | null {
const [focusId, setFocusId] = useState<string | null>(null)
/** 等着滚过去的位置:新预览第一份文档带的,或已开着的预览收到的 reveal */
const [reveal, setReveal] = useState<Reveal | null>(null)
const expand = useCallback((ids: string[]) => setView(prev => ({ ...prev, collapsed: prev.collapsed.filter(id => !ids.includes(id)) })), [])
const collapsed = useMemo(() => collapsedIds(doc?.blocks ?? [], view.folds), [doc, view.folds])
/** 记下这几块、属性行折叠还是展开,从此不再按默认 */
const setFolded = useCallback((ids: string[], folded: boolean) => setView(prev => ({
...prev,
folds: { ...prev.folds, ...Object.fromEntries(ids.map(id => [id, folded])) },
})), [])
const expand = useCallback((ids: string[]) => setFolded(ids, false), [setFolded])
const revealed = useCallback(() => setReveal(null), [])
useScrollPosition(doc)
useReveal(doc, reveal, view.collapsed, expand, revealed)
useReveal(doc, reveal, collapsed, expand, revealed)
useDefinitionLinks(doc?.version)
useEffect(() => {
@@ -58,15 +65,15 @@ export function App(): ReactElement | null {
const tree = useMemo((): BlockTreeState | null => doc && {
version: doc.version,
editing: new Set(view.editing),
collapsed: new Set(view.collapsed),
collapsed,
focusId,
onFocused,
onToggleEdit: (id) => {
setFocusId(view.editing.includes(id) ? null : id)
setView(prev => ({ ...prev, editing: toggled(prev.editing, id) }))
},
onToggleFold: id => setView(prev => ({ ...prev, collapsed: toggled(prev.collapsed, id) })),
}, [doc, view, focusId, onFocused])
onToggleFold: id => setFolded([id], !collapsed.has(id)),
}, [doc, view, collapsed, focusId, onFocused, setFolded])
if (!doc || !tree)
return null