diff --git a/package.json b/package.json index 245dd6a..0841d82 100644 --- a/package.json +++ b/package.json @@ -259,6 +259,12 @@ "title": "%bookmark-manager.changeBookmarkGroup%", "icon": "$(bookmark)", "category": "Bookmark Manager (BM)" + }, + { + "command": "bookmark-manager.listBookmarksInSelectedGroup", + "title": "%bookmark-manager.listBookmarksInSelectedGroup%", + "icon": "$(bookmark)", + "category": "Bookmark Manager (BM)" } ], "views": { diff --git a/package.nls.json b/package.nls.json index 7820482..a69ba48 100644 --- a/package.nls.json +++ b/package.nls.json @@ -61,5 +61,6 @@ "bookmark-manager.groupedByCustom": "Grouped by custom", "bookmark-manager.clearAllBookmarksInColor": "Clear bookmarks in this color", "bookmark-manager.setAsDefaultActivedGroup": "Set as default activation group", - "bookmark-manager.changeBookmarkGroup": "Change group" + "bookmark-manager.changeBookmarkGroup": "Change group", + "bookmark-manager.listBookmarksInSelectedGroup": "List the bookmarks in the selected group" } diff --git a/package.nls.zh.json b/package.nls.zh.json index f7aabac..32790af 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -61,5 +61,6 @@ "bookmark-manager.groupedByCustom": "自定义分组", "bookmark-manager.clearAllBookmarksInColor": "清除此颜色下的所有书签", "bookmark-manager.setAsDefaultActivedGroup": "设置为默认激活组", - "bookmark-manager.changeBookmarkGroup": "改变书签分组" + "bookmark-manager.changeBookmarkGroup": "改变书签分组", + "bookmark-manager.listBookmarksInSelectedGroup": "列出已选择分组中的书签列表" } diff --git a/src/commands/bookmark/base.ts b/src/commands/bookmark/base.ts index 68f26dc..9e5e5a5 100644 --- a/src/commands/bookmark/base.ts +++ b/src/commands/bookmark/base.ts @@ -15,66 +15,15 @@ import { checkIfBookmarksIsInCurrentEditor, chooseBookmarkColor, deleteBookmark as deleteBookmarkUtil, - getBookmarkFromLineNumber, getBookmarksFromFileUri, getLineInfoStrFromBookmark, gotoSourceLocation as gotoSourceLocationUtil, quicklyJumpToBookmark, - showGroupPickItems, toggleBookmark, + getBookmarkFromCtx, + getBookmarkColorFromCtx, toggleBookmarksWithSelections, } from '../../utils'; -import BookmarkTreeItem from '../../providers/BookmarksTreeItem'; - -/** - * 从`context`获取书签数据 - * @param cb - * @returns - */ -function getBookmarkFromCtx(context: LineBookmarkContext, cb?: () => void) { - let bookmark: IBookmark | undefined; - if ( - context && - 'contextValue' in context && - context.contextValue === 'bookmark' - ) { - bookmark = context.meta as IBookmark; - } else { - bookmark = getBookmarkFromLineNumber(); - } - - if (!bookmark && cb) { - cb(); - return; - } - return bookmark; -} - -/** - * 从`context`获取书签数据 - - * @param cb - * @returns - */ -function getBookmarkColorFromCtx( - context: LineBookmarkContext | BookmarkTreeItem | undefined, - cb?: () => void, -) { - let bookmark: IBookmark | undefined; - if ( - context && - 'contextValue' in context && - context.contextValue === 'color' - ) { - bookmark = context.meta as IBookmark; - } - - if (!bookmark && cb) { - cb(); - return; - } - return bookmark; -} /** * 开启行书签, 使用默认颜色且无标签等相关信息 @@ -399,19 +348,3 @@ export function clearAllBookmarksInColor(args: any) { const meta = args.meta as BookmarksGroupedByColorType; controller.clearAllBookmarksInColor(meta.color); } - -/** - * 更改书签分组 - * @param args - */ -export async function changeBookmarkGroup(args: any) { - const bookmark = getBookmarkFromCtx(args); - if (!bookmark) { - return; - } - const newGroup = await showGroupPickItems(true, bookmark.groupId); - if (!newGroup) { - return; - } - bookmark.changeGroupId(newGroup.id); -} diff --git a/src/commands/bookmark/group.ts b/src/commands/bookmark/group.ts index 69b4ae1..2516316 100644 --- a/src/commands/bookmark/group.ts +++ b/src/commands/bookmark/group.ts @@ -1,10 +1,26 @@ -import {window, l10n} from 'vscode'; +import { + window, + l10n, + Selection, + TextEditorRevealType, + Uri, + workspace, + QuickPickItem, + ThemeIcon, +} from 'vscode'; import {resolveBookmarkController} from '../../bootstrap'; import {DEFAULT_BOOKMARK_COLOR} from '../../constants'; import {DEFAULT_BOOKMARK_GROUP_ID} from '../../constants/bookmark'; -import {IBookmarkGroup} from '../../stores'; +import {IBookmark, IBookmarkGroup} from '../../stores'; import {BookmarksGroupedByCustomType} from '../../types'; -import {showGroupPickItems} from '../../utils'; +import { + showGroupQuickPick, + getBookmarkFromCtx, + gotoSourceLocation, + getLineInfoStrFromBookmark, + getBookmarkIcon, + showBookmarksQuickPick, +} from '../../utils'; import {IBookmarkCommand, IBookmarkCommandContext} from '../../types/command'; export const BookmarkGroupCommands: IBookmarkCommand[] = [ @@ -14,7 +30,7 @@ export const BookmarkGroupCommands: IBookmarkCommand[] = [ callback: async (ctx: IBookmarkCommandContext, args: any) => { let meta: IBookmarkGroup | undefined; if (!args || !args.meta) { - meta = await showGroupPickItems(true); + meta = await showGroupQuickPick(true); if (!meta) { return; } @@ -31,7 +47,7 @@ export const BookmarkGroupCommands: IBookmarkCommand[] = [ callback: async (ctx: IBookmarkCommandContext, args: any) => { let meta: IBookmarkGroup | undefined; if (!args || !args.meta) { - meta = await showGroupPickItems(false); + meta = await showGroupQuickPick(false); if (!meta) { return; } @@ -51,7 +67,7 @@ export const BookmarkGroupCommands: IBookmarkCommand[] = [ callback: async (ctx: IBookmarkCommandContext, args: any) => { let meta: IBookmarkGroup | undefined; if (!args || !args.meta) { - meta = await showGroupPickItems(false); + meta = await showGroupQuickPick(false); if (!meta) { return; } @@ -71,7 +87,7 @@ export const BookmarkGroupCommands: IBookmarkCommand[] = [ callback: async (ctx: IBookmarkCommandContext, args: any) => { let meta: IBookmarkGroup | undefined; if (!args || !args.meta) { - meta = await showGroupPickItems(false); + meta = await showGroupQuickPick(false); if (!meta) { return; } @@ -153,7 +169,7 @@ export const BookmarkGroupCommands: IBookmarkCommand[] = [ export async function setAsDefaultActivedGroup(args: any) { let meta: IBookmarkGroup | undefined; if (!args || !args.meta) { - meta = await showGroupPickItems(false); + meta = await showGroupQuickPick(false); if (!meta) { return; } @@ -163,3 +179,41 @@ export async function setAsDefaultActivedGroup(args: any) { const controller = resolveBookmarkController(); controller.setAsDefaultActivedGroup(meta); } + +/** + * 更改书签分组 + * @param args + */ +export async function changeBookmarkGroup(args: any) { + const bookmark = getBookmarkFromCtx(args); + if (!bookmark) { + return; + } + const newGroup = await showGroupQuickPick(true, bookmark.groupId); + if (!newGroup) { + return; + } + bookmark.changeGroupId(newGroup.id); +} + +export async function listBookmarksInSelectedGroup(args: any) { + const group = await showGroupQuickPick(true); + if (!group) { + return; + } + + const controller = resolveBookmarkController(); + + const bookmarks = + ( + controller.store + .getBookmarksGroupedByCustom as BookmarksGroupedByCustomType[] + ).find(it => it.id === group.id)?.bookmarks || []; + + const selectedBookmark = await showBookmarksQuickPick(bookmarks); + if (!selectedBookmark) { + return; + } + // @ts-ignore + gotoSourceLocation(selectedBookmark.meta); +} diff --git a/src/controllers/BookmarksController.ts b/src/controllers/BookmarksController.ts index 95b1896..8d3b1b7 100644 --- a/src/controllers/BookmarksController.ts +++ b/src/controllers/BookmarksController.ts @@ -89,6 +89,7 @@ export default class BookmarksController implements IController { } return []; } + private _disposables: IDisposable[] = []; private _watcher: FileSystemWatcher | undefined; @@ -117,8 +118,8 @@ export default class BookmarksController implements IController { return this._context.workspaceState; } - public get store(): IBookmarksStore | undefined { - return this._store; + public get store(): IBookmarksStore { + return this._store!; } /** @@ -516,29 +517,6 @@ export default class BookmarksController implements IController { } } - /** - * - * 根据文件名对书签进行分组 - * [ - * { fileId: xxx , - * bookmarks: [ - * - * ] - * }, - * { fileId: xxx , - * bookmarks: [ - * - * ] - * } - * ] - */ - private _getBookmarksGroupedByFile() { - if (!this._store) { - return []; - } - return this._store.bookmarksGroupedByFile; - } - dispose(): void { this._disposables.filter(it => it).forEach(it => it.dispose()); this._storeDisposer?.(); diff --git a/src/utils/bookmark.ts b/src/utils/bookmark.ts index b21bd19..f9e88f6 100644 --- a/src/utils/bookmark.ts +++ b/src/utils/bookmark.ts @@ -17,11 +17,14 @@ import { } from 'vscode'; import {LineBookmarkContext} from '../types'; import {resolveBookmarkController} from '../bootstrap'; -import resolveServiceManager from '../services/ServiceManager'; +import resolveServiceManager, { + ServiceManager, +} from '../services/ServiceManager'; import {defaultColors} from '../constants/colors'; import {IBookmark} from '../stores/bookmark'; import {IBookmarkGroup} from '../stores'; import {DEFAULT_BOOKMARK_GROUP_ID} from '../constants/bookmark'; +import BookmarkTreeItem from '../providers/BookmarksTreeItem'; const REGEXP_NEWLINE = /(\r\n)|(\n)/g; /** @@ -445,62 +448,12 @@ export async function chooseBookmarkColor() { * 快速跳转到书签指定位置 */ export async function quicklyJumpToBookmark() { - const controller = resolveBookmarkController(); - const sm = resolveServiceManager(); - const gutters = sm.gutterService.gutters; - const tagGutters = sm.gutterService.tagGutters; - if (!controller || !controller.store) { - return; - } - - const pickItems = controller.store.bookmarks.map(it => { - const iconPath = it.label - ? (tagGutters[it.color] || tagGutters['default']).iconPath - : (gutters[it.color] || (tagGutters['default'] as any)).iconPath; - return { - filename: it.fileName || '', - label: - it.label || it.description || it.selectionContent?.slice(0, 120) || '', - description: getLineInfoStrFromBookmark(it), - detail: it.fileName, - iconPath: iconPath as any, - meta: it, - }; - }); - const chosenBookmarks = await window.showQuickPick(pickItems, { - title: l10n.t('Select a bookmark to jump to the corresponding location.'), - placeHolder: l10n.t('Please select the bookmark you want to open'), - canPickMany: false, - ignoreFocusOut: false, - async onDidSelectItem(item: QuickPickItem & {meta: IBookmark}) { - // @ts-ignore - let bookmark = typeof item === 'object' ? item.meta : undefined; - if (bookmark) { - const doc = await workspace.openTextDocument( - Uri.from({ - scheme: 'file', - path: item.meta.fileId, - }), - ); - const editor = await window.showTextDocument(doc, { - preview: true, - preserveFocus: true, - }); - editor.selection = new Selection( - bookmark.selection.start, - bookmark.selection.end, - ); - editor.revealRange( - bookmark.selection, - TextEditorRevealType.InCenterIfOutsideViewport, - ); - } - }, - }); + const chosenBookmarks = await showBookmarksQuickPick(); if (!chosenBookmarks) { return; } + // @ts-ignore gotoSourceLocation(chosenBookmarks.meta); } @@ -810,7 +763,7 @@ export function getBookmarksFromFileUri(uri: Uri) { return controller.getBookmarkStoreByFileUri(uri); } -export async function showGroupPickItems( +export async function showGroupQuickPick( all: boolean = false, selectedGroupId?: string, ): Promise { @@ -840,3 +793,118 @@ export async function showGroupPickItems( return controller.groups.find(it => it.label === selectedGroup.label); } + +/** + * 从`context`获取书签数据 + * @param cb + * @returns + */ +export function getBookmarkFromCtx( + context: LineBookmarkContext, + cb?: () => void, +) { + let bookmark: IBookmark | undefined; + if ( + context && + 'contextValue' in context && + context.contextValue === 'bookmark' + ) { + bookmark = context.meta as IBookmark; + } else { + bookmark = getBookmarkFromLineNumber(); + } + + if (!bookmark && cb) { + cb(); + return; + } + return bookmark; +} + +/** + * 从`context`获取书签数据 + * @param cb + * @returns + */ +export function getBookmarkColorFromCtx( + context: LineBookmarkContext | BookmarkTreeItem | undefined, + cb?: () => void, +) { + let bookmark: IBookmark | undefined; + if ( + context && + 'contextValue' in context && + context.contextValue === 'color' + ) { + bookmark = context.meta as IBookmark; + } + + if (!bookmark && cb) { + cb(); + return; + } + return bookmark; +} + +export function getBookmarkIcon(sm: ServiceManager, bookmark: IBookmark) { + const gutters = sm.gutterService.gutters; + const tagGutters = sm.gutterService.tagGutters; + + return bookmark.label + ? (tagGutters[bookmark.color] || tagGutters['default']).iconPath + : (gutters[bookmark.color] || (tagGutters['default'] as any)).iconPath; +} + +export async function showBookmarksQuickPick(bookmarks?: IBookmark[]) { + let _bookmarks = bookmarks; + const sm = resolveServiceManager(); + if (!_bookmarks) { + _bookmarks = resolveBookmarkController().store.bookmarks; + } + const quickItems = _bookmarks.map(it => ({ + label: + it.label || it.description || it.selectionContent?.slice(0, 120) || '', + description: getLineInfoStrFromBookmark(it), + detail: it.fileId, + meta: it, + iconPath: getBookmarkIcon(sm, it) as any, + })); + + // @ts-ignore + const selectedBookmark = await window.showQuickPick(quickItems, { + title: l10n.t('Select a bookmark to jump to the corresponding location.'), + placeHolder: l10n.t('Please select the bookmark you want to open'), + matchOnDescription: true, + matchOnDetail: true, + ignoreFocusOut: false, + onDidSelectItem: async (item: QuickPickItem & {meta: IBookmark}) => { + // @ts-ignore + let bookmark = typeof item === 'object' ? item.meta : undefined; + if (bookmark) { + const doc = await workspace.openTextDocument( + Uri.from({ + scheme: 'file', + path: item.meta.fileId, + }), + ); + const editor = await window.showTextDocument(doc, { + preview: true, + preserveFocus: true, + }); + editor.selection = new Selection( + bookmark.selection.start, + bookmark.selection.end, + ); + editor.revealRange( + bookmark.selection, + TextEditorRevealType.InCenterIfOutsideViewport, + ); + } + }, + }); + if (!selectedBookmark) { + return; + } + // @ts-ignore + return selectedBookmark.meta; +}