I have 2506 nodes, it costs 2.5 seconds to show mini-buffer candidate after C-c n f
, this is pretty slow.
Is there something wrong within my config or a better way to make it faster?
Thank you very much.
I have 2506 nodes, it costs 2.5 seconds to show mini-buffer candidate after C-c n f
, this is pretty slow.
Is there something wrong within my config or a better way to make it faster?
Thank you very much.
This is my org-roam and org-roam-ui config
;; org-roam: basic config
;; {{{
(use-package org-roam
:ensure t
:defer t ;; autoload
:bind (
("C-c n a" . org-roam-alias-add)
("C-c n c" . org-roam-capture)
("C-c n f" . org-roam-node-find)
("C-c n g" . org-roam-graph)
("C-c n i" . org-roam-node-insert)
("C-c n j" . org-roam-dailies-capture-today) ;; Dailies
("C-c n l" . org-roam-buffer-toggle)
("C-c n o" . org-id-get-create)
("C-c n t" . org-roam-tag-add)
)
:config
(setq org-roam-directory "~/org-roam")
(setq org-roam-db-location "~/org-roam/org-roam.db")
(setq org-roam-file-extensions '("org" "md")) ;; enable Org-roam for markdown
(require 'org-roam-protocol) ;; org-roam-protocol
(org-roam-db-autosync-mode 1) ;; if md-roam installed, move to md-roam config
)
;; }}}
;; org-roam: backlink count & node hierarchy
;; {{{
;; https://github.com/Jousimies/.emacs.d/blob/master/lisp/init-roam.el
(require 'org)
(require 'org-roam)
;;
(cl-defmethod org-roam-node-directories ((node org-roam-node))
(if-let ((dirs (file-name-directory (file-relative-name (org-roam-node-file node) org-roam-directory))))
(format "(%s)" (car (split-string dirs "/")))
""))
;;
(cl-defmethod org-roam-node-backlinkscount ((node org-roam-node))
(let* ((count (caar (org-roam-db-query
[:select (funcall count source)
:from links
:where (= dest $s1)
:and (= type "id")]
(org-roam-node-id node)))))
(format "[%d]" count)))
;;
;; (cl-defmethod org-roam-node-filetitle ((node org-roam-node))
;; "Return the file TITLE for the node."
;; (if-let ((file (org-roam-node-file node)))
;; (with-temp-buffer
;; (insert-file-contents file nil 0 1024)
;; (cadr (assoc "TITLE"
;; (org-collect-keywords (list "TITLE")))))
;; (cadr (assoc "TITLE"
;; (org-collect-keywords (list "TITLE"))))))
;; (cl-defmethod org-roam-node-hierarchy ((node org-roam-node))
;; "Return the hierarchy for the node."
;; (let ((title (org-roam-node-title node))
;; (olp (org-roam-node-olp node))
;; (level (org-roam-node-level node))
;; (filetitle (org-roam-node-filetitle node)))
;; (concat
;; (if (> level 0) (concat filetitle " > "))
;; (if (> level 1) (concat (string-join olp " > ") " > "))
;; title))
;; )
;;
(setq org-roam-node-display-template
"${title:30} ${backlinkscount:5} ${tags:30} ${directories:15}")
;; }}}
;; org-roam: completion
;; {{{
(setq org-roam-completion-everywhere t)
;;roam links support auto-completion via completion-at-point
;; call M-x completion-at-point within a roam link.
;; Where the | character represents the cursor:
;; [[|]] : completes for a file title
;; [[roam:]] : completes for a file title
;; [[*|]] : completes for a headline within this file
;; [[foo*|]] : completes a headline within the file with title “foo”
;; [[roam:foo*|]] completes a headline within the file with title “foo”
;; }}}
;; org-roam: filter tags
;; {{{
(defun my/org-roam-filter-by-tag (tag-name)
(lambda (node)
(member tag-name (org-roam-node-tags node))))
(defun my/org-roam-list-notes-by-tag (tag-name)
(mapcar #'org-roam-node-file
(seq-filter
(my/org-roam-filter-by-tag tag-name)
(org-roam-node-list))))
;; }}}
;; org-roam: search tag
;; {{{
(defun my/org-roam-node-find-by-tag ()
(interactive)
(let ((chosen-tag
(completing-read "filter by tag: "
(seq-uniq
(org-roam-db-query
[:select [tag]
:from tags ])))))
(org-roam-node-find
nil
nil
(lambda (node) (member chosen-tag (org-roam-node-tags node))))))
;; }}}
;; org-roam: template, id (uuid) timestamps and so on
;; {{{
(setq org-roam-capture-templates
'(
;; #+date: %<%Y-%m-%d-%H:%M:%S %Z>\n
;; #+date: %<%FT%T%z>\n
;; a: audio & music
;; A
;; B
("b" "图书" plain "%?"
:target (file+head "图书/${slug}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n#+category:\n#+filetags: \n")
:immediate-finish t
:unnarrowed t)
;; c:
;; C
("d" "default" plain "%?"
:target (file+head "${slug}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n#+category:\n#+filetags:\n")
:empty-lines 1
:immediate-finish t
:unnarrowed t)
;; D
("e" "Emacs" plain "%?"
:target (file+head "Emacs/${slug}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n#+category:\n#+filetags: \n")
:immediate-finish t
:unnarrowed t)
;; E
;; f:
("f" "Emacs Function" plain "%?"
:target (file+head "Emacs/function/${title}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n#+category:\n#+filetags: \n")
:immediate-finish t
:unnarrowed t)
;; F
;; g:
;; G
;; h: human
;; H
;; i:
;; I
;; j:
;; J
;; k:
;; K
;; l:
;; L
;; m:
;; M
;; n:
;; N
;; o:
;; O
("p" "project" plain "%?"
:target (file+head "${slug}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n")
:immediate-finish t
:unnarrowed t)
("P" "Emacs 包/插件" plain "%?"
:target (file+head "Emacs/package/${title}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n#+filetags: :Emacs:\n")
:immediate-finish t
:unnarrowed t)
;; q:
;; Q
("r" "reference" plain "%?"
:target (file+head "reference/${slug}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n")
:immediate-finish t
:unnarrowed t)
;; R
;; s:
("s" "软件" plain "%?"
:target (file+head "software/${slug}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n")
:immediate-finish t
:unnarrowed t)
;; S
;; t: topic todo
("t" "主题" plain "%?"
:target (file+head "topics/${slug}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n")
:immediate-finish t
:unnarrowed t)
;; T
;; u:
;; U
("v" "Emacs 变量" plain "%?"
:target (file+head "Emacs/variable/${title}.org"
"#+title: ${title}\n#+date: %<%FT%T%z>\n")
:immediate-finish t
:unnarrowed t)
;; V:
;; w:
;; W
;; x:
;; X
;; y:
;; Y
;; z:
;; Z
))
;; }}}
;; little hack
;; {{{
;; brew install --cask db-browser-for-sqlite
(defun my/org-roam-view-db ()
(interactive)
(cond
((eq system-type 'darwin)
(shell-command
;; net.sourceforge.sqlitebrowser
(format "open \"/Applications/DB Browser for SQLite.app\" --args --table nodes %s" org-roam-db-location)))
(t
(message "my/org-roam-view-db not yet working on this system-type"))))
;; }}}
;; org-roam-ui
;; {{{
(use-package org-roam-ui
:after org-roam
;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have
;; a hookable mode anymore, you're advised to pick something yourself
;; if you don't care about startup time, use
;; :hook (after-init . org-roam-ui-mode)
:bind (("C-c G" . org-roam-ui-open)
)
:config
(setq org-roam-ui-sync-theme t
org-roam-ui-follow t
org-roam-ui-update-on-save t
org-roam-ui-open-on-start t)
)
;; }}}
This is my vertico + posframe + orderless config
;; vertico
;; {{{
(use-package vertico
:init
(vertico-mode)
(vertico-mouse-mode)
;; Different scroll margin
;; (setq vertico-scroll-margin 0)
;; Show more candidates
(setq vertico-count 20)
;; Grow and shrink the Vertico minibuffer
(setq vertico-resize t)
;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
(setq vertico-cycle t)
)
;; Persist history over Emacs restarts. Vertico sorts by history position.
(use-package savehist
:init
(savehist-mode))
;; Configure directory extension.
(use-package vertico-directory
:after vertico
:ensure nil
;; ;; More convenient directory navigation commands
:bind (:map vertico-map
("RET" . vertico-directory-enter)
("DEL" . vertico-directory-delete-char)
("M-DEL" . vertico-directory-delete-word))
;; Tidy shadowed file names
:hook (rfn-eshadow-update-overlay . vertico-directory-tidy))
;; A few more useful configurations...
(use-package emacs
:init
;; Add prompt indicator to `completing-read-multiple'.
;; We display [CRM<separator>], e.g., [CRM,] if the separator is a comma.
(defun crm-indicator (args)
(cons (format "[CRM%s] %s"
(replace-regexp-in-string
"\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" ""
crm-separator)
(car args))
(cdr args)))
(advice-add #'completing-read-multiple :filter-args #'crm-indicator)
;; Do not allow the cursor in the minibuffer prompt
(setq minibuffer-prompt-properties
'(read-only t cursor-intangible t face minibuffer-prompt))
(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
;; Emacs 28: Hide commands in M-x which do not work in the current mode.
;; Vertico commands are hidden in normal buffers.
;; (setq read-extended-command-predicate
;; #'command-completion-default-include-p)
;; Enable recursive minibuffers
(setq enable-recursive-minibuffers t))
;; }}}
;; vertico-posframe
;; {{{
(require 'posframe)
(require 'vertico-posframe)
(vertico-posframe-mode 1)
(setq vertico-multiform-commands
'((consult-line
posframe
(vertico-posframe-poshandler . posframe-poshandler-frame-top-center)
(vertico-posframe-border-width . 10)
;; NOTE: This is useful when emacs is used in both in X and
;; terminal, for posframe do not work well in terminal, so
;; vertico-buffer-mode will be used as fallback at the
;; moment.
(vertico-posframe-fallback-mode . vertico-buffer-mode))
(t posframe)))
(vertico-multiform-mode 1)
(setq vertico-posframe-parameters
'((left-fringe . 20)
(right-fringe . 20)))
;; }}}
;; orderless: minibuffer filter, works with icomplete
;; {{{
(require 'orderless)
(setq completion-styles '(basic initials substring partial-completion flex orderless)
completion-category-defaults nil
completion-category-overrides '((file (styles basic partial-completion))))
;; }}}
Off the top of my head, I suggest you remove org-roam-node-backlinkscount. If it is straight from the wiki, it should be my code and it is not efficient.
Oh man, you saved my life