Skip to content
/ patto Public

πŸ™ A simple, language server-powered plain-text format for quick note-taking, outlining, and task management.

Notifications You must be signed in to change notification settings

ompugao/patto

Repository files navigation

πŸ™ 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

demo.gif

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

Usage with (neo)vim

  • First, open a file in a workspace with suffix .pn, or :new and :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 :LspPattoTasks command; that will gather tasks from the notes in your workspace and show them in a location window.

Installation

Install lsp server using cargo

cargo install patto

This will install the following utilities:

  • patto-lsp: a lsp server
  • patto-markdown-renderer: a format converter from patto note to markdown
  • patto-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

rg --vimgrep '.*@task.*todo' . | awk '{match($0, /due=([0-9:\-T]+)/, m); if (RLENGTH>0) print m[1], $0; else print "9999-99-99", $0}' |sort |cut -d' ' -f2-
# or, in vim
cgetexpr system('rg --vimgrep ".*@task.*todo" . | awk "{match(\$0, /due=([0-9T:\-]+)/, m); if (RLENGTH>0) print m[1], \$0; else print \"9999-99-99\", \$0}" |sort|cut -d" " -f2-')|copen

About

πŸ™ A simple, language server-powered plain-text format for quick note-taking, outlining, and task management.

Resources

Stars

Watchers

Forks

Packages

No packages published