Jotura

Docs / Using the app / The editor

The editor

Reference for the Jotura editor: markdown input rules, the slash menu, source mode, tables, lists and checkboxes, links, images, and autosave.

Every note opens in a rich editor that writes plain Markdown to disk. You type Markdown syntax and it formats as you go, or you switch to source mode and edit the raw file. Both views edit the same file, and there is no import or export step between them.

This page covers the editing surface itself. If you have not opened a vault yet, start with Getting started. Keyboard chords are listed in full on Keyboard shortcuts, and the settings mentioned here are described alongside every other option in the Settings reference.

The editor header and the two modes

The editor header carries two controls. The first is an export button labeled Export as HTML. It opens a native save dialog and writes a self-contained HTML file with the styles inlined, so the exported page renders on its own.

The second is a mode toggle with the tooltip Toggle source mode (Cmd/Ctrl+Shift+E). The button is labeled with the destination rather than the current state, so it reads Source while you are in the rich view and Preview while you are in source mode.

The rich view applies formatting live as you type. Source mode shows the raw Markdown in a plain code editor. The setting Open in source mode decides which one new tabs start in, and it is off by default.

The command palette also carries the toggle as Editor: Toggle Source Mode, along with Insert Link to Note…, Export as HTML…, and Print / Save as PDF. Print opens the operating system print dialog, which is also how you produce a PDF.

Formatting as you type

Typing Markdown syntax converts it in place. These rules fire as soon as you complete the pattern, so the characters you typed disappear and the formatting appears.

You typeYou get
# through ###### Heading levels 1 to 6
- , + , or * Bullet list
1. with any numberOrdered list, starting at that number
> Blockquote
``` or ```langCode block, with the language when you give one
~~~ or ~~~langCode block
---, ___ , or *** Horizontal rule
**bold** or __bold__Bold
*italic* or _italic_Italic
~~strike~~Strikethrough
`code`Inline code

