vault backup: 2026-05-20 17:30:52

This commit is contained in:
2026-05-20 17:30:52 -04:00
parent 593c687ef6
commit bc48c9cdd4
54 changed files with 476 additions and 32 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
"strictLineBreaks": true,
"propertiesInDocument": "visible",
"showLineNumber": true,
"autoPairMarkdown": false,
"autoPairMarkdown": true,
"useTab": false,
"alwaysUpdateLinks": true,
"tabSize": 4,
+3 -1
View File
@@ -24,5 +24,7 @@
"obsidian-toggle-list",
"neighbouring-files",
"cmdr",
"sheets"
"sheets",
"tabout",
"obsidian-tidy-footnotes"
]
+1 -1
View File
@@ -1,6 +1,6 @@
{
"defaultSortOrder": "alphabetical",
"enableFolderLoop": true,
"enableFolderLoop": false,
"enableFolderBoundary": false,
"includedFileTypes": "markdownOnly",
"additionalExtensions": [
+189
View File
@@ -0,0 +1,189 @@
/*
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: () => TidyFootnotes
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
// src/tidyFootnotes.ts
var reKey = /\[\^(.+?(?=\]))\]/gi;
var reDefinition = /^\[\^([^\]]+)\]\:/;
function isNumeric(value) {
return !isNaN(value - parseFloat(value));
}
function tidyFootnotes(editor) {
let markers = [];
let definitions = /* @__PURE__ */ new Map();
let firstDefinitionLine = -1;
let definitionsIndexed = /* @__PURE__ */ new Map();
const lineCount = editor.lineCount();
let prevKey = "";
for (let i = 0; i < lineCount; i++) {
const line = editor.getLine(i);
let isDefinition = false;
let match;
if (prevKey.length) {
const hasIndent = /^[ \t]/.test(line);
const isLastLine = i === lineCount - 1;
if (hasIndent || line.length === 0 && !isLastLine) {
const value = definitions.get(prevKey);
definitions.set(prevKey, value + "\n" + line);
markers[markers.length - 1].length++;
continue;
} else {
prevKey = "";
}
}
while ((match = reDefinition.exec(line)) !== null) {
if (match.length < 1)
return;
isDefinition = true;
let key = match[1];
let value = line.substring(match[0].length);
definitions.set(key, value);
prevKey = key;
let marker = {
key,
line: i,
index: 0,
length: 0,
isDefinition: true
};
markers.push(marker);
if (firstDefinitionLine === -1) {
firstDefinitionLine = i;
}
break;
}
if (isDefinition)
continue;
while ((match = reKey.exec(line)) !== null) {
if (match.length < 1)
return;
let key = match[1];
let marker = {
key,
line: i,
index: match.index,
length: match[0].length,
isDefinition: false
};
markers.push(marker);
if (!definitionsIndexed.has(key)) {
definitionsIndexed.set(key, {
key,
newKey: key,
isNumber: isNumeric(key),
value: ""
});
}
}
}
definitions.forEach((value, key) => {
definitionsIndexed.set(key, {
key,
newKey: key,
isNumber: isNumeric(key),
value
});
});
let count = 1;
let definitionsStr = "";
definitionsIndexed.forEach((definition, marker) => {
let key = definition.key;
if (definition.isNumber) {
const current = definitionsIndexed.get(marker);
key = count.toString();
definitionsIndexed.set(marker, {
...current,
newKey: key
});
count++;
}
definitionsStr += `[^${key}]:${definition.value}
`;
});
const markersCount = markers.length;
for (let i = markersCount - 1; i >= 0; i--) {
const marker = markers[i];
const markerLine = marker.line;
if (marker.isDefinition) {
let rangeStart, rangeEnd;
const lineEnd = markerLine + 1 + marker.length;
if (lineEnd === editor.lineCount()) {
rangeStart = { line: markerLine, ch: 0 };
rangeEnd = { line: lineEnd - 1, ch: Infinity };
} else {
rangeStart = { line: markerLine, ch: 0 };
rangeEnd = { line: lineEnd, ch: 0 };
}
if (markerLine === firstDefinitionLine) {
editor.replaceRange(definitionsStr, rangeStart, rangeEnd);
continue;
}
editor.replaceRange("", rangeStart, rangeEnd);
continue;
}
const definition = definitionsIndexed.get(marker.key);
const newKey = definition.newKey;
if (marker.key === newKey)
continue;
const line = editor.getLine(markerLine);
const prefix = line.substring(0, marker.index);
const newMarker = `[^${newKey}]`;
const suffix = line.substr(marker.index + marker.length);
const newLine = prefix + newMarker + suffix;
editor.replaceRange(
newLine,
{ line: markerLine, ch: 0 },
{ line: markerLine, ch: Infinity }
);
}
if (firstDefinitionLine == -1) {
const lineCount2 = editor.lineCount();
editor.replaceRange(
"\n\n" + definitionsStr,
{ line: lineCount2, ch: 0 },
{ line: lineCount2, ch: Infinity }
);
}
}
// src/main.ts
var TidyFootnotes = class extends import_obsidian.Plugin {
async onload() {
this.addCommand({
id: "tidy-footnotes",
name: "Tidy Footnotes",
editorCallback: (editor, view) => {
tidyFootnotes(editor);
}
});
}
};
/* nosourcemap */
+11
View File
@@ -0,0 +1,11 @@
{
"id": "obsidian-tidy-footnotes",
"name": "Tidy Footnotes",
"version": "0.1.2",
"minAppVersion": "0.11.13",
"description": "Tidy your footnotes seamlessly.",
"author": "Charlie Chao",
"authorUrl": "https://github.com/charliecm",
"fundingUrl": "https://www.buymeacoffee.com/charliecm",
"isDesktopOnly": false
}
+71
View File
@@ -0,0 +1,71 @@
{
"rules": [
{
"tokenMatcher": "strong",
"lookups": [
"**"
],
"jumpAfter": true
},
{
"tokenMatcher": "em",
"lookups": [
"*",
"_"
],
"jumpAfter": true
},
{
"tokenMatcher": "math",
"lookups": [
"$"
],
"jumpAfter": true
},
{
"tokenMatcher": "code",
"lookups": [
"`"
],
"jumpAfter": true
},
{
"lookups": [
"=="
],
"tokenMatcher": "highlight",
"jumpAfter": true
},
{
"lookups": [
"~~"
],
"tokenMatcher": "strikethrough",
"jumpAfter": true
},
{
"tokenMatcher": "hmd-internal-link",
"lookups": [
"]]"
],
"jumpAfter": true
},
{
"tokenMatcher": "link",
"lookups": [
"]",
")"
],
"jumpAfter": true
},
{
"tokenMatcher": "math",
"lookups": [
")",
"]",
"}"
],
"jumpAfter": true
}
]
}
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "tabout",
"name": "Tabout",
"version": "1.0.1",
"minAppVersion": "0.13.0",
"description": "Easily \"tab out\" of Links or other Markdown Formatting Characters.",
"author": "phibr0",
"authorUrl": "https://phibr0.de",
"isDesktopOnly": true,
"fundingUrl": "https://ko-fi.com/phibr0"
}
+24
View File
@@ -0,0 +1,24 @@
.tabout-kbd {
padding: 3px 6px;
}
.tabout-add-rule-container {
width: 100%;
display: flex;
}
.tabout-add-rule {
margin: auto !important;
min-width: 15%;
margin-top: 2rem;
}
.setting-item.tabout-jump-char {
border: none;
margin: 18px 0 18px 0;
padding: 0 !important;
}
.setting-item.tabout-match-text {
border-bottom: 1px solid var(--background-modifier-border);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

+10
View File
@@ -36,16 +36,22 @@ Dimming Terms
### Line Voltage
![[line-voltage-occupancy-sensor-diagram.png]]
120--347VAC
### Low Voltage
![[analog-lighting-controls-diagram.png]]
24V Class 2 control circuit
### Digital
#### Generic "Standalone"
![[digital-standalone-diagram.png]]
The examples below are typical of a generic system,
with functionally identical features and topologies.
@@ -57,6 +63,10 @@ and wireless (via RF) communication.
* [Lutron Vive](https://commercial.lutron.com/us/en/commercial-systems/vive)
* [Cooper Greengate](https://www.cooperlighting.com/global/brands/greengate)
#### Generic "Centralized"
A "centralized" system refers
#### Digital Addressable Lighting Interface (DALI) ^dali
[Digital Addressable Lighting Interface](https://en.wikipedia.org/wiki/Digital_Addressable_Lighting_Interface)
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2025-07-18T00:00:00-0400
title: 2025-07-18 ??:??:??
tags: []
tags:
- topic/estimating
daily: "[[2025-07-18]]"
---
# 2025-07-18 ??:??:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2025-08-15T14:15:41-0400
title: 2025-08-15 14:15:41
tags: []
tags:
- occupational/takeoff
daily: "[[2025-08-15]]"
---
# 2025-08-15 14:15:41
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2025-11-11T00:00:00-0500
title: 2025-11-11 ??:??:??
tags: []
tags:
- occupational/takeoff
daily: "[[2025-11-11]]"
---
# 2025-11-11 ??:??:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2025-12-02T10:57:00-0500
title: 2025-12-02 10:57:??
tags: []
tags:
- topic/math
daily: "[[2025-12-02]]"
---
# 2025-12-02 10:57:??
+3 -1
View File
@@ -1,7 +1,9 @@
---
id: 2025-12-02T13:20:00-0500
title: 2025-12-02 13:20:??
tags: []
tags:
- topic/estimating
- topic/construction/electrical
daily: "[[2025-12-02]]"
---
# 2025-12-02 13:20:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2025-12-03T15:54:22-0500
title: 2025-12-03 15:54:22
tags: []
tags:
- topic/estimating
daily: "[[2025-12-03]]"
---
# 2025-12-03 15:54:22
+1 -1
View File
@@ -26,7 +26,7 @@ Objective: Discuss lighting control systems
A primary reason for the discussion was presented:
> [!example] ^ex
> [!example] Example ^ex
> While putting together a large garden style project
> [[pdi-bid-estimating|Bid]] received a quote for lighting control
> at over one million dollars.
+1
View File
@@ -2,6 +2,7 @@
id: 2025-12-16T09:20:52-0500
title: 2025-12-16 09:20:52
tags:
- topic/math/statistics
daily: "[[2025-12-16]]"
---
# 2025-12-16 09:20:52
+2 -1
View File
@@ -2,10 +2,11 @@
id: 2025-12-16T20:04:00-0500
title: 2025-12-16 20:04:??
tags:
- topic/math/statistics
daily: "[[2025-12-16]]"
---
# 2025-12-16 20:04:??
### Metalog Distributions
[Metalog Distributions]http://www.metalogdistributions.com/home.html)
[Metalog Distributions](http://www.metalogdistributions.com/home.html)
+1
View File
@@ -2,6 +2,7 @@
id: 2025-12-18T14:18:00-0500
title: 2025-12-18 14:18:??
tags:
- topic/estimating
daily: "[[2025-12-18]]"
---
# 2025-12-18 14:18:??
+1
View File
@@ -2,6 +2,7 @@
id: 2025-12-18T15:22:00-0500
title: 2025-12-18 15:22:??
tags:
- occupational
daily: "[[2025-12-18]]"
---
# 2025-12-18 15:22:??
+2
View File
@@ -2,6 +2,8 @@
id: 2025-12-18T15:30:00-0500
title: 2025-12-18 15:30:??
tags:
- topic/construction
- topic/estimating
daily: "[[2025-12-18]]"
---
# 2025-12-18 15:30:??
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-02T10:10:18-0500
title: 2026-01-02 10:10:18
tags:
- occupational
daily: "[[2026-01-02]]"
---
# 2026-01-02 10:10:18
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-06T10:00:00-0500
title: 2026-01-06 10:00:??
tags:
- occupational/takeoff
daily: "[[2026-01-06]]"
---
# 2026-01-06 10:00:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-01-07T10:03:00-0500
title: 2026-01-07 10:03:??
tags: []
tags:
- topic/construction
daily: "[[2026-01-07]]"
---
# 2026-01-07 10:03:??
+2
View File
@@ -2,6 +2,8 @@
id: 2026-01-07T10:05:00-0500
title: 2026-01-07 10:05:??
tags:
- topic/estimating
- occupational
daily: "[[2026-01-07]]"
---
# 2026-01-07 10:05:??
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-09T14:45:00-0500
title: 2026-01-09 14:45:??
tags:
- topic/estimating
daily: "[[2026-01-09]]"
---
# 2026-01-09 14:45:??
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-11T09:00:00-0500
title: 2026-01-11 09:00:??
tags:
- topic/estimating
daily: "[[2026-01-11]]"
---
# 2026-01-11 09:00:??
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-20T09:09:12-0500
title: 2026-01-20 09:09:12
tags:
- topic/estimating
daily: "[[2026-01-20]]"
---
# 2026-01-20 09:09:12
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-20T14:25:00-0500
title: 2026-01-20 14:25:??
tags:
- topic/hobbies/music
daily: "[[2026-01-20]]"
---
# 2026-01-20 14:25:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-01-20T16:30:00-0500
title: 2026-01-20 16:30:00
tags: []
tags:
- occupational/takeoff
daily: "[[2026-01-20]]"
---
# 2026-01-20 16:30:00
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-23T12:34:00-0500
title: 2026-01-23 12:34:??
tags:
- topic/meta
daily: "[[2026-01-23]]"
---
# 2026-01-23 12:34:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-01-25T18:46:00-0500
title: 2026-01-25 18:46:??
tags: []
tags:
- topic/finance
daily: "[[2026-01-25]]"
---
# 2026-01-25 18:46:??
+1
View File
@@ -2,6 +2,7 @@
id: 2026-01-25T22:59:00-0500
title: 2026-01-25 22:59:??
tags:
- topic/estimating
daily: "[[2026-01-25]]"
---
# 2026-01-25 22:59:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-01-29T17:57:00-0500
title: 2026-01-29 17:57:??
tags: []
tags:
- topic/finance
daily: "[[2026-01-29]]"
---
# 2026-01-29 17:57:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-01-30T16:29:00-0500
title: 2026-01-30 16:29:??
tags: []
tags:
- topic/math/statistics
daily: "[[2026-01-30]]"
---
# 2026-01-30 16:29:??
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-21T11:55:50
title: 2026-02-17 16:36:35
tags: []
tags:
- topic/estimating
daily: "[[2026-02-17]]"
---
# 2026-02-17 16:36:35
+3 -2
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-18T18:44:11
title: "2026-04-18 18:44:11"
tags: []
title: 2026-04-18 18:44:11
tags:
- topic/estimating
daily: "[[2026-04-18]]"
---
# 2026-04-18 18:44:11
+4 -2
View File
@@ -1,7 +1,9 @@
---
id: 2026-04-20T08:31:52
title: "2026-04-20 08:31:52"
tags: []
title: 2026-04-20 08:31:52
tags:
- type/minutes
- occupational
daily: "[[2026-04-20]]"
---
# 2026-04-20 08:31:52
+3 -2
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-20T08:58:40
title: "2026-04-20 08:58:40"
tags: []
title: 2026-04-20 08:58:40
tags:
- occupational
daily: "[[2026-04-20]]"
up: "[[conest-pre-takeoff-email-template]]"
---
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-22T11:50:05-0400
title: 2026-04-22 11:50:05
tags: []
tags:
- topic/estimating
daily: "[[2026-04-22]]"
---
# 2026-04-22 11:50:05
+3 -1
View File
@@ -1,7 +1,9 @@
---
id: 2026-04-23T10:01:40-0400
title: 2026-04-23 10:01:40
tags: []
tags:
- occupational
- type/minutes
daily: "[[2026-04-23]]"
---
# 2026-04-23 10:01:40
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-23T14:36:51-0400
title: 2026-04-23 14:36:51
tags: []
tags:
- topic/construction/electrical
daily: "[[2026-04-23]]"
---
# 2026-04-23 14:36:51
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-27T10:05:24-0400
title: 2026-04-27 10:05:24
tags: []
tags:
- occupational/takeoff
daily: "[[2026-04-27]]"
---
# 2026-04-27 10:05:24
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-27T12:19:33-0400
title: 2026-04-27 12:19:33
tags: []
tags:
- topic/estimating
daily: "[[2026-04-27]]"
---
# 2026-04-27 12:19:33
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-27T12:43:54-0400
title: 2026-04-27 12:43:54
tags: []
tags:
- occupational/takeoff
daily: "[[2026-04-27]]"
---
# 2026-04-27 12:43:54
+3 -1
View File
@@ -1,7 +1,9 @@
---
id: 2026-04-27T12:56:35-0400
title: 2026-04-27 12:56:35
tags: []
tags:
- occupational
- type/minutes
daily: "[[2026-04-27]]"
---
# 2026-04-27 12:56:35
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-29T20:25:22-0400
title: 2026-04-29 20:25:22
tags: []
tags:
- topic/estimating
daily: "[[2026-04-29]]"
---
# 2026-04-29 20:25:22
+2 -1
View File
@@ -1,7 +1,8 @@
---
id: 2026-04-30T14:27:02-0400
title: 2026-04-30 14:27:02
tags: []
tags:
- occupational/takeoff
daily: "[[2026-04-30]]"
---
# 2026-04-30 14:27:02
+42
View File
@@ -0,0 +1,42 @@
---
id: 2026-05-20T12:23:54-0400
title: 2026-05-20 12:23:54
tags: []
daily: "[[2026-05-20]]"
---
# 2026-05-20 12:23:54
## Footnotes as Sidenotes for Obsidian
I've recently switched to using
`Editor > Display > Readable Line Length`
and have been enjoying the change,
however I'm left with a lot of real estate in the viewport.
An unrelated problem,
I really don't love using the reading view and find it difficult to recommend
because it puts `[^n]` style footnotes at the bottom of the page.
I use footnotes liberally to include extra context
and information that interests me
while still maintaining a strong central narrative
which only includes what is strictly necessary to understand the subject.
My favorite way to present such asides
is in the margin, right next to the reference.[^1]
While the [[obsidian]] core plugin Footnotes View
can almost emulate the desired appearance,
the text is redundant when in the editing view.
[^1]: See [My hobby: running deranged surveys --- LessWrong](https://www.lesswrong.com/posts/fQz6afpcZhdMdYzgE/my-hobby-running-deranged-surveys).
No existing community plugin implements the desired behavior.
Cornell Marginalia is close,
but it uses new syntax rather than footnotes
and is bloated, buggy, and not fully translated.
Eventually I should take a crack at it.
### Resources
* [Sidenotes In Web Design · Gwern.net](https://gwern.net/sidenote)
* [Implementing Pure CSS Sidenotes for a Blog • Hey!👏Lyle!](https://heylyle.com/en/posts/only-css-sidenotes/)
* [What HTML element for semantic sidenotes? --- Stack Overflow](https://stackoverflow.com/questions/57272564/what-html-element-for-semantic-sidenotes)
+32
View File
@@ -0,0 +1,32 @@
---
id: 2026-05-20T13:10:36-0400
title: 2026-05-20 13:10:36
tags: []
daily: "[[2026-05-20]]"
---
# 2026-05-20 13:10:36
Direction from [[josh-ford]]
on [[303-mariposa-residence]]
with application elsewhere as well.
## Heating Designations vs. Temporary Assemblies
Reiterating direction expressed [[2025-05-11]],
we are to prefer length-based assemblies for equipment connections,
preferring temp assemblies over heating designations.
## "1/2in Conduit"
> [!quote] Electrical.pdf, E2.11
> PROVIDE EQUIPMENT WITH 1/2"C - 2#8 AWG & #10 GND.
Josh repeated my understanding that this verbiage is common
even when cable type wiring methods are allowed.
Assuming the inclusion is deliberate,
it could be interpreted in our favor as
"if you choose to or must use conduit, use this size."
We very rarely use 1/2in conduit, using 3/4in instead.
the cost difference is quite small,
especially when considering bulk savings.