🐙 Patto Note
A simple, language server-powered plain-text format for quick note-taking, outlining, and task management.
Description
Patto Note is a text format inspired by Cosense (formerly Scrapbox), designed for quick note-taking, task management, and outlining. It works with your favorite editor, powered by the Language Server Protocol. Unlike Markdown, every newline (\n) creates a new line, and a leading hard tab (\t) itemizes the line. This simple, line-oriented structure makes it easy to outline ideas, organize tasks, and brainstorm effectively.
Demo
Features
- Primary Zettelkasten support
- Task management with
line property(please refer to the syntax section below) - Integrated vim plugin
- Language server protocol
- asynchronous workspace scanning
- diagnostics
- jumping between notes by go-to definition
- note/anchor completion
Syntax
Hello world.
itemize lines with a leading hard tab `\t'
that can be nested
the second element #sampleanchor
the third element
[@quote]
quoted text must be indented with `\t'
Task Management
a task {@task status=todo}
another task with deadline {@task status=todo due=2030-12-31T23:59:00}
abbreviated version of task !2030-12-31
a completed task {@task status=done}
Decoration:
[* bold text]
[/ italic text]
[*/ bold italic text]
Links:
[other note]
link to other note in a workspace
[other note#anchor]
direct link to an anchored line
[#sampleanchor]
self note link to the anchored line (i.e., this line) #sampleanchor
url link:
[https://google.com url title]
title and url can be flipped:
[url title https://google.com]
link to an image
[@img https://via.placeholder.com/50]
Code highlight with highlight.js
[@code python]
import numpy as np
print(np.sum(10))
[` inline code `]
Math with katex
[@math]
O(n^2)\\
sum_{i=0}^{10}{i} = 55
inline math: [$ O(n log(n)) $]
Line property
A text in the form of {@XXX YYY=ZZZ} is named as line property and adds an property to the line (not the whole text).
Currently, anchor and task properties are implemented:
{@anchor name}: adds an anchor to the line. abbrev:#name{@task status=todo due=2024-12-31}: marks the line as a todo.
The due date only supports the ISO 8601 UTC formats (YYYY-MM-DD or YYYY-MM-DDThh:mm).
abbrev (symbols might be changed some time):- todo:
!2024-12-31 - doing:
*2024-12-31 - done:
-2024-12-31
- todo:
Usage with (neo)vim
- First, open a file in a workspace with suffix
.pn, or:newand:set syntax=patto - Then, write your memos.
- Once you type
[and@, lsp client will complete links and snippets respectively- snippets will only be completed with lsp-oriented snippet plugins such as vim-vsnip).
- You will have
:LspPattoTaskscommand; that will gather tasks from the notes in your workspace and show them in a location window.
Installation
Install lsp server using cargo
This will install the following utilities:
patto-lsp: a lsp serverpatto-markdown-renderer: a format converter from patto note to markdownpatto-html-renderer: a format converter from patto note to html
Setup vim with vim-lsp (using vim-plug)
call plug#begin()
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'ompugao/patto', {'for': 'patto'}
call plug#end()
Setup neovim with nvim-lspconfig (using vim-plug)
call plug#begin()
Plug 'neovim/nvim-lspconfig'
Plug 'hrsh7th/cmp-nvim-lsp'
Plug 'hrsh7th/nvim-cmp'
Plug 'ompugao/patto'
call plug#end()
lua << EOF
require('patto')
require('lspconfig.configs').patto_lsp.setup({})
EOF
Setup vscode extension
To be released.
Upcoming features:
parser
- link to local files
lsp
- document backlinks using find references
- semantic tokens
- file renaming keeping note connections
- anchor renaming
renderer
- markdown export
- math expression rendering
- replace highlight.js with syntect
other todos
please refer to todo
Misc
unix command utilities
sort tasks with grep and sort
| | |
# or, in vim
)|