├── src ├── style.css ├── plugins │ ├── context-menu.ts │ ├── toastification.ts │ └── vuetify.ts ├── components │ ├── setting │ │ ├── table │ │ │ ├── FlexTable.vue │ │ │ ├── HeadRow.vue │ │ │ └── BodyRow.vue │ │ └── tabs │ │ │ ├── PreviewTab.vue │ │ │ ├── AboutTab.vue │ │ │ ├── GeneralTab.vue │ │ │ └── FilterTab.vue │ ├── home │ │ ├── FileThumbnail.vue │ │ ├── SortOrder.vue │ │ ├── SideNumOverlay.vue │ │ ├── DisplayMode.vue │ │ ├── FolderSubItem.vue │ │ ├── SearchInput.vue │ │ ├── TextViewer.vue │ │ ├── FolderViewer.vue │ │ ├── Preview.vue │ │ └── FileList.vue │ └── common │ │ ├── Subheader.vue │ │ ├── Header.vue │ │ ├── Hover.vue │ │ ├── ShowBox.vue │ │ ├── OverlayProgress.vue │ │ ├── Checkbox.vue │ │ ├── SelectBox.vue │ │ └── FormItem.vue ├── utils │ ├── common.ts │ ├── plist.ts │ ├── strings.ts │ ├── collections.ts │ ├── mdfinds.ts │ ├── handler.ts │ └── query.ts ├── hooks │ ├── useActivated.ts │ ├── useLastState.ts │ ├── useEventListener.ts │ ├── useDark.ts │ ├── useMouse.ts │ ├── useHotkeys.ts │ ├── useKeyLongPress.ts │ └── useContextMenu.ts ├── typings │ ├── global.d.ts │ └── preload.d.ts ├── directives │ └── index.ts ├── router │ └── index.ts ├── main.ts ├── App.vue ├── vite-env.d.ts ├── styles │ └── context-menu.scss ├── models │ ├── KindFilterModel.ts │ ├── SearchScopeModel.ts │ ├── index.ts │ └── SettingModel.ts ├── constant │ ├── enums.ts │ └── index.ts ├── views │ └── Setting.vue ├── store │ └── index.ts ├── assets │ └── empty_inbox.svg └── preload.ts ├── public ├── disk.png ├── exec.png ├── file.png ├── logo.png ├── folder.png ├── quicklook.html └── plugin.json ├── screenshots ├── list-mode.png ├── preview-mode.png └── list-mode-detail.png ├── postcss.config.js ├── .prettierrc ├── tsconfig.node.json ├── tailwind.config.js ├── .gitignore ├── index.html ├── tsconfig.json ├── vite.config.ts ├── package.json ├── README.md └── LICENSE /src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /public/disk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/public/disk.png -------------------------------------------------------------------------------- /public/exec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/public/exec.png -------------------------------------------------------------------------------- /public/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/public/file.png -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/public/logo.png -------------------------------------------------------------------------------- /public/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/public/folder.png -------------------------------------------------------------------------------- /screenshots/list-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/screenshots/list-mode.png -------------------------------------------------------------------------------- /screenshots/preview-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/screenshots/preview-mode.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /screenshots/list-mode-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/trentlee0/mverything-plus/HEAD/screenshots/list-mode-detail.png -------------------------------------------------------------------------------- /public/quicklook.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 附件,搜索名称包含“附件”的文件夹
63 |
64 | 4. `学习 语言`,搜索名称同时包含“学习”和“语言”的文件或文件夹
65 |
66 | 5. `java -javascript`,搜索名称包含“java”而不包含”javascript“的文件或文件夹
67 |
68 | ### 筛选
69 |
70 | #### 类型筛选
71 |
72 | 根据文件类型直接进行搜索。
73 |
74 | 添加规则:多个类型用 `|` 分隔,排除用 `!`,详细类型见预览框中的类型树项,可参考默认提供的编写。
75 |
76 | #### 正则筛选
77 |
78 | 对搜索结果的每个文件路径,使用正则表达式进行过滤筛选。使用方法:在搜索文本前加上关键字,具体格式 `关键字:搜索文本`。
79 |
80 | 示例:
81 |
82 | `notlibrary:xml`,搜索名称包含“xml”的结果,并使用关键字 `notlibrary` 对应的正则表达式进行筛选
83 |
84 | ### 预览
85 |
86 | 直接预览文件、文件夹内容。支持文件夹、文本、图片、音频和视频文件的预览,可根据需要配置文件名后缀,使用逗号 `,` 分隔开。(注:图片、音频和视频文件的预览,有些格式可能无法显示)
87 |
88 | ### 问题
89 |
90 | - 搜索不到已存在的文件?
91 |
92 | 请尝试重建索引,见 https://support.apple.com/zh-cn/HT201716
93 |
94 | - 主搜索框搜索结果与插件内搜索结果不一致?
95 |
96 | 设计上就是如此,考虑到在主搜索框搜索的效率问题,搜索结果不包含系统文件,而插件内的搜索结果则是包含系统文件的。
97 |
--------------------------------------------------------------------------------
/src/constant/index.ts:
--------------------------------------------------------------------------------
1 | export * from './enums'
2 |
3 | export namespace StoreKey {
4 | export const SETTING = 'setting'
5 | export const DISPLAY_MODE = 'displayItemIndex'
6 | export const IS_PREVIEW_CONTENT = 'enablePreviewContent'
7 | export const IS_SHOW_RECENT = 'enableShowRecent'
8 | }
9 |
10 | export namespace FileConstant {
11 | export const KB = 1000
12 | export const MB = KB * 1000
13 | export const GB = MB * 1000
14 |
15 | export const KiB = 1 << 10
16 | export const MiB = 1 << 20
17 | export const GiB = 1 << 30
18 | }
19 |
20 | export namespace ContentType {
21 | export const FOLDER = 'public.folder'
22 |
23 | export const IMAGE = 'public.image'
24 | export const AUDIO = 'public.audio'
25 |
26 | export const MOVIE = 'public.movie'
27 | export const MPEG2_TS = 'public.mpeg-2-transport-stream'
28 |
29 | export const PDF = 'com.adobe.pdf'
30 | export const PRESENTATION = 'public.presentation'
31 |
32 | export const PAGES = 'com.apple.iwork.pages.sfftemplate'
33 | export const DOC = 'com.microsoft.word.doc'
34 | export const DOCX = 'org.openxmlformats.wordprocessingml.document'
35 |
36 | export const SPREADSHEET = 'public.spreadsheet'
37 | export const XLS = 'com.microsoft.excel.xls'
38 | export const XLSX = 'org.openxmlformats.spreadsheetml.sheet'
39 |
40 | export const TEXT = 'public.text'
41 | export const PLAIN_TEXT = 'public.plain-text'
42 | export const MARKDOWN = 'net.daringfireball.markdown'
43 | export const SOURCE_CODE = 'public.source-code'
44 |
45 | export const ARCHIVE = 'public.archive'
46 |
47 | export const APPLICATION = 'com.apple.application'
48 |
49 | export const EXECUTABLE = 'public.unix-executable'
50 |
51 | export const VOLUME = 'public.volume'
52 |
53 | export const DIRECTORY = 'public.directory'
54 |
55 | export const ITEM = 'public.item'
56 | }
57 |
58 | export namespace ScopeName {
59 | export const HOME = 'home'
60 | export const SETTING = 'setting'
61 | }
62 |
--------------------------------------------------------------------------------
/src/models/SearchScopeModel.ts:
--------------------------------------------------------------------------------
1 | import { getOsUserInfo, getVolumes } from '@/preload'
2 |
3 | export class SearchScopeModel {
4 | public static readonly ROOT_ID = 'root'
5 | public static readonly USER_ID = 'user'
6 | public static readonly COMMON_ID = 'common'
7 |
8 | id: string
9 | label: string
10 | paths: string[]
11 |
12 | constructor(id: string, label: string, paths: string[]) {
13 | this.id = id
14 | this.label = label
15 | this.paths = paths
16 | }
17 |
18 | public static readonly ROOT = new SearchScopeModel(SearchScopeModel.ROOT_ID, '这台 Mac', ['/'])
19 |
20 | public static readonly USER = new SearchScopeModel(SearchScopeModel.USER_ID, '', [])
21 |
22 | public static readonly COMMON = new SearchScopeModel(SearchScopeModel.COMMON_ID, '常用', [])
23 |
24 | static {
25 | const info = getOsUserInfo()
26 | SearchScopeModel.USER.label = info.username
27 | SearchScopeModel.USER.paths = [info.homedir]
28 |
29 | SearchScopeModel.COMMON.paths = [
30 | '/Applications',
31 | '/System/Applications',
32 | '/System/Library/CoreServices',
33 | '/Library/Developer',
34 | info.homedir
35 | ]
36 | }
37 |
38 | private static DEFAULT_SCOPES: SearchScopeModel[] = [
39 | SearchScopeModel.ROOT,
40 | SearchScopeModel.USER,
41 | SearchScopeModel.COMMON
42 | ]
43 |
44 | public static defaultSearchScopes() {
45 | return SearchScopeModel.DEFAULT_SCOPES
46 | }
47 |
48 | public static async refreshDefaultSearchScopes() {
49 | const scopes = [SearchScopeModel.ROOT]
50 | const volumes = await getVolumes()
51 | volumes.forEach((v, index) => {
52 | scopes.push(new SearchScopeModel(index + v.name, v.name, [v.path]))
53 | })
54 | SearchScopeModel.ROOT.paths = ['/', ...volumes.map((v) => v.path)]
55 | scopes.push(SearchScopeModel.USER)
56 | scopes.push(SearchScopeModel.COMMON)
57 | SearchScopeModel.DEFAULT_SCOPES = scopes
58 | return SearchScopeModel.DEFAULT_SCOPES
59 | }
60 | }
61 |
62 | export default SearchScopeModel
63 |
--------------------------------------------------------------------------------
/src/views/Setting.vue:
--------------------------------------------------------------------------------
1 |
2 | 版本:{{ version }}
5 |开发者:{{ author }}
6 |7 | 项目地址: 8 | 13 | 14 |
15 |
16 | 帮助文档:
17 |
{{ text }}
25 |