XBrackets plugin

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 19
Joined: Sun Jan 17, 2016 5:41 pm

Post by nbsp »

I have added the backtick character to the user defined bracket pairs and it works ok. For the next line, however, the 2 backtick characters colored in red are not highlighted (those enclosing the second argument to /if):
akelpad /show(0) /if(`1`, `/Call("Scripts::Main", 7, 'AkelPad.MessageBox(0, "Test", "Caption", 64)')`, ``) /quit
If I change the enclosing characters for the `1` condition to single quotes ('1') or double quotes ("1"), the backticks enclosing "/Call" are highlighted:
akelpad /show(0) /if('1', `/Call("Scripts::Main", 7, 'AkelPad.MessageBox(0, "Test", "Caption", 64)')`, ``) /quit
This is the "XBrackets.ini" file:

Code: Select all

[Options]
OptionsFlags=307
HighlightRGB=0000FF00
HighlightBkRGB=00FFFF00
HtmlFileExts=htm; xml; php
Comment1FileExts=cs; java; js; php
common.user_brpairs=«» ‘’ “” ``
autobrackets.next_char_ok=.,!?:;<)]}"'>/ »’”`
autobrackets.prev_char_ok=([{<= «‘“`
autocomplete.all_autobr=0
autocomplete.ovr_autobr=0
autocomplete.sel_autobr=2
highlight.hlt_bothbr=1
highlight.hlt_style=3
highlight.quote_detect_lines=1
highlight.quote_max_lines=10
highlight.br_max_lines=0

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets tries to guess pair quotes, and in this case it can't. Let's take a closer look at the following text:

Code: Select all

`1`, `/Call("Scripts::Main", 7, 'AkelPad.MessageBox(0, "Test", "Caption", 64)')`, ``
The part

Code: Select all

`, `/Call("Scripts::Main", 7, 'AkelPad.MessageBox(0, "Test", "Caption", 64)')`, `
contains delimiters around the ` symbol in the beginning and in the end:

Code: Select all

`, `/

Code: Select all

)`, `
so it's not clear what direction to prefer to find the pair symbol.

Changing it to

Code: Select all

'1', `/Call("Scripts::Main", 7, 'AkelPad.MessageBox(0, "Test", "Caption", 64)')`, ``
or to

Code: Select all

`1`, `Call("Scripts::Main", 7, 'AkelPad.MessageBox(0, "Test", "Caption", 64)')`, ``
removes the ambiguity, and the pair of ` ` can be highlighted.
(In the first case the extra ` symbol to the left was removed, so it's clear that the first remaining ` symbol is the opening of the pair ` `.
In the second case the / symbol was removed, and the sequence `C is most likely the opening of the pair ` `.)
Probably this looks complicated, but this is how it works.
To have better results that rely on full text parsing rather than guessing, you can add ` ` to the Quotes section of the corresponding .coder file. In this case XBrackets will highlight pair symbols provided by the Coder plugin.

Offline
Posts: 19
Joined: Sun Jan 17, 2016 5:41 pm

Post by nbsp »

DV
Thank you very much for the detailed explanation.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets v.6.9
+ ничего не тянем из MSVCR = меньший размер файла

Дополнительно отмечу, что для достижения этого эффекта были обновлены файлы проектов и файлы .cmd для сборки под 2005, 2008 и 2013 Студией. Я пользуюсь вариантами Visual Studio Express, и для сборки под 2005 и 2008 дополнительно используется внешний SDK: Microsoft Platform SDK for Windows Server 2003 R2 или Microsoft SDK for Windows 7.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets v.7.0
+ теперь настройка "Пропускать экранированные скобки" учитывает расширение
файла (точно так же, как настройка "Пропускать скобки после //")

XBrackets v.7.1
* AkelPad 4.9.8+

XBrackets v.7.2
Ещё одно обновление поразительного плагина XBrackets!
Настоящий подарок для энтузиастов использования этого плагина!
Добавлена настройка 'highlight.hlt_xmode':
XBrackets-Rus.txt wrote:Эта настройка управляет тем, что использует XBrackets для поиска и
подсветки парных скобок. Позволяет отключить как запрос к AkelEdit
насчёт синтаксиса файла, так и внутренний алгоритм поиска парной
скобки. Предполагает использование в экспериментальных целях.
Значением настройки будет сумма следующих чисел, отвечающих за
поведение плагина:
1 - использовать внутренний алгоритм поиска парной скобки/кавычки;
2 - использовать AEM_HLGETHIGHLIGHT (подсветка, кавычки);
4 - использовать AEM_FINDFOLD (сворачиваемые блоки).

Offline
Posts: 202
Joined: Sat Mar 28, 2015 2:36 pm
Location: Russia

Post by Kley »

DV, Instructor
Если задать цвет для скобок, скажем #FFFF00, то в цветовой теме Sunburst скобки видно прекрасно, а вот в Earth - не разглядеть.
Нельзя ли добавить пару переменных в Coder плагин для: "Цвет скобок", "Цвет фона"?
Или такая возможность уже есть (менять цвет скобок при смене темы)? Ни как не соображу. Подскажите пожалуйста.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Kley,
В XBrackets можно одновременно задать и цвет скобок, и цвет фона (чтобы на этом фоне цвет скобок был виден).
А вообще у плагина XBrackets свои настройки, а у плагина Coder - свои, и изменение цветовой темы плагином Coder не влияет на выбранный в XBrackets цвет скобок.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Хотя предложенная выше идея вполне может быть реализована.

В XBrackets потребуется:
1. Изменить диалог настроек, добавив пункт "Брать цвет из Coder";
2. Добавить вычитку переменных из Coder по аналогии с плагином Lineboard, например;
3. Понять, когда именно следует перечитывать цвета из Coder.

В Coder потребуется:
1. Добавить переменные типа "XBrackets_FgColor" и "XBrackets_BkColor";
2. Придумать этим переменным подходящие цвета для каждой из тем подсветки.

Offline
Posts: 47
Joined: Sat Mar 10, 2018 11:35 am

Post by wertfds »

Как добавить такие скобки?:
/*
текст
*/

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

wertfds,
в текущей реализации єто невозможно, поддерживается только один символ на открывающую скобку/кавычку.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets v7.3
Что нового:
Значение настройки autocomplete.sel_autobr теперь можно установить в 3 или 4, получая "закавычивание" или "заскобывание" выделенного текста а-ля Sublime Text, когда текст в кавычках остаётся выделенным, а сами кавычки - нет.
Теперь autocomplete.sel_autobr=4 - мой любимый режим, в котором "закавычивание" и "раскавычивание" работают симметрично: первая печать левой скобки/кавычки окружает выделенный текст соответствующей парой скобок/кавычек, и повторная печать левой скобки/кавычки убирает обрамляющие скобки/кавычки.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets v7.4
+ новые функции: GoToNearestBracket, SelToNearestBrackets
+ новые настройки: nearestbr.goto_flags, nearestbr.selto_flags
+ теперь повторный вызов SelToMatchingBracket и SelToNearestBrackets перемещает каретку из конца выделения в начало выделения и наоборот


Это большое обновление. Объём изменений можно оценить по функции GetNearestBracketsRange и вызываемому из неё семейству функций с префиксом "NearestBr_", каждая из которых была написана с нуля. Разработка велась в несколько итераций, и версия 7.4 - это примерно восьмая итерация.
Изначально была одна небольшая функция, которая мало что умела помимо вызовов AEM_FINDFOLD и AEM_HLGETHIGHLIGHT. Затем стал совершенствоваться собственный алгоритм поиска ближайших скобок. В него добавилось наработки "оценочного" сравнения скобок, применяемого в GetHighlightIndexes. Функция поиска ближайших скобок стала слишком большой, и начала дробиться для лучшей читаемости. Затем потребовалось внести изменения в сам алгоритм поиска, в зависимости от ситуации, и дробление изначальной функции позволило дерижировать её отдельными составляющими как угодно. Несколько раз уточнялось поведение в "краевых условиях" - непосредственно перед или сразу после кавычки. Наконец, была добавлена поддержка значений XML-тэгов вида

Code: Select all

<tag>some value</tag>
На всё про всё ушло более половины вечеров с начала августа до почти середины сентября.
Это в некоторой степени должно объяснить, почему я не брался за это раньше, и почему не берусь за некоторые другие вещи.
На резонный вопрос о том, не слишком ли я всё усложняю и действительно ли были необходимы все эти описанные выше вещи, есть такой же резонный ответ: да, они были необходимы. Если бы я остановился, скажем, на третьей или четвёртой итерации, тут же посыпались бы отчёты об ошибках. Если бы остановился на пятой или шестой, чуть позже появились бы отзывы о неправильном поведении в "краевых" условиях и о том, что с XML-тэгами всё совсем плохо. (На самом деле, всё и сейчас не идеально - но, по крайней мере, достигнут разумный баланс между тем, как хотелось бы сделать и как удаётся сделать.)
Хотя, конечно, отдельные знатоки гораздо лучше меня понимают, что и как нужно делать, а мои скромные оценки задачи - не более чем понты:
http://akelpad.sourceforge.net/forum/vi ... &start=567

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

XBrackets v.7.5
* небольшие уточнения в GoToNearestBracket/SelToNearestBrackets
* 12 лет XBrackets! :)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

DV wrote:"закавычивание" или "заскобывание"
Правильно "заскобычивание" :P

Offline
Posts: 330
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

Я тут делал делал умный захват и в итоге нашёл эту возможность в XBrackets, хотя отчасти.
Тремя постами выше в общем ТЗ, то есть хоткеем расширять захват от выделенного.
Удобно было бы для HTML сделать и захват фолдинга, расширяя, а то для многих языков это не работает.


Примеры
Call("XBrackets::SelToMatchingBracket") - выделяет содержимое парных скобок ([{""}]), если курсор находится вплотную к одному из ([{""}])
Call("XBrackets::SelToNearestBrackets") - выделяет содержимое парных скобок ([{""}]), если курсор находится в любом месте между скобками
Call("XBrackets::GoToMatchingBracket") - делает прыжок к парной скобке ([{""}]), если курсор находится вплотную к одному из ([{""}])
Call("XBrackets::GoToNearestBracket") - делает прыжок к ближайшей парной скобке ([{""}]), если курсор находится в любом месте между скобками

Code: Select all

res = AkelPad.Call("XBrackets::SelToMatchingBracket", 1, lpBuffer);
что здесь делает единица?
Post Reply