[TxMt] Re: possible format strings bug
Allan Odgaard
mailinglist at textmate.org
Tue Apr 8 02:59:58 UTC 2014
On 8 Apr 2014, at 1:34, Matt Neuburg wrote:
> Find expression:
>
> (?<orig>hello)
>
> Replace expression:
>
> ${orig/(?<one>hey)?/${one:?howdy:scram}/}
>
> […] I expect _all_ of "hello" to be replaced by "scram". In other
> words, I expect the replace expression to be a calculation about what
> to put in place of the whole text found by the Find expression.
The second assertion here is correct. You ask TextMate to find
“hello” and replace it.
But your replacement text is effectively “$orig”, i.e. the original
string found.
What you do is a substitution on the “$orig” variable, but this
substitution is “replace ‘hey’ with ‘howdy’, and if you do not
find ‘hey’, insert ‘scram’”.
The problem is “not finding hey” expressed using “(hey)?” means
that zero bytes is considered “not finding ‘hey’”.
What you probably want is (I switched back to numbered captures for
readability):
${orig/(hey)|.+/${1:?howdy:scram}/}
What this regular expression says (‘(hey)|.+’) is “find ‘hey’
and put in capture $1 OR (‘|’) find anything (‘.+’)”.
So when it gets time to evalulate what to insert for what we found
(‘${1:?howdy:scram}’) then we either matched ‘hey’ and will
repalce that with ‘howdy’ or we replaced non-zero bytes of something
else, and will replace that with ‘scram’.
More information about the textmate
mailing list