2012-11-23 21 views
6

To doprowadza mnie do szału i byłem na tym cały dzień.Emacs - przewijanie automatyczne po wstawieniu tekstu

Próbuję napisać filtr procesu do komunikacji z urządzeniem szeregowym. To działa dobrze, ale kiedy wstawiam tekst do bufora, chcę, aby bufor przewijał się, tak żebym mógł zobaczyć tekst, tak jak wtedy, gdy ty typ tekst do bufora. Wstawiam tekst do kilku buforów pokazujących różne informacje na linii szeregowej. Tak jak to jest, za każdym razem, gdy wydaję komendę szeregową, muszę przeciągnąć każdy pasek przewijania tak, żebym mógł zobaczyć tekst.

Zmiana "punktu" powoduje jedynie zmianę punktu wstawienia - przewijanie okna nie następuje. Próby wywoływania funkcji przewijania i "recenter" wydają się nic nie robić. Jak mogę przewinąć okna?

Chciałbym również zmienić bufor, aby nie można było go wpisać lub zmienić pozycję "punktu", klikając w oknie. Czy jest jakiś tryb, którego powinienem używać?

Wielkie dzięki, jeśli ktoś może pomóc,

David.

Odpowiedz

5

Podejrzewam problem wynika z faktu, że pozycja punkt nie jest dołączony do bufora, ale do okna wyświetlającego bufor (ponieważ można mieć różne okna wyświetlające ten sam bufor w różnych lokalizacjach).

można spróbować coś takiego:

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

Hurray !! Dobra robota Francesco! To ładnie sprawiło tę pracę. –

0

(goto-char (point-max)) powinien przewijać bufor do końca. Aktywny kursor nie może znajdować się poza rzutnią w Emacs. Czy zawijasz swoje połączenia w jednym z poleceń zapisywania wycieczek?

Aby uniemożliwić edycję, zrobić (toggle-read-only 1)

+0

Dzięki za odpowiedź Magnar. Mam (goto-char (point-max)) w moim kodzie. Pomyślnie wysyła punkt do końca bufora. Ale kiedy wstawiam mój tekst (wstawię ), to ostatecznie spływa z dolnej części okna i muszę ciągnąć pasek przewijania w dół, aby nadążyć za moim wyjściem. –

+0

Zawijam polecenie excursion. Robię to z ięgi. Nie wiem, czy to ma znaczenie. Na przykład, jeśli masz otwarty bufor o nazwie "xbee.el" i wpisz (z buforem bieżącym "xbee.el" (goto-char (punkt-min)) (wstaw "tekst")) do ome, tekst wejdzie na początek bufora "xbee.el", ale nie zobaczysz go, dopóki nie przewiniesz go (zakładając, że jest poza ekranem). –

1

Może chcesz (set (make-local-variable 'window-point-insertion-type) t) w swoim buforze.

+0

Co ta wartość ma, Stefan? Docstring mówi, że zmienna określa typ znacznika, ale nie jest dla mnie jasne, co oznacza wartość "t" w tym zakresie. – phils

+0

Oznacza to, że po dodaniu tekstu w miejscu, w którym znajduje się kursor okna, kursor powinien pozostać po nowym tekście, a nie wcześniej. – Stefan

+0

Dzięki, Stefan. Być może tę zmienną można udokumentować bardziej szczegółowo? To powiedziawszy, brzmi to tak, jakbym zobaczył różnicę w zachowaniu między 'nil' a' t' dla tej zmiennej, jeśli I 'M-: (wstaw" foo ") RET' do bufora, ale wynik wydaje się taki sam w obu przypadkach, więc nadal jestem trochę zdezorientowany. – phils

2

Dziękuję wam wszystkim za pomoc. Jeśli ma to jakikolwiek pożytek dla kogokolwiek, to właśnie do tej pory wymyśliłem i wydaje się, że działa.

(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))))) 
Powiązane problemy