Skorzystaj z pustego obszaru echa, aby wyświetlić informacje

10

Obszar echa jest przez większość czasu pusty, co sprawia, że ​​myślę, że mógłbym go użyć do wyświetlenia niektórych informacji. Na przykład org-clockwyświetla bieżące zadanie, pozostały czas i całkowity czas, który upłynął na modeline. Ta informacja nie jest tak naprawdę czytelny (modeline może być dość krótki), powtarza się na każdej modeline (bo odnosi się do całych sesji emacs), a nie jest to przydatne, że jestem w stanie poświęcić trochę cennego miejsca Modeline dla niego . Z drugiej strony może pojawić się w obszarze echa, gdy nie ma tu nic więcej do wyświetlenia.

Czy istnieje kanoniczny sposób na osiągnięcie tego? Myślałem o włamaniu się do funkcji wstawiania minibuffer-inactive-mode-hook(ale to nie działa niezawodnie, na przykład wiadomość znika, gdy tylko obszar echa zostanie ponownie użyty) lub spamowaniu niezalogowanych wiadomości (ale będzie to bałagan przy innych zastosowaniach obszar echa i minibufor).

Wersja dla biednego człowieka używałaby bezczynnych timerów, ale obszar echa może być pusty bez emacsa bezczynności (na przykład podczas wprowadzania tekstu).

T. Verron
źródło
1
Wyświetlany obszar echa to zawartość `* Echo Area 0 *` lub `* Echo Area 1 *` i są to „normalne” bufory. Powinno być możliwe załatanie Emacsa, aby zapewnić pewny przebieg przechwytywania za każdym razem, gdy bufory te są „opróżniane” (lub są wyświetlane i puste), aby ta funkcja mogła zostać wdrożona wydajnie i niezawodnie.
Stefan
Nie jest to dokładnie to, co masz na myśli, ale Bastien Guerry zrobił kilka interesujących rzeczy, aby zapisać nieruchomość ekranu, szczególnie wyświetlając linię trybu w tytule ramki: bzg.fr/emacs-strip-tease.html
Dieter.Wilhelm

Odpowiedzi:

4

Komentarz do tego pytania wspomina, że ​​pakiet o nazwie symon korzysta z takiej funkcji.

Osiąga się to poprzez spamowanie niezalogowanych wiadomości, gdy minibufor jest nieaktywny, oraz poprzez zatrzymanie ponownego wyświetlania za każdym razem, gdy polecenie jest wydawane. Płyta główna tego jest raczej krótka, a po kilku minutach użytkowania nie zauważyłem żadnych problemów: komunikaty i użycie minibufora nadal mają pierwszeństwo przed komunikatami.

Kluczowe elementy to:

  • funkcja wyświetlania, uruchom na bezczynnym zegarze (wywołuje komunikat z message-log-maxustawionym na nil, aby wyświetlany ciąg nie dostał się do *Messages*bufora)
  • funkcja ponownego wyświetlania, uruchom na zegarze
  • funkcja zatrzymująca wyświetlanie, uruchom pre-command-hook

Jedynym problemem jest to, że wyświetlanie jest zatrzymywane przy każdym uruchomieniu polecenia, w tym podczas pisania.

Zainteresowanym wyodrębniłem odpowiedni kod w pakiecie z szablonami dostępnymi na github .

T. Verron
źródło
1

Odpowiedź IMO brzmi: nie . Obszar echa służy do przekazywania ulotnych wiadomości . I wiele rzeczy wyraźnie usuwa wszystko, co mogło zostać tam powtórzone. Zatem realizacja tego, o co prosisz w rozsądny sposób, jest problematyczna, IMO.

Podsumowując, użyj alternatywy. Oto niektóre:

  1. Użyj innego bufora (np. Małej ramki lub okna, które w tym celu pozostanie otwarte). Prosty w obsłudze, możesz go przenosić, edytować, usuwać lub robić z nim co chcesz.

  2. Użyj części lub całości wiersza trybu (najwyraźniej już to rozważałeś).

  3. Użyj linii nagłówka.

  4. Użyj tytułu ramki.

