提交 4d3b04f9 编写于 作者: A Alex Dima

Fixes #41573: Allow cursor to recover from markers even if the view model line mapping changes

上级 b7588a82
......@@ -92,6 +92,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
private readonly _configuration: editorCommon.IConfiguration;
private readonly _model: ITextModel;
private _knownModelVersionId: number;
private readonly _viewModel: IViewModel;
public context: CursorContext;
private _cursors: CursorCollection;
......@@ -105,6 +106,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
super();
this._configuration = configuration;
this._model = model;
this._knownModelVersionId = this._model.getVersionId();
this._viewModel = viewModel;
this.context = new CursorContext(this._configuration, this._model, this._viewModel);
this._cursors = new CursorCollection(this.context);
......@@ -115,6 +117,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
this._prevEditOperationType = EditOperationType.Other;
this._register(this._model.onDidChangeRawContent((e) => {
this._knownModelVersionId = e.versionId;
if (this._isHandling) {
return;
}
......@@ -128,6 +131,16 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
return;
}
if (this._knownModelVersionId !== this._model.getVersionId()) {
// There are model change events that I didn't yet receive.
//
// This can happen when editing the model, and the view model receives the change events first,
// and the view model emits line mapping changed events, all before the cursor gets a chance to
// recover from markers.
//
// The model change listener above will be called soon and we'll ensure a valid cursor state there.
return;
}
// Ensure valid state
this.setStates('viewModel', CursorChangeReason.NotSet, this.getAll());
}));
......@@ -136,13 +149,13 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors {
this.context = new CursorContext(this._configuration, this._model, this._viewModel);
this._cursors.updateContext(this.context);
};
this._register(model.onDidChangeLanguage((e) => {
this._register(this._model.onDidChangeLanguage((e) => {
updateCursorContext();
}));
this._register(model.onDidChangeLanguageConfiguration(() => {
this._register(this._model.onDidChangeLanguageConfiguration(() => {
updateCursorContext();
}));
this._register(model.onDidChangeOptions(() => {
this._register(this._model.onDidChangeOptions(() => {
updateCursorContext();
}));
this._register(this._configuration.onDidChange((e) => {
......
......@@ -1852,6 +1852,36 @@ suite('Editor Controller - Regression tests', () => {
assertCursor(cursor, new Selection(1, 12, 1, 12));
});
});
test('issue #41573 - delete across multiple lines does not shrink the selection when word wraps', () => {
const model = TextModel.createFromString([
'Authorization: \'Bearer pHKRfCTFSnGxs6akKlb9ddIXcca0sIUSZJutPHYqz7vEeHdMTMh0SGN0IGU3a0n59DXjTLRsj5EJ2u33qLNIFi9fk5XF8pK39PndLYUZhPt4QvHGLScgSkK0L4gwzkzMloTQPpKhqiikiIOvyNNSpd2o8j29NnOmdTUOKi9DVt74PD2ohKxyOrWZ6oZprTkb3eKajcpnS0LABKfaw2rmv4\','
].join('\n'));
const config = new TestConfiguration({
wordWrap: 'wordWrapColumn',
wordWrapColumn: 100
});
const viewModel = new ViewModel(0, config, model, null);
const cursor = new Cursor(config, model, viewModel);
console.log(viewModel.getLineCount());
moveTo(cursor, 1, 43, false);
moveTo(cursor, 1, 147, true);
assertCursor(cursor, new Selection(1, 43, 1, 147));
model.applyEdits([{
range: new Range(1, 1, 1, 43),
text: ''
}]);
assertCursor(cursor, new Selection(1, 1, 1, 105));
cursor.dispose();
viewModel.dispose();
config.dispose();
model.dispose();
});
});
suite('Editor Controller - Cursor Configuration', () => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册