2016-09-12 241 views
1

的第n列收集数的最有效的方法。如果我有一个包含一个缓冲在缓冲区

  | 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最有效的方法吗?

回答

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" . ""))

+0

我选择'重新搜索后向'连同匹配字符串。这是我的解决方案:https://github.com/nordlow/elisp/blob/master/mine/flycheck-d-all.el#L70谢谢。 –

+0

我喜欢'^ \\(......... \\)',因为它涉及每个'.'捕获一个字符(例如,九个点,等于9个字符) - 感谢您分享您的正则表达式。 :) – lawlist

2

你的建议已经很快了。

如果你真的为速度而拼命,你可以避免使用正则表达式和换行符。然后致电string-to-number。这是值得的努力?

0

skip-chars-forwardsearch-forward更快。

但是,只有这样,如果任务完成了它。如果需要重复,事情已经不同了。 search-forward是一个更舒适的功能。 尽管有可能在比赛中停止(while (search-forward "MY-CHAR"))skip-chars-forward,因此需要额外的forward-char。粗略地说,使用这种额外的Emacs-Lisp级别时,skip-chars-forward的速度优势被例示。由于经常检查EOB是否需要,哪些内置search-forwardskip-chars-forward即将失效。

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

IMO它需要一个基准来知道下面的表格是否比resp快。一个使用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