Я просто попытался (наивно) собрать макрос для верхнего регистра произвольного набора зарезервированных слов SQL.
:nnoremap <leader>c :s/\(\<use\>\)\|\(\<create\>\)\|\(\<select\>\)\|\(\<update\>\)\|\(\<delete\>\)\|\(\<not\>\)\|\(\<null\>\)\|\(\<unique\>\)\|\(\<constraint\>\)\|\(\<references\>\)\|\(\<join\>\)\|\(\<on\>\)\|\(\<inner\>\)\|\(\<outer\>\)\|\(\<left\>\)\|\(\<group\>\)\|\(\<order\>\)\|\(\<having\>\)\|\(\<by\>\)/\U&/g<CR>
Макрос записан в мой .vimrc, который загружается нормально. Но когда я запускаю макрос, Vim выдает некоторые ошибки:
E872: (NFA regexp) Too many '('
E51: Too many \(
E476: Invalid command
Я искал, но ничего не нашел, чтобы указать, что есть ограничения на регулярные выражения. Я лучше всего понимаю ошибки, что мне не удалось что-то правильно избежать, но я не могу этого найти.
Я здесь превысил какой-то лимит регулярных выражений?
2 ответа
Дело не в ограничении количества символов в регулярном выражении, а в ограничении количества групп в вашем регулярном выражении.
Vim может обрабатывать не более 10 групп регулярных выражений (\0....\9
), я не считал ваши коды, но у вас должно быть более 10 групп в вашем регулярном выражении.
Константа (10) была определена в regexp.h
https://github.com/vim/vim/blob/0b9e4d1224522791c0dbbd45742cbd688be823f3/src/regexp.h#L22
И он использовался для проверки регулярного выражения пользователя, как здесь:
https://github.com/vim/vim/blob/af98a49dd0ef1661b4998f118151fddbf6e4df75/src/regexp.c#L1539
У вас могут быть только шаблоны захвата \ 1 .. \ 9. Если вам нужно больше группировок, но не нужно захватывать их все, вы можете использовать группы без захвата с синтаксисом \%(pattern\)
:
/abc\%(def\)ghi/
Похожие вопросы
Новые вопросы
vim
Vim - это бесплатный модальный текстовый редактор с открытым исходным кодом, доступный для большинства основных платформ. Это позволяет с высокой эффективностью выполнять многие задачи по редактированию текста, но имеет крутую кривую обучения. Чтобы изучить основы, запустите ": help vimtutor". Для вопросов, не связанных с программированием, используйте https://vi.stackexchange.com/.