vault backup: 2026-05-15 16:58:51

This commit is contained in:
2026-05-15 16:58:51 -04:00
parent 901a23ae0e
commit b1b483daf8
38 changed files with 2562 additions and 75 deletions
+3 -1
View File
@@ -24,5 +24,7 @@
"pdf-plus",
"copy-document-as-html",
"templater-obsidian",
"obsidian-toggle-list"
"obsidian-toggle-list",
"neighbouring-files",
"cmdr"
]
+27 -10
View File
@@ -42,15 +42,6 @@
"key": "S"
}
],
"obsidian-linter:lint-all-files": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "S"
}
],
"copy-as-html:copy-as-html-command": [
{
"modifiers": [
@@ -93,5 +84,31 @@
],
"key": "X"
}
]
],
"graph:open": [],
"graph:open-local": [
{
"modifiers": [
"Mod"
],
"key": "G"
}
],
"neighbouring-files:prev-alphabetical": [
{
"modifiers": [
"Mod"
],
"key": "K"
}
],
"neighbouring-files:next-alphabetical": [
{
"modifiers": [
"Mod"
],
"key": "J"
}
],
"editor:insert-link": []
}
+51
View File
@@ -0,0 +1,51 @@
{
"confirmDeletion": false,
"showAddCommand": true,
"debug": false,
"editorMenu": [],
"fileMenu": [],
"leftRibbon": [],
"rightRibbon": [],
"titleBar": [],
"statusBar": [],
"pageHeader": [
{
"id": "neighbouring-files:prev-alphabetical",
"icon": "lucide-file-up",
"name": "Neighbouring Files: Navigate to prev file (alphabetical)",
"mode": "any"
},
{
"id": "neighbouring-files:next-alphabetical",
"icon": "lucide-file-down",
"name": "Neighbouring Files: Navigate to next file (alphabetical)",
"mode": "any"
}
],
"macros": [],
"explorer": [],
"hide": {
"statusbar": [
"properties",
"backlink"
],
"leftRibbon": [
"Digital Garden Publication Center",
"Open Git source control",
"New drawing",
"Advanced Tables Toolbar",
"Create new base"
]
},
"spacing": "8",
"advancedToolbar": {
"rowHeight": 48,
"rowCount": 1,
"spacing": 0,
"buttonWidth": 48,
"columnLayout": false,
"mappedIcons": [],
"tooltips": false,
"heightOffset": 0
}
}
+11
View File
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "cmdr",
"name": "Commander",
"version": "0.5.5",
"minAppVersion": "1.4.0",
"description": "Customize your workspace by adding commands everywhere, create Macros and supercharge your mobile toolbar.",
"author": "jsmorabito & phibr0",
"authorUrl": "https://github.com/phibr0",
"fundingUrl": "https://ko-fi.com/phibr0",
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"defaultSortOrder": "alphabetical",
"enableFolderLoop": true,
"enableFolderBoundary": false,
"includedFileTypes": "markdownOnly",
"additionalExtensions": [
"canvas",
"pdf"
]
}
+450
View File
@@ -0,0 +1,450 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => NeighbouringFileNavigatorPlugin
});
module.exports = __toCommonJS(main_exports);
// src/NeighbouringFileNavigator.ts
var import_obsidian = require("obsidian");
var _NeighbouringFileNavigator = class _NeighbouringFileNavigator {
constructor(settings) {
this.settings = settings;
}
static reverse(fn) {
return (a, b) => -fn(a, b);
}
getFileExplorerSortOrder(workspace) {
var _a, _b, _c, _d, _e, _f;
return (_f = (_e = (_d = (_c = (_b = (_a = workspace.getLeavesOfType) == null ? void 0 : _a.call(workspace, "file-explorer")) == null ? void 0 : _b.first()) == null ? void 0 : _c.getViewState()) == null ? void 0 : _d.state) == null ? void 0 : _e.sortOrder) != null ? _f : this.settings.defaultSortOrder;
}
getCurrentSortFn(workspace) {
const sortOrder = this.getFileExplorerSortOrder(workspace);
return _NeighbouringFileNavigator.sorters[sortOrder];
}
navigateToNextFile(workspace) {
const sortOrder = this.getFileExplorerSortOrder(workspace);
console.debug("navigateToNextFile with sortOrder", sortOrder);
const sortFn = _NeighbouringFileNavigator.sorters[sortOrder];
this.navigateToNeighbouringFile(workspace, sortFn, true);
}
navigateToPrevFile(workspace) {
const sortOrder = this.getFileExplorerSortOrder(workspace);
console.debug("navigateToPrevFile with sortOrder", sortOrder);
const sortFn = _NeighbouringFileNavigator.sorters[sortOrder];
this.navigateToNeighbouringFile(workspace, sortFn, false);
}
navigateToNextAlphabeticalFile(workspace) {
console.debug("navigateToNextAlphabeticalFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.alphabetical,
true
);
}
navigateToPrevAlphabeticalFile(workspace) {
console.debug("navigateToPrevAlphabeticalFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.alphabetical,
false
);
}
navigateToOlderCreatedFile(workspace) {
console.debug("navigateToOlderCreatedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byCreatedTime,
true
);
}
navigateToNewerCreatedFile(workspace) {
console.debug("navigateToNewerCreatedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byCreatedTimeReverse,
true
);
}
navigateToOlderModifiedFile(workspace) {
console.debug("navigateToOlderModifiedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byModifiedTime,
true
);
}
navigateToNewerModifiedFile(workspace) {
console.debug("navigateToNewerModifiedFile");
this.navigateToNeighbouringFile(
workspace,
_NeighbouringFileNavigator.sorters.byModifiedTimeReverse,
true
);
}
navigateToResolvedFile(workspace, resolveTarget) {
const activeFile = workspace.getActiveFile();
if (!activeFile) return;
const toFile = resolveTarget(activeFile, this.getCurrentSortFn(workspace));
if (!toFile || toFile === activeFile) return;
workspace.getLeaf(false).openFile(toFile);
}
navigateToParentFolder(workspace) {
this.navigateToResolvedFile(workspace, (activeFile, sortFn) => {
var _a;
const parentFolder = (_a = activeFile.parent) == null ? void 0 : _a.parent;
return parentFolder ? this.findBoundaryFileInFolderTree(parentFolder, sortFn, true) : void 0;
});
}
navigateToFirstChildFolder(workspace) {
this.navigateToResolvedFile(
workspace,
(activeFile, sortFn) => this.findFileInChildFolders(activeFile.parent, sortFn)
);
}
navigateToNextSiblingFolder(workspace) {
this.navigateToResolvedFile(
workspace,
(activeFile, sortFn) => this.findFileInSiblingFolders(activeFile.parent, sortFn, true)
);
}
navigateToPrevSiblingFolder(workspace) {
this.navigateToResolvedFile(
workspace,
(activeFile, sortFn) => this.findFileInSiblingFolders(activeFile.parent, sortFn, false)
);
}
navigateToNeighbouringFile(workspace, sortFn, forward = true) {
const activeFile = workspace.getActiveFile();
if (!activeFile) return;
const files = this.getNeighbouringFiles(activeFile, sortFn);
if (!files.length) return;
const currentItem = files.findIndex(
(item) => item.name === activeFile.name
);
if (currentItem === -1) return;
const delta = forward ? 1 : -1;
const tentativeIndex = currentItem + delta;
const isAtBoundary = tentativeIndex < 0 || tentativeIndex >= files.length;
const nextIndex = this.settings.enableFolderLoop ? isAtBoundary ? forward ? 0 : files.length - 1 : tentativeIndex : Math.max(0, Math.min(tentativeIndex, files.length - 1));
let toFile = files[nextIndex];
const atFolderBoundary = !this.settings.enableFolderLoop && nextIndex === currentItem && isAtBoundary && (forward ? currentItem === files.length - 1 : currentItem === 0);
if (atFolderBoundary && this.settings.enableFolderBoundary) {
const boundaryFile = this.findBoundaryFile(
activeFile,
sortFn,
forward
);
if (boundaryFile) {
toFile = boundaryFile;
}
}
if (!toFile) return;
workspace.getLeaf(false).openFile(toFile);
}
filterFiletype(file) {
if (this.settings.includedFileTypes === "allFiles") return true;
if (this.settings.includedFileTypes === "markdownOnly") {
return file.extension === "md";
} else if (this.settings.includedFileTypes === "additionalExtensions") {
return file.extension === "md" || this.settings.additionalExtensions.includes(file.extension);
}
}
getNeighbouringFiles(file, sortFn) {
return file.parent ? this.getSortedFilesInFolder(file.parent, sortFn) : [];
}
getSortedFilesInFolder(folder, sortFn) {
var _a, _b;
return (_b = (_a = folder.children) == null ? void 0 : _a.filter((child) => child instanceof import_obsidian.TFile).filter((file) => this.filterFiletype(file)).sort(sortFn)) != null ? _b : [];
}
getChildFolders(folder) {
var _a, _b;
return (_b = (_a = folder.children) == null ? void 0 : _a.filter(
(child) => child instanceof import_obsidian.TFolder
)) != null ? _b : [];
}
findFileInChildFolders(folder, sortFn) {
if (!folder) return void 0;
for (const childFolder of this.getChildFolders(folder)) {
const toFile = this.findBoundaryFileInFolderTree(
childFolder,
sortFn,
true
);
if (toFile) return toFile;
}
return void 0;
}
findFileInSiblingFolders(currentFolder, sortFn, forward) {
if (!(currentFolder == null ? void 0 : currentFolder.parent)) return void 0;
const siblingFolders = this.getChildFolders(currentFolder.parent);
const currentFolderIndex = siblingFolders.findIndex(
(folder) => folder === currentFolder
);
if (currentFolderIndex === -1) return void 0;
const step = forward ? 1 : -1;
for (let folderIndex = currentFolderIndex + step; folderIndex >= 0 && folderIndex < siblingFolders.length; folderIndex += step) {
const toFile = this.findBoundaryFileInFolderTree(
siblingFolders[folderIndex],
sortFn,
forward
);
if (toFile) return toFile;
}
return void 0;
}
findBoundaryFileInFolderTree(folder, sortFn, forward) {
const sortedFiles = this.getSortedFilesInFolder(folder, sortFn);
const childFolders = this.getChildFolders(folder);
const orderedChildFolders = forward ? childFolders : childFolders.slice().reverse();
if (forward) {
if (sortedFiles.length) return sortedFiles[0];
for (const childFolder of orderedChildFolders) {
const file = this.findBoundaryFileInFolderTree(
childFolder,
sortFn,
forward
);
if (file) return file;
}
return void 0;
}
for (const childFolder of orderedChildFolders) {
const file = this.findBoundaryFileInFolderTree(
childFolder,
sortFn,
forward
);
if (file) return file;
}
return sortedFiles.length ? sortedFiles[sortedFiles.length - 1] : void 0;
}
findBoundaryFile(activeFile, sortFn, forward) {
let currentFolder = activeFile.parent;
if (!currentFolder) return void 0;
while (currentFolder && currentFolder.parent) {
const parentFolder = currentFolder.parent;
const boundaryFile = this.findFileInSiblingFolders(
currentFolder,
sortFn,
forward
);
if (boundaryFile) return boundaryFile;
const parentFiles = this.getSortedFilesInFolder(
parentFolder,
sortFn
);
if (parentFiles.length) {
return forward ? parentFiles[0] : parentFiles[parentFiles.length - 1];
}
currentFolder = parentFolder;
}
return void 0;
}
};
_NeighbouringFileNavigator.localeSorter = (a, b) => a.basename.localeCompare(b.basename, void 0, {
numeric: true,
sensitivity: "base"
});
_NeighbouringFileNavigator.mtimeSorter = (a, b) => {
return b.stat.mtime - a.stat.mtime;
};
_NeighbouringFileNavigator.ctimeSorter = (a, b) => {
return b.stat.ctime - a.stat.ctime;
};
_NeighbouringFileNavigator.sorters = {
alphabetical: _NeighbouringFileNavigator.localeSorter,
byCreatedTime: _NeighbouringFileNavigator.ctimeSorter,
byModifiedTime: _NeighbouringFileNavigator.mtimeSorter,
alphabeticalReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.localeSorter),
byCreatedTimeReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.ctimeSorter),
byModifiedTimeReverse: _NeighbouringFileNavigator.reverse(_NeighbouringFileNavigator.mtimeSorter)
};
var NeighbouringFileNavigator = _NeighbouringFileNavigator;
// src/NeighbouringFileNavigatorPluginSettings.ts
var DEFAULT_SETTINGS = {
// sorting
defaultSortOrder: "alphabetical",
// navigation options
enableFolderLoop: false,
enableFolderBoundary: false,
// file mask
includedFileTypes: "markdownOnly",
additionalExtensions: ["canvas", "pdf"]
};
// src/NeighbouringFileNavigatorPluginSettingTab.ts
var import_obsidian2 = require("obsidian");
var NeighbouringFileNavigatorPluginSettingTab = class extends import_obsidian2.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
new import_obsidian2.Setting(containerEl).setName("Default Sort Order").setDesc("Fallback sort order used for the default command").addDropdown((dropdown) => {
dropdown.addOption("alphabetical", "Alphabetical");
dropdown.addOption("byCreatedTime", "Creation Timestamp");
dropdown.addOption("byModifiedTime", "Modification Timestamp");
dropdown.setValue(this.plugin.settings.defaultSortOrder);
dropdown.onChange(async (value) => {
this.plugin.settings.defaultSortOrder = value;
await this.plugin.saveSettings();
});
});
new import_obsidian2.Setting(containerEl).setName("Loop Notes in Folder").setDesc("Navigate to the first note when navigating past the last note in the same folder.").addToggle((toggle) => {
toggle.setValue(this.plugin.settings.enableFolderLoop);
toggle.onChange(async (value) => {
this.plugin.settings.enableFolderLoop = value;
await this.plugin.saveSettings();
});
});
new import_obsidian2.Setting(containerEl).setName("Continue Across Folders").setDesc("Move to adjacent folders when navigating beyond the current folder boundary.").addToggle((toggle) => {
toggle.setValue(this.plugin.settings.enableFolderBoundary);
toggle.onChange(async (value) => {
this.plugin.settings.enableFolderBoundary = value;
await this.plugin.saveSettings();
});
});
new import_obsidian2.Setting(containerEl).setName("Included File Types").setDesc("Set which file types to include in the navigation").addDropdown((dropdown) => {
dropdown.addOption("markdownOnly", "Markdown only");
dropdown.addOption("allFiles", "All files");
dropdown.addOption("additionalExtensions", "Additional file extensions below");
dropdown.setValue(this.plugin.settings.includedFileTypes);
dropdown.onChange(async (value) => {
this.plugin.settings.includedFileTypes = value;
await this.plugin.saveSettings();
this.display();
});
});
if (this.plugin.settings.includedFileTypes === "additionalExtensions") {
new import_obsidian2.Setting(containerEl).setName("Extensions").setDesc("List of additional file extensions to include in the navigation (comma separated)").addText((text) => {
text.setPlaceholder("canvas, pdf");
text.setValue(this.plugin.settings.additionalExtensions.join(", "));
text.onChange(async (value) => {
this.plugin.settings.additionalExtensions = value.split(",").map((ext) => ext.trim());
await this.plugin.saveSettings();
});
});
}
}
};
// src/main.ts
var import_obsidian3 = require("obsidian");
var NeighbouringFileNavigatorPlugin = class extends import_obsidian3.Plugin {
async onload() {
await this.loadSettings();
this.addSettingTab(
new NeighbouringFileNavigatorPluginSettingTab(this.app, this)
);
this.navigator = new NeighbouringFileNavigator(this.settings);
this.addCommand({
id: "next",
name: "Navigate to next file",
callback: () => this.navigator.navigateToNextFile(this.app.workspace)
});
this.addCommand({
id: "prev",
name: "Navigate to prev file",
callback: () => this.navigator.navigateToPrevFile(this.app.workspace)
});
this.addCommand({
id: "next-alphabetical",
name: "Navigate to next file (alphabetical)",
callback: () => this.navigator.navigateToNextAlphabeticalFile(
this.app.workspace
)
});
this.addCommand({
id: "prev-alphabetical",
name: "Navigate to prev file (alphabetical)",
callback: () => this.navigator.navigateToPrevAlphabeticalFile(
this.app.workspace
)
});
const olderCreated = {
name: "Navigate to older file (creation timestamp)",
callback: () => this.navigator.navigateToOlderCreatedFile(this.app.workspace)
};
this.addCommand({ ...olderCreated, id: "older-created" });
this.addCommand({ ...olderCreated, id: "prev-created" });
const newerCreated = {
name: "Navigate to newer file (creation timestamp)",
callback: () => this.navigator.navigateToNewerCreatedFile(this.app.workspace)
};
this.addCommand({ ...newerCreated, id: "next-created" });
this.addCommand({ ...newerCreated, id: "newer-created" });
const olderModified = {
name: "Navigate to older file (modification timestamp)",
callback: () => this.navigator.navigateToOlderModifiedFile(this.app.workspace)
};
this.addCommand({ ...olderModified, id: "older-modified" });
this.addCommand({ ...olderModified, id: "prev-modified" });
const newerModified = {
name: "Navigate to newer file (modification timestamp)",
callback: () => this.navigator.navigateToNewerModifiedFile(this.app.workspace)
};
this.addCommand({ ...newerModified, id: "next-modified" });
this.addCommand({ ...newerModified, id: "newer-modified" });
this.addCommand({
id: "folder-up",
name: "Folder up",
callback: () => this.navigator.navigateToParentFolder(this.app.workspace)
});
this.addCommand({
id: "folder-down",
name: "Folder down",
callback: () => this.navigator.navigateToFirstChildFolder(this.app.workspace)
});
this.addCommand({
id: "folder-next",
name: "Next folder",
callback: () => this.navigator.navigateToNextSiblingFolder(this.app.workspace)
});
this.addCommand({
id: "folder-prev",
name: "Prev folder",
callback: () => this.navigator.navigateToPrevSiblingFolder(this.app.workspace)
});
}
onunload() {
}
async loadSettings() {
this.settings = Object.assign(
{},
DEFAULT_SETTINGS,
await this.loadData()
);
}
async saveSettings() {
await this.saveData(this.settings);
}
};
/* nosourcemap */
+11
View File
@@ -0,0 +1,11 @@
{
"id": "neighbouring-files",
"name": "Neighbouring Files",
"version": "1.1.3",
"minAppVersion": "0.15.0",
"description": "Navigate to the next and previous file in the current directory",
"author": "Fabian Untermoser",
"authorUrl": "https://www.ederbit.xyz",
"fundingUrl": "https://www.ederbit.xyz/coffee",
"isDesktopOnly": false
}
+1847
View File
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "sheets",
"name": "Sheets Extended",
"version": "1.2.10",
"minAppVersion": "1.5.0",
"description": "Vertical headers, merged cells, and custom css tables with advanced table compatibility",
"author": "NicoNekoru",
"authorUrl": "https://github.com/NicoNekoru",
"fundingUrl": "https://www.buymeacoffee.com/niconekoru",
"isDesktopOnly": false
}
+35
View File
@@ -0,0 +1,35 @@
/*
This CSS file will be included with your plugin, and
available in the app when your plugin is enabled.
If your plugin does not need CSS, delete this file.
*/
.obs-sheets_error {
color: rgb(255, 100, 100);
background-color: rgba(240, 128, 128, 20%);
text-rendering: optimizeLegibility;
-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
color-scheme: dark;
-webkit-user-select: text;
white-space: break-spaces;
word-break: break-word;
overflow-wrap: anywhere;
-webkit-user-modify: read-write-plaintext-only;
tab-size: 4;
box-sizing: border-box;
font-size: var(--code-size);
font-family: var(--font-monospace);
clear: left;
left: 0;
right: 0;
margin: 0 !important;
display: block;
position: relative;
padding: 0;
max-width: var(--file-line-width);
padding-left: var(--size-4-4);
text-align: center;
}