Как написать Vimfoldexpr для файлов трассировки xdebug с помощью memdeltas
Вопрос
Я ничего не знаю о выражениях Vim.У меня есть vimfoldexpr, который поставляется с файлом синтаксиса для файлов трассировки 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
Может ли кто-нибудь сказать мне, как изменить исходное выражение, чтобы во втором примере свертывание работало правильно?Я не могу понять ни головы, ни хвоста.
Спасибо
Решение
Часть, которая читает
'^\\s.\\{20\\}\\(\\s\\+\\)\\?->.*$'
ищет начало строки [^
], затем 1 пробел [\\s
], затем любой символ на 20 повторений [.\\{20\\}
], затем, возможно, один или пробелы, запомненные на будущее [\\(\\s\\+\\)\\?
], и, наконец, стрелка плюс что-нибудь еще до конца строки [->.*$
].Если вы всегда собираетесь использовать дополнительный столбец, я бы просто изменил поиск по 20 символов на 30, например:
'^\\s.\\{30\\}\\(\\s\\+\\)\\?->.*$'
В противном случае вы можете попробовать диапазон, например:
'^\\s.\\{20,30\\}\\(\\s\\+\\)\\?->.*$'
На самом деле я не тестировал ни один из них, поэтому вам, возможно, придется немного подкорректировать цифры, но это должно помочь вам начать работу.