2012-11-23 5 views
6

Das macht mich verrückt und ich war den ganzen Tag dran.Emacs - scrollen automatisch beim Einfügen von Text

Ich versuche, einen Prozessfilter für die Kommunikation mit einem seriellen Gerät zu schreiben. Das funktioniert OK, aber wenn ich Text in einen Puffer einfüge, möchte ich, dass der Puffer scrollt, damit ich den Text sehen kann, genau wie wenn Sie in einen Puffer schreiben. Ich füge Text in verschiedene Puffer ein, die verschiedene Informationen auf der seriellen Linie zeigen. So wie es ist, jedes Mal, wenn ich einen seriellen Befehl ausstelle, muss ich jede Bildlaufleiste nach unten ziehen, damit ich den Text sehen kann.

Ändern des "Punkts" ändert nur den Einfügepunkt - das Fenster Scrollen folgt nicht. Versuche, scrollende Funktionen und 'recenter' aufzurufen, scheinen nichts zu tun. Wie bekomme ich die Fenster zum Scrollen?

Ich möchte auch den Puffer ändern, so dass Sie nicht eingeben können, oder ändern Sie die Position von "Punkt" durch Klicken in das Fenster. Gibt es einen Modus, den ich verwenden sollte oder etwas?

Vielen Dank, wenn jemand helfen kann,

David.

Antwort

5

Ich vermute, Ihr Problem kommt von der Tatsache, dass Punktposition nicht auf einen Puffer angebracht ist, sondern an das Fenster des Puffers anzeigt (da Sie verschiedene Fenster Anzeige des gleichen Puffer haben kann an verschiedenen Orten).

Man könnte so etwas wie dies versuchen:

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

Hurra !! Gut gemacht Francesco! Das hat den Job gut gemacht. –

0

(goto-char (point-max)) sollte den Puffer bis zum Ende scrollen. Der aktive Cursor darf sich in Emacs nicht außerhalb des Darstellungsbereichs befinden. Wickeln Sie Ihre Anrufe in einen der Exkursionsbefehle ein?

Bearbeitung Um nicht zulassen, tun (toggle-read-only 1)

+0

Danke für die Antwort Magnar. Ich habe (goto-char (point-max)) in meinem Code. Es sendet erfolgreich einen Punkt an das Ende des Puffers. Aber wenn ich meinen Text einfüge (Einfügen ), läuft er schließlich vom unteren Rand des Fensters und ich muss die Bildlaufleiste weiter nach unten ziehen, um mit meiner Ausgabe Schritt zu halten. –

+0

Ich wickle einen Exkursionsbefehl ein. Ich mache das von Ielm. Ich weiß nicht, ob das einen Unterschied macht. Wenn Sie zum Beispiel einen Puffer namens 'xbee.el' haben und (mit 'current-buffer "" xbee.el "(goto-char (point-min)) eingeben (" irgendeinen Text "einfügen)) in ielm, dann wird der Text wird an den Anfang des "xbee.el" -Puffers gehen, aber Sie sehen es nicht, bis Sie zu ihm scrollen (vorausgesetzt, es ist Off-Screen). –

1

Sie könnten zu (set (make-local-variable 'window-point-insertion-type) t) in Ihrem Puffer mögen.

+0

Was macht dieser Wert, Stefan? Der Docstring sagt, dass die Variable einen Markertyp angibt, aber es ist mir nicht klar, was ein Wert von "t" in dieser Hinsicht bedeutet. – phils

+0

Dies bedeutet, dass, wenn Text genau dort hinzugefügt wird, wo sich der Cursor des Fensters befindet, der Cursor nach diesem neuen Text und nicht vor dem Text bleiben soll. – Stefan

+0

Danke, Stefan. Vielleicht könnte diese Variable genauer dokumentiert werden? Das heißt, es klingt, als ob ich einen Unterschied im Verhalten zwischen 'nil' und 't' für diese Variable sehen sollte, wenn ich 'M-: (Einfügen" foo ") RET 'in den Puffer, aber das Ergebnis scheint das gleiche In beiden Fällen bin ich immer noch etwas verwirrt. – phils

2

Danke, dass alle für Sie dabei helfen. Wenn es für irgendjemanden von Nutzen ist, ist es das, was ich bisher herausgefunden habe und es scheint zu funktionieren.

(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)))))