Sto scrivendo un'estensione emacs da utilizzare con il riconoscimento vocale e sto cercando aiuto con una particolare funzione. Alcune parole che il riconoscimento vocale (Dragon) riconosce costantemente in modo scadente - non importa quante volte lo alleni, farà semplicemente schifo nel riconoscere determinate parole. Allo stesso tempo, di solito quando scrivi su un argomento o quando scrivi un codice utilizzerai molte delle stesse parole più e più volte.
Quindi ho scritto una modalità che utilizza le sovrapposizioni per modificare il modo in cui le parole vengono visualizzate nel buffer. Prende una lettera casuale nella parola, la sottolinea in un colore casuale e mette un segno diacritico casuale (accento, umlaut, ecc.) Sopra di esso. Ecco uno screenshot (probabilmente dovrai ingrandire per vedere segni / sottolineature):
Quindi puoi dire "p capelli viola" e cercherà la parola con una sottolineatura viola sotto la sua 'a' con un segno diacritico che assomiglia a capelli e digita quella parola per te. Quindi nello screenshot sopra che dice che farebbe emacs digitare "regexp-quote" per te.
L'idea è che questo ti permetta di fare riferimento a qualsiasi parola che hai già usato sullo schermo usando un insieme finito di parole che il riconoscitore è costantemente bravo a riconoscere.
Funziona abbastanza bene, tranne che occasionalmente c'è una collisione. Per farlo, posso imparare a fare costantemente riferimento alle parole nello stesso modo in cui sto usando i byte dell'hash md5 della parola anziché (random)
o facendo in modo che un algoritmo assegni le modifiche in modo da evitare le collisioni. Ho trovato solo 6 colori facilmente distinguibili (è difficile quando la sottolineatura è larga solo un carattere e spessa un solo pixel) e 3 segni diacritici facilmente distinguibili (facili da distinguere l'uno dall'altro e anche non confondibili con una sottolineatura di cui sopra linea o sovrapposizione con la sottolineatura), visualizzato nella parte superiore della fonte sopra.
Ho bisogno di più modi per modificare il rendering al fine di ridurre la frequenza di collisione. Idealmente una modifica del rendering dovrebbe:
- Non essere stonato dal resto del testo. Questo mi ha portato ad eliminare, ad esempio, la proprietà del video inverso.
- Non essere facilmente confondibile con altre modifiche. Le sottolineature possono essere facilmente scambiate per sottolineature nella riga precedente. Molti segni diacritici sembrano simili a meno che la dimensione del carattere non sia incredibilmente grande.
- Essere spazialmente vicino a dove sono gli altri cambiamenti. In questo momento, una volta che il mio occhio trova il personaggio bersaglio, tutte le informazioni sono lì, il marcatore, la sottolineatura e la lettera.
- Funziona bene con un carattere a larghezza fissa (necessario per la codifica) che esegue correttamente il rendering dei segni diacritici (ho dovuto passare a DejaVu Sans Mono da Consolas per avere il rendering corretto dei segni)
- Lavora su lettere dell'alfabeto latino. Ci sono segni di combinazione arabi per esempio, ma non si combinano su caratteri alfabetici latini.
- Non cambiare il colore delle lettere, poiché è già utilizzato per l'evidenziazione della sintassi.
- Effettivamente fattibile in emacs con emacs lisp;)
Forse ci sono speciali caratteri unicode che controllano il rendering che potrebbero essere abusati per aprire nuove possibilità? O un modo per addensare le sottolineature in modo da poter distinguere facilmente più colori? O qualche altra caratteristica oscura di emacs che ti consente di rendere segni sopra i personaggi oltre all'unicode?
(char-to-string ?\uFEFF)
e l'altro è un personaggio bersaglio che è ridotto in dimensioni in modo che si adattino entrambi. Un'altra idea sarebbe quella di utilizzare un barrato verticale (disponibile in alcuni caratteri, ma non tutti) simile a quello che viene utilizzato nella libreriavline.el
emacswiki.org/emacs/VlineMode