Code change:
<!-- Do you have a question? Please ask it on --- VSCode Version: 1.10.2 OS Version: Mac OSX (10.11.6) Steps to Reproduce: VS Code integrated terminal a relative path (eg. ) Description: Let's say you have a build system that outputs a stack trace on a build error or failed test. If this was run from the integrated terminal, the file paths in the output should be included as clickable links which can be clicked to open the file in VSCode. However, this only works if the path is either an absolute path (e.g. ) or a relative path that begins with "./". Many build systems and tools output file paths relative to the directory the command was run, without the leading "./", Karma for example. So the output would be something like: , not . The first is not matched by VSCode as an openable path, but the second is. I believe that what is determined to be a path comes from the Regex in "" Is there a reason why relative paths of this form (e.g. no leading "./") are not included?
The reason was because until 1.11 links aren't validated so there would be heaps of false positives. Performance was also a factor but it shouldn't impact that much really now that I think about it. Now that links are validated maybe we should be more lenient when linkifying.
I'll assign this to April but if someone wants to do a PR before then you're welcome. You will need to: Modify the regex to allow paths that are not qualified with , , etc. Make sure that the new path matcher does not conflict with previously matched links and does not create links with adjacent characters. Eg. we want to avoid this:
Nice. I'll write a PR...
That would be awesome :+1:
Fixed in

Related discussion:
text: }); } <del> private _resolvePath(link: string): TPromise<string> { </del> <ins> protected _preprocessPath(link: string): string { </ins> if (this._platform === platform.Platform.Windows) { // Resolve ~ -> %HOMEDRIVE%%HOMEPATH% if (link.charAt(0) === '~') { if (!process.env.HOMEDRIVE || !process.env.HOMEPATH) { <del> return TPromise.as(void 0); </del> <ins> return null; </ins> } link = `${process.env.HOMEDRIVE}${process.env.HOMEPATH + link.substring(1)}`; } <del> } else { // Resolve workspace path . / .. -> <path>/. / <path/.. if (link.charAt(0) === '.') { if (!this._contextService.hasWorkspace) { </del> <ins> // Resolve relative paths (.a, ..a, ~a, ab) if (!link.match('^' + winDrivePrefix)) { if (!this._contextService.hasWorkspace()) { </ins> // Abort if no workspace is open <del> return TPromise.as(void 0); </del> <ins> return null; </ins> } link = path.join(this._contextService.getWorkspace().resource.fsPath, link); } } <del> // Resolve workspace path . / .. -> <path>/. / <path/.. if (link.charAt(0) === '.') { if (!this._contextService.hasWorkspace) { </del> <ins> // Resolve workspace path . | .. | <relative_path> -> <path>/. | <path>/.. | <path>/<relative_path> else if (link.charAt(0) !== '/' && link.charAt(0) !== '~') { if (!this._contextService.hasWorkspace()) { </ins> // Abort if no workspace is open <del> return TPromise.as(void 0); </del> <ins> return null; </ins> } link = path.join(this._contextService.getWorkspace().resource.fsPath, link); } <ins> return link; } private _resolvePath(link: string): TPromise<string> { link = this._preprocessPath(link); if (!link) { return TPromise.as(void 0); } </ins> // Open an editor if the path exists return pfs.fileExists(link).then(isFile => {