open editors: sort by fullPath#133790
Conversation
| 'explorer.openEditors.sortOrder': { | ||
| 'type': 'string', | ||
| 'enum': ['editorOrder', 'alphabetical'], | ||
| 'enum': ['editorOrder', 'alphabetical', 'fullPath'], |
There was a problem hiding this comment.
I'd rename alphabetical to fileName, then the new option would be filePath. The code would need to be made backwards compatible with the old name.
There was a problem hiding this comment.
I made this but then reverted changes because editors are not equal to the files. There are other special editor types and generic 'alphabetical' is closer to reality.
| return -1; | ||
| } else if (secondResource === undefined) { | ||
| return 1; | ||
| } else { |
There was a problem hiding this comment.
Can we use comparers.ts's comparePaths here? I don't think we need to special case Schemas.file here or really compare schemas at all, did you see an example of the results being confusing without that schema comparison?
There was a problem hiding this comment.
As I remember. There are several editor types that have different schema names and may not have a path. In my code schema participates in URI comparison therefore special editors can be placed before or after files without any explicit logic for the user so I placed them before all files because they are special in some way.
List of schemas
Dump of:
editors.forEach(x => {
const r = x.editor?.resource;
console.log(`A<${r?.authority}>F<${r?.fragment}>FS<${r?.fsPath}>P<${r?.path}>Q<${r?.query}>S<${r?.scheme}>`);
});
"A<>F<>FS</home/max/dev/state-example/src/api/commentApi.ts>P</home/max/dev/state-example/src/api/commentApi.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/app/postItem.tsx>P</home/max/dev/state-example/src/app/postItem.tsx>Q<>S<file>"
"A<undefined>F<undefined>FS<undefined>P<undefined>Q<undefined>S<undefined>"
"A<>F<>FS<settingseditor>P<settingseditor>Q<>S<vscode-settings>"
"A<vscode_getting_started_page>F<>FS<>P<>Q<>S<walkThrough>"
"A<>F<>FS</home/max/dev/state-example/src/base/actionType.ts>P</home/max/dev/state-example/src/base/actionType.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/api/postApi.ts>P</home/max/dev/state-example/src/api/postApi.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/app/app.tsx>P</home/max/dev/state-example/src/app/app.tsx>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/base/httpClient.ts>P</home/max/dev/state-example/src/base/httpClient.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/core/globalState.ts>P</home/max/dev/state-example/src/core/globalState.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/core/http.ts>P</home/max/dev/state-example/src/core/http.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/core/loader.ts>P</home/max/dev/state-example/src/core/loader.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/core/types.ts>P</home/max/dev/state-example/src/core/types.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/global/usePosts.ts>P</home/max/dev/state-example/src/global/usePosts.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/shared/flex.tsx>P</home/max/dev/state-example/src/shared/flex.tsx>Q<>S<file>"
"A<>F<>FS<Untitled-1>P<Untitled-1>Q<>S<untitled>"
"A<>F<>FS</home/max/dev/state-example/src/shared/button.tsx>P</home/max/dev/state-example/src/shared/button.tsx>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/public/favicon.ico>P</home/max/dev/state-example/public/favicon.ico>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/public/logo192.png>P</home/max/dev/state-example/public/logo192.png>Q<>S<file>"
"A<>F<>FS<Untitled-2>P<Untitled-2>Q<>S<untitled>"
"A<>F<>FS<Untitled-3>P<Untitled-3>Q<>S<untitled>"
"A<>F<>FS</home/max/dev/state-example/src/base/globalStateKey.ts>P</home/max/dev/state-example/src/base/globalStateKey.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/app/postList.tsx>P</home/max/dev/state-example/src/app/postList.tsx>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/base/actionType.ts>P</home/max/dev/state-example/src/base/actionType.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/core/globalState.ts>P</home/max/dev/state-example/src/core/globalState.ts>Q<>S<file>"
"A<>F<>FS</home/max/dev/state-example/src/shared/button.tsx>P</home/max/dev/state-example/src/shared/button.tsx>Q<>S<file>"
For some editors, there are not so much data
"A<vscode_getting_started_page>F<>FS<>P<>Q<>S<walkThrough>"
"A<>F<>FS<Untitled-3>P<Untitled-3>Q<>S<untitled>"
There was a problem hiding this comment.
If there are no conditions non-file tabs go to the bottom of the list because they have vscode- prefix in the schema name.
current implementation.
Maybe we should sort all non-file tabs by editor name instead of random(for an end-user) schema name.
editors = editors.sort((first, second) => {
//put non-file editors before files
if (first.editor.resource?.scheme !== Schemas.file && second.editor.resource?.scheme !== Schemas.file) {
return compareFileNamesDefault(first.editor.getName(), second.editor.getName());
} else if (first.editor.resource?.scheme !== Schemas.file) {
return -1;
} else if (second.editor.resource?.scheme !== Schemas.file) {
return 1;
} else {
return comparePaths(first.editor.resource?.fsPath ?? '', second.editor.resource?.fsPath ?? '');
}
});There was a problem hiding this comment.
I don't like how the Untitled editors get split up in that last approach. The current method is fine
|
I will be focusing on releasing the next vscode for the next week or so but will come back to reviewing this. Thanks for your contribution! |
|
Hello, any updates? |
| 'enumDescriptions': [ | ||
| nls.localize('sortOrder.editorOrder', 'Editors are ordered in the same order editor tabs are shown.'), | ||
| nls.localize('sortOrder.alphabetical', 'Editors are ordered in alphabetical order inside each editor group.') | ||
| nls.localize('sortOrder.alphabetical', 'Editors are ordered in alphabetical order inside each editor group.'), |
There was a problem hiding this comment.
Please change this to ..alphabetical order by {...} inside... to help explain the difference between this and the next option.
|
Just one comment then looks good |
| 'enumDescriptions': [ | ||
| nls.localize('sortOrder.editorOrder', 'Editors are ordered in the same order editor tabs are shown.'), | ||
| nls.localize('sortOrder.alphabetical', 'Editors are ordered in alphabetical order inside each editor group.') | ||
| nls.localize('sortOrder.alphabetical', 'Editors are ordered in alphabetical order by tab name inside each editor group.'), |
There was a problem hiding this comment.
@JacksonKearl
I've added ... by tab name ...
|
Thanks! |



Issue: #114470
I have added an option to sort editors by resource path.