Страница 7 из 20

Добавлено: Чт июл 27, 2006 19:55
KF-121
sepa писал(а): 2KF-121
1. так и задумывалось, используй enter
2. если ты про QuickSearch то так и задумано
3. недостаток API листера. в плагин передается только строка и 4 атрибута:
lcs_findfirst Search from the beginning of the first displayed line (not set: find next)
lcs_matchcase The search string is to be treated case-sensitively.
lcs_wholewords Find whole words only.
lcs_backwards Search backwards towards the beginning of the file.
4. не дает работать? =)
5. подправил
6. подправил
7. ты выделять не забываешь?
8. ее и не делал и не собираюсь пока
9. пока не найти причину =(
10. ты чекбокс в опциях включал?
11. ты же тестер, сам знаешь что это плохое сообщение о баге =)
2. Ну и про QuickSearch тоже, и в основном поиске поже не работает. По крайней мере blabla*xxx не ищет!
3. А почемуже тогда это понимает родной листер? Надо предложить чтобы он поправил эту беду!
4. Да нет не мешает, но я думаю можно для Code Explorer`a придумать другое меню.
7. Конечно не забываю.
10. ОК поставил.
11. Так вот и не нашел из-за чего такая трабла, если кто знает подскажите.

А как прикрутить эти разборы функций к разным подсветкам?
Syn 0.7
[-]
1. При наведении в настройках на Edit Function RegEx, то вываливается ошибка "System Error. Code: 1400", Invalid Window Handle
2. При разборе функций отображается в Code Explorer слово Function а не имя ее
а пр такой строке (([fF])+unction|([Ss]+ub)), отобрадается F или f, в зависимости от того как написано слово.

Добавлено: Чт июл 27, 2006 21:22
Lev
При разборе функций отображается в Code Explorer слово Function а не имя ее
В данный момент именем функции считается содержимое вторых скобок регекспа
Хотелось бы завести поле для имени функции, типа:
FunctionName=$3

Добавлено: Пт июл 28, 2006 10:29
Batya
sepa писал(а):
И, поскольку поиск по Ctrl+F -> F3 и F7 -> F5 работают независимо, то есть ли горячая клавиша для очистки поля быстрого поиска, чтобы работало F7 -> F3?
не понял. один Search Next от Listera, другой от плагина и они не связаны. Когда у тебя не работает Shift-F3? если ты пользовался QuickSearch то в нем есть текст. Если Ctrl-R то тоже работает. А в листере нет SearchBack.
В листере прямой поиск далее - F3 или F5, обратный поиск - Shift+F3 или Shift+F5.
В Syn же обратный поиск работает только по Shift+F3 при заполненном QuickSearch.

Добавлено: Пт июл 28, 2006 10:43
WhiteWind
Позиция окна Setup где-то внизу - половина окна скрыта краем экрана.

2Lev:
РегЭксп для C/C++ не будет работать, вот поправленый вариант:

Код: Выделить всё

([A-Za-z]+)\s+([A-Za-z_][A-Za-z0-9_:]*)(\([^)]*\))
Мой РегЭксп для Паскаля:

Код: Выделить всё

(function|procedure)\s+([a-z_]+[a-z_0-9\.]+)\s*?(\([^\)]*?\))?\s*?(\:\s*?[0-9a-z]+)?\s*?\;?\s*?(\sbegin|\svar|\sconst|\stype|\{|//)

Добавлено: Пт июл 28, 2006 19:11
Lev
РегЭксп для C/C++ не будет работать
угу, я их кинул, чтобы было от чего оттолкнуться.
попробовал использовать несохраняющие скобки (?:...), чтобы обойти проблему вторых скобок в определителе имени функции - в результате получаю ошибку, с дальнейшим закрытием тотала

образец вышибающего тотал регэкспа (для VB, VBS и т.п.):

Код: Выделить всё

^(private|public|declare)?\s*(?:function|sub)\s*([A-Za-z]+[A-Za-z0-9_.]*\([^)]*\))

Добавлено: Пт июл 28, 2006 19:29
sepa
Кто понимает о чем речь, и кому интересно дальнейшее развитие, выскажите свое мнение здесь

Добавлено: Пн июл 31, 2006 11:54
Митяй
Более точный код для функций и переменных в C++

Код: Выделить всё

FunctionDetect=[A-Za-z]+\s+([A-Za-z_][A-Za-z0-9_]*::)?([A-Za-z_][A-Za-z0-9_]*)(\([^)]*\))
VariableDetect=([A-Za-z]+)\s+([A-Za-z_][A-Za-z0-9_]*)(\[[^\]+]\])?

Добавлено: Пн июл 31, 2006 22:18
sepa
Залажали значит scintill'у ! =) А я уже успел набросать листер на ней с табами. Ну ладно, тогда будем апдейтить этот.

2KF-121
2. blabla*xxx равносилен запросу "xxx". В твоем тексте есть xxx? У меня все нормально ищет
3. Дак родной листер полный доступ имеет к данным. А плагин может знать только то что ему передали и все. Предложить конечно можно, но как то там не очень работа движется по изменению API в версии 7. Ничего кардинально Гислер не решил менять.
4. ну я так и думал, но пока что CodeExplorer примитивный и там попап тот же что и на всех меню
7. я сам именно этой фишкой и пользуюсь а не Tab, Shift-Tab и все пашет вроде нормально. У кого нибудь еще Ctrl-Shift-U,I не работает?
9. нашел, теперь не падает.
10. работает?
А как прикрутить эти разборы функций к разным подсветкам?
так же как и раньше через опции (F9) или напрямую через дизайнер подсветок.
1. поподробней. просто мышку задержать над EditBox ?
2. почитай внимательней то, что я выше писал про создание DetectStrings. Он совершенно правильно выводит содержимое второй скобки.
Хотелось бы завести поле для имени функции, типа:FunctionName=$3
Да но хотелось бы стандартизации общей. Каков твой случай, может его можно обойти по другому?
В листере прямой поиск далее - F3 или F5, обратный поиск - Shift+F3 или Shift+F5.
наконец понял о чем речь, буду фиксить
Позиция окна Setup где-то внизу - половина окна скрыта краем экрана.
поправил, теперь будет по центру окна плагина.

Спасибо за тесты регекспов. Охота их уже утвердить и засунуть в подсветки дистрибутива, для тех людей которые не умеют их писать. Забыл упомянуть что поиск идет с модификаторами I, M. Так что можно не использовать [A-Za-z] а просто [a-z], так же ^ значит начало текста/строки. Предварительные результаты:
Apache
FunctionDetect=(\<IfModule)\s+([a-z0-9_\.]+)\>
Cpp
FunctionDetect=[a-z]+\s+([a-z_][a-z0-9_]*::)?([a-z_][a-z0-9_]*)(\([^)]*\))
VariableDetect=([a-z]+)\s+([a-z_][a-z0-9_]*)(\[[^\]+]\])?
CSS
FunctionDetect=(.*?)([a-z0-9\.\, \:]+)\{
Delphi
FunctionDetect=(function|procedure)\s+([a-z_]+[a-z_0-9\.]+)\s*?(\([^\)]*?\))?\s*?(\:\s*?[0-9a-z]+)?\s*?\;?\s*?(\sbegin|\svar|\sconst|\stype|\{|//)
INI, Reg, Txt
FunctionDetect=(^)(\[[^\[\]]+\])\s
Java,Perl, VB
(function|sub)\s*?([a-z]+[a-z0-9_.]*?)\s*?(\([^)]\))?\s*?\{
JavaScript
FunctionDetect=(function)\s+([a-z_]+[a-z_0-9]+)\s*?(\([^\)]*?\))?\s\;?\s*?\{
PHP
FunctionDetect=(function)\s+([a-z_]+[a-z_0-9]+)\;?\s*?(\([^\)]*?\))?\s*?\{
VariableDetect=([^\$])(\$[a-z_]+[0-9a-z_]+)(\[[^\]\$]+\])?
образец вышибающего тотал регэкспа (для VB, VBS и т.п.):
в приведеном тобой примере первые скобки не обязательны, соответственно проблема вторых скобок не стоит. "?" - значит что может быть, а может и НЕ быть. По поводу того что тотал падал, я наконец разобрался как ошибку перехватить в регекспе. Теперь будет окошко ошибки показывать.

Добавлено: Вт авг 01, 2006 11:29
Митяй
2sepa
Поставь RegExp`ы в

