Wyświetla listę słów wzdłuż dolnej części ramki?

20

Chciałbym wyświetlić 3 listy słów w oddzielnych liniach poziomo wzdłuż dolnej krawędzi (chociaż górna też by działała) każdej otwartej ramki emacsa. Pomyślałem o 6 sposobach na zrobienie tego i wszystkie mają problemy:

  1. Moją pierwszą myślą było dodanie linii do mojej linii trybu, ale AFAICT nie można użyć znaku nowej linii w linii trybu, po prostu zostaje przekonwertowany na „^ J”.

  2. Druga myśl polegała na tym, aby mieć linię na górze ekranu i użyć linii nagłówka, ale nie obsługuje ona także znaku nowej linii.

  3. Mógłbym wyświetlić nakładkę na ostatnie 3 linie okna, ale sprawienie, by ta solidność wydawała się trudna - przewijanie musiałoby zostać uruchomione, gdy punkt osiągnie nakładkę, a nie rzeczywisty koniec okna, i musiałbym ciągle zmieniać położenie nakładka, ponieważ nakładki znajdują się w przestrzeni tekstowej, a nie w przestrzeni okna.

  4. Mógłbym spróbować stworzyć dedykowane okna u dołu ramki. Próbowałem to zakodować, ale to też nie jest zbyt solidne, wydaje się, że nie działa poprawnie, gdy ramka zawiera już podzielone okna i musiałem ponownie powiązać Cx, 1 z niestandardową wersją delete-other-windows, która ignoruje moje specjalne okna i jestem pewien, że istnieją inne narożne skrzynki. Również kiedy okno pomocy otwiera się teraz, otwiera się pionowo, ponieważ wydaje się, że jest już podział poziomy (co technicznie istnieje, ale służy tylko do wyświetlania okna z jedną linią).

  5. Mógłbym mieć dedykowaną ramkę do tego, ale wtedy moja konfiguracja nie będzie działać w trybie terminalowym, i musiałbym napisać skrypt do mojego menedżera okien, aby poradził sobie z utrzymywaniem go na dole ekranu, dzięki czemu nie można go wybrać, nie wpływa na układ, itd itd.

  6. Mógłbym wstawić tekst 3 linii bezpośrednio do minibufora. Mam częściowo działający, mogę wyhodować minibufor, aby pomieścić 3 linie i mogę je wyświetlić. Jednak za każdym razem, gdy jakakolwiek wiadomość jest wyświetlana, wiersze znikają, dopóki nie wydam innego polecenia, w którym miejscu ponownie się pojawiają. Idealnie 3 linie i obszar echa nie zachodzą na siebie, więc mogłem zobaczyć oba. Byłoby to mniej denerwujące, gdybym mógł niezawodnie filtrować, które wiadomości trafiają do obszaru echa - znalazłem rozwiązanie na EmacsWiki, ale wydaje się, że nie działa dla wiadomości, które pochodzą ze źródła emacs C (konkretnie chciałbym uzyskać pozbyć się wiadomości zapisywania plików, ponieważ często zapisuję automatycznie na zegarze).

W kontekście, moim celem jest ciągłe wyświetlanie najczęściej używanych słów w bieżącym buforze, słów najbliższego punktu w bieżącym buforze oraz słów ostatnio używanych w bieżącym buforze. Zamierzam móc je wstawić do bufora za pomocą poleceń głosowych. Więc mógłbym powiedzieć „najbliższe 2” i pozwolić mu wybrać drugi element z listy słów najbliższego punktu i wstawić go. Dbam tylko o to, by listy słów były widoczne dla każdego bufora, który aktualnie edytuję. Nie chcę używać okien wyskakujących używanych przez różne tryby uzupełniania kodu, ponieważ listy muszą być zawsze widoczne.

Joseph Garvin
źródło
Dobre pytanie i dobrze postawione. Mam nadzieję, że otrzymasz przydatne wskazówki.
Drew
Zastanawiam się nad innymi częściami # 5, oprócz potrzeby trybu terminalowego (która jest ważna). Możesz użyć dedykowanej ramki, która jest ustawiona na dole (bez problemu). Co masz na myśli Nie można wybrać i dlaczego trzeba to? Jeśli masz na myśli tylko do odczytu, to też nie stanowi problemu. Co masz na myśli mówiąc, że nie wpływasz na układ ? Podsumowując, # 5 nie jest dla mnie zbyt jasne.
Drew
@Drew: Mam na myśli to, że prowadzę WM za pomocą klawiatury i jest mało prawdopodobne, że kiedykolwiek chciałbym celowo skoncentrować się na ramce, więc chciałbym, aby moje powiązania następnego okna / poprzedniego okna pomijały tę ramkę. Podobnie chciałbym, aby układy okien działały tak, jakby ta ramka była tylko częścią panelu / paska zadań. Edytuj: wszędzie w tym komentarzu mówiłem „okno” Mam na myśli okno X, a nie okno emacsa; p
Joseph Garvin
Inną zaproponowaną mi możliwością jest po prostu użycie minibufora. Nie mam pojęcia, czy możliwe jest pasywne wyświetlanie tekstu bez zakłócania wszystkich innych prób jego użycia ...
Joseph Garvin,
Dodano notatkę o próbie użycia minibufora.
Joseph Garvin,

