Coder plugin (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Drugmix
Я подумал, что если парсер сразу читает содержимое coder-файла и, соотв., секции Blocks в память, то, наверное, можно указать ему читать всю строку $~xxx до конца, игнорируя какие бы то ни было разделители (кроме перевода строки). Хотя, наверное, я ошибаюсь, т.к. есть опция "Дополнять словами из документа"... В любом случае поддерживаю это предложение:
Drugmix wrote:+ добавить возможность выбирать то, что считать разделителем (конкретно для секции Blocks:), а что нет - вот это будет супер.
Instructor
А как работает опция "Дополнять словами из документа"? Плагин просто берет все подряд между разделителями?

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

VladSh wrote:Подскажите пожалуйста, чем "быстрый" от "умного" кэша отличается? И можно ли добавить это в доку?
viewtopic.php?p=22881#p22881
VladSh wrote:Похоже баг
"Сохраняется" Sessions плагином. Плагин сохраняет сессию при закрытии, в состав которой уже не входит закрытый пользователем файл.
Skif_off wrote:Плагин просто берет все подряд между разделителями?
Почти. Можете глянуть StackFillDocWord в AutoComplete.c

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Skif_off wrote:Я подумал, что если парсер сразу читает содержимое coder-файла и, соотв., секции Blocks в память, то, наверное, можно указать ему читать всю строку $~xxx до конца
Так в том то и дело, что, скорей всего, так уже и происходит (или ещё не происходит, но всего лишь этого изменения было бы всё равно не достаточно).
Но это лишь список того, с чем сравнивать.
Но а что сравнивать-то? Вот Instructor же и рассказал про то, как работает плагин: его парсер начинает сдвигаться от текущей позиции каретки влево до тех пор, пока не дойдёт до первого разделителя. Как дошёл - он останавливается, копирует содержимое строки (от разделителя до каретки) и потом делает сравнение этой строки со списком строк из Blocks: и Words: секций .coder файла.

Сейчас, если у скопированной строки нет частичных совпадений с этим списком, то парсер на этом и останавливается, не предлагая вариантов автозавершения.

Я же предлагаю изменить подход и заставить в таком случае парсер продолжать идти влево и снова выполнять все те же самые действия (идти до разделителя, остановиться, скопировать строку [от места остановки до каретки], сравнить со списком из .coder) до тех пор, пока парсер не упрётся в начало строки или начало документа.

p.s.: да поправит меня Instructor, если я не правильно понял работу .coder плагина из того, что он сказал.

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

Call("Coder::HighLight", 4, 0, 0, 0, {0,1})
Call("Coder::HighLight", 4, -1, 0, 0, {0,1})
работают одинаково :(

вроде как, насколько я помню, задумывалось что
Call("Coder::HighLight", 4, 0, 0, 0, 0) должен искать вперед любую отметку
а
Call("Coder::HighLight", 4, -1, 0, 0, 0) должен искать вперед отметку такого же цвета, как на которой, в данный момент, стоит курсор

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Подскажите как в окне редактирования свернуть/развернуть все блоки сразу.

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Вкладка CodeFold 2 в настройках кодера - не то?

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Serge Yolkin wrote:Вкладка CodeFold 2 в настройках кодера - не то?
Спасибо, то! Но как сделать это во время работы без этой опции? Наверно скриптом...

Offline
Posts: 173
Joined: Mon Dec 06, 2010 9:53 am
Location: г.Харьков, Русь

Post by San_dr »

Andrey_A_A

Code: Select all

"Свернуть/развернуть все блоки" Call("Coder::CodeFold::AllCollapse")
"Свернуть/развернуть текущий блок" Call("Coder::CodeFold::CurrentCollapse")
"Выделить текущий блок" Call("Coder::CodeFold::CurrentSelect")
-?

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

San_dr
Ой, спасибо, знал, да забыл)))

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Instructor
а как управлять приоритетами у правил из QuotesRE?
Путём эксперимента - было установлено, что чем правило в списке выше - тем оно главнее.
Но не всегда: у меня никак не получается заставить такое правило

