The evolution of a structural code editor

Enthusiasm for structural editors

  • Many commenters like the idea of treating programs as ASTs rather than raw text, with potential benefits:
    • Fewer or no syntax errors; “always-valid” code enabling continuous analysis.
    • Richer editing operations that work on meaningful constructs instead of characters.
    • Better fit for phones, touchscreens, and accessibility, where typing text is painful.
    • More powerful refactoring and visualization (control-flow graphs, node views, code-flow overlays).
    • Clearer structural diffs and renames if diffs operate on syntax trees.

Plain text vs structured representation

  • Strong defense of plain text:
    • Works with existing tools: git, diffs, grep, email, CLIs, teaching, documentation.
    • Stores “what keys were pressed,” enabling simple mental models, version control, and error recovery.
    • Text remains visible and flexible; whitespace, layout, and ordering often convey meaning.
  • Some argue the real win is structural tooling on top of textual formats; the AST must be serialized anyway.
  • Concern that non-text formats lock users into specific editors and break existing workflows.

UX and workflow concerns

  • Several report structural editors feeling clunky:
    • Editing requires navigating only through valid intermediate states, adding cognitive load.
    • Operations that are trivial text edits (e.g., wrapping a call in an if) can require multiple structural steps.
    • Need for temporary syntactically invalid states (pasting, block editing, “gobbledygook” transformations).
  • Preferences differ: some want mouse/touch UIs, others insist structural editing must be keyboard-first, akin to vim motions over ASTs.
  • Suggestions for an “escape hatch” raw-text mode, with reparsing afterward.

Diffing, typing, and analysis

  • Tree-based diffs could:
    • Ignore harmless reorderings.
    • Treat renames as single semantic changes instead of many textual ones.
  • Counterpoints:
    • Whitespace and ordering can be semantically or communicatively important.
    • Syntax-aware diffs and parsers can be added to existing tools without changing editors.
  • “Always-valid” syntax does not guarantee well-typed programs; type-error recovery is a property of the type system, not the editor.

Prior art and hybrid approaches

  • Many note long histories of structural editing (Lisp, paredit/parinfer, Smalltalk, mainframe editors, visual node systems, UI designers).
  • Some argue decades of attempts without mainstream adoption suggest hard, possibly fundamental trade-offs.
  • Popular view: best path is hybrid:
    • Keep a canonical textual representation.
    • Layer structural operations via plugins (Tree-sitter, LSP, refactoring engines, snippet-like structural commands).
    • Explore domain-specific structural editors (UIs, robotics, education) where benefits may outweigh costs.

Open questions / unclear

  • Whether a universal, simple AST format is desirable vs language-specific structures.
  • How far structural editing can scale beyond demos without sacrificing speed, flexibility, and interoperability.