2010-03-21 150 views
2

我想重新接收一個名爲*Lense*的緩衝區,其中插入了一些文本。我希望通過(set-buffer "*Lense*"),然後(recenter 0))使它成爲當前的緩衝區。通過下面的代碼段:接收到一個指定的緩衝區,它不一定是Emacs Lisp中的當前緩衝區

(save-excursion (set-buffer "*Lense*") 
       (recenter 0)) 

然而,似乎上面的代碼只會recenter這是當前緩衝區的緩衝區,並(set-buffer "*Lense*")沒有效果,使當前緩衝區爲*Lense*

請幫我找出正確的方法來重新命名緩衝區*Lense*

+0

我現在找到了答案。下面的代碼可以完成這個任務: (保存偏移(彈出到緩衝區)流行到緩衝器」。 「set-buffer」的行爲令人困惑,不可靠。 – 2010-03-21 07:36:27

+1

混淆是由不同的上下文造成的。 'set-buffer'選擇* buffer *作編輯操作,'recenter'作用於* window * not buffer。 – 2010-03-22 07:26:51

回答

7

如果您想要更新緩衝區是可見的,那麼您想重新調用它的窗口。

(with-selected-window (get-buffer-window "*Lense*") 
    (recenter 0)) 

如果沒有顯示緩衝區,這可能會爆炸,因此您可能需要進行條件或退繞保護。

如果要處理緩衝區不可見的情況,則需要移動該點。最終將顯示緩衝區的窗口將居中靠近該點,因此您必須將該點移到某處才能實現此目的。似乎你的插入操作將DTRT,所以你不必擔心在這種情況下。

+0

這是一個很好的解決方案。它符合我的需求。緩衝區「* Lense *」是可見的。非常感謝! Yu – 2010-03-21 13:11:05

+3

你不需要使用'condition-case'或'unwind-protect'。假設你只想重新接收一個實際顯示的緩衝區,只需要使代碼有條件:'(when(get-buffer-window「* Lense *」'visible)...'。 – Drew 2011-08-21 18:36:14

0

我還沒有發現(recenter)功能,但有(recenter-上下)。您可以嘗試使用它而不是(更新)。標準C-l熱鍵正好調用這個函數(recenter-top-bottom),它也有可選參數,窗口行,可以通過C-arg C-1傳遞。

PS:我可能是錯的,因爲我不熟悉emacs-lisp,我只是用最小的自定義設置來使用emacs。

+0

我相信* recenter *函數最近發生了ome名稱變化,所以這裏有一個版本依賴關係... – dmckee 2010-03-21 06:46:10

+0

'recenter是window.c中的一個交互式內置函數。' – jrockway 2010-03-21 06:55:53

+0

我負責添加'最後上限「並將其綁定到」Cl「。命令'recenter'仍然存在,如jrockway所示;它只是不再被默認綁定到'C-l'。 – Drew 2011-08-21 18:37:45