✅ Introduction
Editmarks is a track changes system for scientific writing and collaborative editing in VS Code. Inspired by `scimax-editmarks' from Emacs Scimax, it provides a lightweight markup syntax for tracking insertions, deletions, comments, and typo corrections directly in your documents.
Unlike traditional track changes systems that rely on binary formats or external tools, editmarks uses plain text markup that works seamlessly across org-mode, Markdown, and LaTeX files. Changes remain visible and editable as plain text, making them perfect for version control systems like Git.
✅ Key Features
Plain text markup: Changes are visible in any text editor
Language-agnostic: Works in org-mode, Markdown, LaTeX, and plain text
Four mark types: Insertions, deletions, comments, and typo corrections
Visual highlighting: Color-coded decorations for easy identification
Quick navigation: Jump between marks with keyboard shortcuts
Batch operations: Accept or reject all changes at once
Hover actions: Quick accept/reject from hover tooltips
Summary view: Overview of all changes in the document
✅ Use Cases
Document review: Mark suggested changes when reviewing a colleague's work
Collaborative editing: Track your edits when working on shared documents
Self-revision: Keep track of your own changes during editing sessions
Teaching and feedback: Provide inline suggestions to students or mentees
Version control: Complement Git commits with inline change tracking
✅ Markup Syntax
Editmarks supports two markup formats to maximize compatibility:
✅ Universal Format (Recommended)
The universal format works in all document types:
@@+inserted text+@@ # Insertion @@-deleted text-@@ # Deletion @@>comment text<@@ # Comment @@~old text|new text~@@ # Typo correction
✅ CriticMarkup Format (Alternative)
An alternative format inspired by CriticMarkup:
{++inserted text++} # Insertion
{--deleted text--} # Deletion
{>>comment text<<} # Comment
{~~old text~>new text~~} # Typo correction
Both formats are recognized and rendered identically. Choose whichever you prefer or is required by your workflow.
✅ Types of Editmarks
✅ Insertion
The quick brown fox @@+gracefully+@@ jumps over the lazy dog.
Suggesting new content
Adding missing words or phrases
Inserting clarifications or examples
✅ Deletion
The quick brown @@-very-@@ fox jumps over the lazy dog.
Removing redundant text
Deleting incorrect information
Suggesting text removal during review
✅ Comment
The results were statistically significant @@>verify p-value<@@.
Asking questions about the text
Leaving notes for the author
Marking sections that need attention
Providing context for other changes
✅ Typo Correction
The experment @@~experment|experiment~@@ was successful.
Correcting spelling mistakes
Fixing grammatical errors
Suggesting better word choices
Standardizing terminology
✅ Creating Editmarks
✅ Mark Insertion
With text selected: Wraps selection with insertion markup
Without selection: Prompts for text to insert
Select "quickly" in your text (or place cursor where text should be inserted)
Press `C-c e i'
If no selection, type the text to insert
Result: @@+quickly+@@
✅ Mark Deletion
Requires text selection
Wraps selected text with deletion markup
Select "very" in your text
Press `C-c e d'
Result: @@-very-@@
✅ Insert Comment
With text selected: Uses selection as comment text
Without selection: Prompts for comment
Place cursor at the relevant location
Press `C-c e c'
Type: "Check this citation"
Result: @@>Check this citation<@@
✅ Mark Typo Correction
Requires text selection (the incorrect text)
Prompts for the correct text
Creates a typo mark showing old→new
Select "teh" in your text
Press `C-c e t'
Type: "the"
Result:
@@`teh|the'@@
✅ Reviewing and Processing Editmarks
✅ Accept Edit Mark
Accepts the editmark at the cursor position:
Insertion: Keeps the inserted text, removes markup (@@+text+@@ → text)
Deletion: Removes the deleted text entirely (@@-text-@@ → empty)
Comment: Removes the comment (@@>text<@@ → empty)
Typo: Applies the correction (
@@`old|new'@@` → 'new)
Before: The quick @@+brown+@@ fox After: The quick brown fox
✅ Reject Edit Mark
Rejects the editmark at the cursor position:
Insertion: Removes the inserted text (@@+text+@@ → empty)
Deletion: Keeps the original text (@@-text-@@ → text)
Comment: Removes the comment (@@>text<@@ → empty)
Typo: Keeps the original text (
@@`old|new'@@` → 'old)
Before: The quick @@+brown+@@ fox After: The quick fox
✅ Accept All Edit Marks
Accepts all editmarks in the current document:
Shows confirmation dialog with count
Processes all marks from bottom to top
Displays success message
✅ Reject All Edit Marks
Rejects all editmarks in the current document:
Shows confirmation dialog with count
Processes all marks from bottom to top
Displays success message
✅ Hover Actions
Position your cursor over any editmark to see a hover tooltip with:
Mark type and content
Quick action links to accept or reject
For typos: Shows old → new transformation
This provides a quick way to review and act on individual changes without remembering keybindings.
✅ Summary View
Opens a quick pick menu showing:
Summary statistics: Total count and breakdown by type
Individual marks: List of all editmarks with:
Searchable: Type to filter marks
Click to navigate: Select a mark to jump to it
Color-coded: Visual distinction between mark types
Summary ├── Insertions: 3 (Green) ├── Deletions: 2 (Red) ├── Comments: 1 (Yellow) └── Typos: 2 (Orange) 📝 gracefully Line 12 ❌ very Line 15 💬 Check this citation Line 23 ✏️ teh → the Line 34 ...
✅ Visual Appearance
Editmarks are rendered with distinctive decorations (The icons are similar to what is shown in the summary view):
| Type | Background Color | Border | Text Style | Icon |
|---|---|---|---|---|
| Insertion | Light green | Green | Normal | 📝 |
| Deletion | Light red | Red | Strikethrough | ❌ |
| Comment | Light yellow | Yellow | Italic | 💬 |
| Typo | Light orange | Orange | Normal | ✏️ |
All decorations include:
Semi-transparent background (20% opacity)
Solid border for clear delimitation
2px border radius for rounded corners
Complete Command Reference
Insertion Commands
| Command | Keybinding | Description |
|---|---|---|
scimax.editmarks.insertion | C-c e i | Mark text as insertion |
Deletion Commands
| Command | Keybinding | Description |
|---|---|---|
scimax.editmarks.deletion | C-c e d | Mark text for deletion |
Comment Commands
| Command | Keybinding | Description |
|---|---|---|
scimax.editmarks.comment | C-c e c | Insert edit comment |
Typo Correction Commands
| Command | Keybinding | Description |
|---|---|---|
scimax.editmarks.typo | C-c e t | Mark typo correction |
Review Commands
| Command | Keybinding | Description |
|---|---|---|
scimax.editmarks.accept | C-c e a | Accept mark at cursor |
scimax.editmarks.reject | C-c e r | Reject mark at cursor |
scimax.editmarks.acceptAll | (none) | Accept all marks |
scimax.editmarks.rejectAll | (none) | Reject all marks |
Utility Commands
| Command | Keybinding | Description |
|---|---|---|
scimax.editmarks.summary | C-c e s | Show all marks summary |
Keybinding Pattern
All editmarks keybindings follow the pattern C-c e <letter>:
`C-c e' → Editmarks prefix
`i' → Insertion
`d' → Deletion
`c' → Comment
`t' → Typo
`a' → Accept
`r' → Reject
`s' → Summary
[ → Previous
] → Next
This consistent pattern makes the commands easy to remember and discover.
Typical Workflows
Workflow 1: Peer Review
Open the document in VS Code
Read through and identify areas needing changes
Mark suggestions:
Add typo corrections:
Save the document and send back to colleague
Colleague reviews using C-c e ] to navigate between marks
Colleague processes each mark:
Save final version with all changes resolved
Workflow 2: Self-Editing
Enable editmarks mode (always on - no toggle needed)
As you edit, use editmarks instead of direct changes:
Take a break - changes are preserved in plain text
Review later:
Process systematically:
Commit to version control with clear change history
Workflow 3: Collaborative Writing
Author A makes initial draft
Author B checks out the branch and adds suggestions:
Author C adds more changes:
Authors meet to review:
Accept/reject collaboratively
Commit final version to Git with all changes incorporated
Workflow 4: Student Feedback
Open student's submission
Read through once without marking
Second pass - mark issues:
Add pedagogical comments:
Generate summary report:
Student processes feedback:
Workflow 5: Document Review Cycle
The project will @@+likely+@@ be completed @@-on time-@@ @@+ahead of schedule+@@. @@>Reviewer: Source for this claim?<@@
The project will @@+likely+@@ be completed @@+ahead of schedule+@@. @@>Author: Added reference below. See Smith et al. 2025<@@ [ref added here]
Reviewer opens document
Presses `C-c e s' to see all outstanding marks
Navigates with C-c e ] through each change
Presses `C-c e a' to accept all approved changes
Final document is clean and ready for publication
✅ Best Practices
✅ Do's
Use descriptive comments: Instead of @@>fix this<@@, write @@>fix grammar: subject-verb agreement<@@
Be specific with insertions: Show exactly what you're suggesting
One change per mark: Don't combine multiple edits in one mark
Review systematically: Use navigation commands to ensure you don't miss any marks
Preserve marks in Git: Commit documents with editmarks to track review history
Use hover tooltips: Quick way to remind yourself what each mark does
✅ Don'ts
Don't nest editmarks: Avoid @@+text @@-with-@@ nesting+@@ - it's confusing
Don't mix formats randomly: Pick either universal or CriticMarkup and stick with it
Don't leave marks indefinitely: Process them regularly to keep documents clean
Don't delete marks manually: Use accept/reject commands to ensure proper processing
Don't use for version control: Editmarks complement Git but don't replace it
✅ Tips
Quick review: Use C-c e s at the start of each editing session to see pending changes
Batch processing: For documents with many trivial changes, use "Accept All" after review
Comments as TODO: Use comment marks as inline TODO items during writing
Color awareness: Learn to recognize mark types by color for faster visual scanning
Git integration: Create commits after processing editmarks with descriptive messages
Keyboard efficiency: The navigation keys ([ and ]) combined with a/r enable fast review
✅ Integration with Other Features
✅ Source Blocks
Editmarks work inside source blocks (although they likely break the code unless you use them in comments.):
def calculate(x):
return x * @@+2+@@ @@-3-@@ @@>why change the multiplier?<@@
This is useful when reviewing code snippets in documentation or educational materials.
✅ Tables
Use editmarks in table cells:
| Item | Original | Revised | Notes |
|---|---|---|---|
| Budget | @@ | approved by CFO | |
| Time | 6 months | @@ | realistic estimate |
✅ Export Compatibility
Editmarks are fully supported in HTML, LaTeX, and PDF exports. The export behavior is controlled by the scimax.export.editmarkMode setting.
Export Modes
| Mode | Description |
|---|---|
show | Render with visual markup (colored insertions/deletions) |
accept | Apply all changes (keep insertions, remove deletions) |
reject | Revert all changes (remove insertions, keep deletions) |
hide | Remove all editmarks without any replacement |
HTML Export
In HTML, editmarks are rendered using semantic HTML elements with CSS styling:
Insertions:
<ins class"editmark-ins">text= (green background)Deletions:
<del class"editmark-del">text= (red background, strikethrough)Comments:
<mark class"editmark-comment">text= (yellow background, italic)Typos:
<span class"editmark-typo">oldnew=
LaTeX/PDF Export
In LaTeX, editmarks use custom commands defined in the preamble:
\editins{inserted text} % Green underlined text
\editdel{deleted text} % Red strikethrough text
\editcomment{comment text} % Orange italic text in brackets
\edittypo{old text}{new text} % Old crossed out, new inserted
The required packages (xcolor, ulem) and command definitions are automatically added to the preamble when editmarks are detected.
Configuration
Set the export mode in VS Code settings:
{
"scimax.export.editmarkMode": "show"
}
Or use the Settings UI: Search for "editmark" and select the desired mode.
Workflow Recommendations
Draft review: Use
showmode to see all changes visually in the exportFinal publication: Use
acceptorrejectmode, or process marks manually before exportClean copy: Use
hideto remove all editmarks without deciding on them
✅ Version Control
Editmarks are perfect for version control workflows:
# Add document with editmarks
git add manuscript.org
# Commit with descriptive message
git commit -m "Add reviewer feedback as editmarks"
# Later, after processing
git add manuscript.org
git commit -m "Incorporate reviewer suggestions"
The diff shows both the markup and the final changes, providing complete review history.
✅ Troubleshooting
✅ Editmarks Not Showing
Check that you're in a supported file (any text file works)
Reload window: C-S-P → "Developer: Reload Window"
Verify syntax: Ensure markup is exactly correct (e.g., @@+text+@@ not @@+ text +@@)
Accept/Reject Not Working
Position cursor inside the editmark (between the markup symbols)
Hover over the mark to see the tooltip - if visible, cursor is positioned correctly
Check that the editmark syntax is valid
✅ Nested Marks Issue
✅ Performance with Many Marks
Process marks in batches (accept/reject groups of related changes)
Use "Accept All" or "Reject All" for bulk processing
Split large documents into smaller files
✅ FAQ
Q: Can I customize the colors?
A: Currently, colors are fixed (green for insertion, red for deletion, yellow for comments, orange for typos). Custom theme support may be added in future versions.
Q: Do editmarks work in any file type?
A: Yes! Editmarks work in any text file: .org, .md, .tex, .txt, .py, etc. The markup is plain text.
Q: Can I export documents with editmarks?
A: Yes! Editmarks are fully supported in HTML, LaTeX, and PDF exports. Use the scimax.export.editmarkMode setting to control how they appear:
show: Visual markup with colors (default)accept: Apply all changes automaticallyreject: Revert all changeshide: Remove editmarks silently
Q: How do I see who made which mark?
A: Editmarks don't automatically track authors. Add author names manually in comments:
@@>(Author: John Doe) This needs clarification<@@
Q: Can I use editmarks with Word documents?
A: No, editmarks require plain text files. Convert Word documents to Markdown or use Word's built-in track changes.
Q: Do editmarks interfere with syntax highlighting?
A: No, they're implemented as decorations that overlay the text without modifying syntax highlighting.
Q: Can I undo an accept/reject action?
A: Yes, use VS Code's regular undo (C-z) immediately after accepting or rejecting a mark.
Q: Are editmarks saved with the file?
A: Yes! Editmarks are plain text markup, so they're saved as part of the document content.
Q: Can I search for editmarks?
A: Yes, use regular search (C-f) for @@+ or {++ to find all insertions, etc. Or use C-c e s for the summary view.
✅ Conclusion
Editmarks provide a powerful, plain-text approach to track changes that integrates seamlessly with modern developer workflows. By using simple markup instead of complex binary formats, editmarks offer:
Transparency: Changes are always visible and readable
Portability: Works across editors and platforms
Version control: Perfect for Git-based collaboration
Flexibility: Use as much or as little as you need
Whether you're reviewing papers, collaborating on documentation, or tracking your own revisions, editmarks offer a lightweight yet powerful solution for managing document changes.
Start using editmarks today:
Open any document
Press `C-c e i' to insert your first mark
Press `C-c e s' to see the summary
Navigate with C-c e ] and C-c e [
Accept or reject with `C-c e a' and `C-c e r'
Happy editing!