提交 b233d909 编写于 作者: A Alex Dima

Fixes #3463

上级 7e96c99d
......@@ -78,6 +78,26 @@ export interface IFindWordResult extends editorCommon.IWordRange {
wordType: WordType;
}
export enum WordType {
None = 0,
Regular = 1,
Separator = 2
};
enum CharacterClass {
Regular = 0,
Whitespace = 1,
WordSeparator = 2
};
const CH_REGULAR = CharacterClass.Regular;
const CH_WHITESPACE = CharacterClass.Whitespace;
const CH_WORD_SEPARATOR = CharacterClass.WordSeparator;
const W_NONE = WordType.None;
const W_REGULAR = WordType.Regular;
const W_SEPARATOR = WordType.Separator;
export class OneCursor {
// --- contextual state
......@@ -476,6 +496,9 @@ export class OneCursor {
public getColumnAtEndOfLine(lineNumber:number, column:number): number {
return this.helper.getColumnAtEndOfLine(this.model, lineNumber, column);
}
public getVisibleColumnFromColumn(lineNumber:number, column:number): number {
return this.helper.visibleColumnFromColumn(this.model, lineNumber, column);
}
// -- view
public getViewLineCount(): number {
......@@ -1337,20 +1360,22 @@ export class OneCursorOp {
}
public static tab(cursor:OneCursor, ctx: IOneCursorOperationContext): boolean {
var selection = cursor.getSelection();
let selection = cursor.getSelection();
if (selection.isEmpty()) {
var typeText = '';
let typeText = '';
if (cursor.model.getLineMaxColumn(selection.startLineNumber) === 1) {
// Line is empty => indent straight to the right place
typeText = cursor.configuration.normalizeIndentation(this._goodIndentForLine(cursor, selection.startLineNumber));
} else {
var position = cursor.getPosition();
let position = cursor.getPosition();
if (cursor.configuration.getIndentationOptions().insertSpaces) {
var nextTabColumn = CursorMoveHelper.nextTabColumn(position.column - 1, cursor.configuration.getIndentationOptions().tabSize);
for (var i = position.column; i <= nextTabColumn; i++) {
let visibleColumnFromColumn = cursor.getVisibleColumnFromColumn(position.lineNumber, position.column);
let tabSize = cursor.configuration.getIndentationOptions().tabSize;
let spacesCnt = tabSize - (visibleColumnFromColumn % tabSize);
for (let i = 0; i < spacesCnt; i++) {
typeText += ' ';
}
} else {
......@@ -1786,19 +1811,23 @@ class CursorHelper {
return this.moveHelper.getColumnAtEndOfLine(model, lineNumber, column);
}
/**
* ATTENTION: This works with 0-based columns (as oposed to the regular 1-based columns)
*/
public nextTabColumn(column:number): number {
return CursorMoveHelper.nextTabColumn(column, this.configuration.getIndentationOptions().tabSize);
public visibleColumnFromColumn(model:ICursorMoveHelperModel, lineNumber:number, column:number): number {
return this.moveHelper.visibleColumnFromColumn(model, lineNumber, column);
}
/**
* ATTENTION: This works with 0-based columns (as oposed to the regular 1-based columns)
*/
public prevTabColumn(column:number): number {
return CursorMoveHelper.prevTabColumn(column, this.configuration.getIndentationOptions().tabSize);
}
// /**
// * ATTENTION: This works with 0-based columns (as oposed to the regular 1-based columns)
// */
// public nextTabColumn(column:number): number {
// return CursorMoveHelper.nextTabColumn(column, this.configuration.getIndentationOptions().tabSize);
// }
// /**
// * ATTENTION: This works with 0-based columns (as oposed to the regular 1-based columns)
// */
// public prevTabColumn(column:number): number {
// return CursorMoveHelper.prevTabColumn(column, this.configuration.getIndentationOptions().tabSize);
// }
// public findWord(position:editorCommon.IEditorPosition, preference:string, skipSyntaxTokens:boolean=false): editorCommon.IWordRange {
// var words = this.model.getWords(position.lineNumber);
......@@ -1955,26 +1984,6 @@ class CursorHelper {
}
}
export enum WordType {
None = 0,
Regular = 1,
Separator = 2
};
enum CharacterClass {
Regular = 0,
Whitespace = 1,
WordSeparator = 2
};
const CH_REGULAR = CharacterClass.Regular;
const CH_WHITESPACE = CharacterClass.Whitespace;
const CH_WORD_SEPARATOR = CharacterClass.WordSeparator;
const W_NONE = WordType.None;
const W_REGULAR = WordType.Regular;
const W_SEPARATOR = WordType.Separator;
function once<T, R>(keyFn:(input:T)=>string, computeFn:(input:T)=>R):(input:T)=>R {
let cache: {[key:string]:R;} = {};
return (input:T):R => {
......
......@@ -1131,6 +1131,27 @@ suite('Editor Controller - Regression tests', () => {
});
});
test('issue #3463: pressing tab adds spaces, but not as many as for a tab', () => {
usingCursor({
text: [
'function a() {',
'\tvar a = {',
'\t\tx: 3',
'\t};',
'}',
],
mode: null,
config: {
insertSpaces: true,
tabSize: 4
}
}, (model, cursor) => {
moveTo(cursor, 3, 2, false);
cursorCommand(cursor, H.Tab);
assert.equal(model.getLineContent(3), '\t \tx: 3');
});
});
test('issue #832: deleteWordLeft', () => {
usingCursor({
text: [
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册