2016-09-12 295 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