[О блоге] [наверх] [пред] [2022-03-15 10:37:17+03:00] [b1ac320825bc6653f09ad75359b5a97fc1692f8c]
Темы: [zsh]

zk.zsh -- zettelkästen/wiki помощник и генератор статичных сайтов

http://www.git.stargrave.org/?p=zk.zsh.git;a=blob;f=README
https://box.matto.nl/zettelkasten-in-plain-textonly-flat-files.html
https://www.youtube.com/watch?v=4W_m176PIdU
https://github.com/drcode/zek
Посмотрел попристальнее что такое zettelkästen о котором много говорят
на разных ресурсах. Пообщался и с одним человеком его активно
использующем. По сути это просто культура работы со знаниями. Ничего
специфичного с технической точки зрения этот метод не требует толком. В
чём разница между какой-нибудь wiki технологией и ZK? Никакой, грубо
говоря -- вопрос только в подходе как, что, когда и каким образом
заполнять в них.

В одной статье показано что Vim может быть очень удобно использован для
ведения ZK без проблем. Главное это хранить всё в plain text файлах.
Стараться делать их с CamelCase, чтобы редактор мог определять границы
слов удобно. ZK предполагает иерархию? Файловая система автоматом это
предоставляет. "gf" команда Vim без проблем может переходить на файл под
курсором. expand("%:r") вызов покажет относительный (относительно корня)
путь до файла, если надо куда-то скопировать текущий "адрес" заметки.
Хочется дополнения названия имеющихся заметок? Встроенное родное
дополнение Vim-а по именам файлов (:help compl-filename) -- идеально для
этого подходит. Хочется fuzzy-like поиск по содержимому или именам
заметок? fzf может в этом легко помочь.

Посмотрел и видео автора ZEK ZK-движка. По сути он сделал ed, но с ZK
фичами. Единственное что Vim из коробки не предоставит -- показ
зависимостей между записями. Если понять на что ссылается данная заметка
ещё можно бы было, например помещая ссылки в []-скобки и выпарсивая их,
то понять кто ссылается на заметку уже не тривиально. А это вроде бы
одно из самых важных требований в ZK. Делать это руками, конечно же, не
вариант.

Just-for-fun решил написать утилитку которая бы парсила все заметки,
составляла зависимости и показывала бы backlinks/backreferences. На
чистом zsh:

    $ zk.zsh backs SomeNote
    AnotherNote
    Sub/Dir/Note
    $ zk.zsh links AnotherNote
    SomeNote

Это автоматом покрывает и такую штуку как тэги и категоризацию заметок?
Факт наличия ссылки на категорию/тэг -- автоматически означает что
заметка будет в backlink-ах страницы категории, которая вообще может
быть пустым файлом.

А потом решил написать генератор HTML-ек на основе всего этого. Чтобы в
них и ссылки автоматически были на заметки и ссылки с backlinks-ами.
Оказалось довольно просто и мало кода отняло. Ни одного внешнего вызова
не делается, никаких grep/awk/perl/sed. Плюс автоматическая генерация
Index-страниц с полным списком заметок в текущей директории. Вполне себе
такой генератор web-сайтов вышел, довольно быстрый.

Понятия не имею буду ли я его использовать для чего-либо, но получил
огромное удовольствие от написания, ибо это реальный use-case для
лучшего познания возможностей программирования zsh. Если несколько лет
назад я нередко искал в Интернете вопросы "как сделать XXX в zsh" и
получал магические строчки, то сейчас, владея info zsh, умея
пользоваться поиском по индексам в нём, я без проблем быстро нахожу все
нужные мне подсказки и без посторонней помощи легко самостоятельно пишу
какие-нибудь (${(oi)${(k)pages[(I)$1*]}}) выражения, понимая каждый
символ в них.

Для того, чтобы узнать backlinks, он парсит абсолютно все файлы в
директории, рассматривает каждое слово в них. В принципе это безумно
дорого, но на моих заметках оно выполняется за десятки миллисекунд. Если
пришлось бы работать с большими объёмами данных, то достаточно бы было
просто сделать кэш отпарсенных значений, храня ctime/hash (как в redo)
для понимания устаревания данных. И аналогично можно сделать и кэш
отренедренных HTML-ек, ибо это самая дорогая операция в нём.

Когда-то давно я сайты делал на движке Vimwiki, по сути используя только
его навигацию по []-ссылкам и HTML-рендер. Если добавить чуть-чуть
поддержку форматирования в zk.zsh (что тривиально), то для меня было бы
полной заменой Vimwiki тогда.

И ещё я понял что ZK мне точно нафиг не сдался. Нет у меня use-case-ов
когда такой подход работы с "знаниями" мне был бы нужен или полезен.

    [оставить комментарий]