Как написать Vim foldexpr для файлов трассировки xdebug с помощью memdeltas

Я ничего не знаю о выражениях Vim. У меня есть vim foldexpr, который поставляется с файлом синтаксиса для файлов трассировки xdebug. Существующее выражение выглядит так:

foldexpr=strlen(substitute(substitute(substitute(substitute(getline(v:lnum),'^TR.*$','',''),'\\s>=>','->',\"g\"),'^\\s.\\{20\\}\\(\\s\\+\\)\\?->.*$','\\1',''),'\\s\\s','\',\"g\"))-2

Это работает нормально для файлов трассировки по умолчанию, которые выглядят следующим образом:

0.0974    3908596     -> GenericDispatcher->dispatch() /home/tomw/source/public_html/main.php:49
0.0975    3908676       -> ReflectionClass->getMethods() /home/tomw/source/presentation/framework/routing/GenericDispatcher.php:59
0.0975    3910532       -> ReflectionFunctionAbstract->getName() /home/tomw/source/presentation/framework/routing/GenericDispatcher.php:60

и т.п.

Однако, если вы настроите Xdebug для отображения дельт памяти в трассировке, файлы трассировки будут выглядеть так (обратите внимание на дополнительный столбец с дельтами памяти, например +80):

0.0964    3908336      +84     -> GenericDispatcher->dispatch() /home/tomw/source/public_html/main.php:49
0.0965    3908416      +80       -> ReflectionClass->getMethods() /home/tomw/source/presentation/framework/routing/GenericDispatcher.php:59
0.0965    3910272    +1856       -> ReflectionFunctionAbstract->getName() /home/tomw/source/presentation/framework/routing/GenericDispatcher.php:60 

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

Спасибо


person EvilPuppetMaster    schedule 05.02.2009    source источник


Ответы (1)


Часть, которая читает

'^\\s.\\{20\\}\\(\\s\\+\\)\\?->.*$'

ищет начало строки [^], затем 1 пробел [\\s], затем любой символ на 20 повторений [.\\{20\\}], затем опционально один или пробелы, запомненные на потом [\\(\\s\\+\\)\\?], и, наконец, стрелку плюс что-нибудь еще к конец строки [->.*$]. Если вы всегда будете использовать дополнительный столбец, я бы просто изменил 20-символьный поиск на 30, например:

'^\\s.\\{30\\}\\(\\s\\+\\)\\?->.*$'

В противном случае вы можете попробовать диапазон, например:

'^\\s.\\{20,30\\}\\(\\s\\+\\)\\?->.*$'

На самом деле я не тестировал ни один из них, поэтому вам, возможно, придется немного изменить цифры, но это должно помочь вам начать работу.

person Caleb Huitt - cjhuitt    schedule 05.02.2009