diff --git a/src/vimscript/pattern.ts b/src/vimscript/pattern.ts index 230cb3b6b5a..ba945f73a47 100644 --- a/src/vimscript/pattern.ts +++ b/src/vimscript/pattern.ts @@ -305,10 +305,13 @@ export class Pattern { caseOverride, ignoreSmartcase: args.ignoreSmartcase ?? false, }); + + const jsPatternString = Pattern.convertToJsCompatiblePattern(patternString); + return new Pattern( patternString, args.direction, - Pattern.compileRegex(patternString, ignoreCase), + Pattern.compileRegex(jsPatternString, ignoreCase), inSelection ?? false, closed, emptyBranch, @@ -328,6 +331,10 @@ export class Pattern { return configuration.ignorecase; } + private static convertToJsCompatiblePattern(patternString: string): string { + return patternString.replace(/\\\(/g, '(').replace(/\\\)/g, ')'); + } + private constructor( patternString: string, direction: SearchDirection, diff --git a/test/search/search.test.ts b/test/search/search.test.ts index 2b34da6ed44..bcf388bfba3 100644 --- a/test/search/search.test.ts +++ b/test/search/search.test.ts @@ -16,6 +16,13 @@ suite('Search (/ and ?)', () => { end: ['', 'one tw|o2o'], }); + newTest({ + title: '/ can search with regex groupings (search for sequence of aX where X is not b)', + start: ['|', 'ab ac'], + keysPressed: '/a\\([^b]\\)\n', + end: ['', 'ab |ac'], + }); + newTest({ title: '/ can search with newline', start: ['|asdf', '__asdf', 'asdf'],