{"id":13443265,"url":"https://github.com/publicimageltd/delve","last_synced_at":"2025-03-20T16:30:51.132Z","repository":{"id":38089859,"uuid":"309173863","full_name":"publicimageltd/delve","owner":"publicimageltd","description":"Delve into your org-roam zettelkasten","archived":true,"fork":false,"pushed_at":"2024-12-25T19:11:57.000Z","size":4083,"stargazers_count":193,"open_issues_count":2,"forks_count":8,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-03-15T00:03:23.846Z","etag":null,"topics":["org-roam","zettelkasten"],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/publicimageltd.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2020-11-01T19:41:22.000Z","updated_at":"2025-01-04T20:34:57.000Z","dependencies_parsed_at":"2023-12-22T20:54:28.421Z","dependency_job_id":"7557c356-b579-4621-8c8d-862bbe348648","html_url":"https://github.com/publicimageltd/delve","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/publicimageltd%2Fdelve","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/publicimageltd%2Fdelve/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/publicimageltd%2Fdelve/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/publicimageltd%2Fdelve/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/publicimageltd","download_url":"https://codeload.github.com/publicimageltd/delve/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244649739,"owners_count":20487482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["org-roam","zettelkasten"],"created_at":"2024-07-31T03:01:58.318Z","updated_at":"2025-03-20T16:30:51.119Z","avatar_url":"https://github.com/publicimageltd.png","language":"Emacs Lisp","funding_links":[],"categories":["Emacs Lisp"],"sub_categories":[],"readme":"#+TITLE: delve.el\n\n-------------\n\n* IMPORTANT\n\n*This repository is archived*\n\nI haven't worked on it anymore for more than a year, and I don't feel that the overall UI approach was a good idea. Plus, I feel bad at feeding Github's AI; I might be switching to some other public repository.\n\n------------\n\n\n** So what is Delve?\n\n=Delve= (currently version =0.9.6=) is a package on top of [[https://github.com/org-roam/org-roam][Org Roam]]. It\nprovides tools to collect, inspect and edit Org Roam Nodes in a\nseparate application buffer. It helps you to quickly establish and\nmaintain a project-specific subset of Org Roam Nodes, e.g. when\nwriting a paper or for collecting information on a particular topic.\nThose subsets (called 'collections') can be stored persistently in\nseparate files. =Delve= also offers functions to 'edit' nodes remotely,\ne.g. by adding or removing tags without having to open the node's file\nitself.\n\nHere's a slightly outdated gif:\n\n[[./screenshots/delve-intro-tour.gif]]\n\n** Table of Contents\n - [[#feature-list][Quick overview: Features]]\n - [[#installation][Installation]] \n - [[#the-notion-of-a-collection][It's all about collections]]\n - [[#storing-collections-in-files][Storing Collections in files]]\n - [[#how-items-are-presented][How items are presented]]\n - [[#keybindings--usage][Keybindings / Usage]]\n  - [[#delve][Delve]]\n  - [[#delve-minor-mode][Delve Minor Mode]]\n - [[#customizations][Customizations]]\n - [[#upcoming][Upcoming]]\n - [[#changelog][Changelog]]\n \n* State of Development\n\nPresently, development is mostly aiming at stabilizing the current\nbasic set of features and covering the present functionality with\nautomated tests. \n\nThe one big feature still lacking, in my view, is a decent =undo=\nfunction. I'm staring at that goal intensively each time I work on the\nrepo for some other reasons, and I hope the relevant code will thus\nmaterialize itself. Until then, =Delve= will not be added to MELPA yet.\n\n* Feature List\n\n - Provide a =Dashboard= with customizable queries for quick access (and\n   overview) of nodes with certain tags and of nodes with no links.\n - Sort any list with a spiffy interactive transient menu.\n - Insert or delete Org Roam nodes interactively in the =Delve= buffer,\n   or add them directly from any open Org Roam file using\n   =delve-minor-mode=.\n - Re-arrange nodes manually by moving them around or by creating\n   hierarchical trees (outlines).\n - Copy and paste Delve nodes.\n - Yank copied Zettel into Org buffers (they will be rendered as\n   links),\n - Preview an Org Roam node in =Delve= for a rough glance at its content\n   without having to leave the collection buffer.\n - Toggle between a short node view and a more extended one.\n - Edit the node's tags from within the =Delve= buffer without leaving it.\n - Add backlinks or 'fromlinks' of a specific node into the current\n   =Delve= buffer.\n - Hide away nodes by creating \"piles\". I do not like this feature and\n   will most likely remove it in =1.0=.\n - Move nodes into a new collection.\n - Bookmark stored collections for quick access.\n\n* Installation\n\n=Delve= requires =lister=, which is available on Melpa. =Delve= itself,\nhowever, is not yet on Melpa. For the time being, you will have to\ninstall it manually.\n\n=Delve= is currently following the =org-roam= source without taking care\nof the releases. The only 'strong' dependency is the DB scheme used by\nOrg Roam, which has to conform to the Org Roam scheme. If there is a\nDB error or something similar, thus consider updating =org-roam= from\nsource even if there is not a new official release yet.\n\n=Delve= profits from =all-the-icons=. If it is installed, items will be\ndisplayed with nice icons. Install it from [[https://github.com/domtronn/all-the-icons.el][there]].\n\nHere's an example installation using =straight.el=:\n\n#+begin_src emacs-lisp\n  (use-package delve\n    :straight (:repo \"publicimageltd/delve\" :host github :type git)\n    :after (org-roam)\n    ;; this is necessary if use-package-always-defer is true\n    :demand t\n    :custom\n    ;; set meaningful tag names for the dashboard query\n    (delve-dashboard-tags '(\"Tag1\" \"Tag2\"))\n    :hook\n    (delve-mode . delve-compact-view) ; turn on compact view per default\n    (delve-mode . hl-line-mode)   ; nicer to use with hl-line\n    :bind\n    ;; the main entry point, offering a list of all stored collections\n    ;; and of all open Delve buffers:\n    ((\"\u003cf12\u003e\" . delve)))\n\n  (use-package delve-minor-mode\n    :straight (:repo \"publicimageltd/delve\" :host github :type git)\n    :init\n    (setq delve-minor-mode-prefix-key (kbd \"C-.\"))\n    :config\n    (delve-global-minor-mode +1))\n#+end_src\n\n* The notion of a 'collection'\n\nThe core idea of =Delve= is to add stuff to editable \"collections\". A\ncollection is a list of Org Roam nodes, and it can be stored in a file\nor be visited in a =Delve= buffer. All commands which ask you to do\nsomething \"with a collection\", e.g. to add a node to a collection,\nfirst ask you to select the collection to act on. In these cases, you\ncan always choose either an open =Delve= buffer or a storage file to act\non. Selecting a storage file effectively causes the file to be read in\na new buffer, reading it 'on the fly'.\n\n*Example*: Imagine you have a stored collection of nodes referring to\nthe topic /Artificial Intelligence/. Then when visiting an Org Roam\nfile, you find an interesting node which you would like to add to that\ncollection. You press =M-n c= (=delve-minor-mode-collect=) from within the\nfile's buffer and select the =Delve= file which contains that collection\non AI. Now a new =Delve= buffer has been created in the background and\nthe node at point been added to it. To explicitly visit that buffer\nafter adding the Org Roam node, use =C-u f12= (=C-u M-x delve=). Don't\nforget to save the modified collection to persist these changes.\n\n* Storing collections in files\n\nThe top-level command =Delve= (=M-x delve=) a list of all collections,\nstored and currently open. This is useful e.g. when adding Org roam\nnodes to an existing collection.\n\n=Delve= tries to mimic Emacs's established behavior of storing buffers\ninto files. To store a collection, save any =Delve= buffer with =M-x\ndelve-save-buffer= (or =C-x s= from within a =Delve= buffer). To open a\ncollection (that is, to visit it in a new buffer), respectively use\n=M-x delve-find-storage-file= (or =C-x f= from within a =Delve= buffer). To\nsave a buffer which is already linked to a file, use =M-x\ndelve-write-buffer= (or =C-x w= from within a =Delve= buffer).\n\nAll storage files will be recognized by the file extension =.delve=. The\nextension can be changed by setting =delve-storage-suffix=.\n\nOnce a buffer is associated with a file, the file name will be\ndisplayed in the header. An asterisk indicates that the buffer content\nhas been modified.\n\nThe default storage directory is defined in the variable\n=delve-storage-paths=. It is initially set to a directory =delve-store=\nwithin the local emacs user directory. It will be created when you use\nthe storage feature for the first time. But since it's Emacs, you can\ncustomize it:\n\n#+begin_src emacs-lisp\n;; one file name -- one directory:\n(setq delve-storage-paths \"~/path/to/directory\")\n;; a list of file names -- multiple locations:\n(setq delve-storage-paths '(\"~/path1\" \"~/path2\"))\n#+end_src\n\nNote that if you provide multiple paths, you will have to make sure by\nyourself that these directories do actually exist.\n\nAll stored files can be /bookmarked/. Simply set a bookmark in the\nvisiting buffer. Calling the bookmark will jump to an existing buffer\ncontaining that collection or load it.\n\n*Changed at =0.9.4=:* If you had used =Delve= prior to v =0.9.4=,\nyou might want to convert all existing files in the storage directory\nto the new file name format. You can use =M-x\ndelve-convert-storage-directory= for that. The function is interactive\nand will guide you through the conversion process in two steps: It\nfirst asks you for the directory name (the default should be fine if\nyou did not yet change =delve-storage-paths=) and then gives you some\ninformation about the files found in this directory. Only after you\nconfirm that will your files be changed. In any case, the function is\njust a bulk rename, so you can just do it manually.\n\n* How items are presented\n\nAll nodes which refer to a file (and not to a subheading) look like that:\n\n[[./screenshots/file-node-no-tags.png]]\n\nHere the node has been created as a backlink from the node \"Künstliche\nIntelligenz (AI)\". If you press RET on the button linking to that\noriginal node, =Delve= will jump to it.\n\nThe other type of nodes (i.e., headings) looks like that:\n\n[[./screenshots/heading-node-tags.png]]\n\nAlso note the list of tags which are associated with that specific node.\n\nPer default, heading notes are displayed with their outline path,\nincluding the file title. The variable =delve-display-path= controls\nthis behaviour, set it to =nil= to turn this off. Here's two nodes first\nwith path and then without:\n\n[[./screenshots/node-with-and-without-path.png]]\n\nIn the dashboard buffer, you'll find queries:\n\n[[./screenshots/query.png]]\n\nPress =\u003cTAB\u003e= to add its contents into the current buffer's collection.\n\n* Keybindings / Usage\n** Delve\n*** Navigation / The Tab Key\n\nUse the usual nagivation commands.\n\n=\u003cTAB\u003e= does the following:\n - If there is a sublist (indented nodes) below the node at point,\n   hide them outline-style.\n - If the current node hides a sublist, open it.\n - If there is no sublist, and the current item is a Zettel, insert\n   all backlinks and fromlinks as a sublist.\n - If there is no sublist, and the current item is a query, execute\n   the query and insert the results as a sublist.\n - If there is no sublist, and the current item is a a pile, insert\n   the contents of the pile and remove the pile (!).\n\nAs with most commands inserting stuff, pressing =C-u= before executing\nthe command offers you to add that result into another collection.\n\n*** Preview or visit the node at point\n\n[[./screenshots/node-with-preview.png]]\n\n| Command / Keys | Function                                                                |\n|----------------+-------------------------------------------------------------------------|\n| o, C-return    | Visit the node at point  (its original file)                            |\n| v              | Toggle display of node (long view vs. short view with only basic infos) |\n| RET            | If on a node, toggle preview                                            |\n\nThe preview buffer recognizes all Org Roam links in the previewed text\nand turns them into 'buttons'. Press =RET= or click on these buttonized\nlinks to visit the node they are referring to. Press =i= on the links in\nthe preview to directly add the node referred to the current\ncollection.\n\n*** Marking / unmarking nodes\n\n| Command / Keys | Function                                                     |\n|----------------+--------------------------------------------------------------|\n| m              | Mark node at point and move to next one                      |\n| C-u m          | Mark all nodes below current nodes, if they form a \"sublist\" |\n| u              | Unmark node at point and move to next one                    |\n| C-u u          | Unmark sublist bewlow                                        |\n| U              | Unmark all items                                             |\n\nMost functions which work with \"marked nodes\" also accept regions. \n\n*** Choosing and inserting nodes \n\nPer default, offer to insert a node from a given list of nodes per\ncompletion. If =consult= is installed, all of the following commands\nallow to insert multiple nodes at once. Support for other completion\npackages is lacking, contributions are welcome.\n\n| Command / Keys | Function                                                  |\n|----------------+-----------------------------------------------------------|\n| nn             | Insert new node(s)                                        |\n| nt             | Insert node(s), limit selection to a specific tag or tags |\n| nb             | Insert node(s) from all backlinks of that node below      |\n| nf             | insert node(s) from all fromlinks of that node below      |\n\n*** Insert nodes directly\n\n| Command / Keys | Function                                                                |\n|----------------+-------------------------------------------------------------------------|\n| tab            | If current node is not hiding a sublist, insert backlinks and fromlinks |\n| f, C-right     | Insert fromlinks of current node as a sublist                           |\n| b, C-left      | Insert backlinks to current node as a sublist                           |\n\n*** Deleting nodes\n\n| Command / Keys | Function                             |\n|----------------+--------------------------------------|\n| \u003cdelete\u003e       | Delete marked nodes or node at point |\n\n*** Copy and Paste\n\nThere is a rudimentary support of copy/paste. Use the usual commands\nto copy the items within the active region into the kill ring, such as\n=M-w=, or to copy and kill them (=C-w=). A string representing the\nselected items is pushed onto the kill ring. The =yank= command (=M-y=) is\nremapped to an internal function which interprets this string data and\ninserts it at point.\n\nThere is currently no replacement for =yank-pop=.\n\n*** Refresh / Update\n\n| Command / Keys | Function                                      |\n|----------------+-----------------------------------------------|\n| g              | Sync all nodes                                |\n| C-u g          | Force update of marked nodes or node at point |\n\nPress =g= to sync all nodes with the Org Roam DB. =Delve= items which have\nno corresponding DB entry will be removed, queries will be updated.\nUse =C-u g= to just update the node at point (or some marked nodes).\n\n*** Piling Zettel\n\nLike on any good real desktop, you can pile the Zettels:\n\n| Command / Keys | Function                                        |\n|----------------+-------------------------------------------------|\n| m, u           | Mark or unmark first the nodes you want to pils |\n| p              | Then create a pile                              |\n| i              | Insert contents of pile and remove the pile     |\n\nIf you press =p= while the region is active, pile the nodes in that\nregion.\n\nTo insert a pile, either press =\u003cTAB\u003e= or =i=.\n\nPiling will most likely be removed in =1.0=.\n\n*** Insert headings\nUse =h= to insert a heading. A heading is just a simple text item which\nyou can use to internally structure your nodes.\n\n*** Remote Editing of Org Roam Nodes \n\n| Command / Keys | Function               |\n|----------------+------------------------|\n| +              | Add tag(s) remotely    |\n| -              | Remove tag(s) remotely |\n\nRemote editing either applies to all marked nodes and the nodes in the\ncurrently active region, or, if nothing is marked, to the node at\npoint.\n\nIf editing multiple nodes, you can choose between all tags which are\npresent in all nodes (union of sets). Attempts to remove a tag in a node\nwhich does not have this tag are silently skipped.\n\nPress =g= to refresh after editing.\n\n*** Sorting\nThe key =s= gives access to some sorting commands, which are presented\nas a transient menu. Sorting (or reversing) applies to the current\nsublist at point. If there is no sublist, the whole list is sorted.\n\n** Delve Minor Mode\n\nIf you enable the =delve-global-minor-mode=, a =delve-minor-mode= will be\nautomatically enabled when visting an Org Roam file. This binds some\nkeys which facilitate 'collecting' stuff. All keys are on a transient\nprefix defaultsing to =M-n=. You can change the binding for this\ntransient by setting the variable =delve-minor-mode-prefix-key= manually\n(or using customize).\n\n#+begin_src emacs-lisp\n  ;; set this /before/ loading Delve!, e.g. in the :init section of a\n  ;; use-package declaration:\n    (setq delve-minor-mode-prefix-key (kbd \"C-c d\"))\n#+end_src\n\n*** Collecting vs. Inspecting\n\n=Delve= offers two distinct ways of collecting nodes, corresponding to\ndifferent workflows. \n\nOne variant is to *collect Org Roam nodes* while browsing through your\nnote files. The imagined workflow is that you visit =Org Roam= files and\nthink 'Yes, that's interesting, I will use it later!' Thus you copy\nthis node into a list which remains in the background and move on\nlooking through your notes. (Very much like \"open tab in background\"\nin web browsers).\n\nFor this workflow, =Delve Minor Mode= commands which have the word\n=collect= in their function name are your friends. Per default, they add\nthe nodes to the =last selected Delve buffer= in the background, not\ndisturbing your evaluation of th nodes.\n\nThese collecting commands accept the prefix key (usually =C-u=) to\nfinetune the selection of the target =Delve= buffer. Per default (no\nprefix), =Delve= uses the last selected buffer or asks you to select one\nif there is none yet. Using /one/ prefix (=C-u=) unconditionally prompts\nyou to select the target collection. Using /two/ prefixes (=C-u C-u=)\ncreates a new buffer for you. Note that in this case, since this\nautomatically generated buffer remains in the background, it will not\nbe recognized as the \"last selected buffer\" by the following\noperations.\n\nThe second workflow supported is to *inspect nodes* in order to further\nexplore their relations to other nodes within a =Delve= buffer. That is,\nyou encounter an interesting node and think: 'Hey, I want to look at\nthis node's backlinks, and their backlinks, and just generally check\nwhere this node leads me too!' In this case, you want to switch\nimmediately to the buffer in which you have just collected the nodes.\nFunctions offering this kind of functionality have the word =inspect= in\ntheir function name. They add the nodes to an =automatically created\nDelve buffer= and then switch to it. Additionally, this buffer is\nalways marked as the \"last selected buffer\" so that all further\ncollection commands recognize it.\n\n*** Minor Mode Keys\n\n=M-n= opens a transient menu offering the user to either edit, inspect\nor collect the node at point. However, the functions finally reached\nthrough the transients can also be bound separately. Have a look at\nhow the transients are defined or post an issue. It is planned to\nenable the collection keys also in =Org Roam Mode= buffers.\n\nFor *collecting* the node at point, use these commands:\n\n| Command / Keys | Function                                                     |\n|----------------+--------------------------------------------------------------|\n| M-n c n        | Add node at point to a Delve collection                      |\n| M-n c a        | Add all nodes of current Org Roam file to a Delve collection |\n| M-n c b        | Collect backlinks from current node                          |\n| M-n c f        | Find the node at point in currently open Delve buffers       |\n\nFor *inspecting* nodes, these commands are available:\n\n| Command / Keys | Function                                                     |\n|----------------+--------------------------------------------------------------|\n| M-n i n        | Add node to an automatically created collection and open it  |\n| M-n i a        | Inspect all nodes of the current Org Roam file               |\n| M-n i b        | Inspect backlinks                                            |\n\nFurthermore, =delve-minor-mode= offers some convenience functions for\nediting the node at point, which are basically wrappers around the\ncorresponding =Org Roam= and =Org Mode= functions:\n\n| Command / Keys | Function                                                     |\n|----------------+--------------------------------------------------------------|\n| M-n e .        | Create an ID link for the current heading                    |\n| M-n e +        | Add tag to the heading at point                              |\n| M-n e -        | Remove tag from the heading at point                         |\n\n* Customizations\n\n: delve-dashboard-queries\n\nA list of functions determining the initial dashboard queries (e.g.,\nfor \"TODO Items\" or for tags). Each function must return a\n=delve--query= struct (see the docstring). If this variable is set to\n=nil=, do not add any non-tag queries to the Dashboard.\n\nDefault setting:\n\n#+begin_src emacs-lisp\n(defcustom delve-dashboard-queries (list #'delve--create-todo-query\n                                         #'delve--create-unlinked-query\n                                         #'delve--create-last-modified-query)\n#+end_src\n\nThis adds:\n - A query for TODO items\n - A query for uninked items\n- A query for the 10 last modified items\n\nPlease open an issue if you want any specific query to be added.\n\n: delve-dashboard-tags \n\nList of strings (or of lists of strings), from which the initial\nDashboard queries are built. E.g., with the setting =(setq\ndelve-dashboard-tags '(\"relevant\"))=, the Dashboard will offer a query\nfor all Delve nodes tagged with the tag =relevant=.\n\n: delve-last-modified-limit\n\nNumber of nodes to be displayed in the pre-configured Dashboard query\n'last modified items'.\n\n: delve-compact-view-shows-node-path\n\nIn compact view, show the complete path to the node if it is not a\nfile node (that is, if it is a subtree). Defaults to =t=. \n\n* Testing Delve\n\n=Delve= uses the excellent [[https://github.com/emacs-eldev/eldev][Eldev]] for development. There is a =tests/=\ndirectory with tests. To run the automated tests, use:\n\n#+begin_src bash\neldev test\n#+end_src\n\nNot eveything is covered by the tests. In particular, interactive stuff\nis tested 'manually'. For interactive testing, the repository ships\nwith a live environment which does not interfere with your own local\n=Emacs= setup. From the root directory of the repository, just call:\n\n#+begin_src bash\nbin/test-emacs \n#+end_src\n\nThe script will upgrade the dependencies in an isolated environment\nand then start a new =Emacs= instance with only =Delve=, =Org Roam= and some\nbasic packages for completion installed.\n\nIf you want to have nice icons in the live environment, you have to\nmanually install the icons on your system using =M-x\nall-the-icons-install-fonts= from within the testing =Emacs= instance.\nNote that even though you install them from your test instance, these\nicons will be installed system-wide and will not be restricted to the\ntest environment. In general, however, this should not be a problem,\nsince all this command does is to install the fonts and to update the\nfont cache.\n\nThe testing enviroment provides a small pseudo Org Roam Zettelkasten\nto browse, with links, tags, and all.\n\n* Changelog\n\n** 0.9.6.\n\n  - Add two-way syncing Delve \u003c-\u003e DB\n - Refactor deletion\n - Sync with lister v0.9.6.\n\n** 0.9.5\n\n - Add intelligent update of queries \n - Provide a live environment for testing\n - Add option =delve-compact-view-shows-node-path=\n - In =Delve= buffers, remap =rename-buffer= to edit the collection's title\n - Add new Dashboard query 'last modified nodes' with customizable\n   variable =delve-last-modified-limit= to set the number of nodes to be\n   displayed.\n - Add new Dashboard query 'TODO items'\n - Use hand-made =completing-read-multiple= (found in\n   https://github.com/emacs-citar/citar/compare/simple-crm) since\n   =consult='s is now deprecated (see  https://github.com/minad/consult/commit/b15c81f7766a8981f2f022fc47bbeb7000696caf).\n - Add much more commands to the transient suffix key 'n'\n   \n** 0.9.4 \n\n  - Bookmarks. \n  - Lift storage system restriction to one predefined directory; force\n    all storage files to end in =.delve=.\n  - Toggle between extended view (default) and a shorter one.\n  - Rudimentary copy/paste.\n  - Yank copied or pasted Org Roam node zettel into org buffers.\n  - Bugfix because org-roam somwhere lost the function =org-roam-node-find-file-noselect=.\n  - Sorting.\n\n** 0.9.3\n\n - Refactor collecting nodes from outside Delve.\n - For non-file nodes, display the outline path. Depends now on Org\n   Roam with DB 18 (merged in Nov., 10th, 21).\n - Introduce new item type \"Heading\" (key =h=)\n - Allow remote editing (add, remove tags) of multiple items.\n - Mark list as \"modified\" if items are deleted, inserted or updated.\n   Storing the list removes that flag.\n - Somewhere in between is 0.9.2, I forgot to update all version\n   numbers in all files. \n\n** 0.9 \nComplete rewrite; now based on Org Roam =v2=.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpublicimageltd%2Fdelve","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpublicimageltd%2Fdelve","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpublicimageltd%2Fdelve/lists"}