Drugmix
Я подумал, что если парсер сразу читает содержимое coder-файла и, соотв., секции Blocks в память, то, наверное, можно указать ему читать всю строку $~xxx до конца, игнорируя какие бы то ни было разделители (кроме перевода строки). Хотя, наверное, я ошибаюсь, т.к. есть опция "Дополнять словами из документа"... В любом случае поддерживаю это предложение:
Drugmix wrote:+ добавить возможность выбирать то, что считать разделителем (конкретно для секции Blocks:), а что нет - вот это будет супер.
Instructor
А как работает опция "Дополнять словами из документа"? Плагин просто берет все подряд между разделителями?
Skif_off wrote:Я подумал, что если парсер сразу читает содержимое coder-файла и, соотв., секции Blocks в память, то, наверное, можно указать ему читать всю строку $~xxx до конца
Так в том то и дело, что, скорей всего, так уже и происходит (или ещё не происходит, но всего лишь этого изменения было бы всё равно не достаточно).
Но это лишь список того, с чем сравнивать.
Но а что сравнивать-то? Вот Instructor же и рассказал про то, как работает плагин: его парсер начинает сдвигаться от текущей позиции каретки влево до тех пор, пока не дойдёт до первого разделителя. Как дошёл - он останавливается, копирует содержимое строки (от разделителя до каретки) и потом делает сравнение этой строки со списком строк из Blocks: и Words: секций .coder файла.
Сейчас, если у скопированной строки нет частичных совпадений с этим списком, то парсер на этом и останавливается, не предлагая вариантов автозавершения.
Я же предлагаю изменить подход и заставить в таком случае парсер продолжать идти влево и снова выполнять все те же самые действия (идти до разделителя, остановиться, скопировать строку [от места остановки до каретки], сравнить со списком из .coder) до тех пор, пока парсер не упрётся в начало строки или начало документа.
p.s.: да поправит меня Instructor, если я не правильно понял работу .coder плагина из того, что он сказал.
вроде как, насколько я помню, задумывалось что
Call("Coder::HighLight", 4, 0, 0, 0, 0) должен искать вперед любую отметку
а
Call("Coder::HighLight", 4, -1, 0, 0, 0) должен искать вперед отметку такого же цвета, как на которой, в данный момент, стоит курсор
Instructor
а как управлять приоритетами у правил из QuotesRE?
Путём эксперимента - было установлено, что чем правило в списке выше - тем оно главнее.
Но не всегда: у меня никак не получается заставить такое правило
то оно начинает перебивать остальные, но так, что части, которые подпадают под .* становятся не окрашенными совсем.
Можно ли как-то задать правило так, чтобы у частей, которые не находятся ни в одной суб-группе - не терялась раскраска от остальных правил?
EDIT:
Видимо, того, о чём я спрашивал выше - сейчас нет. В связи с этим, предлагаю добавить новый аргумент в правила QuotesRE, который бы принимал бы целочисленные значения от -2 до n (512 должно хватить).
Правила с рейтингом 0 - обрабатывались бы так же,
Если есть несколько правил, которые срабатывают на каком-то куске текста - то из них применится только одно: то, которое в списке правил идёт выше.
Правила с рейтингом от 1 и выше - обрабатывались бы так:
- если несколько таких правил срабатывают на каком-то куске текста, то приоритет отдаётся правилу с наивысшим рейтингом, а не определялся бы их позицией в списке правил;
- если же правил с наивысшим рейтингом несколько (т.е. если он одинаковый для нескольких сработавших правил), то все эти правила применяются к строке каскадно, т.е. накладываясь один поверх предыдущего. Наложение правил должно идти снизу вверх (сначала те, что ниже, а потом поверх них - те, что выше).
- правила с рейтингом 0 по-прежнему будут перебивать (не накладываться, а перебивать) любые другие правила с положительным рейтингом, если они расположены вверху списка.
Правила со значениями -1 - срабатывали бы так:
- если строка подпадает сразу и под правило с рейтингом -1 и под одно или несколько правил с положительным рейтингом, то примениться должны все из них, а правило с рейтингом -1 - должно примениться последним, т.е. наложиться поверх остальных. В случае если правил -1 было несколько, то их каскадное наложение определяется из позицией в списке (самое верхнее накладывается самым последним);
- но если строка подпадает сразу и под правило с рейтингом -1 и под правило(а) с рейтингом 0, то примениться должно только одно из них: то, что идёт в списке выше.
- если строка подпадает сразу и под правило(а) с рейтингом -1, и под правило(а) с рейтингом 0 и под правило(а) с положительным рейтингом, то применится только одно: наивысшее из всех правил с не положительным рейтингом.
Т.е. правила с рейтингом -1 ведут себя по-разному в зависимости от того, с какими правилами в группе они оказались: с 0-правилами они себя ведут как 0-правила, с р+ правилами - как р+ правило с наивысшим рейтингом.
Правила с рейтингом -2 - должны срабатывать как правила с рейтингом -1, за одним лишь исключением, что в группе с р+ правилами - они срабатывают как правила с наинизшим рейтингом.
Summary: есть правила с положительным рейтингом (р+) и с не положительным (р0 и р-). Правила могут накладываться или перебиваться.
Если срабатывают сразу несколько правил с разными типами рейтингов, то они себя ведут так:
если среди сработавших правил есть р0 - то сработает только 1 правило (наивысшее в списке).
если среди сработавших правил нет р0 - то сработают правила с наивысшим рейтингом и правила с рейтингом -1. Первым применится -2 (если есть), потом р+ (если есть), потом -1 (если есть).
Получается, что -1 - правило с наивысшим рейтингом, -2 - правило с наинизшим рейтингом.
Last edited by Drugmix on Mon Jan 13, 2014 3:09 pm, edited 3 times in total.
Спасибо!
если выделить всю отметку, то все работает.
но хотелось бы чтобы можно было просто стать курсором в любое место отметки и найти следующую или предыдущую отметку такого же цвета. я думал что -1 такое делать и должно, а так вообще не понял чем отличается -1 от 0 - работает вроде на 100% одинаково.
Drugmix
Вывод из экспериментов: если последующее правило ЦЕЛИКОМ захватывает захваченное предыдущим, то сработает второе. Я для "особо важных" правил что-нибудь типа предваряющего пробела в правило включаю: пробел не подсветится, а менее важные, если пробелы не захватывают, не смогут сожрать.
Serge Yolkin
не понял ничего: "последующее" - это то, которое выше, или то, которое ниже? (обычно в тексте "последующее = ниже", но тут же список так составлен, что более важные - вверху)
"второе" - это то которое "предыдущее" или "последующее"?
и примеры можно, пожалуйста?
У меня проблема в том, что есть 2 таких правила:
одно для раскрашивания текста в кавычках и оно составлено без якорей
то эта строка окрасится так, будто 1-го правила вообще нет, потому что 1-ое правило задано без якорей, а это, видимо, понижает его приоритете так, что любое правило с якорями - легко перебьёт его.
А хочется, чтобы строку раскрасили оба правила: чтобы она сначала целиком окрасилась 2-ым правилом, а потом те её части, которые подпадают под 1-ое правило - окрасились бы и им.
понял: при ID = -1 необходимо напрямую в вызове указывать цвета:
Call("Coder::HighLight", 4, -1, 0, "#FFFF9B", 0)
а такой вызов
Call("Coder::HighLight", 4, -1, 0, 0, 0)
полностью эквивалентен такому:
Call("Coder::HighLight", 4, 0, 0, 0, 0)
можно ли добавить возможность поиска следующей/предыдущей отметки такого же цвета, на котором в данный момент стоит курсор ? (т.е. как при новой фиче с ID = -2, но без необходимости выделения всей отметки - а то как бы совсем лишнее действие получается необходимо, а если текст с отметкой длинный, то довольно таки неудобное)