aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bp.113
-rw-r--r--bp.1.md11
-rw-r--r--grammars/bp.bp3
3 files changed, 21 insertions, 6 deletions
diff --git a/bp.1 b/bp.1
index 3d082f5..2524840 100644
--- a/bp.1
+++ b/bp.1
@@ -203,9 +203,16 @@ Any one of the given escape sequences or ranges \f[I]esc1\f[R] or
\f[I]esc2\f[R] (e.g.\ \f[B]\[rs]r,n,x01-x04\f[R])
.TP
\f[B]\[rs]N\f[R]
-A special case escape that matches a \[lq]nodent\[rq]: one or more
-newlines followed by the same indentation that occurs on the current
-line.
+A special escape that matches a \[lq]nodent\[rq]: one or more newlines
+followed by the same indentation that occurs on the current line.
+.TP
+\f[B]\[rs]C\f[R]
+A special escape that always matches the empty string and replaces it
+with the indentation of the line on which it matched.
+For example, this pattern would match Bash-style heredocs that start
+with \[lq]<<-FOO\[rq] and end with a line containing only the starting
+indentation and the string \[lq]FOO\[rq]: \f[B]\[dq]<<-\[dq]
+\[at]end=(\[rs]C id) ..%\[rs]n (\[ha]end$)\f[R]
.TP
\f[B]\[rs]i\f[R]
An identifier character (e.g.\ alphanumeric characters or underscores).
diff --git a/bp.1.md b/bp.1.md
index 6995372..869ea42 100644
--- a/bp.1.md
+++ b/bp.1.md
@@ -169,8 +169,15 @@ can be combined with a comma (e.g. `` `a-z,A-Z ``).
: Any one of the given escape sequences or ranges *esc1* or *esc2* (e.g. `\r,n,x01-x04`)
`\N`
-: A special case escape that matches a "nodent": one or more newlines followed
-by the same indentation that occurs on the current line.
+: A special escape that matches a "nodent": one or more newlines followed by
+the same indentation that occurs on the current line.
+
+`\C`
+: A special escape that always matches the empty string and replaces it with
+the indentation of the line on which it matched. For example, this pattern
+would match Bash-style heredocs that start with "<<-FOO" and end with a line
+containing only the starting indentation and the string "FOO":
+`"<<-" @end=(\C id) ..%\n (^end$)`
`\i`
: An identifier character (e.g. alphanumeric characters or underscores).
diff --git a/grammars/bp.bp b/grammars/bp.bp
index 68d1ec8..2782934 100644
--- a/grammars/bp.bp
+++ b/grammars/bp.bp
@@ -15,7 +15,7 @@ Def: @name=id __ `: __ (
String-pattern: ..%(\n / Nodent / Identifier-char / Identifier-start / Escape / `\ pat [`;])$$
pat: simple-pat !(__("!~"/"~")) / suffixed-pat
-simple-pat: (Upto-and / Dot / Word-boundary/ String / Chars / Nodent
+simple-pat: (Upto-and / Dot / Word-boundary/ String / Chars / Nodent / Curdent
/ Identifier-char / Identifier-start / Escape-range
/ Escape / Repeat / Optional / No / After / Before / Capture
/ Start-of-File / Start-of-Line / End-of-File / End-of-Line / Ref / parens)
@@ -48,6 +48,7 @@ escape-sequence: (
)
No: `! (__@pat / @error=(=>"Expected a pattern after the exclamation mark"))
Nodent: "\N"
+Curdent: "\C"
Word-boundary: `| / "\b"
Identifier-char: "\i"
Identifier-start: "\I"