Change:
Testing Clone Use the command and select the folder Select in the quick pick It looks like the file has 4 conflict Pressing "Go to Next Conflict" highlights the first conflict Pressing "Go to Next Conflict" again does not do anything Also interesting that the editor minimap only has one conflict marker
I also saw this. It seemed to happen when both inputs make the same change.
On , once it moves past the first conflict and try to go back to it, it doesn't go back to it properly. !
This is weird, I cannot reproduce this. Also, for , I only have 2 conflicts. And this checkbox is also very weird: !
I'm on commit , not the latest commit. Does that make a difference?
If you can reproduce on the latest commit, can you try to give me a call?
yup, things look good on the latest on master for diff-merge-datasets for demo1. :) One thing I noticed, though, is that, if you're focused on the result and try to skip to next conflict, it's hard to tell by looking at the two inputs where the conflict is (seems that the two inputs aren't telling me anything in this screenshot): ! When I make the input editors a little bigger, then it starts making a little more sense. ! Not too big of a deal though, just wanted to bring your attention to it!

Discussion:
} } <del> export class GoToNextConflict extends MergeEditorAction { </del> <ins> export class GoToNextUnhandledConflict extends MergeEditorAction { </ins> constructor() { super({ <del> id: 'merge.goToNextConflict', </del> <ins> id: 'merge.goToNextUnhandledConflict', </ins> category: mergeEditorCategory, title: { <del> value: localize('merge.goToNextConflict', 'Go to Next Conflict'), original: 'Go to Next Conflict', </del> <ins> value: localize('merge.goToNextUnhandledConflict', 'Go to Next Unhandled Conflict'), original: 'Go to Next Unhandled Conflict', </ins> }, icon: Codicon.arrowDown, menu: [

} override runWithViewModel(viewModel: MergeEditorViewModel): void { <del> viewModel.goToNextModifiedBaseRange(true); </del> <ins> viewModel.goToNextModifiedBaseRange(r => !viewModel.model.isHandled(r).get()); </ins> } } <del> export class GoToPreviousConflict extends MergeEditorAction { </del> <ins> export class GoToPreviousUnhandledConflict extends MergeEditorAction { </ins> constructor() { super({ <del> id: 'merge.goToPreviousConflict', </del> <ins> id: 'merge.goToPreviousUnhandledConflict', </ins> category: mergeEditorCategory, title: { value: localize( <del> 'merge.goToPreviousConflict', 'Go to Previous Conflict' </del> <ins> 'merge.goToPreviousUnhandledConflict', 'Go to Previous Unhandled Conflict' </ins> ), <del> original: 'Go to Previous Conflict', </del> <ins> original: 'Go to Previous Unhandled Conflict', </ins> }, icon: Codicon.arrowUp, menu: [

} override runWithViewModel(viewModel: MergeEditorViewModel): void { <del> viewModel.goToPreviousModifiedBaseRange(true); </del> <ins> viewModel.goToPreviousModifiedBaseRange(r => !viewModel.model.isHandled(r).get()); </ins> } }

import { EditorPaneDescriptor, IEditorPaneRegistry } from 'vs/workbench/browser/editor'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { EditorExtensions, IEditorFactoryRegistry } from 'vs/workbench/common/editor'; <del> import { AcceptAllInput1, AcceptAllInput2, CompareInput1WithBaseCommand, CompareInput2WithBaseCommand, GoToNextConflict, GoToPreviousConflict, OpenBaseFile, OpenMergeEditor, OpenResultResource, SetColumnLayout, SetMixedLayout, ToggleActiveConflictInput1, ToggleActiveConflictInput2 } from 'vs/workbench/contrib/mergeEditor/browser/commands/commands'; </del> <ins> import { AcceptAllInput1, AcceptAllInput2, CompareInput1WithBaseCommand, CompareInput2WithBaseCommand, GoToNextUnhandledConflict, GoToPreviousUnhandledConflict, OpenBaseFile, OpenMergeEditor, OpenResultResource, SetColumnLayout, SetMixedLayout, ToggleActiveConflictInput1, ToggleActiveConflictInput2 } from 'vs/workbench/contrib/mergeEditor/browser/commands/commands'; </ins> import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput'; import { MergeEditor, MergeEditorResolverContribution, MergeEditorOpenHandlerContribution } from 'vs/workbench/contrib/mergeEditor/browser/view/mergeEditor'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';

registerAction2(OpenMergeEditor); registerAction2(OpenBaseFile); <del> registerAction2(GoToNextConflict); registerAction2(GoToPreviousConflict); </del> <ins> registerAction2(GoToNextUnhandledConflict); registerAction2(GoToPreviousUnhandledConflict); </ins> registerAction2(ToggleActiveConflictInput1); registerAction2(ToggleActiveConflictInput2);

const startLine = model!.getLineContent(b.lineRange.startLineNumber).substring(0, 20); const endLine = model!.getLineContent(b.lineRange.endLineNumberExclusive - 1).substring(0, 20); <ins> const conflictingLinesCount = b.lineRange.lineCount - 2; </ins> const domNode = h('div', [ h('div.conflict-zone-root', [ h('pre', [startLine]), h('span.dots', ['...']), h('pre', [endLine]), <del> h('span.text', [nls.localize('conflictingLines', "Conflicting Lines")]), </del> <ins> h('span.text', [ conflictingLinesCount === 1 ? nls.localize('conflictingLine', "1 Conflicting Line") : nls.localize('conflictingLines', "{0} Conflicting Lines", conflictingLinesCount) ]), </ins> ]), ]).root; this.viewZoneIds.push(c.addZone({

} } <del> public goToNextModifiedBaseRange(onlyConflicting: boolean): void { </del> <ins> public goToNextModifiedBaseRange(predicate: (m: ModifiedBaseRange) => boolean): void { </ins> this.goToConflict( (e, l) => this.model.modifiedBaseRanges .get() .find( (r) => <del> (!onlyConflicting || r.isConflicting) && </del> <ins> predicate(r) && </ins> this.getRange(e, r, undefined).startLineNumber > l ) || this.model.modifiedBaseRanges .get() <del> .find((r) => !onlyConflicting || r.isConflicting) </del> <ins> .find((r) => predicate(r)) </ins> ); } <del> public goToPreviousModifiedBaseRange(onlyConflicting: boolean): void { </del> <ins> public goToPreviousModifiedBaseRange(predicate: (m: ModifiedBaseRange) => boolean): void { </ins> this.goToConflict( (e, l) => findLast( this.model.modifiedBaseRanges.get(), (r) => <del> (!onlyConflicting || r.isConflicting) && </del> <ins> predicate(r) && </ins> this.getRange(e, r, undefined).endLineNumberExclusive < l ) || findLast( this.model.modifiedBaseRanges.get(), <del> (r) => !onlyConflicting || r.isConflicting </del> <ins> (r) => predicate(r) </ins> ) ); }