mirror of
https://github.com/NotAShelf/nvf.git
synced 2026-02-04 02:45:53 +00:00
deploy: ab629c1995
This commit is contained in:
parent
c8e237c3a8
commit
3435dce176
13 changed files with 4554 additions and 5571 deletions
160
assets/main.js
160
assets/main.js
|
|
@ -1,8 +1,8 @@
|
|||
// Polyfill for requestIdleCallback for Safari and unsupported browsers
|
||||
if (typeof window.requestIdleCallback === "undefined") {
|
||||
window.requestIdleCallback = function (cb) {
|
||||
var start = Date.now();
|
||||
var idlePeriod = 50;
|
||||
const start = Date.now();
|
||||
const idlePeriod = 50;
|
||||
return setTimeout(function () {
|
||||
cb({
|
||||
didTimeout: false,
|
||||
|
|
@ -85,6 +85,127 @@ function createMobileElements() {
|
|||
}
|
||||
}
|
||||
|
||||
// Initialize collapsible sidebar sections with state persistence
|
||||
function initCollapsibleSections() {
|
||||
// Target sections in both desktop and mobile sidebars
|
||||
const sections = document.querySelectorAll(
|
||||
".sidebar .sidebar-section, .mobile-sidebar-content .sidebar-section",
|
||||
);
|
||||
|
||||
sections.forEach((section) => {
|
||||
const sectionId = section.dataset.section;
|
||||
if (!sectionId) return;
|
||||
|
||||
const storageKey = `sidebar-section-${sectionId}`;
|
||||
const savedState = localStorage.getItem(storageKey);
|
||||
|
||||
// Restore saved state (default is open)
|
||||
if (savedState === "closed") {
|
||||
section.removeAttribute("open");
|
||||
}
|
||||
|
||||
// Save state on toggle and sync between desktop/mobile
|
||||
section.addEventListener("toggle", () => {
|
||||
localStorage.setItem(storageKey, section.open ? "open" : "closed");
|
||||
|
||||
// Sync state between desktop and mobile versions
|
||||
const allWithSameSection = document.querySelectorAll(
|
||||
`.sidebar-section[data-section="${sectionId}"]`,
|
||||
);
|
||||
allWithSameSection.forEach((el) => {
|
||||
if (el !== section) {
|
||||
el.open = section.open;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Initialize scroll spy
|
||||
function initScrollSpy() {
|
||||
const pageToc = document.querySelector(".page-toc");
|
||||
if (!pageToc) return;
|
||||
|
||||
const tocLinks = pageToc.querySelectorAll(".page-toc-list a");
|
||||
const content = document.querySelector(".content");
|
||||
if (!tocLinks.length || !content) return;
|
||||
|
||||
const headings = Array.from(
|
||||
content.querySelectorAll("h1[id], h2[id], h3[id]"),
|
||||
);
|
||||
|
||||
if (!headings.length) return;
|
||||
|
||||
// Build a map of heading IDs to TOC links for quick lookup
|
||||
const linkMap = new Map();
|
||||
tocLinks.forEach((link) => {
|
||||
const href = link.getAttribute("href");
|
||||
if (href && href.startsWith("#")) {
|
||||
linkMap.set(href.slice(1), link);
|
||||
}
|
||||
});
|
||||
|
||||
let activeLink = null;
|
||||
|
||||
// Update active link based on scroll position
|
||||
function updateActiveLink() {
|
||||
const threshold = 120; // threshold from the top of the viewport
|
||||
|
||||
let currentHeading = null;
|
||||
|
||||
// Find the last heading that is at or above the threshold
|
||||
for (const heading of headings) {
|
||||
const rect = heading.getBoundingClientRect();
|
||||
if (rect.top <= threshold) {
|
||||
currentHeading = heading;
|
||||
}
|
||||
}
|
||||
|
||||
// If no heading is above threshold, use first heading if it's in view
|
||||
if (!currentHeading && headings.length > 0) {
|
||||
const firstRect = headings[0].getBoundingClientRect();
|
||||
if (firstRect.top < window.innerHeight) {
|
||||
currentHeading = headings[0];
|
||||
}
|
||||
}
|
||||
|
||||
const newLink = currentHeading ? linkMap.get(currentHeading.id) : null;
|
||||
|
||||
if (newLink !== activeLink) {
|
||||
if (activeLink) {
|
||||
activeLink.classList.remove("active");
|
||||
}
|
||||
if (newLink) {
|
||||
newLink.classList.add("active");
|
||||
}
|
||||
activeLink = newLink;
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll event handler
|
||||
let ticking = false;
|
||||
function onScroll() {
|
||||
if (!ticking) {
|
||||
requestAnimationFrame(() => {
|
||||
updateActiveLink();
|
||||
ticking = false;
|
||||
});
|
||||
ticking = true;
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("scroll", onScroll, { passive: true });
|
||||
|
||||
// Also update on hash change (direct link navigation)
|
||||
window.addEventListener("hashchange", () => {
|
||||
requestAnimationFrame(updateActiveLink);
|
||||
});
|
||||
|
||||
// Set initial active state after a small delay to ensure
|
||||
// browser has completed any hash-based scrolling
|
||||
setTimeout(updateActiveLink, 100);
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
// Apply sidebar state immediately before DOM rendering
|
||||
if (localStorage.getItem("sidebar-collapsed") === "true") {
|
||||
|
|
@ -96,6 +217,13 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
createMobileElements();
|
||||
}
|
||||
|
||||
// Initialize collapsible sidebar sections
|
||||
// after mobile elements are created
|
||||
initCollapsibleSections();
|
||||
|
||||
// Initialize scroll spy for page TOC
|
||||
initScrollSpy();
|
||||
|
||||
// Desktop Sidebar Toggle
|
||||
const sidebarToggle = document.querySelector(".sidebar-toggle");
|
||||
|
||||
|
|
@ -111,8 +239,9 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
document.body.classList.toggle("sidebar-collapsed");
|
||||
|
||||
// Use documentElement to check state and save to localStorage
|
||||
const isCollapsed =
|
||||
document.documentElement.classList.contains("sidebar-collapsed");
|
||||
const isCollapsed = document.documentElement.classList.contains(
|
||||
"sidebar-collapsed",
|
||||
);
|
||||
localStorage.setItem("sidebar-collapsed", isCollapsed);
|
||||
});
|
||||
}
|
||||
|
|
@ -144,7 +273,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
}
|
||||
|
||||
// Make the entire heading clickable
|
||||
heading.addEventListener("click", function (e) {
|
||||
heading.addEventListener("click", function () {
|
||||
const id = this.id;
|
||||
history.pushState(null, null, "#" + id);
|
||||
|
||||
|
|
@ -257,19 +386,10 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
".mobile-sidebar-container",
|
||||
);
|
||||
const mobileSidebarFab = document.querySelector(".mobile-sidebar-fab");
|
||||
const mobileSidebarContent = document.querySelector(
|
||||
".mobile-sidebar-content",
|
||||
);
|
||||
const mobileSidebarHandle = document.querySelector(".mobile-sidebar-handle");
|
||||
const desktopSidebar = document.querySelector(".sidebar");
|
||||
|
||||
// Always set up FAB if it exists
|
||||
if (mobileSidebarFab && mobileSidebarContainer) {
|
||||
// Populate content if desktop sidebar exists
|
||||
if (desktopSidebar && mobileSidebarContent) {
|
||||
mobileSidebarContent.innerHTML = desktopSidebar.innerHTML;
|
||||
}
|
||||
|
||||
const openMobileSidebar = () => {
|
||||
mobileSidebarContainer.classList.add("active");
|
||||
mobileSidebarFab.setAttribute("aria-expanded", "true");
|
||||
|
|
@ -379,8 +499,6 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Options filter functionality
|
||||
const optionsFilter = document.getElementById("options-filter");
|
||||
if (optionsFilter) {
|
||||
|
|
@ -404,8 +522,8 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
);
|
||||
|
||||
// Detect if we're on a mobile device
|
||||
const isMobile =
|
||||
window.innerWidth < 768 || /Mobi|Android/i.test(navigator.userAgent);
|
||||
const isMobile = window.innerWidth < 768 ||
|
||||
/Mobi|Android/i.test(navigator.userAgent);
|
||||
|
||||
// Cache all option elements and their searchable content
|
||||
const options = Array.from(document.querySelectorAll(".option"));
|
||||
|
|
@ -483,7 +601,8 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
// Update counter at the very end for best performance
|
||||
if (filterResults.visibleCount !== undefined) {
|
||||
if (filterResults.visibleCount < totalCount) {
|
||||
filterResults.textContent = `Showing ${filterResults.visibleCount} of ${totalCount} options`;
|
||||
filterResults.textContent =
|
||||
`Showing ${filterResults.visibleCount} of ${totalCount} options`;
|
||||
filterResults.style.display = "block";
|
||||
} else {
|
||||
filterResults.style.display = "none";
|
||||
|
|
@ -530,8 +649,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
isDescMatch = !isTitleMatch && data.description.includes(term);
|
||||
} else {
|
||||
isTitleMatch = searchTerms.every((term) => data.name.includes(term));
|
||||
isDescMatch =
|
||||
!isTitleMatch &&
|
||||
isDescMatch = !isTitleMatch &&
|
||||
searchTerms.every((term) => data.description.includes(term));
|
||||
}
|
||||
if (isTitleMatch) {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1,4 +1,151 @@
|
|||
self.onmessage = function(e) {
|
||||
const isWordBoundary = (char) =>
|
||||
/[A-Z]/.test(char) || /[-_\/.]/.test(char) || /\s/.test(char);
|
||||
|
||||
const isCaseTransition = (prev, curr) => {
|
||||
const prevIsUpper = prev.toLowerCase() !== prev;
|
||||
const currIsUpper = curr.toLowerCase() !== curr;
|
||||
return (
|
||||
prevIsUpper && currIsUpper && prev.toLowerCase() !== curr.toLowerCase()
|
||||
);
|
||||
};
|
||||
|
||||
const findBestSubsequenceMatch = (query, target) => {
|
||||
const n = query.length;
|
||||
const m = target.length;
|
||||
|
||||
if (n === 0 || m === 0) return null;
|
||||
|
||||
const positions = [];
|
||||
|
||||
const memo = new Map();
|
||||
const key = (qIdx, tIdx, gap) => `${qIdx}:${tIdx}:${gap}`;
|
||||
|
||||
const findBest = (qIdx, tIdx, currentGap) => {
|
||||
if (qIdx === n) {
|
||||
return { done: true, positions: [...positions], gap: currentGap };
|
||||
}
|
||||
|
||||
const memoKey = key(qIdx, tIdx, currentGap);
|
||||
if (memo.has(memoKey)) {
|
||||
return memo.get(memoKey);
|
||||
}
|
||||
|
||||
let bestResult = null;
|
||||
|
||||
for (let i = tIdx; i < m; i++) {
|
||||
if (target[i] === query[qIdx]) {
|
||||
positions.push(i);
|
||||
const gap = qIdx === 0 ? 0 : i - positions[positions.length - 2] - 1;
|
||||
const newGap = currentGap + gap;
|
||||
|
||||
if (newGap > m) {
|
||||
positions.pop();
|
||||
continue;
|
||||
}
|
||||
|
||||
const result = findBest(qIdx + 1, i + 1, newGap);
|
||||
positions.pop();
|
||||
|
||||
if (result && (!bestResult || result.gap < bestResult.gap)) {
|
||||
bestResult = result;
|
||||
if (result.gap === 0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
memo.set(memoKey, bestResult);
|
||||
return bestResult;
|
||||
};
|
||||
|
||||
const result = findBest(0, 0, 0);
|
||||
if (!result) return null;
|
||||
|
||||
const consecutive = (() => {
|
||||
let c = 1;
|
||||
for (let i = 1; i < result.positions.length; i++) {
|
||||
if (result.positions[i] === result.positions[i - 1] + 1) {
|
||||
c++;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
})();
|
||||
|
||||
return {
|
||||
positions: result.positions,
|
||||
consecutive,
|
||||
score: calculateMatchScore(query, target, result.positions, consecutive),
|
||||
};
|
||||
};
|
||||
|
||||
const calculateMatchScore = (query, target, positions, consecutive) => {
|
||||
const n = positions.length;
|
||||
const m = target.length;
|
||||
|
||||
if (n === 0) return 0;
|
||||
|
||||
let score = 1.0;
|
||||
|
||||
const startBonus = (m - positions[0]) / m;
|
||||
score += startBonus * 0.5;
|
||||
|
||||
let gapPenalty = 0;
|
||||
for (let i = 1; i < n; i++) {
|
||||
const gap = positions[i] - positions[i - 1] - 1;
|
||||
if (gap > 0) {
|
||||
gapPenalty += Math.min(gap / m, 1.0) * 0.3;
|
||||
}
|
||||
}
|
||||
score -= gapPenalty;
|
||||
|
||||
const consecutiveBonus = consecutive / n;
|
||||
score += consecutiveBonus * 0.3;
|
||||
|
||||
let boundaryBonus = 0;
|
||||
for (let i = 0; i < n; i++) {
|
||||
const char = target[positions[i]];
|
||||
if (i === 0 || isWordBoundary(char)) {
|
||||
boundaryBonus += 0.05;
|
||||
}
|
||||
if (i > 0) {
|
||||
const prevChar = target[positions[i - 1]];
|
||||
if (isCaseTransition(prevChar, char)) {
|
||||
boundaryBonus += 0.03;
|
||||
}
|
||||
}
|
||||
}
|
||||
score = Math.min(1.0, score + boundaryBonus);
|
||||
|
||||
const lengthPenalty = Math.abs(query.length - n) / Math.max(query.length, m);
|
||||
score -= lengthPenalty * 0.2;
|
||||
|
||||
return Math.max(0, Math.min(1.0, score));
|
||||
};
|
||||
|
||||
const fuzzyMatch = (query, target) => {
|
||||
const lowerQuery = query.toLowerCase();
|
||||
const lowerTarget = target.toLowerCase();
|
||||
|
||||
if (lowerQuery.length === 0) return null;
|
||||
if (lowerTarget.length === 0) return null;
|
||||
|
||||
if (lowerTarget === lowerQuery) {
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
if (lowerTarget.includes(lowerQuery)) {
|
||||
const ratio = lowerQuery.length / lowerTarget.length;
|
||||
return 0.8 + ratio * 0.2;
|
||||
}
|
||||
|
||||
const match = findBestSubsequenceMatch(lowerQuery, lowerTarget);
|
||||
if (!match) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Math.min(1.0, match.score);
|
||||
};
|
||||
|
||||
self.onmessage = function (e) {
|
||||
const { messageId, type, data } = e.data;
|
||||
|
||||
const respond = (type, data) => {
|
||||
|
|
@ -6,59 +153,146 @@ self.onmessage = function(e) {
|
|||
};
|
||||
|
||||
const respondError = (error) => {
|
||||
self.postMessage({ messageId, type: 'error', error: error.message || String(error) });
|
||||
self.postMessage({
|
||||
messageId,
|
||||
type: "error",
|
||||
error: error.message || String(error),
|
||||
});
|
||||
};
|
||||
|
||||
try {
|
||||
if (type === 'tokenize') {
|
||||
const tokens = (typeof data === 'string' ? data : '')
|
||||
.toLowerCase()
|
||||
.match(/\b[a-zA-Z0-9_-]+\b/g) || []
|
||||
.filter(word => word.length > 2);
|
||||
|
||||
if (type === "tokenize") {
|
||||
const text = typeof data === "string" ? data : "";
|
||||
const words = text.toLowerCase().match(/\b[a-zA-Z0-9_-]+\b/g) || [];
|
||||
const tokens = words.filter((word) => word.length > 2);
|
||||
const uniqueTokens = Array.from(new Set(tokens));
|
||||
respond('tokens', uniqueTokens);
|
||||
}
|
||||
respond("tokens", uniqueTokens);
|
||||
} else if (type === "search") {
|
||||
const { query, limit = 10 } = data;
|
||||
|
||||
if (type === 'search') {
|
||||
const { documents, query, limit } = data;
|
||||
const searchTerms = (typeof query === 'string' ? query : '')
|
||||
.toLowerCase()
|
||||
.match(/\b[a-zA-Z0-9_-]+\b/g) || []
|
||||
.filter(word => word.length > 2);
|
||||
if (!query || typeof query !== "string") {
|
||||
respond("results", []);
|
||||
return;
|
||||
}
|
||||
|
||||
const docScores = new Map();
|
||||
|
||||
// Pre-compute lower-case terms once
|
||||
const lowerSearchTerms = searchTerms.map(term => term.toLowerCase());
|
||||
const rawQuery = query.toLowerCase();
|
||||
const text = typeof query === "string" ? query : "";
|
||||
const words = text.toLowerCase().match(/\b[a-zA-Z0-9_-]+\b/g) || [];
|
||||
const searchTerms = words.filter((word) => word.length > 2);
|
||||
|
||||
let documents = [];
|
||||
if (typeof data.documents === "string") {
|
||||
documents = JSON.parse(data.documents);
|
||||
} else if (Array.isArray(data.documents)) {
|
||||
documents = data.documents;
|
||||
} else if (typeof data.transferables === "string") {
|
||||
documents = JSON.parse(data.transferables);
|
||||
}
|
||||
|
||||
if (!Array.isArray(documents) || documents.length === 0) {
|
||||
respond("results", []);
|
||||
return;
|
||||
}
|
||||
|
||||
const useFuzzySearch = rawQuery.length >= 3;
|
||||
|
||||
if (searchTerms.length === 0 && rawQuery.length < 3) {
|
||||
respond("results", []);
|
||||
return;
|
||||
}
|
||||
|
||||
const pageMatches = new Map();
|
||||
|
||||
// Pre-compute lower-case strings for each document
|
||||
const processedDocs = documents.map((doc, docId) => ({
|
||||
docId,
|
||||
title: doc.title,
|
||||
content: doc.content,
|
||||
lowerTitle: doc.title.toLowerCase(),
|
||||
lowerContent: doc.content.toLowerCase()
|
||||
}));
|
||||
const processedDocs = documents.map((doc, docId) => {
|
||||
const title = typeof doc.title === "string" ? doc.title : "";
|
||||
const content = typeof doc.content === "string" ? doc.content : "";
|
||||
|
||||
lowerSearchTerms.forEach(lowerTerm => {
|
||||
processedDocs.forEach(({ docId, title, content, lowerTitle, lowerContent }) => {
|
||||
if (lowerTitle.includes(lowerTerm) || lowerContent.includes(lowerTerm)) {
|
||||
const score = lowerTitle === lowerTerm ? 30 :
|
||||
lowerTitle.includes(lowerTerm) ? 10 : 2;
|
||||
docScores.set(docId, (docScores.get(docId) || 0) + score);
|
||||
return {
|
||||
docId,
|
||||
doc,
|
||||
lowerTitle: title.toLowerCase(),
|
||||
lowerContent: content.toLowerCase(),
|
||||
};
|
||||
});
|
||||
|
||||
// First pass: Score pages with fuzzy matching
|
||||
processedDocs.forEach(({ docId, doc, lowerTitle, lowerContent }) => {
|
||||
let match = pageMatches.get(docId);
|
||||
if (!match) {
|
||||
match = { doc, pageScore: 0, matchingAnchors: [] };
|
||||
pageMatches.set(docId, match);
|
||||
}
|
||||
|
||||
if (useFuzzySearch) {
|
||||
const fuzzyTitleScore = fuzzyMatch(rawQuery, lowerTitle);
|
||||
if (fuzzyTitleScore !== null) {
|
||||
match.pageScore += fuzzyTitleScore * 100;
|
||||
}
|
||||
|
||||
const fuzzyContentScore = fuzzyMatch(rawQuery, lowerContent);
|
||||
if (fuzzyContentScore !== null) {
|
||||
match.pageScore += fuzzyContentScore * 30;
|
||||
}
|
||||
}
|
||||
|
||||
// Token-based exact matching
|
||||
searchTerms.forEach((term) => {
|
||||
if (lowerTitle.includes(term)) {
|
||||
match.pageScore += lowerTitle === term ? 20 : 10;
|
||||
}
|
||||
if (lowerContent.includes(term)) {
|
||||
match.pageScore += 2;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const results = Array.from(docScores.entries())
|
||||
.sort((a, b) => b[1] - a[1])
|
||||
.slice(0, limit)
|
||||
.map(([docId, score]) => ({ ...documents[docId], score }));
|
||||
// Second pass: Find matching anchors
|
||||
pageMatches.forEach((match) => {
|
||||
const doc = match.doc;
|
||||
if (
|
||||
!doc.anchors ||
|
||||
!Array.isArray(doc.anchors) ||
|
||||
doc.anchors.length === 0
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
respond('results', results);
|
||||
doc.anchors.forEach((anchor) => {
|
||||
if (!anchor || !anchor.text) return;
|
||||
|
||||
const anchorText = anchor.text.toLowerCase();
|
||||
let anchorMatches = false;
|
||||
|
||||
if (useFuzzySearch) {
|
||||
const fuzzyScore = fuzzyMatch(rawQuery, anchorText);
|
||||
if (fuzzyScore !== null && fuzzyScore >= 0.4) {
|
||||
anchorMatches = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!anchorMatches) {
|
||||
searchTerms.forEach((term) => {
|
||||
if (anchorText.includes(term)) {
|
||||
anchorMatches = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (anchorMatches) {
|
||||
match.matchingAnchors.push(anchor);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const results = Array.from(pageMatches.values())
|
||||
.filter((m) => m.pageScore > 5)
|
||||
.sort((a, b) => b.pageScore - a.pageScore)
|
||||
.slice(0, limit);
|
||||
|
||||
respond("results", results);
|
||||
}
|
||||
} catch (error) {
|
||||
respondError(error);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
|
|||
1235
assets/search.js
1235
assets/search.js
File diff suppressed because it is too large
Load diff
202
assets/style.css
202
assets/style.css
|
|
@ -203,6 +203,11 @@
|
|||
U+FFFD;
|
||||
}
|
||||
|
||||
/* Smooth scrolling */
|
||||
html {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
/* Core Layout */
|
||||
body {
|
||||
font-family:
|
||||
|
|
@ -771,7 +776,9 @@ img {
|
|||
color: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
|
||||
#search-input:focus {
|
||||
/* Expand input when focused OR when results are visible */
|
||||
.search-container:focus-within #search-input,
|
||||
.search-container.has-results #search-input {
|
||||
outline: none;
|
||||
background-color: rgba(255, 255, 255, 0.15);
|
||||
width: 300px;
|
||||
|
|
@ -1925,7 +1932,6 @@ h6:hover .copy-link {
|
|||
|
||||
.mobile-sidebar-container {
|
||||
display: flex;
|
||||
/* Use flex for container */
|
||||
}
|
||||
|
||||
.content {
|
||||
|
|
@ -1943,3 +1949,195 @@ h6:hover .copy-link {
|
|||
margin-bottom: 0 !important;
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
|
||||
/* Search result styles */
|
||||
.search-result-page {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.search-result-anchor {
|
||||
padding-left: calc(var(--space-4) + var(--space-6));
|
||||
font-size: 0.9em;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.search-result-anchor::before {
|
||||
content: "↳";
|
||||
position: absolute;
|
||||
left: var(--space-4);
|
||||
color: var(--text-muted);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.search-result-anchor a {
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.search-result-anchor:hover::before {
|
||||
color: var(--link-color);
|
||||
}
|
||||
|
||||
/* Search page specific styling */
|
||||
.search-page-results .search-result-page {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.search-page-results .search-result-anchor {
|
||||
padding-left: calc(var(--space-6) + var(--space-6));
|
||||
}
|
||||
|
||||
.search-page-results .search-result-anchor::before {
|
||||
left: var(--space-6);
|
||||
}
|
||||
|
||||
/* Mobile search anchor styling */
|
||||
.mobile-search-results .search-result-anchor {
|
||||
padding-left: calc(var(--space-4) + var(--space-4));
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
.mobile-search-results .search-result-anchor::before {
|
||||
left: var(--space-3);
|
||||
}
|
||||
|
||||
/* Sidebar Sections */
|
||||
.sidebar-section {
|
||||
margin-bottom: var(--space-2);
|
||||
}
|
||||
|
||||
.sidebar-section summary {
|
||||
font-size: 0.875rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
color: var(--text-muted);
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
list-style: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-2);
|
||||
border-radius: var(--radius-md);
|
||||
transition:
|
||||
color var(--transition-fast),
|
||||
background-color var(--transition-fast);
|
||||
}
|
||||
|
||||
.sidebar-section summary:hover {
|
||||
background-color: var(--sidebar-hover);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.sidebar-section summary::before {
|
||||
content: "▶";
|
||||
font-size: 0.625rem;
|
||||
transition: transform var(--transition-fast);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.sidebar-section[open] summary::before {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
/* Hide default marker */
|
||||
.sidebar-section summary::-webkit-details-marker {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Animated content wrapper using CSS Grid */
|
||||
.sidebar-section-content {
|
||||
display: grid;
|
||||
grid-template-rows: 0fr;
|
||||
overflow: hidden;
|
||||
transition: grid-template-rows var(--transition);
|
||||
}
|
||||
|
||||
.sidebar-section[open] .sidebar-section-content {
|
||||
grid-template-rows: 1fr;
|
||||
}
|
||||
|
||||
.sidebar-section-content > * {
|
||||
min-height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Right-side Page Table of Contents */
|
||||
.page-toc {
|
||||
position: fixed;
|
||||
top: calc(var(--header-height) + var(--space-4));
|
||||
max-height: calc(100vh - var(--header-height) - var(--space-8));
|
||||
width: 220px;
|
||||
overflow-y: auto;
|
||||
padding: var(--space-4);
|
||||
font-size: 0.8125rem;
|
||||
display: none;
|
||||
|
||||
/* Position to the right of centered content
|
||||
Content is max 800px, centered. Sidebar is 300px fixed left.
|
||||
Calculate: sidebar (300px) + half remaining + half content (400px) + gap
|
||||
*/
|
||||
right: var(--space-4);
|
||||
}
|
||||
|
||||
.page-toc-nav h3 {
|
||||
font-size: 0.75rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
color: var(--text-muted);
|
||||
margin: 0 0 var(--space-3) 0;
|
||||
padding-left: var(--space-3);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.page-toc-list {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border-left: 2px solid var(--border-color);
|
||||
}
|
||||
|
||||
.page-toc-list ul {
|
||||
list-style: none;
|
||||
padding-left: var(--space-3);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.page-toc-list li {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.page-toc-list a {
|
||||
display: block;
|
||||
padding: var(--space-1) var(--space-3);
|
||||
color: var(--text-muted);
|
||||
text-decoration: none;
|
||||
transition:
|
||||
color var(--transition-fast),
|
||||
border-color var(--transition-fast);
|
||||
border-left: 2px solid transparent;
|
||||
margin-left: -2px;
|
||||
}
|
||||
|
||||
.page-toc-list a:hover {
|
||||
color: var(--link-color);
|
||||
}
|
||||
|
||||
.page-toc-list a.active {
|
||||
color: var(--link-color);
|
||||
border-left-color: var(--link-color);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* Show page-toc only on wide screens */
|
||||
@media (min-width: 1400px) {
|
||||
.page-toc {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hide page-toc on mobile */
|
||||
@media (max-width: 800px) {
|
||||
.page-toc {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,10 +63,11 @@
|
|||
</svg>
|
||||
</div>
|
||||
<nav class="sidebar">
|
||||
<div class="docs-nav">
|
||||
<h2>Documents</h2>
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<details class="sidebar-section" data-section="docs" open>
|
||||
<summary>Documents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<li><a href="configuring.html">Configuring nvf</a></li>
|
||||
<li><a href="hacking.html">Hacking nvf</a></li>
|
||||
<li><a href="tips.html">Helpful Tips</a></li>
|
||||
|
|
@ -74,24 +75,28 @@
|
|||
<li><a href="release-notes.html">Release Notes</a></li>
|
||||
<li><a href="search.html">Search</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<div class="toc">
|
||||
<h2>Contents</h2>
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-configuring">Configuring nvf</a>
|
||||
<details class="sidebar-section" data-section="toc" open>
|
||||
<summary>Contents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-configuring">Configuring nvf</a>
|
||||
<li><a href="#ch-custom-plugins">Custom Plugins</a>
|
||||
<ul><li><a href="#ch-adding-plugins">Adding Plugins</a>
|
||||
</ul><li><a href="#sec-configuring-plugins">Configuring</a>
|
||||
<ul><li><a href="#ch-vim-lazy-plugins">Lazy Plugins</a>
|
||||
<li><a href="#ch-vim-extra-plugins">Standard API</a>
|
||||
<ul><li><a href="#setup-using-luaconfigrc">Setup using luaConfigRC</a>
|
||||
</ul><li><a href="#sec-lazyfile-event">LazyFile event</a>
|
||||
</ul></ul><li><a href="#sec-lazy-method">Lazy Method</a>
|
||||
<ul><li><a href="#sec-lazyfile-event">LazyFile event</a>
|
||||
</ul><li><a href="#sec-non-lazy-method">Non-lazy Method</a>
|
||||
<li><a href="#sec-legacy-method">Legacy Method</a>
|
||||
<ul><li><a href="#sec-adding-new-plugins">Adding New Plugins</a>
|
||||
</ul><li><a href="#ch-overriding-plugins">Overriding plugins</a>
|
||||
<li><a href="#ch-languages">Language Support</a>
|
||||
<li><a href="#sec-languages-custom-lsp-packages">LSP Custom Packages/Command</a>
|
||||
<li><a href="#ch-using-dags">Using DAGs</a>
|
||||
<ul><li><a href="#sec-types-dag-entryAnywhere">entryAnywhere</a>
|
||||
|
|
@ -108,8 +113,9 @@
|
|||
<ul><li><a href="#sec-vim-augroups">Autogroups (vim.augroups)</a>
|
||||
<li><a href="#sec-vim-autocmds">Autocommands (vim.autocmds)</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</nav>
|
||||
|
||||
<main class="content"><html><head></head><body><h1 id="ch-configuring">Configuring nvf</h1>
|
||||
|
|
@ -186,7 +192,7 @@ use.</p>
|
|||
to find out more about the DAG system.</p>
|
||||
</div>
|
||||
<!-- deno-fmt-ignore-end -->
|
||||
# Lazy Method {#sec-lazy-method}
|
||||
<h1 id="sec-lazy-method">Lazy Method</h1>
|
||||
<p>As of version <strong>0.7</strong>, an API is exposed to allow configuring lazy-loaded
|
||||
plugins via <code>lz.n</code> and <code>lzn-auto-require</code>. Below is a comprehensive example of
|
||||
how it may be loaded to lazy-load an arbitrary plugin.</p>
|
||||
|
|
@ -237,7 +243,7 @@ deprecated in newer versions is changed in the plugin's <code>setupOpts</code>.
|
|||
depend on a new version, requesting a version bump in the issues section is a
|
||||
more reliable option.</p>
|
||||
</div>
|
||||
# Language Support {#ch-languages}
|
||||
<h1 id="ch-languages">Language Support</h1>
|
||||
<p>Language specific support means there is a combination of language specific
|
||||
plugins, <code>treesitter</code> support, <code>nvim-lspconfig</code> language servers, <code>conform-nvim</code>
|
||||
formatters, and <code>nvim-lint</code> linter integration. This gets you capabilities
|
||||
|
|
@ -587,6 +593,44 @@ Neovim starts.</p>
|
|||
</body></html><!-- deno-fmt-ignore-start --></main>
|
||||
</div>
|
||||
|
||||
<aside class="page-toc">
|
||||
<nav class="page-toc-nav">
|
||||
<h3>On this page</h3>
|
||||
<ul class="page-toc-list">
|
||||
<li><a href="#ch-configuring">Configuring nvf</a>
|
||||
<li><a href="#ch-custom-plugins">Custom Plugins</a>
|
||||
<ul><li><a href="#ch-adding-plugins">Adding Plugins</a>
|
||||
</ul><li><a href="#sec-configuring-plugins">Configuring</a>
|
||||
<ul><li><a href="#ch-vim-lazy-plugins">Lazy Plugins</a>
|
||||
<li><a href="#ch-vim-extra-plugins">Standard API</a>
|
||||
<ul><li><a href="#setup-using-luaconfigrc">Setup using luaConfigRC</a>
|
||||
</ul></ul><li><a href="#sec-lazy-method">Lazy Method</a>
|
||||
<ul><li><a href="#sec-lazyfile-event">LazyFile event</a>
|
||||
</ul><li><a href="#sec-non-lazy-method">Non-lazy Method</a>
|
||||
<li><a href="#sec-legacy-method">Legacy Method</a>
|
||||
<ul><li><a href="#sec-adding-new-plugins">Adding New Plugins</a>
|
||||
</ul><li><a href="#ch-overriding-plugins">Overriding plugins</a>
|
||||
<li><a href="#ch-languages">Language Support</a>
|
||||
<li><a href="#sec-languages-custom-lsp-packages">LSP Custom Packages/Command</a>
|
||||
<li><a href="#ch-using-dags">Using DAGs</a>
|
||||
<ul><li><a href="#sec-types-dag-entryAnywhere">entryAnywhere</a>
|
||||
<li><a href="#ch-types-dag-entryAfter">entryAfter</a>
|
||||
<li><a href="#ch-types-dag-entryBefore">entryBefore</a>
|
||||
<li><a href="#sec-types-dag-entryBetween">entryBetween</a>
|
||||
<li><a href="#sec-types-dag-entriesAnywhere">entriesAnywhere</a>
|
||||
<li><a href="#sec-types-dag-entriesAfter">entriesAfter</a>
|
||||
<li><a href="#sec-types-dag-entriesBefore">entriesBefore</a>
|
||||
<li><a href="#sec-types-dag-entriesBetween">entriesBetween</a>
|
||||
</ul><li><a href="#ch-dag-entries">DAG entries in nvf</a>
|
||||
<ul><li><a href="#ch-vim-luaconfigrc">vim.luaConfigRC (top-level DAG)</a>
|
||||
</ul><li><a href="#ch-autocmds-augroups">Autocommands and Autogroups</a>
|
||||
<ul><li><a href="#sec-vim-augroups">Autogroups (vim.augroups)</a>
|
||||
<li><a href="#sec-vim-autocmds">Autocommands (vim.autocmds)</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>Generated with ndg</p>
|
||||
</footer>
|
||||
|
|
|
|||
67
hacking.html
67
hacking.html
|
|
@ -63,10 +63,11 @@
|
|||
</svg>
|
||||
</div>
|
||||
<nav class="sidebar">
|
||||
<div class="docs-nav">
|
||||
<h2>Documents</h2>
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<details class="sidebar-section" data-section="docs" open>
|
||||
<summary>Documents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<li><a href="configuring.html">Configuring nvf</a></li>
|
||||
<li><a href="hacking.html">Hacking nvf</a></li>
|
||||
<li><a href="tips.html">Helpful Tips</a></li>
|
||||
|
|
@ -74,13 +75,15 @@
|
|||
<li><a href="release-notes.html">Release Notes</a></li>
|
||||
<li><a href="search.html">Search</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<div class="toc">
|
||||
<h2>Contents</h2>
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-hacking">Hacking nvf</a>
|
||||
<details class="sidebar-section" data-section="toc" open>
|
||||
<summary>Contents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-hacking">Hacking nvf</a>
|
||||
<ul><li><a href="#sec-contrib-getting-started">Getting Started</a>
|
||||
<li><a href="#sec-guidelines">Guidelines</a>
|
||||
<ul><li><a href="#sec-guidelines-formatting">Formatting</a>
|
||||
|
|
@ -101,8 +104,9 @@
|
|||
</ul><li><a href="#sec-keybinds">Keybinds</a>
|
||||
<ul><li><a href="#sec-custom-key-mappings">Custom Key Mappings Support for a Plugin</a>
|
||||
</li></ul></li></ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</nav>
|
||||
|
||||
<main class="content"><html><head></head><body><h1 id="ch-hacking">Hacking nvf</h1>
|
||||
|
|
@ -261,7 +265,7 @@ project repository before submitting your pull request.</p>
|
|||
<p>While Alejandra is mostly opinionated on how code looks after formatting,
|
||||
certain changes are done at the user's discretion based on how the original code
|
||||
was structured.</p>
|
||||
<h5>Attribute Sets</h5>
|
||||
<h5 id="attribute-sets">Attribute Sets</h5>
|
||||
<p>Please use one line code for attribute sets that contain only one subset. For
|
||||
example:</p>
|
||||
<!-- markdownlint-disable MD013 -->
|
||||
|
|
@ -273,7 +277,7 @@ unfold the whole merged attribute set for you, which we <strong>do not</strong>
|
|||
<p>Though, if the right-hand side is more than a single line, it is okay to move to
|
||||
a new line. For example:</p>
|
||||
<pre class="highlight"><code class="language-nix"><span style="color:rgb(97,175,239);">module</span> <span style="color:rgb(171,178,191);">=</span> <span style="color:rgb(132,139,152);">{</span><br> <span style="color:rgb(92,99,112);font-style: italic;"># This is okay!</span><br> <span style="color:rgb(86,182,194);">key</span> <span style="color:rgb(171,178,191);">=</span> <span style="color:rgb(97,175,239);">mkEnableOption</span> <span style="color:rgb(152,195,121);">"</span><span style="color:rgb(152,195,121);">some description</span><span style="color:rgb(152,195,121);">"</span> <span style="color:rgb(171,178,191);">//</span> <span style="color:rgb(132,139,152);">{</span><br> <span style="color:rgb(86,182,194);">default</span> <span style="color:rgb(171,178,191);">=</span> <span style="color:rgb(209,154,102);">true</span><span style="color:rgb(132,139,152);">;</span> <br> <span style="color:rgb(86,182,194);">example</span> <span style="color:rgb(171,178,191);">=</span> <span style="color:rgb(209,154,102);">false</span><span style="color:rgb(132,139,152);">;</span><br> <span style="color:rgb(132,139,152);">}</span><span style="color:rgb(132,139,152);">;</span><br><br> <span style="color:rgb(92,99,112);font-style: italic;"># ...</span><br><span style="color:rgb(132,139,152);">}</span><br></code></pre>
|
||||
<h5>Lists</h5>
|
||||
<h5 id="lists">Lists</h5>
|
||||
<p>For lists, it is mostly up to your own discretion how you want to format them,
|
||||
but please try to unfold lists if they contain multiple items and especially if
|
||||
they are to include comments.</p>
|
||||
|
|
@ -320,7 +324,7 @@ HTML manual with various goodies, including a <strong>search page</strong> and a
|
|||
page</strong>. The latter, found under <code>options.html</code> contains module options, similar
|
||||
to the official Nixpkgs search utility. The supported syntax for NDG can be
|
||||
found over at the <a href="https://github.com/feel-co/ndg/blob/main/ndg-commonmark/docs/SYNTAX.md">library documentation</a>.</p>
|
||||
<h3>Building the Documentation</h3>
|
||||
<h3 id="building-the-documentation">Building the Documentation</h3>
|
||||
<p>The HTML version of this documentation, dubbed the "nvf manual", can be
|
||||
generated and opened by typing the following in a shell within a clone of the
|
||||
<strong>nvf</strong> Git repository:</p>
|
||||
|
|
@ -333,7 +337,7 @@ documentation:</p>
|
|||
request. If the documentation builds, an automatic "preview" build will be
|
||||
deployed automatically for your Pull Request. You may use this preview to view
|
||||
your changes as your Pull Request is updated.</p>
|
||||
<h3>Formatting Changelog Entries</h3>
|
||||
<h3 id="formatting-changelog-entries">Formatting Changelog Entries</h3>
|
||||
<p>For additions, removals or any general change that concerns the users you must
|
||||
add a changelog entry. The changelog entries are later included in the rendered
|
||||
manual for users hoping to learn what has changed.</p>
|
||||
|
|
@ -347,7 +351,7 @@ tense, unlike commit messages.</p>
|
|||
<p>While adding a new section, please insert the section at an arbitrary location
|
||||
under the <code>## Changelog</code> section rather than the end of the document. This helps
|
||||
avoid merge conflicts.</p>
|
||||
<h3>Breaking Changes</h3>
|
||||
<h3 id="breaking-changes">Breaking Changes</h3>
|
||||
<p>If you are introducing <em>breaking</em> changes to the repository, then you must also
|
||||
briefly mention what has changed in the breaking changes section of the
|
||||
changelog document that you are editing. If this section does not yet exist, you
|
||||
|
|
@ -491,6 +495,35 @@ you get it done.</p>
|
|||
</body></html><!-- markdownlint-enable MD013 --><!-- markdownlint-disable MD013 --><!-- markdownlint-enable MD013 --></main>
|
||||
</div>
|
||||
|
||||
<aside class="page-toc">
|
||||
<nav class="page-toc-nav">
|
||||
<h3>On this page</h3>
|
||||
<ul class="page-toc-list">
|
||||
<li><a href="#ch-hacking">Hacking nvf</a>
|
||||
<ul><li><a href="#sec-contrib-getting-started">Getting Started</a>
|
||||
<li><a href="#sec-guidelines">Guidelines</a>
|
||||
<ul><li><a href="#sec-guidelines-formatting">Formatting</a>
|
||||
<li><a href="#sec-guidelines-commit-message-style">Formatting Commits</a>
|
||||
<li><a href="#sec-guidelines-commit-style">Commit Style</a>
|
||||
<li><a href="#sec-guidelines-code-style">Code Style</a>
|
||||
</ul><li><a href="#sec-testing-changes">Testing Changes</a>
|
||||
<li><a href="#sec-guidelines-documentation">Adding Documentation</a>
|
||||
<ul><li><a href="#building-the-documentation">Building the Documentation</a>
|
||||
<li><a href="#formatting-changelog-entries">Formatting Changelog Entries</a>
|
||||
<li><a href="#breaking-changes">Breaking Changes</a>
|
||||
</ul><li><a href="#sec-additional-plugins">Adding Plugins</a>
|
||||
<ul><li><a href="#sec-npins-for-plugins">With npins</a>
|
||||
<li><a href="#sec-pkgs-for-plugins">Packaging Complex Plugins</a>
|
||||
<li><a href="#sec-modular-setup-options">Modular Setup Options</a>
|
||||
<li><a href="#sec-details-of-toluaobject">Details of toLuaObject</a>
|
||||
<li><a href="#sec-lazy-plugins">Lazy Loading Plugins</a>
|
||||
</ul><li><a href="#sec-keybinds">Keybinds</a>
|
||||
<ul><li><a href="#sec-custom-key-mappings">Custom Key Mappings Support for a Plugin</a>
|
||||
</li></ul></li></ul></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>Generated with ndg</p>
|
||||
</footer>
|
||||
|
|
|
|||
61
index.html
61
index.html
|
|
@ -63,10 +63,11 @@
|
|||
</svg>
|
||||
</div>
|
||||
<nav class="sidebar">
|
||||
<div class="docs-nav">
|
||||
<h2>Documents</h2>
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<details class="sidebar-section" data-section="docs" open>
|
||||
<summary>Documents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<li><a href="configuring.html">Configuring nvf</a></li>
|
||||
<li><a href="hacking.html">Hacking nvf</a></li>
|
||||
<li><a href="tips.html">Helpful Tips</a></li>
|
||||
|
|
@ -74,13 +75,15 @@
|
|||
<li><a href="release-notes.html">Release Notes</a></li>
|
||||
<li><a href="search.html">Search</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<div class="toc">
|
||||
<h2>Contents</h2>
|
||||
<ul class="toc-list">
|
||||
<li><a href="#nvf-manual">Introduction</a>
|
||||
<details class="sidebar-section" data-section="toc" open>
|
||||
<summary>Contents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul class="toc-list">
|
||||
<li><a href="#nvf-manual">Introduction</a>
|
||||
<ul><li><a href="#ch-preface">Preface</a>
|
||||
<ul><li><a href="#sec-what-is-it">What is nvf</a>
|
||||
</ul><li><a href="#ch-try-it-out">Try it Out</a>
|
||||
|
|
@ -96,13 +99,15 @@
|
|||
<li><a href="#sec-nixos-flakes-usage">Usage</a>
|
||||
<li><a href="#sec-example-installation-nixos">Example Installation</a>
|
||||
</ul><li><a href="#sec-nixos-flakeless">Without Flakes</a>
|
||||
<li><a href="#ch-hm-module">Home Manager Module</a>
|
||||
<li><a href="#sec-hm-flakes">With Flakes</a>
|
||||
<ul><li><a href="#sec-hm-flakes-usage">Usage</a>
|
||||
<li><a href="#sec-example-installation-hm">Example Installation</a>
|
||||
</ul><li><a href="#sec-hm-flakeless">Without Flakes</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</nav>
|
||||
|
||||
<main class="content"><html><head></head><body><h1 id="nvf-manual">Introduction</h1>
|
||||
|
|
@ -276,7 +281,7 @@ If you are new to NixOS, I encourage you to look into Flakes and see if they fit
|
|||
your use case. Alternatively, look into the aforementioned projects for more
|
||||
convenient dependency management mechanisms.</p>
|
||||
</div>
|
||||
## Home Manager Module {#ch-hm-module}
|
||||
<h2 id="ch-hm-module">Home Manager Module</h2>
|
||||
<p>The Home Manager module allows us to customize the different <code>vim</code> options from
|
||||
inside the Home Manager configuration without having to call for the wrapper
|
||||
yourself. It is the recommended way to use <strong>nvf</strong> alongside the NixOS module
|
||||
|
|
@ -349,6 +354,36 @@ convenient dependency management mechanisms.</p>
|
|||
</body></html><!-- markdownlint-enable MD014 --><!-- TODO: mention the built-in flake template here when it is added --></main>
|
||||
</div>
|
||||
|
||||
<aside class="page-toc">
|
||||
<nav class="page-toc-nav">
|
||||
<h3>On this page</h3>
|
||||
<ul class="page-toc-list">
|
||||
<li><a href="#nvf-manual">Introduction</a>
|
||||
<ul><li><a href="#ch-preface">Preface</a>
|
||||
<ul><li><a href="#sec-what-is-it">What is nvf</a>
|
||||
</ul><li><a href="#ch-try-it-out">Try it Out</a>
|
||||
<li><a href="#sec-using-prebuilt-configs">Using Prebuilt Configurations</a>
|
||||
<ul><li><a href="#sec-available-configs">Available Configurations</a>
|
||||
</ul><li><a href="#ch-installation">Installing nvf</a>
|
||||
</ul><li><a href="#ch-standalone-installation">Standalone Installation</a>
|
||||
<ul><li><a href="#ch-standalone-nixos">Standalone Installation on NixOS</a>
|
||||
<li><a href="#ch-standalone-hm">Standalone Installation on Home-Manager</a>
|
||||
</ul><li><a href="#ch-module-installation">Module Installation</a>
|
||||
<ul><li><a href="#ch-nixos-module">NixOS Module</a>
|
||||
<ul><li><a href="#sec-nixos-flakes">With Flakes</a>
|
||||
<li><a href="#sec-nixos-flakes-usage">Usage</a>
|
||||
<li><a href="#sec-example-installation-nixos">Example Installation</a>
|
||||
</ul><li><a href="#sec-nixos-flakeless">Without Flakes</a>
|
||||
<li><a href="#ch-hm-module">Home Manager Module</a>
|
||||
<li><a href="#sec-hm-flakes">With Flakes</a>
|
||||
<ul><li><a href="#sec-hm-flakes-usage">Usage</a>
|
||||
<li><a href="#sec-example-installation-hm">Example Installation</a>
|
||||
</ul><li><a href="#sec-hm-flakeless">Without Flakes</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>Generated with ndg</p>
|
||||
</footer>
|
||||
|
|
|
|||
10753
options.html
10753
options.html
File diff suppressed because it is too large
Load diff
41
quirks.html
41
quirks.html
|
|
@ -63,10 +63,11 @@
|
|||
</svg>
|
||||
</div>
|
||||
<nav class="sidebar">
|
||||
<div class="docs-nav">
|
||||
<h2>Documents</h2>
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<details class="sidebar-section" data-section="docs" open>
|
||||
<summary>Documents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<li><a href="configuring.html">Configuring nvf</a></li>
|
||||
<li><a href="hacking.html">Hacking nvf</a></li>
|
||||
<li><a href="tips.html">Helpful Tips</a></li>
|
||||
|
|
@ -74,19 +75,22 @@
|
|||
<li><a href="release-notes.html">Release Notes</a></li>
|
||||
<li><a href="search.html">Search</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<div class="toc">
|
||||
<h2>Contents</h2>
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-known-issues-quirks">Known Issues and Quirks</a>
|
||||
<details class="sidebar-section" data-section="toc" open>
|
||||
<summary>Contents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-known-issues-quirks">Known Issues and Quirks</a>
|
||||
<ul><li><a href="#ch-quirks-nodejs">NodeJS</a>
|
||||
<ul><li><a href="#sec-eslint-plugin-prettier">eslint-plugin-prettier</a>
|
||||
</ul><li><a href="#ch-bugs-suggestions">Bugs & Suggestions</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</nav>
|
||||
|
||||
<main class="content"><html><head></head><body><h1 id="ch-known-issues-quirks">Known Issues and Quirks</h1>
|
||||
|
|
@ -125,6 +129,19 @@ changes that you think are critical over at the <a href="https://github.com/nota
|
|||
</body></html></main>
|
||||
</div>
|
||||
|
||||
<aside class="page-toc">
|
||||
<nav class="page-toc-nav">
|
||||
<h3>On this page</h3>
|
||||
<ul class="page-toc-list">
|
||||
<li><a href="#ch-known-issues-quirks">Known Issues and Quirks</a>
|
||||
<ul><li><a href="#ch-quirks-nodejs">NodeJS</a>
|
||||
<ul><li><a href="#sec-eslint-plugin-prettier">eslint-plugin-prettier</a>
|
||||
</ul><li><a href="#ch-bugs-suggestions">Bugs & Suggestions</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>Generated with ndg</p>
|
||||
</footer>
|
||||
|
|
|
|||
|
|
@ -63,10 +63,11 @@
|
|||
</svg>
|
||||
</div>
|
||||
<nav class="sidebar">
|
||||
<div class="docs-nav">
|
||||
<h2>Documents</h2>
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<details class="sidebar-section" data-section="docs" open>
|
||||
<summary>Documents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<li><a href="configuring.html">Configuring nvf</a></li>
|
||||
<li><a href="hacking.html">Hacking nvf</a></li>
|
||||
<li><a href="tips.html">Helpful Tips</a></li>
|
||||
|
|
@ -74,13 +75,15 @@
|
|||
<li><a href="release-notes.html">Release Notes</a></li>
|
||||
<li><a href="search.html">Search</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<div class="toc">
|
||||
<h2>Contents</h2>
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-release-notes">Release Notes</a>
|
||||
<details class="sidebar-section" data-section="toc" open>
|
||||
<summary>Contents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-release-notes">Release Notes</a>
|
||||
<li><a href="#sec-release-0-1">Release 0.1</a>
|
||||
<ul><li><a href="#sec-release-0-1-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-2">Release 0.2</a>
|
||||
|
|
@ -111,8 +114,9 @@
|
|||
<ul><li><a href="#breaking-changes">Breaking changes</a>
|
||||
<li><a href="#sec-release-0-9-changelog">Changelog</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</nav>
|
||||
|
||||
<main class="content"><html><head></head><body><h1 id="ch-release-notes">Release Notes</h1>
|
||||
|
|
@ -1221,7 +1225,7 @@ Svelte. Enable them via <a class="option-reference" href="options.html#option-vi
|
|||
<li>Add support for <a href="https://astro.build/">Astro</a> language server.</li>
|
||||
</ul>
|
||||
<h1 id="sec-release-0-8">Release 0.8</h1>
|
||||
<h2>Breaking changes</h2>
|
||||
<h2 id="breaking-changes">Breaking changes</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<p><code>git-conflict</code> keybinds are now prefixed with <code><leader></code> to avoid conflicting
|
||||
|
|
@ -1817,7 +1821,7 @@ attach behavior.</li>
|
|||
<li>Added gitFiles mapping option to telescope</li>
|
||||
</ul>
|
||||
<h1 id="sec-release-0-9">Release 0.9</h1>
|
||||
<h2>Breaking changes</h2>
|
||||
<h2 id="breaking-changes">Breaking changes</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Nixpkgs has merged a fully incompatible rewrite of
|
||||
|
|
@ -1962,6 +1966,45 @@ formatter.</p>
|
|||
</body></html></main>
|
||||
</div>
|
||||
|
||||
<aside class="page-toc">
|
||||
<nav class="page-toc-nav">
|
||||
<h3>On this page</h3>
|
||||
<ul class="page-toc-list">
|
||||
<li><a href="#ch-release-notes">Release Notes</a>
|
||||
<li><a href="#sec-release-0-1">Release 0.1</a>
|
||||
<ul><li><a href="#sec-release-0-1-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-2">Release 0.2</a>
|
||||
<ul><li><a href="#sec-release-0-2-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-3">Release 0.3</a>
|
||||
<ul><li><a href="#sec-release-0-3-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-4">Release 0.4</a>
|
||||
<ul><li><a href="#sec-release-0-4-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-5">Release 0.5</a>
|
||||
<ul><li><a href="#sec-release-0-5-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-6">Release 0.6</a>
|
||||
<ul><li><a href="#sec-breaking-changes-and-migration-guide">Breaking Changes and Migration Guide</a>
|
||||
<li><a href="#sec-release-0-6-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-7">Release 0.7</a>
|
||||
<ul><li><a href="#sec-breaking-changes-and-migration-guide-0-7">Breaking Changes and Migration Guide</a>
|
||||
<ul><li><a href="#sec-vim-configrc-removed">vim.configRC removed</a>
|
||||
<li><a href="#sec-vim-maps-rewrite">vim.maps rewrite</a>
|
||||
<li><a href="#sec-nvim-code-action-menu-deprecation">vim.lsp.nvimCodeActionMenu removed in favor of vim.ui.fastaction</a>
|
||||
<li><a href="#sec-type-based-modules-removed">type based modules removed</a>
|
||||
<li><a href="#sec-nixpkgs-fmt-deprecation">nixpkgs-fmt removed in favor of nixfmt</a>
|
||||
<li><a href="#sec-leader-changes">leader changes</a>
|
||||
<li><a href="#sec-vim-opt-changes">vim.* changes</a>
|
||||
</ul><li><a href="#sec-release-0-7-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-8">Release 0.8</a>
|
||||
<ul><li><a href="#breaking-changes">Breaking changes</a>
|
||||
<li><a href="#sec-release-0-8-changelog">Changelog</a>
|
||||
</ul><li><a href="#sec-release-0-9">Release 0.9</a>
|
||||
<ul><li><a href="#breaking-changes">Breaking changes</a>
|
||||
<li><a href="#sec-release-0-9-changelog">Changelog</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>Generated with ndg</p>
|
||||
</footer>
|
||||
|
|
|
|||
|
|
@ -15,6 +15,10 @@
|
|||
</script>
|
||||
<link rel="stylesheet" href="assets/style.css" />
|
||||
<script defer src="assets/main.js"></script>
|
||||
<script>
|
||||
window.searchNamespace = window.searchNamespace || {};
|
||||
window.searchNamespace.rootPath = "";
|
||||
</script>
|
||||
<script defer src="assets/search.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
47
tips.html
47
tips.html
|
|
@ -63,10 +63,11 @@
|
|||
</svg>
|
||||
</div>
|
||||
<nav class="sidebar">
|
||||
<div class="docs-nav">
|
||||
<h2>Documents</h2>
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<details class="sidebar-section" data-section="docs" open>
|
||||
<summary>Documents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul>
|
||||
<li><a href="index.html">Introduction</a></li>
|
||||
<li><a href="configuring.html">Configuring nvf</a></li>
|
||||
<li><a href="hacking.html">Hacking nvf</a></li>
|
||||
<li><a href="tips.html">Helpful Tips</a></li>
|
||||
|
|
@ -74,13 +75,15 @@
|
|||
<li><a href="release-notes.html">Release Notes</a></li>
|
||||
<li><a href="search.html">Search</a></li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
|
||||
<div class="toc">
|
||||
<h2>Contents</h2>
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-helpful-tips">Helpful Tips</a>
|
||||
<details class="sidebar-section" data-section="toc" open>
|
||||
<summary>Contents</summary>
|
||||
<div class="sidebar-section-content">
|
||||
<ul class="toc-list">
|
||||
<li><a href="#ch-helpful-tips">Helpful Tips</a>
|
||||
<li><a href="#sec-debugging-nvf">Debugging nvf</a>
|
||||
<ul><li><a href="#sec-accessing-config">Accessing neovimConfig</a>
|
||||
</ul><li><a href="#sec-offline-documentation">Offline Documentation</a>
|
||||
|
|
@ -91,8 +94,9 @@
|
|||
<ul><li><a href="#ch-plugins-from-nixpkgs">Nixpkgs & Friends</a>
|
||||
<li><a href="#ch-plugins-from-source">Building Your Own Plugins</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</details>
|
||||
</nav>
|
||||
|
||||
<main class="content"><html><head></head><body><h1 id="ch-helpful-tips">Helpful Tips</h1>
|
||||
|
|
@ -203,6 +207,25 @@ example would look like this.</p>
|
|||
</body></html></main>
|
||||
</div>
|
||||
|
||||
<aside class="page-toc">
|
||||
<nav class="page-toc-nav">
|
||||
<h3>On this page</h3>
|
||||
<ul class="page-toc-list">
|
||||
<li><a href="#ch-helpful-tips">Helpful Tips</a>
|
||||
<li><a href="#sec-debugging-nvf">Debugging nvf</a>
|
||||
<ul><li><a href="#sec-accessing-config">Accessing neovimConfig</a>
|
||||
</ul><li><a href="#sec-offline-documentation">Offline Documentation</a>
|
||||
<li><a href="#sec-pure-lua-config">Pure Lua Configuration</a>
|
||||
<ul><li><a href="#sec-pure-nvf-runtime">Pure Runtime Directory</a>
|
||||
<li><a href="#sec-impure-absolute-dir">Impure Absolute Directory</a>
|
||||
</ul><li><a href="#sec-plugin-sources">Adding Plugins From Different Sources</a>
|
||||
<ul><li><a href="#ch-plugins-from-nixpkgs">Nixpkgs & Friends</a>
|
||||
<li><a href="#ch-plugins-from-source">Building Your Own Plugins</a>
|
||||
</li></ul></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<footer>
|
||||
<p>Generated with ndg</p>
|
||||
</footer>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue