Write Markdown with code assist and intelligence in the comfort of your favourite editor.
Marksman is a program that integrates with your editor to assist you in writing and maintaining your Markdown documents. Using LSP protocol it provides completion, goto definition, find references, rename refactoring, diagnostics, and more. In addition to regular Markdown, it also supports wiki-link-style references that enable Zettelkasten-like1, 2 note taking. See more about Marksman's features below.
Marksman works on MacOS, Linux, and Windows and is distributed as a self-contained binary for each OS.
The server provides assistance with:
- Markdown inline links:
This is [inline link](/some-file.md#some-heading). This is an internal [anchor link](#heading).
- Markdown reference links:
See [reference]. [reference]: /url "Title"
- Wiki-links:
Link to [[another-note]]. Link to [[another-notes#heading]]. Internal link to [[#a-heading]].
All types of links support completion, hover, goto definition/references. Additionally, Marksman provides diagnostics for wiki-links to detect broken references and duplicate/ambiguous headings.
Existing editor integrations3:
-
VSCode via Marksman VSCode.
-
Neovim:
- via mason.nvim (automatic server installation) (requires mason-lspconfig.nvim)
- via nvim-lspconfig,
- via CoC-marksman.
-
Vim:
-
via ale - will support Marksman out-of-the-box once PR is merged; in the meantime...
Example config (add the following to your
~/.vim/after/ftplugin/markdown.vim
):if exists('g:loaded_ale') call ale#linter#Define('markdown', { 'name': 'marksman', 'lsp': 'stdio', 'executable': 'marksman', 'command': '%e server', 'initialization_options': {} }) end
-
via lsp
Example config (add the following to your
~/.vim/after/ftplugin/markdown.vim
):if exists('g:loaded_lsp') call LspAddServer([#{ name: 'marksman', filetype: ['markdown'], path: '/path/to/marksman', args: ['server'], syncInit: v:true }]) end
-
-
Emacs:
-
via LSP Mode (automatic server installation).
Example config for
use-package
users:(use-package markdown-mode :hook (markdown-mode . lsp) :config (require 'lsp-marksman))
-
via Eglot, requires configuration (unless eglot#1013 gets merged); add the following to your
init.el
(add-to-list 'eglot-server-programs '(markdown-mode . ("marksman"))) (add-hook 'markdown-mode-hook #'eglot-ensure)
-
-
Helix supports Marksman out of the box. However, you need add
marksman
binary to yourPATH
manually. -
Sublime Text via LSP-marksman (automatic server installation).
-
BBEdit can be configured to use Marksman as an LSP server for Markdown files.
See the installation instructions.
- See this page for a mix of Neovim, VSCode, and Emacs screen captures.
- See this post on how to use Marksman with LunarVim.
- Check out this YouTube video by Luke Pighetti on how to use Marksman with Helix.
See the Features page to learn more about language features, configurations, and single- and multi-file modes.
- Cross-file references and completions don't work.
- Either create an empty
.marksman.toml
in the root folder of your project or initialize a repository (e.g.git init
). See this page to learn more about single- and mult-file modes.
- Either create an empty
- I'm getting "marksman can’t be opened because Apple cannot check it for malicious software" on MacOS.
- Run the following command to bypass it and let Mac know that it's fine:
xattr -d com.apple.quarantine <path-to-marksman-bin>
.
- Run the following command to bypass it and let Mac know that it's fine:
Footnotes
-
You may have heard about Roam Research. That is a commercial implementation of the Zettelkasten method and another point of reference for what Marksman is about. However, unlike a proprietary Roam Research, Marksman is free, open-source and integrated into your favourite editor (albeit for not not as feature rich as Roam Research). ↩
-
There is an excellent VSCode extension called Markdown Memo. You definitely need to check it out if you're primarily using VSCode as it has some features that are missing in Marksman and Marksman VSCode extension. However, Markdown Memo is VSCode specific while Marksman is a generic language server, so can be used with any editor that has LSP support: Emacs, Vim, Neovim, etc. ↩
-
Since Marksman is a regular Language Server most of the functionality works out of the box with any LSP client. ↩