2013-08-01 31 views
0

我有一個字符串,我通過調用buffer-substring得到。有沒有辦法根據它的face設置從該字符串中刪除文本?作爲一個隨便舉個例子:Emacs從基於字體的字符串中刪除文本

(save-excursion 
    (let ((end (point))) 
(ignore-errors 
    (while (not (looking-at "[^][ \t\r\n(){}]+:")) 
    (backward-sexp))) 

不知道怎麼會這樣是要強調這一點,但在Emacs,save-excursionletignore-errorswhile都強調作爲關鍵字,和正則表達式參數looking-at被高亮顯示爲一個字符串。的buffer-substring返回值看起來像

#(" (save-excursion 
     (let ((end (point))) 
    (ignore-errors 
     (while (not (looking-at \"[^][ \\t\\r\\n(){}]+:\")) 
     (backward-sexp)))" 0 5 (fontified t) 5 19 (fontified t face font-lock-keyword-face) 19 28 (fontified t) 28 31 (fontified t face font-lock-keyword-face) 31 50 (fontified t) 50 63 (fontified t face font-lock-keyword-face) 63 65 (fontified t) 65 69 (fontified t) 69 74 (fontified t face font-lock-keyword-face) 74 75 (fontified t) 75 92 (fontified t) 92 94 (fontified t face font-lock-string-face) 94 95 (fontified t face (font-lock-negation-char-face font-lock-string-face)) 95 112 (fontified t face font-lock-string-face) 112 115 (fontified t) 115 137 (fontified t)) 

鑑於例如字符串,我將如何去剝具有facefont-lock-keyword-face一切嗎?也就是說,我想做能像做

(foo-bar *that-region* 'font-lock-keyword-face) 

,並使其返回

(
    (((end (point))) 
( 
    ((not (looking-at "[^][ \t\r\n(){}]+:")) 
    (backward-sexp))) 
+0

你是什麼意思刪除? –

+0

爲什麼不在你的問題中粘貼這樣一個字符串的例子? – sds

+0

@ abo-abo - 我的意思是「返回字符串的一個副本,而不在特定的'font'' face'中突出顯示部分」。 – Inaimathi

回答

2

你將不得不使用text-property-any可以找出臉部的開始和text-property-not-all找到它結束。然後你需要迭代。

(defun kill-text-with-property (start end property value &optional object) 
    "Delete the text with the PROPERTY in the part of OBJECT from START and END." 
    (interactive "r\nsProperty: \nsValue: ") 
    (let ((delenda()) (here start)) 
    ;; collect the list of regions to kill 
    ;; note that delenda contains the regions in the reverse order so that 
    ;; deleting the later ones do not affect the boundaries of the ealier ones 
    (while (< here end) 
     (let ((beg (text-property-any here end property value object)) 
      (stop (and beg (text-property-not-all beg end property value object) end))) 
     (if (null beg) 
      (setq here end)  ; done 
      (push (cons beg stop) delenda) 
      (setq here stop)))) 
    (if (stringp object) 
     ;; collect the complements of delenda into a new string 
     (....) 
     ;; buffer: kill the delenda regions 
     (with-current-buffer (or object (current-buffer)) 
     (dolist (pair delenda) 
      (kill-region (car pair) (cdr pair)))))))