This commit is contained in:
NotAShelf 2026-01-22 19:55:55 +00:00
commit 3435dce176
13 changed files with 4554 additions and 5571 deletions

View file

@ -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

View file

@ -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);
}
};
};

File diff suppressed because it is too large Load diff

View file

@ -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;
}
}

View file

@ -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>

View file

@ -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>&nbsp;<span style="color:rgb(171,178,191);">=</span>&nbsp;<span style="color:rgb(132,139,152);">{</span><br>&nbsp;&nbsp;<span style="color:rgb(92,99,112);font-style: italic;">#&nbsp;This&nbsp;is&nbsp;okay!</span><br>&nbsp;&nbsp;<span style="color:rgb(86,182,194);">key</span>&nbsp;<span style="color:rgb(171,178,191);">=</span>&nbsp;<span style="color:rgb(97,175,239);">mkEnableOption</span>&nbsp;<span style="color:rgb(152,195,121);">"</span><span style="color:rgb(152,195,121);">some&nbsp;description</span><span style="color:rgb(152,195,121);">"</span>&nbsp;<span style="color:rgb(171,178,191);">//</span>&nbsp;<span style="color:rgb(132,139,152);">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:rgb(86,182,194);">default</span>&nbsp;<span style="color:rgb(171,178,191);">=</span>&nbsp;<span style="color:rgb(209,154,102);">true</span><span style="color:rgb(132,139,152);">;</span>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:rgb(86,182,194);">example</span>&nbsp;<span style="color:rgb(171,178,191);">=</span>&nbsp;<span style="color:rgb(209,154,102);">false</span><span style="color:rgb(132,139,152);">;</span><br>&nbsp;&nbsp;<span style="color:rgb(132,139,152);">}</span><span style="color:rgb(132,139,152);">;</span><br><br>&nbsp;&nbsp;<span style="color:rgb(92,99,112);font-style: italic;">#&nbsp;...</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>

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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 &amp; 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 &amp; Suggestions</a>
</li></ul></li>
</ul>
</nav>
</aside>
<footer>
<p>Generated with ndg</p>
</footer>

View file

@ -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>&lt;leader&gt;</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>

View file

@ -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>

View file

@ -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 &amp; 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 &amp; 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>