在缓冲区的前n列中收集数字的最有效方法

时间:2016-09-12 14:45:52

标签: performance search emacs buffer elisp

如果我有一个包含

的缓冲区
         |    inout(Ix)[] prefix() inout
         |    {
     2037|        assert(!keys.empty);
     2037|        final switch (keys.length)
         |        {
000000000|        case 1:
000000000|            return keys.at!0[];
     2037|        case 2:
         |            import std.algorithm.searching : commonPrefix;
     2037|            return commonPrefix(keys.at!0[], keys.at!1[]);
         |        }
         |    }

什么是迭代管道字符左边有数字的所有行的最有效方法?

re-search-forwardmatch-string一起是最有效的方式吗?

3 个答案:

答案 0 :(得分:2)

你的建议已经很快了。

如果你真的非常渴望速度,你可以避免使用正则表达式和string-to-number换行和管道。然后拨打{{1}}。值得努力吗?

答案 1 :(得分:2)

我选择在结果中添加行号,因为还有另一个相关的帖子 - Showing D Coverage Results as Overlays in Source Buffer - 表示原始海报想要使用结果放置叠加等等。 [原始海报可能希望在结果中添加更多内容(例如,缓冲区中的point位置),然后将结果和mapc放在该列表中 - 放置叠加层如果需要,在左边距内(左边缘之前)具有before-string属性。从最左边到管道的每一行的文本也可以删除(或隐藏),以便叠加取代已删除(或隐藏)的内容。]

  
(let (result)
  (save-excursion
    (goto-char (point-max))
    (while (re-search-backward "^\s?+\\([0-9]?+\\)|" nil t)
      (push (cons (format-mode-line "%l") (match-string 1)) result))
    result))

结果如下:

(("1" . "") ("2" . "") ("3" . "2037") ("4" . "2037") ("5" . "") ("6" . "000000000") ("7" . "000000000") ("8" . "2037") ("9" . "") ("10" . "2037") ("11" . "") ("12" . ""))

答案 2 :(得分:0)

skip-chars-forwardsearch-forward快。

但是,只有完成任务才能实现。如果需要重复,事情已经不同了。 search-forward是一个更舒适的功能。 虽然可以写(while (search-forward "MY-CHAR")),但skip-chars-forward会在匹配时停止,因此需要额外的forward-char。大概使用这样一个额外的Emacs-Lisp级别,skip-chars-forward的速度优势得到了普遍化。通常需要检查EOB,search-forward已内置,skip-chars-forward很快就会丢失。

如果一次搜索一个字符,skip-chars-forward可能是一个选项。

IMO需要一个基准来知道下面的表格是否比一个表格更快。一个使用re-search-forward

(defun stop-at-numbers-in-this-special-case ()
  (interactive)
  (while
      (and (skip-chars-forward "^|")
       (eq (char-before) 32))
    (forward-char 1)))

https://www.emacswiki.org/emacs/EmacsLispBenchmark