t9md / atom-vim-mode-plus

vim-mode improved
https://atom.io/packages/vim-mode-plus
MIT License
1.4k stars 111 forks source link

Uncaught Error when searching with invalid character after backslash #1061

Open jacekkopecky opened 6 years ago

jacekkopecky commented 6 years ago

When I search with / and by mistake type \i, I get an exception.

This should probably be treated as a literal string search rather than a regexp search. Vim mode plus shouldn't throw an exception just because of a user typo.

debug info ```json { "atom": "1.25.1", "platform": "darwin", "release": "17.5.0", "vmpVersion": "1.32.0", "vmpConfig": { "groupChangesWhenLeavingInsertMode": false, "useSmartcaseForSearch": true, "wrapLeftRightMotion": true, "blackholeRegisteredOperators": [], "startInInsertModeScopes": [], "charactersToAddSpaceOnSurround": [], "highlightSearchExcludeScopes": [], "flashOnOperateBlacklist": [] } } ```

Steps to reproduce:

  1. press / to search
  2. type \i
  3. observe the exception

Atom: 1.25.1 x64 Electron: 1.7.11 OS: Mac OS X 10.13.4 Thrown From: vim-mode-plus package 1.32.0

Stack Trace

Uncaught Error: unrecognized character follows \

At /Applications/Atom.app/Contents/Resources/app.asar/node_modules/superstring/index.js:246

Error: unrecognized character follows \
    at TextBuffer.findAllInRangeSync (/app.asar/node_modules/superstring/index.js:246:44)
    at TextBuffer.module.exports.TextBuffer.findAllInRangeSync (/Applications/Atom.app/Contents/Resources/app/node_modules/text-buffer/lib/text-buffer.js:1167:32)
    at TextBuffer.module.exports.TextBuffer.scanInRange (/Applications/Atom.app/Contents/Resources/app/node_modules/text-buffer/lib/text-buffer.js:1080:32)
    at TextBuffer.module.exports.TextBuffer.scan (/Applications/Atom.app/Contents/Resources/app/node_modules/text-buffer/lib/text-buffer.js:1052:25)
    at TextEditor.scan (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:3363:30)
    at SearchModel.search (/packages/vim-mode-plus/lib/search-model.js:126:17)
    at Search.search (/packages/vim-mode-plus/lib/motion-search.js:101:26)
    at Search.handleChangeSearch (/packages/vim-mode-plus/lib/motion-search.js:190:12)
    at Function.module.exports.Emitter.simpleDispatch (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:25:20)
    at Emitter.module.exports.Emitter.emit (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:141:34)
    at SearchInput.editor.onDidChange (/packages/vim-mode-plus/lib/search-input.js:42:20)
    at Function.module.exports.Emitter.simpleDispatch (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:25:20)
    at Emitter.module.exports.Emitter.emit (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:141:34)
    at disposables.add.displayLayer.onDidChange.changes (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:595:26)
    at Function.module.exports.Emitter.simpleDispatch (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:25:20)
    at Emitter.module.exports.Emitter.emit (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:141:34)
    at DisplayLayer.emitDeferredChangeEvents (/Applications/Atom.app/Contents/Resources/app/node_modules/text-buffer/lib/display-layer.js:819:26)
    at TextBuffer.module.exports.TextBuffer.emitDidChangeTextEvent (/Applications/Atom.app/Contents/Resources/app/node_modules/text-buffer/lib/text-buffer.js:1756:30)
    at TextBuffer.module.exports.TextBuffer.transact (/Applications/Atom.app/Contents/Resources/app/node_modules/text-buffer/lib/text-buffer.js:975:18)
    at TextEditor.transact (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:1839:30)
    at mergeIntersectingSelections (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:1386:25)
    at TextEditor.mergeSelections (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:3249:53)
    at TextEditor.mergeIntersectingSelections (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:3223:42)
    at TextEditor.mutateSelectedText (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:1385:23)
    at TextEditor.insertText (/Applications/Atom.app/Contents/Resources/app/src/text-editor.js:1349:31)
    at TextEditorComponent.didTextInput (/Applications/Atom.app/Contents/Resources/app/src/text-editor-component.js:1654:30)

