如果我有一个包含
的缓冲区 | 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-forward
与match-string
一起是最有效的方式吗?
答案 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-forward
比search-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)))