2012-11-23 33 views
6

這使我瘋狂,我一整天都在上。Emacs - 插入文字時自動滾動

我想寫一個進程過濾器與串行設備進行通信。這工作正常,但是當我將文本插入到緩衝區時,我希望緩衝區滾動,以便我可以看到文本,就像在中輸入文本進入緩衝區時一樣。我在幾個緩衝區中插入文本,在串行線上顯示不同的信息。實際上,每次我發出一個串行命令時,都必須將每個滾動條向下拖動,以便我可以看到文本。

更改'點'只是改變插入點 - 窗口滾動不遵循。嘗試調用滾動函數和'recenter'似乎什麼都不做。我如何讓窗口滾動?

我也想改變緩衝區,所以你不能輸入它,或通過點擊窗口來改變'點'的位置。有沒有我應該使用的模式?

非常感謝任何人都可以幫忙,

David。

回答

5

我懷疑你的問題來自於一個事實,即點位置沒有連接到一個緩衝,但顯示緩衝區(因爲你可以有不同的窗口顯示相同的緩衝窗口在不同的地點)。

你可以嘗試這樣的事:

(with-selected-window (get-buffer-window YOUR-BUFFER) 
    (goto-char (point-max))) 
+0

萬歲!做得好弗朗切斯科!這很好地完成了這項工作。 –

0

(goto-char (point-max))應該將緩衝區滾動到最後。活動光標不能位於Emacs中的視口之外。你是否將呼叫包裹在其中一個遊覽保存命令中?

要禁止編輯,做(toggle-read-only 1)

+0

感謝您的回覆Magnar。我在我的代碼中有(goto-char(point-max))。它成功將點發送到緩衝區的末尾。但是當我插入我的文本(插入)時,它最終會從窗口底部運行,我必須不斷拖動滾動條以跟上輸出。 –

+0

我包裹在一個遊覽命令。我正在從ielm這樣做。我不知道這是否有所作爲。例如,如果你打開一個名爲'xbee.el'的緩衝區並在ielm中輸入(with-current-buffer「xbee.el」(goto-char(point-min))(插入「some text」)),文本將進入「xbee.el」緩衝區的開始位置,但直到您滾動到該位置時纔會看到它(假設它不在屏幕上)。 –

1

你可能想在你的緩衝區(set (make-local-variable 'window-point-insertion-type) t)

+0

這個價值是什麼,Stefan?文檔字符串表示變量指定了一種標記,但在這方面,我不清楚「t」的值是什麼意思。 – phils

+0

這意味着,當窗口的光標所在的位置添加文本時,光標應保留在新文本之後,而不是之前。 – Stefan

+0

謝謝,斯蒂芬。也許這個變量可以更詳細地記錄下來?這就是說,聽起來好像我應該在'nil'和't'之間看到該變量的行爲有所不同,如果我'M- :(插入「foo」)RET'到緩衝區中,但結果似乎相同在任何情況下,所以我仍然對此有點困惑。 – phils

2

非常感謝您的幫助。如果它對任何人都有用,這就是我到目前爲止所做的,似乎可行的。

(defun append-to-buffer (buffer string) 
    "Append the text to the end of a buffer" 
    (let ((win (get-buffer-window buffer))) 
    (if (eq win nil) 
     (progn 
      (with-current-buffer buffer 
      (goto-char (point-max)) 
      (insert string))) 
     (with-selected-window 
      (get-buffer-window buffer) 
     (goto-char (point-max)) 
     (insert string)))))