" File: explainpat.vim
" Created: 2011 Nov 02
-" Last Change: 2017 Oct 20
-" Version: 0.7
+" Last Change: 2017 Dec 15
+" Version: 0.9
" Author: Andy Wokula <anwoku@yahoo.de>
" License: Vim License, see :h license
" >=1 at pos 0 or after '\|', '\&', '\(', '\%(' or '\n'; else 0 or less:
let s:at_begin_of_pat = 1
- let hulit = a:0>=1 && type(a:1)==s:DICT ? a:1 : s:NewHelpPrinter()
+ let hulit = a:0>=1 && type(a:1)==s:DICT ? a:1 : explainpat#NewHelpPrinter()
call hulit.AddIndent(' ')
let bull = s:NewTokenBiter(magicpat)
while !bull.AtEnd()
let s:LIST = type([])
" }}}
-let s:magic_item_pattern = '\C^\%(\\\%(@<\|%#=\|%[dxouU[(^$V#<>]\=\|z[1-9se(]\|@[>=!]\|_[[^$.]\=\|.\)\|.\)'
+let s:magic_item_pattern = '\C^\%(\\\%(%#=\|%[dxouU[(^$V#<>]\=\|z[1-9se(]\|@[>=!]\=\|_[[^$.]\=\|.\)\|.\)'
let s:doc = {} " {{{
" this is all the help data ...
let s:doc['\@!'] = "(assertion) forbid match for preceding atom"
func! s:DocBefore(bull, hulit, item) "{{{
- let rest = a:bull.Bite('^[=!]')
- if rest == "="
+ let rest = a:bull.Bite('^\d*\%[<[=!]]')
+ if rest == "<="
call a:hulit.Print(a:item.rest, "(assertion) require match for preceding atom to the left")
- elseif rest == "!"
+ elseif rest == "<!"
call a:hulit.Print(a:item.rest, "(assertion) forbid match for preceding atom to the left")
+ elseif rest =~ '^\d\+<='
+ call a:hulit.Print(a:item.rest, printf("(assertion) like `\\@<=', looking back at most %s bytes (since Vim 7.3.1037)", s:SillyCheck(matchstr(rest, '\d\+'))))
+ elseif rest =~ '^\d\+<!'
+ call a:hulit.Print(a:item.rest, printf("(assertion) like `\\@<!', looking back at most %s bytes (since Vim 7.3.1037)", s:SillyCheck(matchstr(rest, '\d\+'))))
else
- call a:hulit.Print(a:item.rest, "(invalid) `\\@<' must be followed by `=' or `!'")
+ call a:hulit.Print(a:item.rest, "(invalid) incomplete item")
endif
endfunc "}}}
-let s:doc['\@<'] = function("s:DocBefore")
+let s:doc['\@'] = function("s:DocBefore")
func! s:DocCircumFlex(bull, hulit, item) "{{{
if s:at_begin_of_pat >= 1
" \V
"}}}
-func! s:NewHelpPrinter() "{{{
+" {{{
+func! s:SillyCheck(digits) "{{{
+ return strlen(a:digits) < 10 ? a:digits : '{silly large number}'
+endfunc "}}}
+" }}}
+
+func! explainpat#NewHelpPrinter() "{{{
let obj = {}
let obj.literals = ''
let obj.indents = []
*explainpat.txt* Give detailed help on a regexp pattern.
- For Vim version 7.0. Last change: 2017 Oct 20
+ For Vim version 7.0. Last change: 2017 Dec 15
By Andy Wokula <anwoku@yahoo.de>
*explainpat* *explainpat.vim*
a explain pattern from register a
etc.
+>
+ :ExplainPattern \C^\%(\\\%(@<\|%#=\|%[dxouU[(^$V#<>]\=\|z[1-9se(]\|@[>=!]\|_[[^$.]\=\|.\)\|.\)
+
Notes:
The pattern is first converted into a purely |magic| pattern using
|nwo#magic#MakeMagic()|. This means that embedded |/\V| |/\M| |/\m| |/\v|
==============================================================================
TODO:
+? `\%[...]` can be nested? But documentation |/\%[]| says no.
Ideas:
- If the user already knows regular expressions but of a different kind,
==============================================================================
History:
+v0.9
++ BF accept `\@123<=` and `\@123<!`
+
+v0.8
+* s:NewHelpPrinter() => explainpat#NewHelpPrinter()
+
v0.7
+ BF `\{3,4\}` not accepted, only `\{3,4}`