Код: Выделить всё

[/b], а то для C++ посередине строки смайлик :D

Добавлено: Вт авг 01, 2006 11:49
Митяй
Ещё более правильный код для C++:

Код: Выделить всё

FunctionDetect=^\s*[a-z_][a-z0-9_]+\s+([a-z_][a-z0-9_]*::)?~?([a-z_][a-z0-9_]*)(\([^)]*\))
Недостатки:
Код не распознаёт конструкторы и деструкторы:

Код: Выделить всё

TClass::TClass()
TClass::~TClass()
Добавляет function() если стоит код

Код: Выделить всё

if(i==0)
  ...
else
  function();
Считает функцией конструкцию

Код: Выделить всё

return function();
В последнем случае слово function() добавляется в список столько раз, сколько раз был вызван return.
2sepa
Пускай одинаковые функции добавляются в список только 1 раз.

Добавлено: Вт авг 01, 2006 15:30
Борис
В файле Cpp.hgl ЕСТЬ Фрагмент

Код: Выделить всё

	<CustomData>
		<Entry Name="CommentBlockStart" Value="/*"/>
		<Entry Name="CommentBlockMid" Value="# "/>
		<Entry Name="CommentBlockEnd" Value="*/"/>
		<Entry Name="FunctionDetect" Value="FunctionDetect=^\s*[a-z_][a-z0-9_]+\s+([a-z_][a-z0-9_]*::)?~?([a-z_][a-z0-9_]*)(\([^)]*\))"/>
		<Entry Name="VariableDetect" Value="VariableDetect=([a-z]+)\s+([a-z_][a-z0-9_]*)(\[[^\]+]\])?"/>
	</CustomData>