Commands

     -2:06.1.0 vim-mode-plus:yank (input.hidden-input)
  2x -2:01.6.0 vim-mode-plus:move-down (input.hidden-input)
     -2:00.5.0 vim-mode-plus:move-left (input.hidden-input)
     -2:00.1.0 vim-mode-plus:move-to-previous-word (input.hidden-input)
     -1:59.2.0 vim-mode-plus:activate-characterwise-visual-mode (input.hidden-input)
     -1:59.1.0 vim-mode-plus:move-to-end-of-word (input.hidden-input)
     -1:58.7.0 vim-mode-plus:yank (input.hidden-input)
     -0:38.7.0 pane:show-previous-item (input.hidden-input)
     -0:33 vim-mode-plus:search (input.hidden-input)
     -0:26.9.0 core:confirm (input.hidden-input)
     -0:22 vim-mode-plus:delete-left (input.hidden-input)
     -0:20.1.0 vim-mode-plus:undo (input.hidden-input)
     -0:19 vim-mode-plus:search (input.hidden-input)
     -0:18 core:backspace (input.hidden-input)
     -0:16.3.0 core:confirm (input.hidden-input)
     -0:03.0 vim-mode-plus:search (input.hidden-input)

Non-Core Packages

atom-fuzzy-grep 0.17.2 
atom-html-preview 0.2.5 
atom-jshint 2.0.0 
atom-material-syntax 1.0.8 
atom-material-syntax-light 0.4.6 
atom-material-ui 2.1.3 
atom-runner 2.7.1 
autocomplete-ctags 0.4.1 
base16-darker-high-contrast-syntax 1.5.1-0 
block-selection-mode 0.3.0 
busy-signal 1.4.3 
coffeescript-check 0.2.0 
cursor-history 0.13.1 
emmet-simplified 2.5.0 
figlet 0.5.4 
flow-ide 1.11.0 
foldername-tabs 0.2.4 
git-plus 7.10.2 
highlight-nbsp 0.1.1 
highlight-selected 0.13.1 
hip-light-ui-theme 1.1.1 
hyperclick 0.1.5 
imdone-atom 2.4.16 
incremental-search 5.2.2 
intentions 1.1.5 
jacek-ui-theme 0.1.1 
js-refactor 0.8.1 
jshint 1.8.6 
jumpy 4.2.0 
language-latex 1.1.1 
lazy-motion 0.7.0 
linter 2.2.0 
linter-csslint 2.0.0 
linter-eslint 8.4.1 
linter-htmlhint 1.4.0 
linter-json-lint 0.1.3 
linter-scss-lint 3.1.1 
linter-stylelint 4.2.0 
linter-tidy 2.3.1 
linter-ui-default 1.7.1 
markdown-toc 0.4.2 
material-ui 1.0.10 
merge-conflicts 1.4.5 
minimap 4.29.8 
multi-cursor 2.1.5 
multi-wrap-guide 1.1.5 
no-dock-arrows 1.0.1 
open-recent 5.0.0 
pipe 0.4.0 
refactor 0.11.5 
single-click-open 0.2.2 
solarized-light-ui 0.1.0 
sort-lines 0.18.0 
teletype 0.12.1 
two-light-ui 1.1.3 
vim-mode-plus 1.32.0 
t9md commented 6 years ago

Thanks for reporting. From quick investigation, this exception started from when editor.scan delegate work to superstring. Which introduce regex incompatibility between Js-Regex and PCRE(superstring).

Currently treat all user input as Regex at first and then fallback to regex-escaped-search when new RegExp was failed. But this time, new Regex("\i") success in JS work then passed to editor.scan which eventual superstring's PCRE engine to throw exception which doesn't recognize \i as invalid regex.

I need some time to think how the fix should be.