jrblevin / deft

Deft for Emacs
http://jblevins.org/projects/deft/
722 stars 88 forks source link

Fix to make deft faster (also on older emacsen) #115

Open xot opened 1 year ago

xot commented 1 year ago

Deft is slow when handling a lot of notes (several others have reported the issue here). After profiling, it turns out the culprit is string-width, at least on < 29.1 Emacs and Emacs 29.1 native on MacOS (for now).

Luckily, in deft, string-width is always called to test whether a string is less wide than (at most) the window width, or to truncate a string to (at most) the window width. In other words, if we first cut the string to something reasonable small (let's use 4 times the window width to account for UTF and emoji roughly) before computing the actual width, we are good. So define

(defun deft-truncate-string-to-window-width (str)
  (if str
      (if (> (length str) (* deft-window-width 4))
          (substring str 0 (* deft-window-width 4))
      str
      )
   ""
  )
)

(defun deft-string-width (str)
  (string-width (deft-truncate-string-to-window-width str))  
)

(defun deft-truncate-string-to-width (str width)
  (truncate-string-to-width (deft-truncate-string-to-window-width str) width)  
)

And use deft-truncate-string-to-width instead of truncate-string-to-width in deft-file-widget.

(More info here)

mdelhey commented 1 year ago

I'm also having the same slow-down problem. But it looks like deft-file-widget is part of an older version of deft, as far as I can tell. The current version uses deft-file-button. Any idea how to fix the problem for this?

xot commented 1 year ago

Hm.. I thought 0.8 was the latest version, which uses deft-file-widget. What version are you referring to?

mdelhey commented 1 year ago

Looks like "widgets" were replaced with "buttons" in this update https://github.com/jrblevin/deft/commit/28be94d89bff2e1c7edef7244d7c5ba0636b1296

The fix works if you rename the function to deft-file-button.