Как написать Vim foldexpr для файлов трассировки xdebug с помощью memdeltas - PullRequest
2 голосов
/ 05 февраля 2009

Я ничего не знаю о выражениях 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 

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

Спасибо

1 Ответ

2 голосов
/ 05 февраля 2009

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

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

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

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

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

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

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

...