2013-12-20 32 views
1

我現在在做ELISP教程,並且不確定標準elisp函數save-excursion(或同樣保存當前緩衝區)中的「還原」的含義。這可能只是因爲我不是母語爲英語的人,並且不知道「恢復」的強弱程度。save-excursion中的「還原」是否還原當前緩衝區的內容?

假設當前緩衝區是A,並且我在save-excursion環境中執行了一個操作,其中A被修改了,例如插入了一個字符串,我希望保存遊覽來恢復A,以便撤消該操作中的更改。

實際的問題,我不明白的是從示例複製到緩衝區:

(defun copy-to-buffer (buffer start end) 
    (interactive "BCopy to buffer: \nr") 
    (let ((oldbuf (current-buffer))) 
    (with-current-buffer (get-buffer-create buffer) 
     (barf-if-buffer-read-only) 
     (erase-buffer) 
     (save-excursion 
     (insert-buffer-substring oldbuf start end))))) 

最後保存衝程工作中的框架與電流緩衝,這讓給予緩衝由用戶當前並在那裏插入一個字符串。如果它恢復緩衝區,它將撤消插入。顯然它不是,但是「恢復緩衝區」是什麼意思?

+0

'save-excursion'的文檔非常明確(Ctrl-h f save-excursion):「保存點,標記和當前緩衝區;執行BODY;恢復這些東西。」 – tripleee

回答

1

這裏有一個簡單的函數來說明什麼保存緩衝區是指:從一個緩衝區,這不是*scratch

(defun foo() 
    (interactive) 
    (insert "foo") 
    (save-excursion 
    (set-buffer "*scratch*") 
    (insert "bar"))) 

調用此。它會插入當前緩衝區, 切換到*scratch*,插入那裏。而這裏的事情:save-excursion通過從*scratch*轉換回 緩衝區,所以你回到了你開始的緩衝區。

+0

Thx,我嘗試了你的問題,並且將(插入「foo」)int切換到save-excursion。所以「恢復」只是說「再次通電」。 – Shinkenjoe