2014-09-19 71 views
1

我正在嘗試編寫一個非常簡單的函數來替換當前行中所有下劃線的白色空格。 這是我迄今爲止Elisp函數在當前行中替換下劃線的空格

(select-current-line) 
    (exit-minibuffer) 
    (query-replace "_" " " nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end))) 

但我得到以下信息:

No catch for tag: exit, nil 

我不是很不服氣,在主動選擇,使用查詢替換是最好的方式,但我根本不是一個elisp程序員。

任何想法?

感謝

UPDATE:

基於下面的答案,這是我使用結束一塊代碼:

(let ((end (copy-marker (line-end-position)))) 
    (while (re-search-forward "_" end t) 
     (replace-match " " nil nil))) 

回答

1

C-h f query-replace RET不說什麼,我想引述,但是C-h f perform-replace RET確實:

Don't use this in your own program unless you want to query and set the mark 
just as `query-replace' does. Instead, write a simple loop like this: 

    (while (re-search-forward \"foo[ \\t]+bar\" nil t) 
    (replace-match \"foobar\" nil nil)) 

至於其限制在當前行,做到這一點的最好辦法是使用re-search-forward第二ARG:

(let ((end (copy-marker (line-end-position)))) 
    (while (re-search-forward \"foo[ \\t]+bar\" end t) 
    (replace-match \"foobar\" nil nil))) 

注意使用copy-marker因爲結束線的位置會不斷變化在修改該行時,所以不要將該位置保留爲普通整數,而是作爲標記(與文本中的某個位置關聯)。 一個常見的選擇是倒退(因爲插入/刪除僅影響更改後的位置):

(end-of-line) 
(let ((beg (line-beginning-position))) 
    (while (re-search-backward \"foo[ \\t]+bar\" beg t) 
    (replace-match \"foobar\" nil nil))) 
相關問題