Способи ненав'язливого варіювання візуалізації тексту?


12

Я пишу розширення Emacs для використання з розпізнаванням мови, і шукаю допомоги з певною функцією. Деякі слова, які розпізнавач мови (Дракон) розпізнає незмінно погано - не важливо, скільки разів ви тренуєтесь, воно просто засмоктує розпізнавання певних слів. У той же час, зазвичай, коли ви пишете тему або коли кодуєте, ви будете використовувати багато і тих же слів знову і знову.

Тому я написав режим, який використовує накладки для зміни способу відображення слів у буфері. Він бере у слові випадкову букву, підкреслює її у випадковому кольорі та над нею ставить випадкову діакритичну позначку (наголос, умлаут тощо). Ось знімок екрана (вам, ймовірно, потрібно буде збільшити масштаб, щоб побачити позначки / підкреслення):

введіть тут опис зображення

Тоді ви можете сказати, "фіолетове волосся", і воно буде шукати слово з фіолетовим підкресленням під його "а" з діакритичною позначкою, що схожа на волосся, і введіть це слово для вас. Отже, на наведеному вище знімку скріншот, що призведе до того, що emacs набере для вас "regexp-quote".

Ідея полягає в тому, що ви можете посилатися на будь-яке слово, яке ви вже вживали, на екрані, використовуючи обмежений набір слів, який розпізнавач незмінно добре розпізнає.

Це працює досить добре, за винятком випадків, коли виникає зіткнення. Щоб зробити це таким чином, я можу навчитися послідовно посилатися на слова так само, як я використовую байти з хеду md5 слова замість того (random), щоб алгоритм призначив зміни, щоб уникнути зіткнень. Я знайшов лише 6 кольорів, що легко розрізнюються (важко, коли підкреслення лише одного символу шириною та товщиною одного пікселя) та 3 легко розрізнених діакритичних позначки (легко розрізнити один від одного, а також не можна переплутати з підкресленням вище лінії або перекриття підкресленням), видно вгорі джерела вгорі.

Мені потрібно більше способів зміни візуалізації, щоб зменшити частоту зіткнення. В ідеалі модифікація візуалізації:

  • Не журіться з решти тексту. Це призвело до відмови, наприклад, властивості зворотного відео.
  • Не можна легко переплутати з іншими змінами. Окреслення легко помиляються з підкресленнями в попередньому рядку. Багато діакритичних позначок виглядають подібними, якщо розмір вашого шрифту не є практично незрозумілим.
  • Будьте просторово поруч, де є інші зміни. Прямо зараз, коли моє око знаходить орієнтаційного персонажа, вся інформація там, маркер, підкреслення та літера.
  • Гарно працюйте з шрифтом фіксованої ширини (необхідним для кодування), який правильно надає діакритичні позначки (мені довелося перейти на DejaVu Sans Mono з Consolas, щоб позначки правильно відображалися)
  • Робота над літерами латинського алфавіту. Наприклад, є поєднання арабських знаків, але вони не поєднуються з символами латинського алфавіту.
  • Не змінюйте колір букви, оскільки це вже використовується для виділення синтаксису.
  • Насправді можна зробити в emacs з emacs lisp;)

Можливо, є спеціальні символи Unicode, що контролюють візуалізацію, якими можна було б зловживати, щоб відкрити нові можливості? Або спосіб згустити підкреслення, щоб я міг легко відрізнити більше кольорів? Або якась інша незрозуміла функція emacs, яка дозволяє вам додавати позначки поверх символів, крім унікоду?


Це не пряма відповідь на ваше запитання, але, можливо, пара ідей, що використовують накладки для створення нових виступів персонажа. Одна ідея полягала б у тому, щоб скласти / нанести бутерброд разом дві накладки - змусивши їх поміститися в той самий простір, що і звичайний символ - наприклад, перший символ - тонка лінія з додаванням кольору, (char-to-string ?\uFEFF)а другий - цільовий символ, який зменшується в розмір, щоб вони обидва підходили. Іншою ідеєю було б використовувати вертикальний прорив (доступний у деяких шрифтах, але не у всіх), аналогічний тому, що використовується у бібліотеці vline.el emacswiki.org/emacs/VlineMode
законник

@lawlist: Ця ідея рядка Unicode цікава, вона дозволила мені зробити "бічну лінію". Чи маєте ви якесь уявлення, як зменшити розмір наступного символу? Можливо, я можу генерувати зображення для використання із властивістю відображення, але AFAICT не існує способу змусити emacs перетворювати текст у зображення, тому мені доведеться робити зображення поза emacs.
Джозеф Гарвін

Цей коментар замінює попередній коментар (який я видалив), а також код у наступному посиланні було оновлено - він містить три приклади (один з яких ідентичний відповіді, яку я розмістив нижче в поточній темі): stackoverflow .com / questions / 23744237 /…
законник

Відповіді:


4

Іншою можливістю буде відображення номерів рядків і вимовлення номера рядка перед цим словом, або, оскільки перегляд, щоб отримати точний номер рядка, буде нудним, у вас може бути пошук алгоритму в межах + або - 5 або 10 рядків числа, яке ви казати.

Або, можливо, оголосіть регіон або функцію, в якій ви працюєте, і всі пошуки шукайте лише там. Я б здогадався, що обмежить зіткнення.

Ви також можете зобразити символи unicode після або перед словом у заданому кольорі, щоб допомогти їм виділитися. А також позначте або підкресліть слово іншим кольором. Таким чином у вас може бути 6 кольорів слів * 6 кольорів символів * N можливостей символу. Напевно, ви можете знайти 10 хороших символів і мати 360 комбінацій. Наприклад, ви можете сказати "синьо-жовта зірка", щоб позначити тут слово кішка.

