Sposoby dyskretnej zmiany renderowania tekstu?


12

Piszę rozszerzenie emacs do użytku z rozpoznawaniem mowy i szukam pomocy z określoną funkcją. Niektóre słowa, które rozpoznaje mowę (Dragon), konsekwentnie słabo rozpoznaje - nie ma znaczenia, ile razy je ćwiczysz, będzie po prostu ssać rozpoznawanie niektórych słów. W tym samym czasie zwykle, kiedy piszesz na temat lub kodujesz, będziesz używać wielu takich samych słów w kółko.

Napisałem więc tryb, który używa nakładek do zmiany sposobu renderowania słów w buforze. Bierze losową literę w słowie, podkreśla go losowym kolorem i kładzie na nim losowy znak diakrytyczny (akcent, umlaut itp.). Oto zrzut ekranu (prawdopodobnie będziesz musiał powiększyć, aby zobaczyć znaki / podkreślenia):

wprowadź opis zdjęcia tutaj

Następnie możesz powiedzieć „fioletowe włosy”, a ono będzie szukać słowa z fioletowym podkreśleniem pod „a” ze znakiem diakrytycznym, który wygląda jak włosy, i wpisz to słowo dla siebie. Więc na powyższym zrzucie ekranu powiedzenie, że spowoduje to, że emacs napisze dla ciebie „regexp-quote”.

Pomysł polega na tym, że możesz odwoływać się do każdego słowa, które już użyłeś, które jest wyświetlane na ekranie przy użyciu skończonego zestawu słów, które rozpoznający jest niezmiennie dobry w rozpoznawaniu.

Działa całkiem dobrze, ale czasami zdarza się kolizja. Aby to zrobić, mogę nauczyć się konsekwentnego odwoływania się do słów w ten sam sposób, w jaki używam bajtów z skrótu md5 słowa zamiast (random)algorytmu przypisującego zmiany tak, aby uniknąć kolizji. Znalazłem tylko 6 łatwych do odróżnienia kolorów (jest to trudne, gdy podkreślenie ma tylko jeden znak szerokości i grubość jednego piksela) oraz 3 łatwo rozpoznawalne znaki diakrytyczne (łatwe do odróżnienia od siebie i nie mylące z podkreśleniem powyżej) linia lub nachodzące na podkreślenie), widoczne u góry źródła powyżej.

Potrzebuję więcej sposobów zmiany renderowania, aby zmniejszyć częstotliwość kolizji. Najlepiej byłoby, gdyby modyfikacja renderowania:

  • Nie denerwuj się resztą tekstu. Doprowadziło mnie to do odrzucenia na przykład właściwości odwrotnego wideo.
  • Nie da się łatwo pomylić z innymi zmianami. Podkreślenia łatwo pomylić z podkreśleniami poprzedniej linii. Wiele znaków diakrytycznych wygląda podobnie, chyba że rozmiar czcionki jest niepraktycznie ogromny.
  • Bądź przestrzennie blisko innych zmian. W tej chwili, gdy moje oko znajdzie celującą postać, wszystkie informacje są tam, znacznik, podkreślenie i litera.
  • Pracuj ładnie z czcionką o stałej szerokości (potrzebną do kodowania), która poprawnie wyświetla znaki diakrytyczne (musiałem przełączyć się na DejaVu Sans Mono z Consolas, aby znaki były poprawnie renderowane)
  • Praca z literami alfabetu łacińskiego. Na przykład arabskie znaki łączące nie łączą się ze znakami alfabetu łacińskiego.
  • Nie zmieniaj koloru liter, ponieważ jest on już używany do podświetlania składni.
  • Właściwie być wykonalnym w emacs z emacs lisp;)

Być może istnieją specjalne znaki Unicode kontrolujące renderowanie, które mogłyby zostać wykorzystane do otwarcia nowych możliwości? Lub sposób na pogrubienie podkreśleń, aby móc łatwo rozróżnić więcej kolorów? A może jakaś inna niejasna funkcja emacsa, która pozwala renderować znaki na znakach innych niż Unicode?


Nie bezpośrednia odpowiedź na twoje pytanie, ale być może kilka pomysłów przy użyciu nakładek, aby nadać nowy wygląd postaci. Jednym z pomysłów byłoby połączenie / nakładanie razem dwóch nakładek - zmuszanie ich do dopasowania w tej samej przestrzeni co zwykły znak - np. Pierwszy znak to cienka linia z dodanym kolorem, (char-to-string ?\uFEFF)a drugi to postać docelowa, która jest zmniejszona w rozmiar, więc oba pasują. Innym pomysłem byłoby użycie przekreślenia w pionie (dostępnego w niektórych czcionkach, ale nie we wszystkich) podobnego do tego, które jest używane w bibliotece vline.el emacswiki.org/emacs/VlineMode
lawlist