Three details in that table are easy to trip over:

  • The code fence captures a lowercase language only. A fence typed as ```JS creates the code block but does not record the language.
  • The horizontal rule accepts a fourth spelling. Three hyphens work with no trailing space, ___ and *** need one, and an em dash followed by a hyphen also works. That last branch exists because some systems autocorrect three hyphens into an em dash plus a hyphen.
  • Bold, italic, strikethrough, and inline code each ship a matching paste rule, so they also apply to text you paste rather than type.

URLs, pasted text, and raw HTML

Bare URLs become links on their own. The editor has autolinking turned on, so finishing a URL as you type converts it into a link. The Markdown parser has linkify turned on as well, so URLs inside pasted or parsed Markdown become links too.

Plain text pasted into the editor is parsed as Markdown, and text copied out of the editor is serialized back to Markdown. Moving content between notes and other apps therefore keeps its formatting.

Raw HTML is not honored. The Markdown layer is configured with HTML disabled, so an HTML snippet in a note, or one you paste in, is treated as ordinary text rather than as markup.

Formatting shortcuts

Mod means Command on macOS and Control on Windows and Linux.

ActionChord
BoldMod+B
ItalicMod+I
StrikethroughMod+Shift+S
Inline codeMod+E
Heading 1 to 6Mod+Alt+1 through Mod+Alt+6
Paragraph, clearing the block typeMod+Alt+0
BlockquoteMod+Shift+B
Code blockMod+Alt+C
Bullet listMod+Shift+8
Ordered listMod+Shift+7
Task listMod+Shift+9
Hard break inside a paragraphMod+Enter or Shift+Enter
UndoMod+Z
RedoMod+Y or Shift+Mod+Z

Markdown has no underline syntax, and Jotura does not support one. There is no underline chord in the editor.

Inside a blockquote, Backspace at the start of the quoted text lifts you back out of it. Inside a code block, Shift+Tab outdents.

Holding the mod key suppresses Tab everywhere in the editor. Mod+Tab and Mod+Shift+Tab are claimed application-wide for tab switching, and the handler cancels the browser default. So Mod+Tab does not indent a list item and does not move to the next table cell. On macOS the system application switcher normally claims Cmd+Tab before the app sees it at all.

The slash menu

Type / at the start of an empty paragraph and a menu of block types appears. Keep typing to filter it by a plain substring match on the item label, then press Enter to insert. The typed /query text is deleted for you before the block is inserted.

The menu is deliberately narrow about when it opens. All of these have to be true: the editor has focus, nothing is selected, the cursor is in a paragraph, only whitespace sits before the /, and the text after the / contains no spaces. Typing a space closes the menu, which is why a / in the middle of a sentence never triggers it.

ItemWhat it inserts
Heading 1A level 1 heading
Heading 2A level 2 heading
Heading 3A level 3 heading
Bullet listA bullet list
Ordered listA numbered list
Task listA checkbox list
BlockquoteA blockquote
Code blockA fenced code block
Horizontal ruleA horizontal rule
TableA 3 by 3 table with a header row
ImageOpens a file dialog, imports the file into the vault, and inserts it

The image item accepts png, jpg, jpeg, gif, webp, svg, bmp, and avif files.

Only headings 1 to 3 are offered in the menu. Headings 4, 5, and 6 are still available through Mod+Alt+4, Mod+Alt+5, Mod+Alt+6, or by typing #### at the start of a line.

Arrow Down and Arrow Up move through the list and wrap around at both ends, Enter inserts the highlighted item, and Escape closes the menu. Tab does nothing here.

Those keys only apply while at least one item matches. Filter down to nothing, by typing /xyz for example, and the menu hides itself and stops handling keys. Escape then falls through to the app’s usual Escape behavior. Delete a character or two and the menu comes back.

The selection toolbar

Selecting text in the rich view pops up a small toolbar with Bold, Italic, Strikethrough, Inline code, Link, and Insert image. It does not appear for a selected image or for a table cell selection, and it never appears in a read-only tab or in source mode.

The Link button behaves exactly like Mod+K, described below. The image button opens the same file dialog as the slash menu item.

Clicking the empty space below the last block puts the cursor at the end of the document, which saves you a scroll on a long note.

Source mode

Source mode replaces the rich view with a plain text editor showing the raw Markdown. It gives you line numbers, an active-line highlight, bracket matching, undo and redo, and the standard text editing keys.

Three things the pane does not have are worth knowing before you go looking for them.

AbsentWhat that means for you
Find and replaceThere is no in-pane search. Use the search page or the sidebar search pane to locate text across the vault.
Tab indentationTab does not indent the current line. It moves focus, as it does in an ordinary text field.
Bracket auto-closingTyping an opening bracket or quote does not insert the closing one. Bracket matching still highlights the pair once both exist.

The Mod+Shift+E chord only works while the rich editor has focus. That is the important caveat: once you are in source mode the rich editor is no longer on screen to receive the key, so the chord will not bring you back. Return to the rich view with the Preview button in the editor header, or run Editor: Toggle Source Mode from the command palette. The same focus rule applies to Mod+L and Mod+K, which are editor chords rather than global ones.

Mermaid diagrams

A fenced code block whose language is mermaid renders in the rich view as a non-editable diagram, with a single button reading Edit in source mode that flips you across to change the diagram text.

There is no slash menu item for a Mermaid block. Create one the way you create any other fenced block: type ```mermaid followed by a space or Enter, which records mermaid as the language. The language capture is lowercase only, so ```Mermaid will not produce a diagram.

When the diagram text does not parse, the block falls back to showing your source in a code block with an error strip reading Mermaid syntax error: and the parser’s message. An empty block shows the same source view with no error.

Lists and checkboxes

KeyIn a list
Enter in a non-empty itemSplits the item and starts the next one
Enter in an empty itemLifts you out of the list entirely, in one press
TabIndents the item one level
Shift+TabOutdents the item one level
Backspace, Delete, Mod+Backspace, Mod+DeleteJoins and merges with awareness of the list structure

The empty-item Enter is the one that differs from most editors. Press Enter on an empty item three levels deep and you land in a normal top-level paragraph immediately, rather than climbing out one level per press.

That single-press exit has one precondition. The empty item must have nothing else inside it. An empty item that carries a nested sublist beneath it takes the ordinary path instead, so Enter splits the item rather than exiting the list.

Checkboxes

Checkboxes are ordinary task lists in Markdown. Start one with /task, with Mod+Shift+9, or by typing the syntax directly. Both of these work:

- [ ] Draft the release notes
- [x] Book the meeting room

Typing [ ] or [x] at the start of a line converts it into a checkbox item. Typing - first and then [ ] also works, which is the sequence most people reach for. Click a checkbox to toggle it, and the state is written back into the file as [ ] or [x].

The input rules accept a lowercase x only. A [X] copied from GitHub-flavored Markdown does not convert, though the file still reads correctly everywhere else.

Lists that mix plain bullets and checkboxes are handled correctly when the file is saved and reopened, so you can keep both kinds of item under one list without losing either.

Tasks in your notes also feed the Tasks pane in the right sidebar. That behavior, along with daily notes, is covered in Daily notes, tasks, and templates.

Tables

Insert a table with the slash menu, which creates three rows and three columns with a header row.

KeyEffect in a table
TabMove to the next cell. At the last cell it adds a row and moves into it.
Shift+TabMove to the previous cell
EnterInsert a line break inside the cell, rather than splitting the cell
Shift+EnterInsert a line break inside the cell
Mod+EnterAdd a row after the current one and move into the next cell
Mod+Shift+BackspaceDelete the current row
Backspace, Delete, Mod+Backspace, Mod+Delete with every cell selectedDelete the whole table

Two of those are Jotura overrides. Enter inserts a break instead of splitting the block, because splitting a paragraph inside a cell is almost never what you want. Mod+Enter adds a row, which means that inside a table it does not insert a hard break the way it does elsewhere. Shift+Enter is not overridden, so it still gives you a hard break in a cell.

Note that the four delete keys wipe out the entire table once all its cells are selected, which is easy to reach by accident after clicking a handle. Undo with Mod+Z brings it back.

Table chrome

Around the table sit gutter controls. A + button below the table adds a row, and a + button to its right adds a column. The strip above each column and beside each row is a handle. Click a handle to select that column or row, and right-click it for a menu.

MenuItems
Row handleInsert row above, Insert row below, Delete row
Column handleInsert column left, Insert column right, Align left, Align center, Align right, Default align, Delete column

Column handles also carry an Align column button and a Delete column button, and row handles carry a Delete row button. The alignment dropdown offers Align left, Align center, Align right, and Default, and it applies the choice to every cell in that column rather than only the one you clicked.

Columns are resizable, and the resize grips live on the column handle strip above the table rather than on the header cells. Hover the strip between two columns to find one, which shows the tooltip Drag to resize column.

Which Enter wins

Enter is handled by several layers, and the first one that claims it stops the rest. The order is: the table override, then the empty-list-item exit, then the ordinary task-item and list-item split.

The consequence is that the table override wins inside a cell regardless of what is nested there. Put a bullet list inside a table cell and press Enter on an empty item, and you get a line break in the cell, not an exit from the list.

Jotura supports both Markdown links and Obsidian-style wikilinks, and the editor gives each its own path. Which one you get depends on which chord you use.

Mod+L inserts a wikilink. It opens the link picker, which searches your notes by file name as you type. Press Enter on a result and the editor inserts [[Note name]]. If you had text selected when you opened the picker, that text becomes the alias, so you get [[Note name|the text you selected]] instead. The .md extension is stripped from the inserted name.

The picker’s placeholder reads Link to note: type to search, Enter to insert. Arrow Down and Arrow Up move through results and wrap around, and results are limited to 20 matches. A Create row appears when your query is not empty and does not exactly match a result, with the subtitle New note in vault root, then link. Choosing it creates that note at the top level of the vault and then inserts the wikilink to it.

Mod+K sets a Markdown link on the current selection. It opens a prompt reading Link URL (leave empty to remove):, pre-filled with the existing link address if the selection already has one. Submitting an empty value removes the link, and cancelling the prompt leaves the text untouched. The Link button in the selection toolbar does the same thing.

Both chords need the rich editor to have focus. From anywhere else, run Insert Link to Note… from the command palette instead, which opens the link picker in the active note.

LinkClick behavior
Wikilink such as [[Roadmap]]Opens the target note in the active tab
Wikilink to a missing noteAsks No note named "{name}". Create it?, then creates and opens it
Wikilink to a missing text or HTML fileAlerts No file named "{name}" in this vault
Relative path such as [spec](specs/api.md)Resolves against the current note, then against the vault root, and opens it
Hashtag such as #projectSwitches the sidebar to the search pane and searches for that tag
External URL such as [docs](https://example.com)Nothing. The editor does not open external links.

That last row is a real limitation, not an omission. Links carrying a URL scheme are not opened from the rich view, and there is no in-app browser behind them. To follow one, copy the address out of the note or open the file in a browser yourself.

Relative-path resolution is skipped in four cases, listed here because each one silently does nothing:

CaseWhy
The link starts with a scheme such as http: or mailto:Treated as external, see above
The link starts with #Treated as an in-page anchor
The click is not a plain left-clickMiddle-click and modified clicks are left alone
Text is selected at the timeThe click is a selection gesture, not a navigation

Paths that try to escape the vault with .. are rejected outright.

Hashtags follow a strict pattern. A tag must start a line or follow a space, and the first character after the # must be a letter, digit, or underscore. So #work/admin is a tag and #-todo is not. Later characters may also include hyphens and slashes, which is what makes nested tags work.

Wikilinks stay as literal [[...]] text in your file. The editor styles them rather than replacing them, and a wikilink pointing at a note that does not exist is styled differently so you can spot it. Both wikilinks and hashtags are plain text in the file, so the jotura CLI and any other Markdown tool read and write them without special handling.

Images

There are four ways to get an image into a note.

  1. The Image item in the slash menu opens a file dialog, imports the file into the vault, and inserts it.
  2. The image button in the selection toolbar does the same.
  3. Pasting an image from the clipboard imports it. Pasted files do not keep their original name.
  4. Dropping a file onto the editor imports it at the drop position and does keep the original file name.

Imported images land in an assets folder. Dropped files that are not images become plain Markdown links to the imported file rather than embedded images, and dropping several files at once puts each on its own line. Non-image documents are imported into the folder set by the document folder setting, which defaults to attachments and is covered in Documents.

Right-clicking an image in the rich view opens a menu with Copy image, Copy file path, Reveal in Finder, and Delete. The two path-based items are disabled when the image has no file path behind it, such as a remote image. Escape closes the menu. The Reveal in Finder label is hard-coded in this menu rather than switched per platform, unlike the equivalent item in the file tree.

Images hosted on the web are not loaded by default. The Load remote images setting is off deliberately, because fetching an image from a remote host reveals your IP address and the fact that you are reading that note to whoever runs the host. Turn it on in Settings if you want them displayed.

Saving and external changes

There is no save shortcut, because there is nothing to save manually. Mod+S is not bound to anything. The editor saves one second after you stop typing, and announces Saved when it does.

It also flushes immediately in two other cases. Clicking into another tab or another app writes the pending save right away rather than discarding it, and so does hiding the app window. Read-only tabs never save at all. You get one of those when you open a note in a share someone gave you view-only access to, which requires a paid Sync subscription on their side. See Sync and sharing and pricing.

The editor owns the document while it is open, which is why the cursor never jumps while a save is in flight. All saves go through a queue, so an autosave timer and a blur flush cannot collide.

When the file changes underneath you

A note can change on disk while you have it open, because sync pulled a new version or because you edited it with the CLI. Jotura merges the two versions silently and announces Merged changes from disk. You are never asked to pick a side.

The merge is a three-way merge. The base is the tab’s last clean content, “ours” is what is in the editor, and “theirs” is what is now on disk. It retries up to three times if the file changes again mid-merge, which is what can happen during a fast sync pull.

Only one case surfaces a prompt. A note that has been deleted or moved outside the app shows a banner reading This note was deleted or moved outside the app. with the choices Close tab and Recreate with my version.

The one second delay is visible in two places

Because saves are on a timer, a note you are actively editing can be a moment behind on disk. Two actions refuse rather than guess:

ActionRefusal
Restoring an older version while the tab is dirtySave the note before restoring.
Toggling a task from the sidebar while its note’s tab is dirtySave the open note before toggling this task from the sidebar.

Clicking into another tab or another app flushes the save, which clears both. Previous versions are covered in Version history.

Editing the same notes from the CLI

The jotura command-line tool edits the same plain files, with hash-checked writes so a concurrent change in the desktop app is not silently overwritten. Read the note with its hash, then write back with that hash as a precondition:

HASH=$(jotura read "Projects/Roadmap.md" --json | jq -r .hash)
jotura edit "Projects/Roadmap.md" --replace "old text" --with "new text" --if-hash "$HASH"

A hash mismatch exits with code 2, which means the file changed since you read it. Exit code 14 means the target was deleted or moved between the read and the write, and the CLI deliberately does not recreate it. See Editing notes and Exit codes and JSON output for the full reference.