提交 5c28e68b 编写于 作者: S Sandeep Somavarapu

move command - add more actions support

上级 84db2cb3
......@@ -9,10 +9,12 @@ import {IEditorService} from 'vs/platform/editor/common/editor';
import {ServicesAccessor} from 'vs/platform/instantiation/common/instantiation';
import {IKeybindings, KbExpr} from 'vs/platform/keybinding/common/keybinding';
import {ICommandDescriptor, KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry';
import {ICommandHandlerDescription} from 'vs/platform/commands/common/commands';
import * as editorCommon from 'vs/editor/common/editorCommon';
import {ICodeEditorService} from 'vs/editor/common/services/codeEditorService';
const H = editorCommon.Handler;
const D = editorCommon.CommandDescription;
export function findFocusedEditor(commandId: string, accessor: ServicesAccessor, complain: boolean): editorCommon.ICommonCodeEditor {
let editor = accessor.get(ICodeEditorService).getFocusedCodeEditor();
......@@ -54,17 +56,18 @@ function triggerEditorHandler(handlerId: string, accessor: ServicesAccessor, arg
});
}
function registerCoreCommand(handlerId: string, kb: IKeybindings, weight: number = KeybindingsRegistry.WEIGHT.editorCore(), when?: KbExpr): void {
function registerCoreCommand(handlerId: string, kb: IKeybindings, weight?: number, when?: KbExpr, description?: ICommandHandlerDescription): void {
let desc: ICommandDescriptor = {
id: handlerId,
handler: triggerEditorHandler.bind(null, handlerId),
weight: weight,
weight: weight ? weight : KeybindingsRegistry.WEIGHT.editorCore(),
when: (when ? when : KbExpr.has(editorCommon.KEYBINDING_CONTEXT_EDITOR_TEXT_FOCUS)),
primary: kb.primary,
secondary: kb.secondary,
win: kb.win,
mac: kb.mac,
linux: kb.linux
linux: kb.linux,
description: description
};
KeybindingsRegistry.registerCommandDesc(desc);
}
......@@ -155,7 +158,7 @@ function getWordNavigationKB(shift:boolean, key:KeyCode): number {
// Control+Command+shift+d => noop
// Register cursor commands
registerCoreCommand(H.CursorMove, { primary: null });
registerCoreCommand(H.CursorMove, { primary: null }, null, null, D.CursorMove);
registerCoreCommand(H.CursorLeft, {
primary: KeyCode.LeftArrow,
......
......@@ -1129,7 +1129,7 @@ export class Cursor extends EventEmitter {
}
private _move(inSelectionMode:boolean, ctx: IMultipleCursorOperationContext): boolean {
return this._invokeForAll(ctx, (cursorIndex: number, oneCursor: OneCursor, oneCtx: IOneCursorOperationContext) => OneCursorOp.move(oneCursor, inSelectionMode, ctx.eventData.viewPosition, ctx.eventSource, oneCtx));
return this._invokeForAll(ctx, (cursorIndex: number, oneCursor: OneCursor, oneCtx: IOneCursorOperationContext) => OneCursorOp.move(oneCursor, inSelectionMode, ctx.eventData.to, ctx.eventSource, oneCtx));
}
private _columnSelectToLineNumber: number = 0;
......
......@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
'use strict';
import {onUnexpectedError} from 'vs/base/common/errors';
import {onUnexpectedError, illegalArgument} from 'vs/base/common/errors';
import * as strings from 'vs/base/common/strings';
import types = require('vs/base/common/types');
import {ReplaceCommand, ReplaceCommandWithOffsetCursorState, ReplaceCommandWithoutChangingPosition} from 'vs/editor/common/commands/replaceCommand';
......@@ -552,6 +552,18 @@ export class OneCursor {
public getViewLineMaxColumn(lineNumber:number): number {
return this.viewModelHelper.viewModel.getLineMaxColumn(lineNumber);
}
public getViewLineMinColumn(lineNumber:number): number {
return this.viewModelHelper.viewModel.getLineMinColumn(lineNumber);
}
public getViewLineCenterColumn(lineNumber:number): number {
return Math.round((this.getViewLineMaxColumn(lineNumber) + this.getViewLineMinColumn(lineNumber)) / 2);
}
public getViewLineFirstNonWhiteSpaceColumn(lineNumber:number): number {
return this.viewModelHelper.viewModel.getLineFirstNonWhitespaceColumn(lineNumber);
}
public getViewLineLastNonWhiteSpaceColumn(lineNumber:number): number {
return this.viewModelHelper.viewModel.getLineLastNonWhitespaceColumn(lineNumber);
}
public getLeftOfViewPosition(lineNumber:number, column:number): editorCommon.IPosition {
return this.helper.getLeftOfPosition(this.viewModelHelper.viewModel, lineNumber, column);
}
......@@ -567,12 +579,6 @@ export class OneCursor {
public getColumnAtBeginningOfViewLine(lineNumber:number, column:number): number {
return this.helper.getColumnAtBeginningOfLine(this.viewModelHelper.viewModel, lineNumber, column);
}
public getViewLineMinColumn(lineNumber:number): number {
return this.viewModelHelper.viewModel.getLineMinColumn(lineNumber);
}
public getViewLineFirstNonWhiteSpaceColumn(lineNumber:number): number {
return this.viewModelHelper.viewModel.getLineFirstNonWhitespaceColumn(lineNumber);
}
public getColumnAtEndOfViewLine(lineNumber:number, column:number): number {
return this.helper.getColumnAtEndOfLine(this.viewModelHelper.viewModel, lineNumber, column);
}
......@@ -630,14 +636,12 @@ export class OneCursorOp {
}
public static move(cursor:OneCursor, inSelectionMode: boolean, to:editorCommon.IPosition | string, eventSource: string, ctx: IOneCursorOperationContext): boolean {
if (!to) {
illegalArgument('to');
}
if (types.isString(to)) {
switch (to) {
case editorCommon.ViewPosition.FirstCharacterOfLine:
return this.moveToFirstColumnOfLine(cursor, inSelectionMode, ctx);
case editorCommon.ViewPosition.FirstNonWhiteSpaceCharacterOfLine:
return this.moveToFirstNonWhiteSpaceColumnOfLine(cursor, inSelectionMode, ctx);
}
return false;
return this._move(cursor, inSelectionMode, to, ctx);
}
let viewPosition: editorCommon.IPosition= <editorCommon.IPosition>to;
......@@ -645,7 +649,6 @@ export class OneCursorOp {
if (eventSource === 'api') {
ctx.shouldRevealVerticalInCenter = true;
}
if (reason) {
ctx.cursorPositionChangeReason = reason;
}
......@@ -653,6 +656,34 @@ export class OneCursorOp {
return true;
}
private static _move(cursor:OneCursor, inSelectionMode: boolean, viewPosition:string, ctx: IOneCursorOperationContext): boolean {
let validatedViewPosition = cursor.getValidViewPosition();
let viewLineNumber = validatedViewPosition.lineNumber;
let viewColumn;
switch (viewPosition) {
case editorCommon.ViewPosition.LineStart:
viewColumn = cursor.getViewLineMinColumn(viewLineNumber);
break;
case editorCommon.ViewPosition.LineFirstNonWhitespaceCharacter:
viewColumn = cursor.getViewLineFirstNonWhiteSpaceColumn(viewLineNumber);
break;
case editorCommon.ViewPosition.LineCenter:
viewColumn = cursor.getViewLineCenterColumn(viewLineNumber);
break;
case editorCommon.ViewPosition.LineEnd:
viewColumn = cursor.getViewLineMaxColumn(viewLineNumber);
break;
case editorCommon.ViewPosition.LineLastNonWhitespaceCharacter:
viewColumn = cursor.getViewLineLastNonWhiteSpaceColumn(viewLineNumber);
break;
default:
return false;
}
ctx.cursorPositionChangeReason = editorCommon.CursorChangeReason.Explicit;
cursor.moveViewPosition(inSelectionMode, viewLineNumber, viewColumn, 0, true);
return true;
}
private static _columnSelectOp(cursor:OneCursor, toViewLineNumber:number, toViewVisualColumn: number): IColumnSelectResult {
let viewStartSelection = cursor.getViewSelection();
let fromVisibleColumn = cursor.getViewVisibleColumnFromColumn(viewStartSelection.selectionStartLineNumber, viewStartSelection.selectionStartColumn);
......@@ -930,26 +961,6 @@ export class OneCursorOp {
return true;
}
public static moveToFirstColumnOfLine(cursor:OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean {
let validatedViewPosition = cursor.getValidViewPosition();
let viewLineNumber = validatedViewPosition.lineNumber;
let viewColumn = cursor.getViewLineMinColumn(viewLineNumber);
ctx.cursorPositionChangeReason = editorCommon.CursorChangeReason.Explicit;
cursor.moveViewPosition(inSelectionMode, viewLineNumber, viewColumn, 0, true);
return true;
}
public static moveToFirstNonWhiteSpaceColumnOfLine(cursor:OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean {
let validatedViewPosition = cursor.getValidViewPosition();
let viewLineNumber = validatedViewPosition.lineNumber;
let viewColumn = cursor.getViewLineFirstNonWhiteSpaceColumn(viewLineNumber);
ctx.cursorPositionChangeReason = editorCommon.CursorChangeReason.Explicit;
cursor.moveViewPosition(inSelectionMode, viewLineNumber, viewColumn, 0, true);
return true;
}
public static moveToEndOfLine(cursor:OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean {
let validatedViewPosition = cursor.getValidViewPosition();
let viewLineNumber = validatedViewPosition.lineNumber;
......
......@@ -4,9 +4,11 @@
*--------------------------------------------------------------------------------------------*/
'use strict';
import nls = require('vs/nls');
import {IAction} from 'vs/base/common/actions';
import {IEventEmitter, BulkListenerCallback} from 'vs/base/common/eventEmitter';
import {MarkedString} from 'vs/base/common/htmlContent';
import types = require('vs/base/common/types');
import URI from 'vs/base/common/uri';
import {TPromise} from 'vs/base/common/winjs.base';
import {IInstantiationService, IConstructorSignature1, IConstructorSignature2} from 'vs/platform/instantiation/common/instantiation';
......@@ -19,6 +21,7 @@ import {Range} from 'vs/editor/common/core/range';
import {Selection} from 'vs/editor/common/core/selection';
import {ModeTransition} from 'vs/editor/common/core/modeTransition';
import {IndentRange} from 'vs/editor/common/model/indentRanges';
import {ICommandHandlerDescription} from 'vs/platform/commands/common/commands';
/**
* @internal
......@@ -4167,8 +4170,27 @@ export var EventType = {
* Positions on the view
*/
export const ViewPosition = {
FirstCharacterOfLine: 'firstCharacterOfLine',
FirstNonWhiteSpaceCharacterOfLine: 'firstNonWhiteSpaceCharacterOfLine'
LineStart: 'lineStart',
LineFirstNonWhitespaceCharacter: 'lineFirstNonWhitespaceCharacter',
LineCenter: 'lineCenter',
LineEnd: 'lineEnd',
LineLastNonWhitespaceCharacter: 'lineLastNonWhitespaceCharacter'
};
/**
* @internal
*/
export var CommandDescription= {
CursorMove: <ICommandHandlerDescription>{
description: nls.localize('editorCommand.cursorMove.description', "Move cursor to a logical position in the view"),
args: [
{
name: 'Logical position argument',
description: nls.localize('editorCommand.cursorMove.arg.description', "A logical position in the view"),
constraint: (arg) => types.isObject(arg) && types.isString(arg.to)
}
]
}
};
/**
......
......@@ -36,12 +36,28 @@ function move(cursor: Cursor, args: any) {
cursorCommand(cursor, H.CursorMove, args);
}
function moveToFirstCharacterOfLine(cursor: Cursor) {
move(cursor, {viewPosition: ViewPosition.FirstCharacterOfLine});
function moveToLineStart(cursor: Cursor) {
move(cursor, {to: ViewPosition.LineStart});
}
function moveToFirstNonWhiteSpaceCharacterOfLine(cursor: Cursor) {
move(cursor, {viewPosition: ViewPosition.FirstNonWhiteSpaceCharacterOfLine});
function moveToLineFirstNonWhiteSpaceCharacter(cursor: Cursor) {
move(cursor, {to: ViewPosition.LineFirstNonWhitespaceCharacter});
}
function moveToLineCenter(cursor: Cursor) {
move(cursor, {to: ViewPosition.LineCenter});
}
function moveToLineEnd(cursor: Cursor) {
move(cursor, {to: ViewPosition.LineEnd});
}
function moveToLineLastNonWhiteSpaceCharacter(cursor: Cursor) {
move(cursor, {to: ViewPosition.LineLastNonWhitespaceCharacter});
}
function moveToPosition(cursor: Cursor, lineNumber: number, column: number) {
move(cursor, {to: new Position(lineNumber, column)});
}
function moveTo(cursor: Cursor, lineNumber: number, column: number, inSelectionMode: boolean = false) {
......@@ -209,40 +225,105 @@ suite('Editor Controller - Cursor', () => {
test('move to first character of line from middle', () => {
moveTo(thisCursor, 1, 8);
moveToFirstCharacterOfLine(thisCursor);
moveToLineStart(thisCursor);
cursorEqual(thisCursor, 1, 1);
});
test('move to first character of line from first non white space character', () => {
moveTo(thisCursor, 1, 6);
moveToFirstCharacterOfLine(thisCursor);
moveToLineStart(thisCursor);
cursorEqual(thisCursor, 1, 1);
});
test('move to first character of line from first character', () => {
moveTo(thisCursor, 1, 1);
moveToFirstCharacterOfLine(thisCursor);
moveToLineStart(thisCursor);
cursorEqual(thisCursor, 1, 1);
});
test('move to first non white space character of line from middle', () => {
moveTo(thisCursor, 1, 8);
moveToFirstNonWhiteSpaceCharacterOfLine(thisCursor);
moveToLineFirstNonWhiteSpaceCharacter(thisCursor);
cursorEqual(thisCursor, 1, 6);
});
test('move to first non white space character of line from first non white space character', () => {
moveTo(thisCursor, 1, 6);
moveToFirstNonWhiteSpaceCharacterOfLine(thisCursor);
moveToLineFirstNonWhiteSpaceCharacter(thisCursor);
cursorEqual(thisCursor, 1, 6);
});
test('move to first non white space character of line from first character', () => {
moveTo(thisCursor, 1, 1);
moveToFirstNonWhiteSpaceCharacterOfLine(thisCursor);
moveToLineFirstNonWhiteSpaceCharacter(thisCursor);
cursorEqual(thisCursor, 1, 6);
});
test('move to end of line from middle', () => {
moveTo(thisCursor, 1, 8);
moveToLineEnd(thisCursor);
cursorEqual(thisCursor, 1, LINE1.length + 1);
});
test('move to end of line from last non white space character', () => {
moveTo(thisCursor, 1, LINE1.length - 1);
moveToLineEnd(thisCursor);
cursorEqual(thisCursor, 1, LINE1.length + 1);
});
test('move to end of line from line end', () => {
moveTo(thisCursor, 1, LINE1.length + 1);
moveToLineEnd(thisCursor);
cursorEqual(thisCursor, 1, LINE1.length + 1);
});
test('move to last non white space character from middle', () => {
moveTo(thisCursor, 1, 8);
moveToLineLastNonWhiteSpaceCharacter(thisCursor);
cursorEqual(thisCursor, 1, LINE1.length - 1);
});
test('move to last non white space character from last non white space character', () => {
moveTo(thisCursor, 1, LINE1.length - 1);
moveToLineLastNonWhiteSpaceCharacter(thisCursor);
cursorEqual(thisCursor, 1, LINE1.length - 1);
});
test('move to last non white space character from line end', () => {
moveTo(thisCursor, 1, LINE1.length + 1);
moveToLineLastNonWhiteSpaceCharacter(thisCursor);
cursorEqual(thisCursor, 1, LINE1.length - 1);
});
test('move to center of line not from center', () => {
moveTo(thisCursor, 1, 8);
moveToLineCenter(thisCursor);
cursorEqual(thisCursor, 1, 11);
});
test('move to center of line from center', () => {
moveTo(thisCursor, 1, 11);
moveToLineCenter(thisCursor);
cursorEqual(thisCursor, 1, 11);
});
test('move to center of line from start', () => {
moveToLineStart(thisCursor);
moveToLineCenter(thisCursor);
cursorEqual(thisCursor, 1, 11);
});
test('move to center of line from end', () => {
moveToLineEnd(thisCursor);
moveToLineCenter(thisCursor);
cursorEqual(thisCursor, 1, 11);
});
test('move to position', () => {
moveToPosition(thisCursor, 3, 10);
cursorEqual(thisCursor, 3, 10);
});
test('move', () => {
moveTo(thisCursor, 1, 2);
cursorEqual(thisCursor, 1, 2);
......
......@@ -3188,8 +3188,11 @@ declare module monaco.editor {
* Positions on the view
*/
export const ViewPosition: {
FirstCharacterOfLine: string;
FirstNonWhiteSpaceCharacterOfLine: string;
LineStart: string;
LineFirstNonWhitespaceCharacter: string;
LineCenter: string;
LineEnd: string;
LineLastNonWhitespaceCharacter: string;
};
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册