This commit is contained in:
Devon22 2026-07-07 23:07:34 +08:00
parent f448ffb986
commit f031515fda
15 changed files with 156 additions and 81 deletions

View file

@ -1,7 +1,7 @@
{
"id": "gridexplorer",
"name": "GridExplorer",
"version": "3.4.16",
"version": "3.4.17",
"minAppVersion": "1.8.7",
"description": "Browse and organize note files visually in a flexible grid layout.",
"author": "Devon22",

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "gridexplorer",
"version": "3.4.16",
"version": "3.4.17",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "gridexplorer",
"version": "3.4.16",
"version": "3.4.17",
"license": "MIT",
"dependencies": {
"jszip": "^3.10.1"

View file

@ -1,6 +1,6 @@
{
"name": "gridexplorer",
"version": "3.4.16",
"version": "3.4.17",
"description": "Browse and organize note files visually in a flexible grid layout.",
"main": "main.js",
"scripts": {

View file

@ -1,4 +1,4 @@
import { TFile, TFolder, WorkspaceLeaf, Menu, setIcon, Platform, normalizePath, ItemView, EventRef, FuzzySuggestModal, parseLinktext, ViewStateResult } from 'obsidian';
import { TFile, TFolder, WorkspaceLeaf, Menu, setIcon, Platform, normalizePath, ItemView, EventRef, FuzzySuggestModal, parseLinktext, ViewStateResult, Notice } from 'obsidian';
import GridExplorerPlugin from './main';
import { GridView } from './GridView';
import { isFolderIgnored, isImageFile, isVideoFile, isAudioFile, isMediaFile } from './utils/fileUtils';
@ -2225,11 +2225,11 @@ export class ExplorerView extends ItemView {
let handled = false;
for (const line of lines) {
let resolvedFile: TFile | null = null;
try {
let text = line;
if (text.startsWith('!')) text = text.substring(1);
let resolvedFile: TFile | null = null;
if (text.startsWith('[[') && text.endsWith(']]')) {
const inner = text.slice(2, -2);
const parsed = parseLinktext(inner);
@ -2253,6 +2253,7 @@ export class ExplorerView extends ItemView {
handled = true;
}
} catch (error) {
new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`);
console.error('An error occurred while moving one of the files (ExplorerView):', error);
// 繼續處理其他檔案
}

View file

@ -398,8 +398,13 @@ export default class GridExplorerPlugin extends Plugin {
// 攔截所有tag點擊事件
this.registerDomEvent(activeDocument, 'click', async (evt: MouseEvent) => {
// 如果未啟用攔截所有tag點擊事件則跳過
if (!this.settings.interceptAllTagClicks) return;
// 判斷是否符合攔截條件
const tagMode = this.settings.interceptAllTagClicks;
if (tagMode === 'disabled') return;
if (tagMode === 'alt' && !evt.altKey) return;
if (tagMode === 'ctrl' && !(evt.ctrlKey || evt.metaKey)) return;
if (tagMode === 'shift' && !evt.shiftKey) return;
// 只處理左鍵
if (evt.button !== 0) return;
@ -462,11 +467,18 @@ export default class GridExplorerPlugin extends Plugin {
// 攔截Breadcrumb導航點擊事件
this.registerDomEvent(activeDocument, 'click', async (evt: MouseEvent) => {
// 如果未啟用攔截Breadcrumb導航點擊事件則跳過
if (!this.settings.interceptBreadcrumbClicks) return;
//如果有按著Ctrl鍵則跳過
if (evt.ctrlKey || evt.metaKey) return;
// 判斷是否符合攔截條件
const crumbMode = this.settings.interceptBreadcrumbClicks;
if (crumbMode === 'disabled') return;
if (crumbMode === 'enabled') {
if (evt.ctrlKey || evt.metaKey) return; // 預設功能,有按 Ctrl 鍵則跳過
} else if (crumbMode === 'alt') {
if (!evt.altKey) return;
} else if (crumbMode === 'ctrl') {
if (!(evt.ctrlKey || evt.metaKey)) return;
} else if (crumbMode === 'shift') {
if (!evt.shiftKey) return;
}
const target = evt.target as HTMLElement;
const breadcrumbEl = target.closest('.view-header-breadcrumb');
@ -838,6 +850,15 @@ export default class GridExplorerPlugin extends Plugin {
async loadSettings() {
const loadedSettings = await this.loadData() as Partial<GallerySettings> | null;
this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedSettings ?? {});
// 相容舊版 boolean 設定
if (typeof this.settings.interceptAllTagClicks === 'boolean') {
this.settings.interceptAllTagClicks = this.settings.interceptAllTagClicks ? 'enabled' : 'disabled';
}
if (typeof this.settings.interceptBreadcrumbClicks === 'boolean') {
this.settings.interceptBreadcrumbClicks = this.settings.interceptBreadcrumbClicks ? 'enabled' : 'disabled';
}
migrateDataviewCodeToQuery(this.settings);
updateCustomDocumentExtensions(this.settings);
}

View file

@ -1,4 +1,4 @@
import { TFolder, TFile, normalizePath, Platform, setIcon, setTooltip, Menu, parseLinktext } from 'obsidian';
import { TFolder, TFile, normalizePath, Platform, setIcon, setTooltip, Menu, parseLinktext, Notice } from 'obsidian';
import { GridView } from './GridView';
import { isFolderIgnored } from './utils/fileUtils';
import { extractObsidianPathsFromDT } from './utils/dragUtils';
@ -93,6 +93,7 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) {
await gridView.app.fileManager.renameFile(resolved, newPath);
}
} catch (error) {
new Notice(`${t('failed_to_move_file')}: ${resolved.name}`);
console.error(`An error occurred while moving the file ${p}:`, error);
}
} else {
@ -117,11 +118,11 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) {
.filter((v: string): v is string => v.length > 0);
for (const line of lines) {
let resolvedFile: TFile | null = null;
try {
let text = line;
if (text.startsWith('!')) text = text.substring(1);
let resolvedFile: TFile | null = null;
if (text.startsWith('[[') && text.endsWith(']]')) {
const inner = text.slice(2, -2);
const parsed = parseLinktext(inner);
@ -144,6 +145,7 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) {
}
}
} catch (error) {
new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`);
console.error('An error occurred while moving one of the files (container):', error);
// 繼續處理其他檔案
}
@ -525,6 +527,7 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) {
await gridView.app.fileManager.renameFile(resolved, newPath);
}
} catch (error) {
new Notice(`${t('failed_to_move_file')}: ${resolved.name}`);
console.error(`An error occurred while moving the file ${p}:`, error);
}
} else {
@ -555,37 +558,38 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) {
.map((s: string) => s.trim())
.filter((v: string): v is string => v.length > 0);
for (const line of lines) {
try {
let text = line;
if (text.startsWith('!')) text = text.substring(1); // 去除 '!'
let resolvedFile: TFile | null = null;
if (text.startsWith('[[') && text.endsWith(']]')) {
const inner = text.slice(2, -2);
const parsed = parseLinktext(inner);
const dest = gridView.app.metadataCache.getFirstLinkpathDest(parsed.path, srcPath);
if (dest instanceof TFile) resolvedFile = dest;
} else {
const direct = gridView.app.vault.getAbstractFileByPath(text);
if (direct instanceof TFile) {
resolvedFile = direct;
} else {
const dest = gridView.app.metadataCache.getFirstLinkpathDest(text, srcPath);
if (dest instanceof TFile) resolvedFile = dest;
}
}
try {
let text = line;
if (text.startsWith('!')) text = text.substring(1); // 去除 '!'
if (resolvedFile instanceof TFile) {
const newPath = normalizePath(`${folderPath}/${resolvedFile.name}`);
if (resolvedFile.path !== newPath) {
await gridView.app.fileManager.renameFile(resolvedFile, newPath);
if (text.startsWith('[[') && text.endsWith(']]')) {
const inner = text.slice(2, -2);
const parsed = parseLinktext(inner);
const dest = gridView.app.metadataCache.getFirstLinkpathDest(parsed.path, srcPath);
if (dest instanceof TFile) resolvedFile = dest;
} else {
const direct = gridView.app.vault.getAbstractFileByPath(text);
if (direct instanceof TFile) {
resolvedFile = direct;
} else {
const dest = gridView.app.metadataCache.getFirstLinkpathDest(text, srcPath);
if (dest instanceof TFile) resolvedFile = dest;
}
}
if (resolvedFile instanceof TFile) {
const newPath = normalizePath(`${folderPath}/${resolvedFile.name}`);
if (resolvedFile.path !== newPath) {
await gridView.app.fileManager.renameFile(resolvedFile, newPath);
}
}
} catch (error) {
new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`);
console.error('An error occurred while moving one of the files:', error);
// 繼續處理其他檔案
}
} catch (error) {
console.error('An error occurred while moving one of the files:', error);
// 繼續處理其他檔案
}
}
})();
});
});

View file

@ -1,4 +1,4 @@
import { TFolder, TFile, Menu, Platform, setIcon, normalizePath, setTooltip, parseLinktext } from 'obsidian';
import { TFolder, TFile, Menu, Platform, setIcon, normalizePath, setTooltip, parseLinktext, Notice } from 'obsidian';
import { GridView } from './GridView';
import { isFolderIgnored } from './utils/fileUtils';
import { extractObsidianPathsFromDT } from './utils/dragUtils';
@ -312,10 +312,9 @@ export function renderModePath(gridView: GridView) {
// 處理 obsidian:// URI 格式(單檔/多檔)
const obsidianPaths = await extractObsidianPathsFromDT(event.dataTransfer);
if (obsidianPaths.length > 0) {
try {
for (const filePath of obsidianPaths) {
let resolved: TFile | null = null;
for (const filePath of obsidianPaths) {
let resolved: TFile | null = null;
try {
// 1) 直接以路徑查找
const direct = gridView.app.vault.getAbstractFileByPath(filePath);
if (direct instanceof TFile) {
@ -341,9 +340,10 @@ export function renderModePath(gridView: GridView) {
await gridView.app.fileManager.renameFile(resolved, newPath);
}
}
} catch (error) {
new Notice(`${t('failed_to_move_file')}: ${resolved ? resolved.name : filePath}`);
console.error('An error occurred while moving multiple files to folder:', error);
}
} catch (error) {
console.error('An error occurred while moving multiple files to folder:', error);
}
return;
}
@ -359,11 +359,11 @@ export function renderModePath(gridView: GridView) {
.filter((v: string): v is string => v.length > 0);
for (const line of lines) {
let resolvedFile: TFile | null = null;
try {
let text = line;
if (text.startsWith('!')) text = text.substring(1);
let resolvedFile: TFile | null = null;
if (text.startsWith('[[') && text.endsWith(']]')) {
const inner = text.slice(2, -2);
const parsed = parseLinktext(inner);
@ -386,6 +386,7 @@ export function renderModePath(gridView: GridView) {
}
}
} catch (error) {
new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`);
console.error('An error occurred while moving one of the files to folder:', error);
// 繼續處理其他檔案
}

View file

@ -37,6 +37,8 @@ function isCustomMode(value: unknown): value is CustomMode {
);
}
export type InterceptMode = 'enabled' | 'alt' | 'ctrl' | 'shift' | 'disabled';
export interface GallerySettings {
ignoredFolders: string[]; // 要忽略的資料夾路徑
ignoredFolderPatterns: string[]; // 要忽略的資料夾模式
@ -81,8 +83,8 @@ export interface GallerySettings {
dateDividerMode: string; // 日期分隔器模式none, year, month, day
showCodeBlocksInSummary: boolean; // 是否在摘要中顯示程式碼區塊
folderNoteDisplaySettings: string; // 資料夾筆記設定
interceptAllTagClicks: boolean; // 攔截所有tag點擊事件
interceptBreadcrumbClicks: boolean; // 攔截Breadcrumb點擊事件
interceptAllTagClicks: InterceptMode; // 攔截所有tag點擊事件
interceptBreadcrumbClicks: InterceptMode; // 攔截Breadcrumb點擊事件
customModes: CustomMode[]; // 自訂模式
quickAccessCommandPath: string; // Path used by "Open quick access folder" command
quickAccessModeType: string; // View types used by "Open quick access view" command
@ -141,8 +143,8 @@ export const DEFAULT_SETTINGS: GallerySettings = {
dateDividerMode: 'none', // 預設不使用日期分隔器
showCodeBlocksInSummary: false, // 預設不在摘要中顯示程式碼區塊
folderNoteDisplaySettings: 'default', // 預設不處理資料夾筆記
interceptAllTagClicks: true, // 預設攔截所有tag點擊事件
interceptBreadcrumbClicks: true, // 預設攔截Breadcrumb點擊事件
interceptAllTagClicks: 'enabled', // 預設攔截所有tag點擊事件
interceptBreadcrumbClicks: 'enabled', // 預設攔截Breadcrumb點擊事件
customModes: [
{
internalName: 'custom-1750837329297',
@ -881,26 +883,34 @@ export class GridExplorerSettingTab extends PluginSettingTab {
new Setting(sectionEl)
.setName(t('intercept_all_tag_clicks'))
.setDesc(t('intercept_all_tag_clicks_desc'))
.addToggle(toggle => {
toggle
.setValue(this.plugin.settings.interceptAllTagClicks)
.onChange(async (value) => {
this.plugin.settings.interceptAllTagClicks = value;
await this.plugin.saveSettings();
});
.addDropdown(drop => {
drop.addOption('enabled', t('intercept_mode_enabled'));
drop.addOption('alt', t('intercept_mode_alt'));
drop.addOption('ctrl', t('intercept_mode_ctrl'));
drop.addOption('shift', t('intercept_mode_shift'));
drop.addOption('disabled', t('intercept_mode_disabled'));
drop.setValue(this.plugin.settings.interceptAllTagClicks);
drop.onChange(async (value) => {
this.plugin.settings.interceptAllTagClicks = value as InterceptMode;
await this.plugin.saveSettings();
});
});
// 攔截Breadcrumb點擊事件
new Setting(sectionEl)
.setName(t('intercept_breadcrumb_clicks'))
.setDesc(t('intercept_breadcrumb_clicks_desc'))
.addToggle(toggle => {
toggle
.setValue(this.plugin.settings.interceptBreadcrumbClicks)
.onChange(async (value) => {
this.plugin.settings.interceptBreadcrumbClicks = value;
await this.plugin.saveSettings();
});
.addDropdown(drop => {
drop.addOption('enabled', t('intercept_mode_enabled'));
drop.addOption('alt', t('intercept_mode_alt'));
drop.addOption('ctrl', t('intercept_mode_ctrl'));
drop.addOption('shift', t('intercept_mode_shift'));
drop.addOption('disabled', t('intercept_mode_disabled'));
drop.setValue(this.plugin.settings.interceptBreadcrumbClicks);
drop.onChange(async (value) => {
this.plugin.settings.interceptBreadcrumbClicks = value as InterceptMode;
await this.plugin.saveSettings();
});
});

View file

@ -140,9 +140,14 @@ export default {
'enable_file_watcher': 'Enable file watcher',
'enable_file_watcher_desc': 'When enabled, the view will automatically update when files change. If disabled, you need to click the refresh button manually',
'intercept_all_tag_clicks': 'Intercept all tag clicks',
'intercept_all_tag_clicks_desc': 'When enabled, all tag clicks will be intercepted and opened in the grid view',
'intercept_all_tag_clicks_desc': 'Configure how tag click interception is triggered to open tags in grid view',
'intercept_breadcrumb_clicks': 'Intercept breadcrumb clicks',
'intercept_breadcrumb_clicks_desc': 'When enabled, breadcrumb clicks will be intercepted and the path will be opened in the grid view',
'intercept_breadcrumb_clicks_desc': 'Configure how breadcrumb click interception is triggered to open the folder path in grid view',
'intercept_mode_enabled': 'Intercept click',
'intercept_mode_alt': 'Click with Alt',
'intercept_mode_ctrl': 'Click with Ctrl',
'intercept_mode_shift': 'Click with Shift',
'intercept_mode_disabled': 'No intercept',
'reset_to_default': 'Reset to default',
'settings_reset_notice': 'Settings have been reset to default values',
'config_management': 'Config management',
@ -333,4 +338,5 @@ export default {
'add_to_stash': 'Add to stash',
'added_to_stash': 'Added to stash',
'import_fail_notice': 'Import failed',
'failed_to_move_file': 'Failed to move file',
};

View file

@ -139,9 +139,14 @@ export default {
'enable_file_watcher': 'ファイル監視を有効にする',
'enable_file_watcher_desc': '有効にすると、ファイルの変更を自動的に検出してビューを更新します。無効の場合は、更新ボタンを手動でクリックする必要があります',
'intercept_all_tag_clicks': 'すべてのタグクリックをインターセプト',
'intercept_all_tag_clicks_desc': '有効にすると、すべてのタグクリックがインターセプトされ、グリッドビューで開かれます',
'intercept_all_tag_clicks_desc': 'タグクリックのインターセプトをトリガーする方法を設定し、グリッドビューで開きます',
'intercept_breadcrumb_clicks': 'パンくずリストのクリックをインターセプト',
'intercept_breadcrumb_clicks_desc': '有効にすると、パンくずリストのクリックがインターセプトされ、パスがグリッドビューで開かれます',
'intercept_breadcrumb_clicks_desc': 'パンくずリストのクリックのインターセプトをトリガーする方法を設定し、グリッドビューで開きます',
'intercept_mode_enabled': 'クリックをインターセプト',
'intercept_mode_alt': 'Altを押しながらクリック',
'intercept_mode_ctrl': 'Ctrlを押しながらクリック',
'intercept_mode_shift': 'Shiftを押しながらクリック',
'intercept_mode_disabled': 'インターセプトしない',
'reset_to_default': 'デフォルトに戻す',
'settings_reset_notice': '設定値がデフォルト値にリセットされました',
'config_management': '設定管理',

View file

@ -140,9 +140,14 @@ export default {
'enable_file_watcher': '파일 감시 활성화',
'enable_file_watcher_desc': '활성화 시 파일 변경 시 뷰가 자동으로 업데이트됩니다. 비활성화 시 새로고침 버튼을 수동으로 클릭해야 합니다',
'intercept_all_tag_clicks': '모든 태그 클릭 가로채기',
'intercept_all_tag_clicks_desc': '활성화 시 모든 태그 클릭이 가로채져 그리드 뷰에서 열립니다',
'intercept_all_tag_clicks_desc': '태그 클릭 가로채기 트리거 방식을 설정하여 그리드 뷰에서 엽니다',
'intercept_breadcrumb_clicks': '브레드크럼 클릭 가로채기',
'intercept_breadcrumb_clicks_desc': '활성화 시 브레드크럼 클릭이 가로채져 경로가 그리드 뷰에서 열립니다',
'intercept_breadcrumb_clicks_desc': '브레드크럼 클릭 가로채기 트리거 방식을 설정하여 경로를 그리드 뷰에서 엽니다',
'intercept_mode_enabled': '클릭 가로채기',
'intercept_mode_alt': 'Alt 누르고 클릭',
'intercept_mode_ctrl': 'Ctrl 누르고 클릭',
'intercept_mode_shift': 'Shift 누르고 클릭',
'intercept_mode_disabled': '가로채지 않음',
'reset_to_default': '기본값으로 재설정',
'settings_reset_notice': '설정이 기본값으로 재설정되었습니다',
'config_management': '구성 관리',

View file

@ -139,9 +139,14 @@ export default {
'enable_file_watcher': 'Включить наблюдение за файлами',
'enable_file_watcher_desc': 'При включении вид будет автоматически обновляться при изменении файлов. Если отключено, нужно вручную нажимать кнопку обновления',
'intercept_all_tag_clicks': 'Перехватывать все клики по тегам',
'intercept_all_tag_clicks_desc': 'При включении все клики по тегам будут перехватываться и открываться в виде сетки',
'intercept_all_tag_clicks_desc': 'Настройте способ перехвата кликов по тегам для открытия в виде сетки',
'intercept_breadcrumb_clicks': 'Перехватывать клики по навигационной цепочке',
'intercept_breadcrumb_clicks_desc': 'При включении клики по навигационной цепочке будут перехватываться, и путь будет открываться в виде сетки',
'intercept_breadcrumb_clicks_desc': 'Настройте способ перехвата кликов по навигационной цепочке для открытия пути в виде сетки',
'intercept_mode_enabled': 'Перехватывать клик',
'intercept_mode_alt': 'Клик с Alt',
'intercept_mode_ctrl': 'Клик с Ctrl',
'intercept_mode_shift': 'Клик с Shift',
'intercept_mode_disabled': 'Не перехватывать',
'reset_to_default': 'Сбросить на значения по умолчанию',
'settings_reset_notice': 'Настройки сброшены на значения по умолчанию',
'config_management': 'Конфигурация управления',

View file

@ -139,9 +139,14 @@ export default {
'enable_file_watcher': 'Увімкнути спостереження за файлами',
'enable_file_watcher_desc': 'Коли увімкнено, вигляд автоматично оновлюватиметься при зміні файлів. Якщо вимкнено, потрібно вручну натискати кнопку оновлення',
'intercept_all_tag_clicks': 'Перехоплювати всі кліки по тегах',
'intercept_all_tag_clicks_desc': 'Коли увімкнено, всі кліки по тегах перехоплюватимуться і відкриватимуться в сітковому вигляді',
'intercept_all_tag_clicks_desc': 'Налаштуйте спосіб перехоплення кліків по тегах для відкриття в сітковому вигляді',
'intercept_breadcrumb_clicks': 'Перехоплювати кліки по навігаційному ланцюжку',
'intercept_breadcrumb_clicks_desc': 'Коли увімкнено, кліки по навігаційному ланцюжку перехоплюватимуться, і шлях відкриватиметься в сітковому вигляді',
'intercept_breadcrumb_clicks_desc': 'Налаштуйте спосіб перехоплення кліків по навігаційному ланцюжку для відкриття шляху в сітковому вигляді',
'intercept_mode_enabled': 'Перехоплювати клік',
'intercept_mode_alt': 'Клік з Alt',
'intercept_mode_ctrl': 'Клік з Ctrl',
'intercept_mode_shift': 'Клік з Shift',
'intercept_mode_disabled': 'Не перехоплювати',
'reset_to_default': 'Скинути до значень за замовчуванням',
'settings_reset_notice': 'Налаштування скинуто до значень за замовчуванням',
'config_management': 'Управління конфігурацією',

View file

@ -140,9 +140,14 @@ export default {
'enable_file_watcher': '啟用檔案監控',
'enable_file_watcher_desc': '啟用後會自動偵測檔案變更並更新視圖,關閉後需手動點擊重新整理按鈕',
'intercept_all_tag_clicks': '攔截所有標籤點擊事件',
'intercept_all_tag_clicks_desc': '啟用後會攔截所有標籤點擊事件,並在網格視圖中打開標籤',
'intercept_all_tag_clicks_desc': '設定攔截標籤點擊事件的觸發方式,並在網格視圖中打開標籤',
'intercept_breadcrumb_clicks': '攔截筆記導航列點擊事件',
'intercept_breadcrumb_clicks_desc': '啟用後會攔截筆記導航列點擊事件,並在網格視圖中打開路徑',
'intercept_breadcrumb_clicks_desc': '設定攔截筆記導航列點擊事件的觸發方式,並在網格視圖中打開路徑',
'intercept_mode_enabled': '攔截點擊',
'intercept_mode_alt': '按著Alt點擊',
'intercept_mode_ctrl': '按著Ctrl點擊',
'intercept_mode_shift': '按著Shift點擊',
'intercept_mode_disabled': '不攔截',
'reset_to_default': '重置為預設值',
'settings_reset_notice': '設定值已重置為預設值',
'config_management': '設定檔管理',
@ -333,4 +338,5 @@ export default {
'add_to_stash': '加入暫存區',
'added_to_stash': '已添加到暫存區',
'import_fail_notice': '匯入失敗',
'failed_to_move_file': '搬移檔案失敗',
};

View file

@ -139,9 +139,14 @@ export default {
'enable_file_watcher': '启用文件监控',
'enable_file_watcher_desc': '启用后会自动检测文件变更并更新视图,关闭后需手动点击刷新按钮',
'intercept_all_tag_clicks': '拦截所有标签点击事件',
'intercept_all_tag_clicks_desc': '启用后会拦截所有标签点击事件,改为在网格视图中打开标签',
'intercept_all_tag_clicks_desc': '设置拦截标签点击事件的触发方式,并在网格视图中打开标签',
'intercept_breadcrumb_clicks': '拦截笔记导航栏点击事件',
'intercept_breadcrumb_clicks_desc': '启用后会拦截笔记导航栏点击事件,并在网格视图中打开路径',
'intercept_breadcrumb_clicks_desc': '设置拦截笔记导航栏点击事件的触发方式,并在网格视图中打开路径',
'intercept_mode_enabled': '拦截点击',
'intercept_mode_alt': '按住Alt点击',
'intercept_mode_ctrl': '按住Ctrl点击',
'intercept_mode_shift': '按住Shift点击',
'intercept_mode_disabled': '不拦截',
'reset_to_default': '重置为默认值',
'settings_reset_notice': '设置值已重置为默认值',
'config_management': '配置管理',
@ -332,4 +337,5 @@ export default {
'add_to_stash': '加入暂存区',
'added_to_stash': '已添加到暂存区',
'import_fail_notice': '导入失败',
'failed_to_move_file': '搬移文件失败',
};