Gdybym to był ja, prawdopodobnie wybrałbym numer 1. (Ale tak naprawdę nie chcę / nie potrzebuję takiego pełnego wyświetlania informacji o stanie. Bardziej prawdopodobne byłoby zdefiniowanie polecenia wyświetlającego mi informacje (nawet historię / dziennik) na żądanie).


Zaktualizowany po twoich komentarzach:

W swoim pytaniu powiedziałeś już: „ komunikat znika, gdy tylko obszar echa zostanie ponownie użyty ”. Brzmiało to więc tak, jakby używać tak efemerycznej przestrzeni, ponieważ obszar echa nie pasowałby do twoich potrzeb. Twoje odpowiedzi na komentarze wydają się temu zaprzeczać.

Jeśli naprawdę chcesz użyć obszaru echa, użyj minibuffer-inactive-mode-hook, jak wspomniałeś, lub użyj timera, aby zadzwonić messagelub wstawić komunikat czasu w obszarze echa w inny sposób. Jednak zauważyliście już problemy z tym związane. Te problemy (nadpisywanie, usuwanie) wynikają z ( zamierzonego ) efemerycznego charakteru obszaru echa .

Podsumowując, chcesz użyć obszaru przeznaczonego na efemeryczne wiadomości, ale nie chcesz, aby Twoje wiadomości znikały, gdy tylko ten obszar zostanie ponownie użyty.

(BTW - napisz swoją wzmiankę, że informacja o linii trybu jest powtarzana w każdej linii trybu: To nie musi być przypadek. Możesz ustawić linię trybu specyficzną dla konkretnego bufora itp. IOW, możesz wybrać jedną linię trybu, aby zawsze (lub okresowo) pokaż swój zegar lub cokolwiek innego.)

Rysował
źródło
Dziękuję za sugestie! Po pierwsze jednak nie do końca rozumiem, dlaczego jest to problematyczne? Chciałbym, aby rzeczy, które trafiłyby do atm obszaru echa, zastąpiłyby jakiekolwiek inne użycie obszaru echa, więc usunięcie go jest OK. Dodatkowe informacje powinny być wyświetlane tylko wtedy, gdy obszar echa jest pusty, więc nie ma nic do usunięcia. Czy to nie brzmi jak rozsądna specyfikacja? O nr 1 problem polega na tym, że nie chcę marnować miejsca na ekranie. Obszar echa jest zawsze obecny, nawet gdy jest pusty. Wymieniłem niektóre problemy z numerami 2, a numery 3 i 4 zawierają wiele z tych problemów.
T. Verron
O tym, dlaczego chcę wyświetlać informacje w pełnym wymiarze czasu, weźmy na przykład org-clockprzykład z pytania: Chcę, aby stoper odznaczał się, aby przypomnieć mi o tym, co powinienem robić i że powinienem to robić teraz , ponieważ często jak to możliwe.
T. Verron
„komunikat znika, gdy tylko obszar echa zostanie ponownie użyty” Ok, to było niejasne. Miałem na myśli to, że jeśli minibuffer-inactive-mode-hookużyję minibufora i wyjdę z niego, pojawi się komunikat. Następnie, jeśli jakieś inne polecenie wypisze coś w obszarze echa, nowa wiadomość zostanie dodana, a wiadomość efemeryczna nie wróci (ponieważ tym razem minibufor się nie zaangażował).
T. Verron
Jeśli chodzi o modelinę, głównym problemem jest mała dostępna przestrzeń (często mam dużo okien, podzielonych poziomo, więc bardzo krótkie modeliny).
T. Verron
Ponownie - „ Podsumowując, chcesz użyć obszaru przeznaczonego na efemeryczne wiadomości, ale nie chcesz, aby twoje wiadomości znikały, gdy tylko ten obszar zostanie ponownie użyty. ” Użyj timera z messagelub post-command-hook, jeśli chcesz. Ale zasadniczy problem znikania / nadpisywania czasami odwraca głowę, ponieważ próbujesz użyć tymczasowego obszaru wyświetlania dla czegoś, czego nie chcesz tymczasowo.
Drew