2016-08-31 99 views
1

所以我寫了一個函數做一些表比對,像這樣:功能對齊使用逗號表報價之外

{"aa,aa" , "sdjhjh" , "bb,asd"} 
{"asdffasd" , "fsd,d" , "sdfsdf"} 

的代碼是在這裏:

(defun align-table (beg end) 
    (interactive "r") 
    (goto-char beg) 
    (replace-chars beg end "|" ?,) 
    (align-regexp beg end "\\(\\s-*\\)|" 1 1 1) 
    (replace-chars beg end "," ?|)) 

它可以通過查找所有在所指定的區域以外的逗號報價和與管道替換它們, 管然後被用於對準使用ALIGN-regexp的表,然後它找到所有管道和再次用 逗號替換它們。

的問題是,校準過程改變了區域的大小和我的替換,字符函數第二個呼叫錯過它應該爲他們的終點後,會出現以取代過去的幾年管道符。

下面是做的工作

(defun find-char (start end char) 
(interactive "r") 
(save-excursion 
    (goto-char start) 
    (let (matches) 
    (while (< (point) end) 
    (cond ((= (char-after) char) 
      (push (point) matches) 
      (forward-char)) 
      ((looking-at "\"") 
      (forward-sexp)) 
      (t 
      (forward-char)))) 
    (nreverse matches)))) 

(defun replace-chars (beg end sep char) 
    (interactive "r") 
    (let ((comma-list (find-char beg end char))) 
    (print comma-list) 
    (dolist (point comma-list) 
     (goto-char point) 
     (delete-char 1) 
     (insert sep)))) 

任何人都可以想辦法來對準逗號的表字符串之外的功能是什麼?

回答

1

我不能讓你的函數確切作爲您的例子顯示,我不感興趣,弄清楚爲什麼。但我想我可以回答你的實際問題。

使用狹窄和對整個收窄緩衝區操作:

(defun align-table (beg end) 
    (interactive "r") 
    (save-excursion 
    (save-restriction 
     (narrow-to-region beg end) 
     (goto-char (point-min)) 
     (replace-chars (point-min) (point-max) "|" ?,) 
     (align-regexp (point-min) (point-max) "\\(\\s-*\\)|" 1 1 1) 
     (replace-chars (point-min) (point-max) "," ?|)))) 

一個可能的好辦法找到只有逗號外串是利用fontlock和syntax-ppss(如(nth 3 (syntax-ppss pos))大概的意思是「fontlock認爲位置pos是在一個字符串「)。

+0

感謝(第n個3(語法PPSS POS))尖端,它的作品真的很好。保存偏移和保存限制仍然不能解決表末尾的某些管道不能轉換回逗號的問題。這似乎只在某些表發生在那裏對準 – Maurex

+0

不知道這是爲什麼,當大空白更改。在變窄的緩衝器,'點min'和'點max'應始終開始和狹窄部的端部,動態地改變作爲文本被刪除或插入。 – jpkotta

+0

對不起,我的壞!我沒有看到point-max和point-min,它已經修復了它!謝謝 – Maurex