我最近做一个buffer单词提取然后和本地词库对比的函数。我现在做法Buffer里面的每一个单词都跟整个词库对比,有包含在内就高亮,没有就不高亮,但是这方法好慢,一次调用都要5秒到10秒的时间才能做好处理好一个buffer。
词库有一万个词左右,已经预加载在一个 word-in-list里面了,buffer的单词加载在 word-in-buffer里面了。
想问一下大家怎样处理大型list处理而又保持很好的性能的?
我的实现如下:
(get-buffer-create "*english-helper*")
(with-current-buffer "*english-helper*"
(erase-buffer))
(with-current-buffer (current-buffer)
(let* ((word-car (mapcar 'car word-in-list))
(highlight-word (seq-intersection word-car word-in-buffer)))
(dolist (sub highlight-word)
;; (write-region (concat (concatString (assoc sub word-in-list)) "\n" ) nil "~/OneDrive/Org/current-buffer-word-list.txt" 'append)
(with-current-buffer "*english-helper*"
(goto-char (point-max))
(insert (concat (concatString (assoc sub word-in-list)) "\n")))
(save-excursion
(goto-char (point-min))
(while (re-search-forward sub nil t)
(let* ((beg (match-beginning 0))
(xx (make-overlay beg (point))))
(overlay-put xx 'face 'highlight)))))))