@lawlist: Ten pomysł na linię Unicode jest interesujący, pozwoliłbym zrobić „linię boczną”. Czy masz jednak pomysł, jak zmniejszyć rozmiar poniższej postaci? Może mógłbym wygenerować obraz do użycia z właściwością display, ale AFAICT nie ma sposobu, aby emacs renderował tekst na obraz, więc musiałbym tworzyć obrazy poza emacs.
Joseph Garvin

Ten komentarz zastępuje poprzedni komentarz (który usunąłem), a kod w poniższym linku również został zaktualizowany - zawiera trzy przykłady (z których jeden jest identyczny z odpowiedzią, którą zamieściłem poniżej w bieżącym wątku): stackoverflow .pl / pytania / 23744237 /…
lista prawnicza

Odpowiedzi:


4

Inną możliwością byłoby wyświetlenie numerów linii i wypowiedzenie numeru linii przed słowem, lub, ponieważ szukanie dokładnego numeru linii byłoby kłopotliwe, możesz wyszukać algorytm w obrębie + lub - 5 lub 10 linii liczby, którą mówić.

A może zadeklaruj region lub funkcję, w której pracujesz i wszystkie wyszukiwania tylko tam szukają. Sądzę, że ograniczy to kolizje.

Możesz także renderować symbole Unicode przed słowem w danym kolorze lub przed nim, aby je wyróżnić. A także pole lub podkreśl słowo w innym kolorze. W ten sposób możesz mieć 6 kolorów słów * 6 kolorów symboli * Możliwości symboli N. Prawdopodobnie możesz znaleźć 10 dobrych symboli i mieć 360 kombinacji. Na przykład możesz powiedzieć „niebiesko-żółta gwiazdka”, odnosząc się tutaj do słowa kot.

wprowadź opis zdjęcia tutaj

Jeśli gwiazda jest zbyt wstrząsająca, możesz połączyć: pudełko i dwa różne: podkreśla.

Możesz więc odwołać się do drzewa słów tutaj, używając „niebiesko-żółtego czerwonego”, co dałoby 216 kombinacji do użycia.

wprowadź opis zdjęcia tutaj


1
Czekałem chwilę, aby zobaczyć, czy ktoś wymyśli inne sztuczki, ale prawdopodobnie zamierzam użyć podwójnego podkreślenia, ponieważ dodanie symboli może zrzucić wcięcie. Zaakceptowano, dziękuję.
Joseph Garvin

2

Czy słyszałeś o trybie skoku z asem ?

Nie spełnia żadnego z określonych wymagań, ale wygląda na to, że idealnie pasuje do tego, co próbujesz osiągnąć. Pozwoliłoby to użytkownikowi określić dowolne słowo, wypowiadając tylko 2 lub 3 słowa.

Możesz zdefiniować zestaw znaków, które oferuje, dzięki czemu możesz uniknąć spółgłosek trudnych do odróżnienia. Następnie użycie może po prostu powiedzieć „naprawić A nine” i poprawić 9. słowo, które zaczyna się od a.


Zobacz mój komentarz do postu tmalsburga, aby dowiedzieć się, dlaczego tryb skoku w tyłek nie zadziałał.
Joseph Garvin

1

Interesujące pytanie. Założę się, że dostaniesz kilka ciekawych sugestii.

Jedna drobna sugestia, która przychodzi mi do głowy, to stosowanie różnych kolorów i stylów do podkreślania. Zobacz Elisp ręczny, węzeł Face Attributeso atrybutu :underlinei jego :colorand :stylekomponentów.

Możesz także eksperymentować z atrybutami :boxoraz różnymi szerokościami i stylami linii, ale to może być zbyt denerwujące.


1

Odpowiem, proponując alternatywny sposób wyboru słowa docelowego. Podświetl połowę słów (losowo wybranych). Użytkownik mówi „tak”, jeśli słowo docelowe jest podświetlone, aw przeciwnym razie „nie”. Jeśli użytkownik powiedział „tak”, weź wszystkie zaznaczone słowa i losowo zaznacz połowę z nich. Jeśli użytkownik powiedział „nie”, losowo zaznacz połowę słów, które nie zostały podświetlone. Znów użytkownik wskazuje, czy słowo docelowe jest podświetlone, mówiąc „tak” czy „nie”. Powtarzaj to, dopóki nie zostanie podświetlone tylko słowo docelowe.

