atom / text-buffer

Atom's underlying text buffer
MIT License
144 stars 73 forks source link

Replacing multiple characters with newlines in a scanInRange only replaces the first occurence #224

Open jazzpi opened 7 years ago

jazzpi commented 7 years ago

Prerequisites

(I didn't really want to factory reset but I'm fairly certain that wouldn't change anything, and this is not a feature request so no package searching)

Description

Replacing multiple characters with newlines (or carriage returns, but not alphanumeric characters or tabs!) in a TextBuffer.scanInRange only replaces the first occurence (but inserts more of the replacement without removing the pattern).

Steps to Reproduce

  1. Open a new file with the contents
    a,b,c
  2. In the developer console, execute atom.workspace.getActiveTextEditor().buffer.scanInRange(/,/g, [[0,0],[1,0]], function(args) {console.debug("found");args.replace('\n')})

Expected behavior: "found" should be output twice and the buffer should now contain

a
b
c

Actual behavior: "found" is actually output twice, but the buffer now contains

a

b,c

Reproduces how often: 100% of the time.

Versions

OS: Arch Linux

$ uname -r
4.9.11-1-ARCH
$ atom --version
Atom    : 1.15.0
Electron: 1.4.15
Chrome  : 53.0.2785.143
Node    : 6.5.0
$ apm --version
(node:1202) DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
apm  1.17.0
npm  4.4.1
node 7.7.3 x64
python 2.7.13
git 2.12.0

Additional Information

This used to work. I believe it might have been broken in https://github.com/atom/text-buffer/commit/7ad08bc4b3a1de7780a923e37aaba0d2a89cb5d7, but I don't really want to bisect.

50Wliu commented 7 years ago

Can you reproduce this using an official version of Atom, available at https://atom.io?

jazzpi commented 7 years ago

No, since atom.io doesn't provide an Arch Linux version and building from source breaks with Error: Cannot find module 'node-gyp/bin/node-gyp'. However, I believe the atom-editor-bin package I'm using actually installs Atom from the .deb package on atom.io, and the same issue also occurs on this Travis build.

jazzpi commented 7 years ago

This has been reproduced by @mkiken in https://github.com/lloeki/ex-mode/pull/178#issuecomment-287731613 using an official version of Atom.

sophaskins commented 7 years ago

An example failing spec for the issue is:

      it "works with newline splitting", ->
        buffer = new TextBuffer("abc,def,ghi")
        buffer.scanInRange /,/g, [[0,0], [1,0]], ({replace}) ->
          replace("\n")
        expect(buffer.getText()).toBe "abc\ndef\nghi"

I added this to a checkout of https://github.com/atom/text-buffer at master, and had the following failure:

Failures:
1) TextBuffer ::scanInRange(range, regex, fn) when given a regex with a global flag works with newline splitting
  Message:
    Expected 'abc

    def,ghi' to be 'abc
    def
    ghi'.
  Stack:
    Error: Expected 'abc

    def,ghi' to be 'abc
    def
    ghi'.
        at Object.<anonymous> (/home/sophaskins/development/text-buffer/spec/text-buffer-spec.coffee:1520:34)
        at runCallback (timers.js:672:20)
        at tryOnImmediate (timers.js:645:5)
        at processImmediate [as _immediateCallback] (timers.js:617:5)
hultberg commented 7 years ago

@50Wliu Any news on this issue? 😄