введіть тут опис зображення

Якщо зірка занадто дрімає, ви можете з'єднати: поле та два різні: підкреслення.

Отже, ви можете посилатися на слово дерево тут, використовуючи "синьо-жовтий червоний", який дасть вам 216 комбінацій.

введіть тут опис зображення


1
Я чекав деякий час, щоб побачити, чи хтось придумає інші хитрощі, але я, мабуть, збираюся подвійно підкреслити колір, оскільки додавання символів може скинути відступи. Прийняли, спасибі.
Джозеф Гарвін

2

Ви чули про режим туза-стрибка ?

Він не відповідає жодній із заданих вами вимог, але, схоже, ідеально відповідає тому, що ви намагаєтесь досягти. Це дозволить користувачеві вказати будь-яке слово, сказавши лише 2 або 3 слова.

Ви можете визначити набір символів, який він пропонує вам, щоб уникнути приголосних, які важко розрізнити. Тоді вживання може просто сказати «виправити дев’ять» і виправити 9-е слово, яке починається з a.


Дивіться мій коментар до публікації tmalsburg, чому не вийшов режим ас-стрибка.
Джозеф Гарвін

1

Цікаве запитання. Б'юсь об заклад, ви отримаєте кілька цікавих пропозицій.

Одна незначна пропозиція, яка мені трапляється, - використовувати різні кольори та стилі для підкреслення. Дивіться посібник Elisp, вузол Face Attributesпро атрибут :underlineта його :colorта :styleкомпоненти.

Ви також можете експериментувати з атрибутом :boxта різними ширинами рядків та стилями для нього, але це, можливо, занадто жарко.


1

Я відповім, запропоную альтернативний спосіб вибору цільового слова. Виділіть половину слів (вибрані випадковим чином). Користувач каже "так", якщо цільове слово виділено, а "ні" в іншому випадку. Якщо користувач сказав «так», візьміть усі слова, які були виділені, і випадково виділіть половину з них. Якщо користувач сказав "ні", випадковим чином виділіть половину слів, які не були виділені. Знову користувач вказує, чи виділено цільове слово, сказавши "так" чи "ні". Повторіть це, поки не виділиться лише цільове слово.

Деякі переваги такого підходу:

  • Це працює, незалежно від того, скільки слів у вас на екрані.
  • Вам не потрібні модні кольори, шрифти чи символи. Однотонного дисплея достатньо.
  • Дуже низьке когнітивне навантаження, тому що легко визначити, виділено слово чи ні.

Недолік: Ви повинні говорити "так" і "ні" занадто часто. Однак це фіксується наступною варіацією ідеї: не виділяйте слова, а використовуйте для них кольори. Ви кажете, що у вас 6 кольорів, які легко розрізнити. Це означає, що якщо у вас на екрані 100 слів, для вибору цільового слова потрібно в середньому називати 2,6 кольори. Якщо є 1000 слів, у середньому ви повинні назвати 3,9 кольорів.


1
На жаль, кількість промовлених слів є хибною метрикою. Проблема з цим стилем рішення полягає в тому, що він містить поїздки на сприйняття / дії. Я повинен бачити колір, потім реагувати, потім бачити, реагувати, бачити. Промовляти 3 слова, не зупиняючись, щоб шукати між ними, на практиці має бути швидше, ніж рішення, де це стосується, особливо якщо у Дракона погана затримка. Якби ці кругові поїздки не були проблемою, я б просто скористався режимом туз-стрибок. Завдяки діакритичним позначкам я можу один раз подивитися на екран і знати всю низку того, що мені потрібно сказати, не маючи паузи, щоб Дракон реагував після кожного слова.
Джозеф Гарвін

1

Нижче наводиться приклад використання накладки із зображенням xpm для графічних версій Emacs, що підтримують формат зображення xpm. Це ширина 11 пікселів; 20 пікселів у висоту; і має вказану користувачем кількість з 4 можливих кольорів. Я перебуваю на Mac, на якому працює Snow Leopard 10.6.8, і шрифт, який я віддаю перевагу при використанні Emacs, -*-Courier-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1- frame-char-widthце 11 і frame-char-heightє 20. Я додав тонку вертикальну жовту лінію зліва від великої літери "А" як приклад того, як намалювати власні зображення. Заміна символу в точці може бути здійснено програмно, використовуючи (char-after (point))та приймаючи це число - яке в даному випадку становить 65 для великої літери "А" - і замінюючи відповідну змінну - наприклад, (cond ((eq (char-after (point)) 65) cap-ltr-a-xpm) . . .- і використовуючи цю змінну в розміщення накладення - наприклад,(overlay-put (make-overlay (point) (1+ (point))) 'display cap-ltr-a-xpm). Це дуже добре працює як для усічених буферів, так і для загортання слів, тому що displayвластивість накладання символу в середині слова не викликає обгортання слова, щоб думати, що перша частина слова належить в кінці попереднього рядка . Звичайно, знадобиться час, щоб створити власну бібліотеку улюблених зображень xpm.

ImageMagick здатний створити напівточний xpm конкретного символу на основі певного сімейства та розміру шрифту, але це було не так точно, як я сподівався - ось посилання на інструкції щодо використання цієї зовнішньої утиліти: https: / /stackoverflow.com/a/14168154/2112489 Коротше кажучи, користувач повинен бути готовим витратити час, налаштовуючи зображення в хв. за своїм смаком.

(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 - дякую - я видалив помилкове твердження щодо растрових зображень XBM.
законник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.