Demonstrate HN: Zetteldesk – Zettelkasten for Org-Plod

93
Demonstrate HN: Zetteldesk – Zettelkasten for Org-Plod

This equipment is in the imply time not on MELPA. If other folks love it I will strive and upload it, nevertheless for now I exquisite wished to publish the workflow I built for my tests, in case it’s precious to others. To install this, simply clone this repository in the neighborhood and add zetteldesk.el to your load-route.

For instructions on fabricate that, talk about with https://www.emacswiki.org/emacs/LoadPath

This code is examined handiest on my machine, so there shall be unexpected errors. Whereas you occur to gain one, I’d admire if you filed a narrate about it. Nonetheless sooner than doing that, be sure that that you just are making an strive reproducing it with emacs -Q. As a comfort, I use the following code to setup equipment.el, org-high-tail and eventually zetteldesk.el in an emacs -Q buffer so I’m in a position to examine with a clear slate.

;; Setup equipment.el
(require 'equipment)
(setq equipment-archives '(("melpa" . "https://melpa.org/packages/")
			     ("nongnu" . "https://elpa.nongnu.org/nongnu/")
			     ("elpa" . "https://elpa.gnu.org/packages/")))

(equipment-initialize)
(unless equipment-archive-contents
  (equipment-refresh-contents))