Niektóre zalety tego podejścia:

  • Działa to bez względu na liczbę słów wyświetlanych na ekranie.
  • Nie potrzebujesz fantazyjnych kolorów, czcionek ani symboli. Wystarczy wyświetlacz monochromatyczny.
  • Bardzo niskie obciążenie poznawcze, ponieważ łatwo jest stwierdzić, czy słowo jest podświetlone, czy nie.

Wada: zbyt często trzeba mówić „tak” i „nie”. Jest to jednak naprawione przez następującą odmianę pomysłu: nie podświetlaj słów, ale używaj dla nich kolorów. Mówisz, że masz 6 łatwo rozpoznawalnych kolorów. Oznacza to, że jeśli masz 100 słów na ekranie, wybranie słowa docelowego wymaga nazywania średnio 2,6 kolorów. Jeśli jest 1000 słów, musisz wymienić średnio 3,9 kolorów.


1
Niestety liczba wypowiedzianych słów jest mylącą miarą. Problem z tym stylem rozwiązania polega na tym, że zawiera on percepcję / działania w obie strony. Muszę zobaczyć kolor, potem zareagować, a następnie zobaczyć, zareagować, zobaczyć. Wypowiedzenie 3 słów bez konieczności zatrzymywania się między nimi musi być w praktyce szybsze niż rozwiązanie, w którym to robisz, zwłaszcza gdy Smok ma słabe opóźnienie. Gdyby te okrągłe podróże nie stanowiły problemu, użyłbym po prostu trybu skoku z asem. Za pomocą znaków diakrytycznych mogę raz spojrzeć na ekran i poznać cały ciąg tego, co muszę powiedzieć, bez konieczności zatrzymywania się, aby Dragon zareagował po każdym słowie.
Joseph Garvin,

1

Poniżej znajduje się przykład użycia nakładki z obrazem xpm dla graficznych wersji Emacsa, które obsługują format obrazu xpm. Ma szerokość 11 pikseli; 20 pikseli wysokości; i ma określoną przez użytkownika liczbę 4 możliwych kolorów. Jestem na komputerze Mac z systemem Snow Leopard 10.6.8, a preferowaną czcionką podczas korzystania z Emacsa jest -*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1- frame-char-widthjest 11, a frame-char-heightjest 20. Dodałem cienką pionową żółtą linię na lewo od dużej litery „A” jako przykład rysowania niestandardowych obrazów. Podstawienia znaku w punkcie można dokonać programowo, używając (char-after (point))i biorąc tę ​​liczbę - która w tym przypadku wynosi 65 dla dużej litery „A” - i zastępując odpowiednią zmienną - np. (cond ((eq (char-after (point)) 65) cap-ltr-a-xpm) . . .- i używając tej zmiennej w umieszczanie nakładki - np.(overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm). Działa to bardzo dobrze zarówno w przypadku obciętych buforów, jak i zawijania wyrazów, ponieważ displaywłaściwość nakładki na znak w środku słowa nie powoduje, że zawijanie słów uważa, że ​​pierwsza część słowa należy na końcu poprzedniego wiersza . Oczywiście stworzenie własnej biblioteki ulubionych obrazów xpm zajmie trochę czasu.

ImageMagick jest w stanie wygenerować pół-dokładne xpm określonego znaku w oparciu o określoną rodzinę czcionek i rozmiar, ale nie było tak precyzyjne, jak się spodziewałem - tutaj jest link do instrukcji korzystania z tego zewnętrznego narzędzia: https: / /stackoverflow.com/a/14168154/2112489 Krótko mówiąc, użytkownik powinien być przygotowany na spędzenie czasu na dostosowywaniu obrazów xpm do swoich upodobań.

(defun xpm-example ()
(interactive)
"Doc-string"
  (let* (
      (cap-ltr-a-xpm `(image :type xpm :mask nil :ascent center :data
        "/* XPM */
        static char * letters_xpm[] = {
        /* columns rows colors chars-per-pixel */
        /* columns = 1 pixel in width -- see also (frame-char-width) */
        /* rows = 1 pixel in height -- see also (frame-char-height) */
        \"11 20 4 1\",
        \". c #000000\",
        \"+ c #FF0000\",
        \"@ c #7F0000\",
        \"% c yellow\",
        \"%..........\",
        \"%....++....\",
        \"%....++....\",
        \"%..++..++..\",
        \"%..++..++..\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++++++++++\",
        \"%++++++++++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%++......++\",
        \"%..........\"};"))  )
    (overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm)))

@wasamasa - dziękuję - usunąłem błędne oświadczenie dotyczące map bitowych XBM.
prawnik
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.