а в CodeExplorer - функций ноль, переменных ноль. Как лечить?

Добавлено: Вт авг 01, 2006 16:23
Митяй
2Борис
У меня по этим регэкспам всё находит. Ты другие пробовал?
А может у тебя просто имена функций не подходят под этот код. Определяются только те функции, которые объявлены и объявление должно стоять в начале строки. Например так:

Код: Выделить всё

int function(void)

Добавлено: Вт авг 01, 2006 16:31
Борис
2Митяй
Например, есть у меня

Код: Выделить всё

void CSortStringArray::Sort()
{
	BOOL bNotDone = TRUE;   
	while(bNotDone)   
	{
		bNotDone = FALSE;
		for(INT pos = 0; pos < GetUpperBound(); pos++)
			bNotDone |= CompareAndSwap(pos);   
	}
}
Вот тут и не находит

Добавлено: Вт авг 01, 2006 16:35
Митяй
Понял. Неправильно. Правильно так:

Код: Выделить всё

<CustomData>
      <Entry Name="CommentBlockStart" Value="/*"/>
      <Entry Name="CommentBlockMid" Value="# "/>
      <Entry Name="CommentBlockEnd" Value="*/"/>
      <Entry Name="FunctionDetect" Value="^\s*[a-z_][a-z0-9_]+\s+([a-z_][a-z0-9_]*::)?~?([a-z_][a-z0-9_]*)(\([^)]*\))"/>
      <Entry Name="VariableDetect" Value="([a-z]+)\s+([a-z_][a-z0-9_]*)(\[[^\]+]\])?"/>
   </CustomData> 
"FunctionDetect=" в значение поля вписывать не надо.

Добавлено: Вт авг 01, 2006 16:43
Lev
Java,Perl, VB
(function|sub)\s*?([a-z]+[a-z0-9_.]*?)\s*?(\([^)]\))?\s*?\{
ну и зачем Basic'у фигурные скобки?
мало того, что за подсветку для vbs выдаётся какая-то java подсветка реагирующая на расширение js, так теперь и новые стандарты языка пошли :)
"?" - значит что может быть, а может и НЕ быть
(?: ) - это группирующие несохраняющие скобки, номер им не присваивается и вторыми скобками в моём примере считаются скобки идущие за ними