Используя Vim, как вы используете переменную для хранения количества найденных паттернов? - PullRequest
5 голосов
/ 10 ноября 2011

Этот вопрос был полезен для подсчета определенного шаблона в Vim, но мне было бы полезно сохранить счет и суммировать результаты, чтобы я мог получить краткую сводку.

Я преподаю урок по основному HTML некоторым старшеклассникам и использую этот сценарий, чтобы быстро проверять количество необходимых элементов на всех их страницах, не покидая Vim. Он отлично работает, но когда у ученика более 10 .html файлов, становится сложным добавлять различные разделы вручную.

Что-то вроде:

img_sum = :bufdo %s/<img>//gen

было бы неплохо. Я думаю, что напишу скрипт ruby ​​для более тщательной проверки страниц и проверки структуры, но сейчас мне интересно узнать, как это сделать в Vim.

Ответы [ 2 ]

7 голосов
/ 10 ноября 2011

Проблема может быть решена с помощью счетчика, отдельного от встроенного в Команда :substitute: используйте переменную Vim-script для хранения номера шаблона Матчи. Удобный способ зарегистрировать каждый матч и изменить конкретный переменная, соответственно, это использовать замену с особенность выражения команды :substitute (см. :help sub-replace-\=). Идея состоит в том, чтобы использовать замену, которая оценивает выражение, увеличивающееся счетчик в каждом случае, и не меняет текст, который он работает на.

Первая часть техники не может быть реализована напрямую потому что запрещено использовать команды Ex в выражениях (включая \= замещающие выражения), и поэтому невозможно использовать :let Команда для изменения переменной. Ответ на вопрос " gVim найти / заменить со счетчиком", я предложил простой прием, чтобы преодолеть это ограничение, который основан на использовании списка из одного элемента (или словаря, содержащего один пара ключ-значение). Поскольку функция map() преобразует список или словарь вместо этого этот единственный элемент может быть изменен в контексте ограниченного выражения. Для этого нужно вызвать функцию map(), передав выражение вычисление нового значения вместе со списком, содержащим текущее значение.

Вторая половина техники - как избежать изменения текста при использовании команда замещения. Для этого можно сделать шаблон иметь нулевую ширину, добавляя \ze или добавляя к нему \zs атомов (см. :help /\zs, :help /\ze). Таким образом, измененный шаблон захватывает строка нулевой ширины непосредственно перед или после появления начального шаблон. Таким образом, если текст замены также пуст, замена не вызвать любое изменение содержимого буфера. Сделать замену выражение вычисляется в пустую строку, можно просто извлечь пустую подстрока или подсписок из результирующего значения этого выражения.

Обе идеи воплощаются в следующую команду.

:let n=[0] | bufdo %s/pattern\zs/\=map(n,'v:val+1')[1:]/ge
0 голосов
/ 27 июля 2012

Я думаю, что ответ выше трудно понять, и более симпатичный способ использовать внешнюю команду grep примерно так:

:let found=0
:bufdo let found=found+(system('grep "<p>" '.expand('%:p') . '| wc -l'))
:echo found
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...