Odpowiedzi:

8

Dzięki wielu hackowanym eksperymentom udało mi się doprowadzić numer 6 (używając tekstu minibufora) do „wystarczająco dobrego” stanu roboczego. Oto zrzut ekranu:

Zrzut ekranu paska w akcji

Aby to zadziałało, istnieje kilka kluczowych elementów:

  • Zaskakujące wstawianie tekstu do minibufora robi właściwie po wyjęciu z pudełka. Tekst tam wstawiony faktycznie się pojawi.
  • Ustawiając tekst jako „ciąg znaków nakładki zamiast zwykłego tekstu, sprawia, że ​​nie można go wybrać i nie musisz się martwić, że kursor przypadkowo się w niego dostanie.
  • Aby komendy monitujące minibufora działały poprawnie, musisz zablokować wstawianie tekstu / nakładki, gdy okno minibufora jest aktywne.
  • Jeśli spróbujesz zmienić rozmiar minibufora za pomocą zwykłych funkcji zmiany rozmiaru okna, otrzymasz błędy dotyczące zbyt małych okien, jeśli użyjesz nieudokumentowanej funkcji md-resize-minibuf, możesz zmienić rozmiar do dokładnej liczby linii, o ile chcesz ustawiłem najpierw resize-mini-windows na zero.
  • Aby rozwiązać problem znikania list za każdym razem, gdy pojawia się komunikat, musisz doradzić funkcji wiadomości, aby przechwytywała wiadomości. Następnie sam wkładasz je do minibufora. Musisz także spojrzeć na zmienną bieżącego komunikatu, która przechowuje wszystko, co ostatnio pojawiło się w obszarze echa (co zaskakujące, obszar echa i minibufor są technicznie odrębne, a niektóre funkcje kodu źródłowego C są drukowane bezpośrednio w obszarze echa bez przechodzenia przez komunikat funkcjonować). Podany poniżej kod jest niedoskonały, wiadomości trwają dłużej niż normalnie, co wciąż muszę zbadać (sprawdzenie ostatniego wpisu w * Wiadomościach może być prostsze i bardziej niezawodne), ale na razie jest to „wystarczająco dobre”.

Oto link do mojej implementacji z przykładowym paskiem z pierścieniem zabójstwa. W końcu będzie to częścią właściwego projektu: https://gist.github.com/jgarvin/ce37d08654978fd7e4c9

To pierwszy raz, kiedy piszę znaczną ilość elisp, więc jakość jest prawdopodobnie słaba, ale działa.

Joseph Garvin
źródło
1

Niestety ani linia trybu, ani linia nagłówka nie mogą być wieloma liniami. Pytałem o to wcześniej i nie ma (przynajmniej nie było) żadnej ukrytej opcji, aby to zadziałało. Więc 1 i 2 są wyłączone. Czuję też, że 3 i 6 to hacki, które nie będą cię uszczęśliwiać na dłuższą metę. 3 i 4 wydają się być dobrym podejściem, ale ich niezawodne działanie będzie sporą inwestycją.

Polecam więc najpierw porozmawiać o tym na emacs-devel . Z mojego doświadczenia wynika, że ​​w końcu rzeczy zostaną wdrożone, jeśli starasz się dokładnie wyjaśnić, czego chcesz i dlaczego jest to dobra rzecz. Może to zająć trochę czasu, przynajmniej do następnej wersji, ale jeśli dobrze jest trochę poczekać lub skorzystać z wersji programistycznej, możesz uzyskać dokładnie to, czego chcesz, przy znacznie mniejszym wysiłku.

Tarsjusz
źródło
Dzięki za sugestię skontaktowania się z emacs-devel. Chociaż wymyśliłem rozwiązanie, było dość hackerskie i byłoby miło mieć prawdziwy interfejs API do bezpośredniego rysowania współrzędnych na ekranie, więc kiedy będę miał czas, prawdopodobnie wystrzelę e-maila po swojemu.
Joseph Garvin