提交 e3673c6b 编写于 作者: D Daniel Imms

Support multiCursorModifier in terminal

Fixes #29541
上级 ff6b72fb
......@@ -15,6 +15,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager';
import { TPromise } from 'vs/base/common/winjs.base';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
const pathPrefix = '(\\.\\.?|\\~)';
const pathSeparatorClause = '\\/';
......@@ -66,7 +67,8 @@ export class TerminalLinkHandler {
private _platform: platform.Platform,
@IOpenerService private _openerService: IOpenerService,
@IWorkbenchEditorService private _editorService: IWorkbenchEditorService,
@IWorkspaceContextService private _contextService: IWorkspaceContextService
@IWorkspaceContextService private _contextService: IWorkspaceContextService,
@IConfigurationService private _configurationService: IConfigurationService
) {
const baseLocalLinkClause = _platform === platform.Platform.Windows ? winLocalLinkClause : unixLocalLinkClause;
// Append line and column number regex
......@@ -116,8 +118,8 @@ export class TerminalLinkHandler {
private _wrapLinkHandler(handler: (uri: string) => boolean | void): XtermLinkMatcherHandler {
return (event: MouseEvent, uri: string) => {
// Require ctrl/cmd on click
if (this._platform === platform.Platform.Mac ? !event.metaKey : !event.ctrlKey) {
// Require correct modifier on click
if (!this._isLinkActivationModifierDown(event)) {
event.preventDefault();
return false;
}
......@@ -163,22 +165,35 @@ export class TerminalLinkHandler {
callback(true);
}
private _isLinkActivationModifierDown(event: MouseEvent): boolean {
const editorConf = this._configurationService.getConfiguration<{ multiCursorModifier: 'ctrlCmd' | 'alt' }>('editor');
if (editorConf.multiCursorModifier === 'ctrlCmd') {
return !!event.altKey;
}
return platform.isMacintosh ? event.metaKey : event.ctrlKey;
}
private _getLinkHoverString(): string {
const editorConf = this._configurationService.getConfiguration<{ multiCursorModifier: 'ctrlCmd' | 'alt' }>('editor');
if (editorConf.multiCursorModifier === 'ctrlCmd') {
return nls.localize('terminalLinkHandler.followLinkAlt', 'Alt + click to follow link');
}
if (platform.isMacintosh) {
return nls.localize('terminalLinkHandler.followLinkCmd', 'Cmd + click to follow link');
}
return nls.localize('terminalLinkHandler.followLinkCtrl', 'Ctrl + click to follow link');
}
private _addTooltipEventListeners(element: HTMLElement): void {
let timeout = null;
let isMessageShowing = false;
this._hoverDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OVER, e => {
element.classList.toggle('active', platform.isMacintosh ? e.metaKey : e.ctrlKey);
element.classList.toggle('active', this._isLinkActivationModifierDown(e));
this._mouseMoveDisposable = dom.addDisposableListener(element, dom.EventType.MOUSE_MOVE, e => {
element.classList.toggle('active', platform.isMacintosh ? e.metaKey : e.ctrlKey);
element.classList.toggle('active', this._isLinkActivationModifierDown(e));
});
timeout = setTimeout(() => {
let message: string;
if (platform.isMacintosh) {
message = nls.localize('terminalLinkHandler.followLinkCmd', 'Cmd + click to follow link');
} else {
message = nls.localize('terminalLinkHandler.followLinkCtrl', 'Ctrl + click to follow link');
}
this._widgetManager.showMessage(element.offsetLeft, element.offsetTop, message);
this._widgetManager.showMessage(element.offsetLeft, element.offsetTop, this._getLinkHoverString());
isMessageShowing = true;
}, 500);
}));
......
......@@ -54,7 +54,7 @@ class TestWorkspace extends Workspace {
suite('Workbench - TerminalLinkHandler', () => {
suite('localLinkRegex', () => {
test('Windows', () => {
const terminalLinkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Windows, null, null, null);
const terminalLinkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Windows, null, null, null, null);
function testLink(link: string, linkUrl: string, lineNo?: string, columnNo?: string) {
assert.equal(terminalLinkHandler.extractLinkUrl(link), linkUrl);
assert.equal(terminalLinkHandler.extractLinkUrl(`:${link}:`), linkUrl);
......@@ -124,7 +124,7 @@ suite('Workbench - TerminalLinkHandler', () => {
});
test('Linux', () => {
const terminalLinkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Linux, null, null, null);
const terminalLinkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Linux, null, null, null, null);
function testLink(link: string, linkUrl: string, lineNo?: string, columnNo?: string) {
assert.equal(terminalLinkHandler.extractLinkUrl(link), linkUrl);
assert.equal(terminalLinkHandler.extractLinkUrl(`:${link}:`), linkUrl);
......@@ -188,7 +188,7 @@ suite('Workbench - TerminalLinkHandler', () => {
suite('preprocessPath', () => {
test('Windows', () => {
const linkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Windows, null, null,
new TestContextService(new TestWorkspace('C:\\base')));
new TestContextService(new TestWorkspace('C:\\base')), null);
let stub = sinon.stub(path, 'join', function (arg1, arg2) {
return arg1 + '\\' + arg2;
......@@ -202,7 +202,7 @@ suite('Workbench - TerminalLinkHandler', () => {
test('Linux', () => {
const linkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Linux, null, null,
new TestContextService(new TestWorkspace('/base')));
new TestContextService(new TestWorkspace('/base')), null);
let stub = sinon.stub(path, 'join', function (arg1, arg2) {
return arg1 + '/' + arg2;
......@@ -215,7 +215,7 @@ suite('Workbench - TerminalLinkHandler', () => {
});
test('No Workspace', () => {
const linkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Linux, null, null, new TestContextService(null));
const linkHandler = new TestTerminalLinkHandler(new TestXterm(), Platform.Linux, null, null, new TestContextService(null), null);
assert.equal(linkHandler.preprocessPath('./src/file1'), null);
assert.equal(linkHandler.preprocessPath('src/file2'), null);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册