;; Set up and Setup Org-Plod
;; Place the org-high-tail itemizing to ~/org_roam as that is what I use, if
;; you'd like one thing different, trade it sooner than testing this
(equipment-install 'org-high-tail)

(add-hook 'after-init-hook 'org-high-tail-setup)
(setq org-high-tail-v2-ack t)

(use-equipment org-high-tail
  :config
  (setq org-high-tail-itemizing "~/org_roam"))

;; Load zetteldesk.el and flip on zetteldesk-mode to hold a
;; functioning zetteldesk-scratch
(load-file "~/Zetteldesk/zetteldesk.el")
(zetteldesk-mode 1)

Welcome to zetteldesk.el, a tiny library I wrote on high of Org-Plod. Now it’s seemingly you’ll perchance well also inquire, why this became written and what just does it fulfill. Well, I am not definite, there are many causes I needed to fabricate this, I’m in a position to’t suppose I wrote it for one in explicit. Nonetheless there had been two main tips. The predominant being that I needed some formulation to filter down my zettelkasten whereas doing revision for uni tests. Org-high-tail has tons of tools by default to administer your nodes, even supposing it’s seemingly you’ll perchance well even hold tons of them. Nonetheless I wanted some extra to hold a extra frictionless revision. It got here out exquisite correct, and I did very easy revision of the entire matters I needed, on the time of writing it. The 2d is a quote I be taught from “How to Purchase Tremendous Notes” that sparked an passion in my thoughts, and after I eventually got the time to ogle into it, I made this. The 2, despite divergent aims, had been in a neighborhood to be blended very with out complications after I eventually got to the halt outcome.

This introduction is going to be formulation longer than wanted as I adore writing stuff and I are wanting to tag how this all got here to be. You are going to be in a neighborhood to skip it if you exquisite are wanting to be taught to make use of this, nevertheless I’d suggest reading it, to hold an “organic” introduction to the idea that. If nevertheless you exquisite are wanting to ogle at collect began with the equipment, it’s seemingly you’ll perchance well leap to the Getting Began portion. Or if you got to must ogle at extra intensive documentation for the equipment, it’s seemingly you’ll perchance well take a look at the Wiki. Moreover indubitably feel free to examine the docstrings of the entire capabilities. They’re properly documented, particularly these that insert things to the zetteldesk-scratch which fabricate tons of things.

So, whereas rereading the honest book “How to Purchase Tremendous Notes” by Sonke Ahrens (round adore 8-9 months after picking the workflow up) to hold a extra detailed ogle in some tiny print I’d hold overlooked starting out, I seen that one curious thing that became mentioned (would indulge in to head away the very quote here nevertheless its been about a months and I am not in the temper of attempting to gain that proper sentence) became the idea that of taking your zettels and spreading them on your desk to ogle at extra than one in all them without lengthen. I began obsessed with it and I wrote this idea in an org file.

A desktop, is the discontinue ground of a desk, or in the digital world an put in a pc conceal conceal all over which any other folks dispute up their icons, similarly to how they would dispute up stuff of their desk. Now if I had an irl zettelkasten, I do know for definite that my desktop may maybe well be stuffed with runt notes with varied matter when learning one thing. So why shouldn’t I in actual fact hold a digital desktop the put I’m in a position to spread all my notes and ogle at them one by one, when learning. Wouldn’t that be helpful?

Thus begun my planning of all this. I became on the initiating gonna name this zettelkasten-desktop.el, nevertheless that one became reasonably dapper, so I exquisite shortened it to zetteldesk.el.

This began out indubitably slowly with me pondering how I became gonna enforce that idea and how it became all gonna pan out. I began with pondering of recent alternate choices for one thing an identical. For instance, I thought to be as customising point of view.el to head smartly with my needs as that had the ability of organising “perspectives” all over which it’s seemingly you’ll perchance well handiest leer sure buffers. I snappy dropped that in favour of writing one thing from scratch. I felt that if I fabricate it from scratch it would determine better as I may maybe well be extra a well informed of what I am doing. Moreover, it became much less work, as a outcome of if I tried to customise a pre-recent equipment to head smartly with my needs I’d must indubitably budge deep into learning what it does. I already needed to fabricate this for org-high-tail to write my addons to it, and as I am not a developer, hold runt recordsdata of elisp and also runt time to work on this, I thought it can perchance well also be better if I wrote one thing from scratch utilizing vanilla emacs and org-high-tail. Presumably I became corrupt, nevertheless its exquisite, this has been working properly so far for me.

First thing I regarded at became what extra or much less predicate I became gonna account for and with what criteria I became going to filter things. I tried to watch a rather easy idea to fabricate this and not overcomplicate things. If truth be told, I account for a buffer-native variable and give it a default mark. Then I account for the predicate feature that shows when a buffer is piece of the zettelkasten desktop. A buffer will likely be piece of the desktop handiest if the price of that variable in the buffer is just not equal to the default. I began planning out things by filtering buffers adore this, nevertheless as I became going to make use of this with org-high-tail nodes as properly, and for viewing nodes you are doing them a misservice if you fabricate not use the instructions outlined from org-high-tail for traversing the database, I ported the entirety over to work with nodes as properly learning a lot concerning the insides of org-high-tail in the job. There are doubtlessly 1,000,000 different ways to gather a easy particular person-succesful predicate, nevertheless altering the price of a buffer native variable looked quite easy to me so I went for it.

When this became taking place, I became in the 2d semester all over which I took notes with org-high-tail and the zettelkasten diagram. I became proud to claim that I had digitalised largely the entirety I had notes for and had developed a correct workflow for working with these notes (if somebody’s on the workflow, some ingredients of it are described over on the piece of my literate emacs config pertaining to Org-high-tail which you are going to gain here and I’d point to a pair things to tag some originate alternatives and some capabilities I in actual fact hold outlined). Nonetheless after a whereas, the exam interval became starting. Having worked on some of my intial tips for this all around the christmas holidays, I became performed with the foremost filter capabilities for swap-to-buffer and org-high-tail-node-gain filtered down to handiest tag the buffers/nodes I chosen. I became indubitably jubilant with them, nevertheless I didn’t indubitably know continue after that. Then, I realised two crucial things

  1. My zettelkasten, having grown important extra for the rationale that handiest other exam interval I had passe it in, became a runt more challenging to navigate so as that I’d fabricate my revision in it.
  2. The tips I became focused on with the zetteldesk, shall be in a neighborhood to abet with that.

    So I began pondering how I’d combine these two. Having ran out of tips for things to fabricate, I thought seeking to automate my revision job may maybe well be a enjoyable puzzle. I had also not implemented the distinctive idea, not having a theory of how I became gonna fabricate it, nevertheless I acknowledged lets transfer on and I will mediate of one thing. I outlined a brand unique formulation of adding files to the zetteldesk moreover a single buffer or a single node. That became so as to add a node and all its abet-links. As somebody who works with enormous index files to sort their matters, this became very precious, as I’d add the large majority of notes on a enviornment with a single repeat. Being in a neighborhood to hold an org-high-tail-node-gain feature that shows handiest the nodes I am attracted to, blended with org-high-tail UI, graphing that, became already an impressive tool. Nonetheless there became generally no automation, nor had I completed my long-established idea but. All I had became a makeshift tool to filter my swap-to-buffer and org-high-tail-node-gain to explicit things. That became precious, nevertheless I wasn’t indubitably happy, I needed to use going. Whereas doing revision for the predominant lesson, I worthy down the entirety I did in a seperate file and became then pondering how I’d automate it.

    Slowly, things began coming collectively. I crafted a workflow which a great deal eased revision for varsity and also managed to enforce, not decrease than as easiest I’d, my long-established imaginative and prescient. Then I experimented a runt extra. If this got here out correct, which it became wanting to be so, I’d use it for further overall just learning. Attributable to this fact, I wanted to address org-files that had been out of doors the org-high-tail itemizing, material handed in pdf sort, websites and I even setup a formulation to address Data buffers (as I be taught tons of documentation by these and I figured it will also be a correct recommendation). I in actual fact hold passe this for every exam of my recent semester as of writing this (February 2022) and it has worked wonders to abet me revise the entirety. Clearly, this is handiest correct revision if the notes themselves are correct, nevertheless having spent a great deal of time all around the semester seeking to achieve the matters and collect correct notes about them, I didn’t misfortune about that piece. And the machine’s automation works to abet the job of reviewing handiest the notes I desire in tons of formulation.

    And as in the buffer that places all of this collectively, I sort things with headings, I thought that perchance this shall be passe as an outliner tool. I will ogle at how other folks fabricate these and enforce some stuff particularly for that, nevertheless for now, its not here. I mediate it will also be usable for that just even supposing on the least.

    Right here’s the put we’re indubitably. The principle other thing I are wanting to fabricate for this, is to debris round a runt with org-commentary. I focal point on that in such tool, the ability to specialise in things and add margin notes to it will also be indubitably precious. On the entire I fabricate not indubitably use this smartly superior now, so this can diagram shut a whereas to fabricate that, nevertheless I ogle ahead to it. I also add tiny things to it in a rather customary foundation, at any time after I indubitably feel one thing is lacking. The enchancment of this, is amazingly closely linked with my learning, so if I gain one thing I’m in a position to give a diagram shut to I will strive and fabricate so.

    And after this incredibly long, and presumably unnecessarily detailed introduction lets dive into what this equipment does.

With that out of the formulation, lets fabricate a short introduction to a pair core sides of the equipment. This handiest scratches the ground of what this equipment can fabricate nevertheless. Its exquisite an illustration of a number of the well-known predominant sides, with gifs in between for a greater visible representation. For further detailed documentation take a look at the Wiki, or the doc-strings of the capabilities.

First things first, if it’s seemingly you’ll perchance well even hold the equipment on your load-route, it will likely be vital to require and advised the global minor-mode zetteldesk-mode. This mode does some background work to assemble a buffer named zetteldesk-scratch. This indubitably acts as your desktop. Right here’s the put you put the entirety indubitably.

So a sample config may maybe well be

(require 'zetteldesk)
(zetteldesk-mode 1)

For starters, we are going to likely be in a position to ogle at how you add or diagram shut an org-high-tail node from the zetteldesk. Right here’s confirmed in the gifs below
https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Adding_Zetteldesk.gif

You generally open with zetteldesk-add-abet-links-to-desktop which is for bulk adding of nodes, adding a node and all its abet-links as its very precious so as to add the entirety linked to a enviornment and them some things that had been missed may maybe well also be added with zetteldesk-add-node-to-desktop or some things that in the halt don’t belong there may maybe well also be removed with zetteldesk-diagram shut-node-from-desktop. For bulk inserting off zetteldesk-diagram shut-abet-links-from-desktop is the main feature you use. The opposite thing displayed here is the filtered version of org-high-tail-node-gain, zetteldesk-node-gain which filters to tag handiest files in the zetteldesk.

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Removing_Zetteldesk.gif

With this, it’s seemingly you’ll perchance well open working on your desktop. Sadly, I’m in a position to’t tag you any real examples I in actual fact hold, as all my lesson nodes are in Greek which is illegible for most. So for demonstration capabilities I in actual fact hold a tiny desktop close to literate programming.

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Desktop.gif

The predominant feature confirmed is zetteldesk-insert-node-contents-with out-hyperlink, which prompts for a node and inserts its contents to the zetteldesk-scratch. It specifies its with out a hyperlink, as the one I essentially use zetteldesk-insert-node-contents also inserts an ID hyperlink to that node in the scratch buffer. My typical workflow (described almost at the moment below) entails me writing a high level belief of the world, linking every enviornment I point to. These links are inserted with this selection so their contents are added to the scratch. There shall be zetteldesk-swap-to-scratch-buffer to open the scratch buffer in a split with the recent buffer. The version that doesn’t insert a hyperlink (confirmed in the gif) does that by default, nevertheless the distinctive zetteldesk-insert-node-contents doesn’t fabricate that by default, so this selection is mostly precious.

But any other thing I are wanting to showcase is recordsdata buffers. Data buffers are extraordinary in the formulation that there aren’t extra than one. There is a single continual buffer for recordsdata. So moreover the use of recordsdata buffers in the zetteldesk, for its have capabilities, it needs to account for a formulation to put the data buffers you got to hold to be viewing. Right here’s in my belief precious even on its have and shall be showcased in the below gif.

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Add_info_Zetteldesk.gif

The feature that does the work is zetteldesk-add-recordsdata-node-to-desktop (and obviously there may be an identical zetteldesk-diagram shut-node-from-desktop). Nonetheless obviously this wouldn’t be total if you couldn’t collect a leer of the entire recordsdata-nodes it’s seemingly you’ll perchance well even hold saved, which switches to the node you dangle. This feature is demonstrated here

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Info_Zetteldesk.gif

This filter feature is zetteldesk-recordsdata-goto-node. Furthermore, I wouldn’t hold in thoughts this total, if you couldn’t insert a node you got to must the zetteldesk-scratch moreover switching to it in the data buffer. Right here’s also that it’s seemingly you’ll perchance well bear in mind with zetteldesk-insert-recordsdata-contents

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Info_scratch.gif

Moreover the contents, it also drops a hyperlink so it’s seemingly you’ll perchance well be taught the node in its context (in the data buffer).

And obviously, as I already had the entire backbone, it became very easy so as to add an identical functionalities expanding to all emacs buffers. The capabilities zetteldesk-add-to-desktop and zetteldesk-diagram shut-from-desktop are what you demand them to be. Have shut a buffer and add it to the zetteldesk. The filter feature for these is zetteldesk-swap-to-buffer. Beneath is a demonstrative gif of how the filtered swap-to-buffer looks.

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Buffers.gif

Final item I hold in thoughts dapper precious to showcase, is how the machine handles references you got to must insert to the zetteldesk moreover the aforementioned org-high-tail files and data buffers.

Things I’d hold in thoughts perfectly much less expensive ways to distribute recordsdata are org-mode files out of doors org-high-tail, pdf, rich text formats adore MS Administrative middle and on-line pages. In fact, rich-text formats don’t interface properly with emacs, so I suggest changing them to pdf, and I don’t hold one thing for on-line pages as org-high-tail-protocol already does the work for me. It captures an org-high-tail file and I exquisite add the org-high-tail file.

Thru zetteldesk-insert-org-file-contents it’s seemingly you’ll perchance well insert your complete org mode files to the zetteldesk-scratch. It follows a an identical common sense to zetteldesk-insert-node-contents with a vital distinction that it’s far going to address headings, as most org files use them (the org-high-tail one doesn’t as its extra rare to watch org-high-tail files with headings, as they’re generally tiny files). Nonetheless that’s ample talking, I will let the gif fabricate the remainder.

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Org_scratch.gif

On this gif, I also mutter one more precious feature the entire zetteldesk-insert capabilities hold. Whereas you occur to give them a C-u argument, they’ll also open the zetteldesk-scratch buffer in a split.

Lastly, for pdfs, it’s seemingly you’ll perchance well even hold the identical zetteldesk-insert-hyperlink-to-pdf. This doesn’t insert a pdf, as obviously that wouldn’t be honest correct, nevertheless a hyperlink to it. The chilly thing is that the hyperlink can tag a explicit page in the pdf. Right here is how it indubitably works.

https://github.com/Vidianos-Giannitsis/zetteldesk.el/blob/master/demos/Pdf_scratch.gif

Gift that the above capabilities filter to handiest tag the acceptable files (org files that are not in org-high-tail or pdfs respectively) and that in the event that they are in the zetteldesk.

And that’s the core of the equipment, which I needed to showcase. For further detailed docs and piece of the workflow I use with this outlined, fabricate take a look at the equipment’s wiki.

Keybindings in Emacs are a protracted discussion. I firmly focal point on that emacs is a tool which it’s seemingly you’ll perchance well mold to your liking, and the true fact that it’s seemingly you’ll perchance well fully trade all its keybindings with ease to those you adore is a enormous piece of that. I personally indulge in harmful fashion keybindings with Condo as the global chief key. But any other particular person may maybe well adore defaults, be impressed by defaults nevertheless trade them a runt, or any other random thing.

For this very just, inner the equipment’s supply code, there may be not any keybinding definition. Its one thing that I focal point on you are going to hold to mediate by yourself. Ample, indubitably I am focused on adding the keybindings and exquisite not defining the prefix key, as moreover the prefix key – which is precisely my non-public preference – I focal point on the remainder doubtlessly collect sense for others as properly, and even in the event that they don’t, by nature of emacs it’s seemingly you’ll perchance well trade them. Haven’t made up our minds fully but, so for now I will cope with the entirety unbound.

Nonetheless, if you exquisite desire some inspiration, I will leave the piece of my config that objects up the zetteldesk keybindings below.

(overall-account for-key
 :states 'fashioned
 :keymaps 'override
 :prefix "SPC z"
 "b" 'zetteldesk-swap-to-buffer
 "a" '(:ignore t :which-key "Add to Zetteldesk")
 "a b" 'zetteldesk-add-to-desktop
 "a n" 'zetteldesk-add-node-to-desktop
 "a i" 'zetteldesk-add-recordsdata-node-to-desktop
 "r" '(:ignore t :which-key "Safe from Zetteldesk")
 "r b" 'zetteldesk-diagram shut-from-desktop
 "r n" 'zetteldesk-diagram shut-node-from-desktop
 "r i" 'zetteldesk-diagram shut-recordsdata-node-from-desktop
 "n" 'zetteldesk-node-gain
 "s" 'zetteldesk-swap-to-scratch-buffer
 "i" '(:ignore t :which-key "Insert to Scratch Buffer")
 "i n" 'zetteldesk-insert-node-contents
 "i N" 'zetteldesk-insert-node-contents-with out-hyperlink
 "i o" 'zetteldesk-insert-org-file-contents
 "i p" 'zetteldesk-insert-hyperlink-to-pdf
 "i i" 'zetteldesk-insert-recordsdata-contents)

(overall-account for-key
 :states 'fashioned
 :keymaps 'org-mode-scheme
 :prefix ", z"
 "i" 'zetteldesk-node-insert
 "r" 'zetteldesk-diagram shut-abet-links-from-desktop
 "b" 'zetteldesk-add-abet-links-to-desktop
 "p" 'zetteldesk-node-insert-if-poi-or-moc
 "s" 'zetteldesk-node-insert-sort-abet-links)

I use overall to account for all my keybindings, as I adore how easy it’s to account for stuff with it. As mentioned, my global chief key the put most of my keybindings budge is Condo. z is the letter I in actual fact hold chosen for the zetteldesk keybindings (for evident causes) and luckily nothing else in my config indubitably passe it. Furthermore, some keybindings are supposed to be ran in org-mode, so these are in an org-mode-scheme beneath , z. The comma is my org-mode explicit chief key, so as for that reason these are in , z.

The principle thing I am wanting into doing is to fully revamp the README to encompass extra visible examples as it became pointed out that its crucial and I agree. I also are wanting to dispute up the wiki better, as that’s the put I may maybe well hold the documentation, until I collect it in texinfo format as properly, which I belief doing after. But any other crucial belief of mine is to dispute up better org-commentary integration with this equipment as its one thing indubitably curious I haven’t gone round to doing.

Varied things I am pondering of are surroundings up the keybindings with out defining a prefix key and wanting out extra into outliner tool and if there may be one thing I are wanting to enforce from these.

Nonetheless, attributable to uni and existence, I’m in a position to’t commit too important time on this, so constructing may maybe well budge gradual at occasions.

Read More

Charlie Layers
WRITTEN BY

Charlie Layers

Fill your life with experiences so you always have a great story to tell

you're currently offline