[TxMt] Re: replacement broken when using regexp look-ahead?

Erik Neumann erikn at myphysicslab.com
Fri Feb 17 16:38:19 UTC 2012

Ah, interesting.  I was unaware of the "replace all in selection" command
on the Find menu.  However, the "replace" button in the Find dialog seems
to do something different from the "replace all in selection" command.  The
"replace" button seems to be "do the find once in the selection, and then
replace the entire selection using the result of the first successful
match".  The explanation that the lookahead fails to match within the
selection explains the behavior.

For example, here is a regexp without look-ahead:
Find:  public ([^ ]+)
Replace: private $1
Regular expression: selected
public String toString() { }
public void makeFoo() { }
public void makeBar() { }

If I select this area of text and do "replace all in selection" from the
Find menu it replaces the 3 instances of "public" with "private", and the
selection range is preserved.  But if I click the replace button of the
Find dialog, then the entire selection is replaced by the result of the
first match, which is "private String".

I can use the "replace all" or "replace all in selection" as a workaround.
 Maybe put a note in the help file that the replace button is really
"replace selection with result of first match in selection"?


On Fri, Feb 17, 2012 at 4:33 AM, Allan Odgaard <mailinglist at textmate.org>wrote:

> On 17/02/2012, at 04.12, Erik Neumann wrote:
> > "replace all" works for me too.  Which makes me feel confident this is a
> bug and not a mistake on my part.
> This is basically the same as
> http://lists.macromates.com/textmate/2011-September/032978.html
> On 5 Sep 2011, at 05:06, Brandon M Fryslie wrote:

>* […] when I do Replace in Current Selection (shortcut or menu) nothing is replaced. […] My hunch says it has something to do with the negative lookbehind but I don't see any way in which I've used it incorrectly so I am stumped.*>* *>* Anyone have any suggestions or is this a bug?*
This is a bug / limitation: When you Replace in Selection and your
regexp matches text _outside_ the selection (via look-around
assertions) it will fail because it doesn’t have access to the text
outside the selection.

The only workaround is to ensure the stuff matched in the look-around
assertion is also part of the selection when using Replace in
Selection (or alternatively use Replace All).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macromates.com/textmate/attachments/20120217/be7f1bd1/attachment-0001.html>

More information about the textmate mailing list