Czy jest możliwe przesłanie danych wyjściowych z filtra procesu do *Messages*
bufora i powstrzymanie pojawiania się tego komunikatu w obszarze echa, tak że jestem w stanie jednocześnie używać interaktywnych poleceń bez konieczności minibuffer-prompt
usuwania ich przez trwające wyjście filtra podciśnienia?
(defun rsync-process-filter (proc string)
(when (not (or
(string-match "files...\r" string)
(string-match "files to consider\n" string)))
(message "%s" string)))
EDYCJA (3 stycznia 2015 r.): Poniżej znajduje się link do podobnego pytania, jednak nie byłem jeszcze w stanie sprawić, aby działał z łańcuchem procesu, w którym dokładny ciąg jest nieznany - tytuł wątku to: Emacs - Wyłącz niektóre komunikaty minibufora :
minibuffer
process
echo-area
lista prawnicza
źródło
źródło
*Messages*
bufora - jednym z nich są projekty związane z synchronizacją. Wciąż jest kilka rzeczy, których nie próbowałem ( ponieważ myślałem, że mogło istnieć wbudowane rozwiązanie ), takie jak*Messages*
tymczasowe zapisywanie buforainhibit-read-only
i używanieinsert
wpoint-max
- nie wiem, czy to się pojawi w obszar echa. Popracuję nad tym wieczorem. . .M-x report-emacs-bug
poprosić o to jako funkcję?(let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))
i opublikowałem roboczą odpowiedź, która będzie kwalifikować się do akceptacji po upływie obowiązkowego okresu oczekiwania na własne pytanie użytkownika. Złożyłem wniosek o dodanie funkcji doreport-emacs-bug
: debbugs.gnu.org/cgi/bugreport.cgi?bug=19495(messages-buffer)
aby uzyskać bufor , jeśli(point-max)
pozostaniesz przy tej metodzie i zauważysz, że nie zawsze będzie to początek nowej linii (np. użyjC-g
).Odpowiedzi:
Możesz ukryć wyświetlanie w minibuforze, ustawiając
minibuffer-message-timeout
na 0.Na przykład używam czegoś takiego w kilku miejscach, w których chcę przełączyć tryb pomocniczy w monicie bufora (np. Plik ido find-file) bez przerywania komunikatem „włączony tryb”:
źródło
(let ((minibuffer-message-timeout 0)) (message "%s" string))
nadal wyświetla się w obszarze echa / minibuforze podczas pisania interaktywnych funkcji, takich jakexecute-extended-command
lubswitch-to-buffer-other-window
- tj. Monit i sugerowane zakończenia są usuwane przez komunikaty wyjściowe procesu.Pierwszy trudny szkic (3 stycznia 2015 r.): Zmieniony wstępny szkic w oparciu o pomocny komentarz @phils dotyczący użycia funkcji
messages-buffer
do zlokalizowania lub utworzenia odpowiedniego bufora (i włożenia gomessages-buffer-mode
); i dodano sprawdzenie, czypoint-max
jest na początku wiersza (jeśli nie, wstaw nowy wiersz przed wstawieniem ciągu wiadomości).EDYCJA (4 stycznia 2015 r.): Są sytuacje, w których wstawiony ciąg niekoniecznie musi kończyć się nowym wierszem, a funkcja
message
nie sprawdza, czy znajduje się na początku nowego wiersza, więc zajmujemy się tym w tej funkcji. Zatem w dowolnym momenciemessage
wstawiania nowej linii wspomniana linia zacznie się w lewo od bufora.źródło
Przechodząc przez dokumentację
message
wydaje się, że powinno być możliwe osiągnięcie tego, co chcesz, poprzez wywołanie wiadomości znil
argumentem natychmiast po wywołaniumessage
z pożądaną treścią. Z dokumentacjimessage
Tak więc modyfikacja funkcji do czegoś takiego jak poniżej powinna działać
Przetestowałem to, wykonując następujące czynności
I wydaje się, że działa
źródło
*Messages*
bufora, a następnie wywołaniem komendy interaktywnejexecute-extended-command
, pokazuje: interaktywny monit (tj.M-x
I wszelkie częściowe uzupełnienia) oraz dane wyjściowe z procesu - tj. Dwa przełączniki z powrotem i z prędkością światła, ale migotanie między nimi jest zauważalne. Wydaje się, że dzieje się tak, ponieważ konkretny sporny proces ciągle wyrzuca nowe wiadomości, a nowa wiadomość jest wyświetlana przez ułamek sekundy w obszarze echa.