Code: Select all

0	`(")((?:[^"]*?(?:"")?)*?)("(?!"))` `\1=(2,#ff0000,0) \2=(3,#00ff00,0) \3=(3,#ff0000,0)`
перебивать остальные (если какое-то из них тоже сработало и окрасило строку по своему).

Если же правило заменить на

Code: Select all

0	`^.*(")((?:[^"]*?(?:"")?)*?)("(?!")).*$` `\1=(2,#ff0000,0) \2=(3,#00ff00,0) \3=(3,#ff0000,0)`
то оно начинает перебивать остальные, но так, что части, которые подпадают под .* становятся не окрашенными совсем.

Можно ли как-то задать правило так, чтобы у частей, которые не находятся ни в одной суб-группе - не терялась раскраска от остальных правил?

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.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Добавлено: параметр -2 для внешнего вызова с кодом 4 - найти отметки выделенного текста (Coder::HighLight).

Added: parameter -2 of external call with code 4 - find selected text marks (Coder::HighLight).


Coder plugin v12.3
Last edited by Instructor on Tue Feb 04, 2014 2:34 pm, edited 2 times in total.

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

Instructor wrote:Добавлено: параметр -2 для внешнего вызова с кодом 4 - найти отметки выделенного текста (Coder::HighLight).

Added: parameter -2 of external call with code 4 - find selected text marks (Coder::HighLight).


Coder plugin v12.3
Спасибо!
если выделить всю отметку, то все работает.
но хотелось бы чтобы можно было просто стать курсором в любое место отметки и найти следующую или предыдущую отметку такого же цвета. я думал что -1 такое делать и должно, а так вообще не понял чем отличается -1 от 0 - работает вроде на 100% одинаково.

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

Drugmix
Вывод из экспериментов: если последующее правило ЦЕЛИКОМ захватывает захваченное предыдущим, то сработает второе. Я для "особо важных" правил что-нибудь типа предваряющего пробела в правило включаю: пробел не подсветится, а менее важные, если пробелы не захватывают, не смогут сожрать.

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Serge Yolkin
не понял ничего: "последующее" - это то, которое выше, или то, которое ниже? (обычно в тексте "последующее = ниже", но тут же список так составлен, что более важные - вверху)
"второе" - это то которое "предыдущее" или "последующее"?
и примеры можно, пожалуйста?

У меня проблема в том, что есть 2 таких правила:
одно для раскрашивания текста в кавычках и оно составлено без якорей

Code: Select all

0	`(")((?:[^"]*?(?:"")?)*?)("(?!"))` `\1=(2,#ff0000,0) \2=(3,#00ff00,0) \3=(3,#ff0000,0)`
а другое - правило для раскрашивания команд и оно составлено с якорями (привязками к концу и начала строки)

Code: Select all

0	`^(.*::)?\s*(#ClipboardTimeout)(?:\s*,\s*|\s+)([^;,]+?)(\s+;.*)?$` `\1=(2,${STR},0) \2=(2,${OP},0) \3=(2,${VAR},#ff0000) \6=(3,${COMM},0)`
Если я напишу

Code: Select all

"text"
то эта строка раскрасится 1-ым правилом, и если напишу

Code: Select all

#ClipboardTimeout, text
то эта строка раскрасится 2-ым правилом.

Но если я напишу

Code: Select all

#ClipboardTimeout, "text"
то эта строка окрасится так, будто 1-го правила вообще нет, потому что 1-ое правило задано без якорей, а это, видимо, понижает его приоритете так, что любое правило с якорями - легко перебьёт его.

А хочется, чтобы строку раскрасили оба правила: чтобы она сначала целиком окрасилась 2-ым правилом, а потом те её части, которые подпадают под 1-ое правило - окрасились бы и им.

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

понял: при 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, но без необходимости выделения всей отметки - а то как бы совсем лишнее действие получается необходимо, а если текст с отметкой длинный, то довольно таки неудобное)
Locked