aboutsummaryrefslogtreecommitdiff
path: root/nvim/dot-config
diff options
context:
space:
mode:
authorMohammad Reza Karimi <m.r.karimi.j@gmail.com>2026-01-04 21:28:36 -0500
committerMohammad Reza Karimi <m.r.karimi.j@gmail.com>2026-01-04 21:28:36 -0500
commit06d1242317f7159ccf3014f0a1480e7c56236ebb (patch)
tree89863b3287ae2c7cc88cd532220f18c38e8d8657 /nvim/dot-config
parent5a41da5881a11ba3fdc3890c342aa3b7eb53e0cf (diff)
add all sorts of things
Diffstat (limited to 'nvim/dot-config')
-rw-r--r--nvim/dot-config/nvim-final/after/ftplugin/lua.lua3
-rw-r--r--nvim/dot-config/nvim-final/colors/solarized.lua490
-rw-r--r--nvim/dot-config/nvim-final/init.lua713
-rw-r--r--nvim/dot-config/nvim-final/lua/mo/zen.lua89
-rw-r--r--nvim/dot-config/nvim-final/nvim-pack-lock.json12
-rw-r--r--nvim/dot-config/nvim-final/plugin/autocommands.lua7
-rw-r--r--nvim/dot-config/nvim-final/stylua.toml12
7 files changed, 1326 insertions, 0 deletions
diff --git a/nvim/dot-config/nvim-final/after/ftplugin/lua.lua b/nvim/dot-config/nvim-final/after/ftplugin/lua.lua
new file mode 100644
index 0000000..53dd1d2
--- /dev/null
+++ b/nvim/dot-config/nvim-final/after/ftplugin/lua.lua
@@ -0,0 +1,3 @@
+vim.cmd([[
+setlocal keywordprg=:help
+]])
diff --git a/nvim/dot-config/nvim-final/colors/solarized.lua b/nvim/dot-config/nvim-final/colors/solarized.lua
new file mode 100644
index 0000000..090090b
--- /dev/null
+++ b/nvim/dot-config/nvim-final/colors/solarized.lua
@@ -0,0 +1,490 @@
+local function oklab_to_linear_rgb(L, a, b)
+ -- Oklab to LMS conversion
+ -- Reference: Björn Ottosson, "A perceptual color space for image processing"
+ local l = L + 0.3963377774 * a + 0.2158037573 * b
+ local m = L - 0.1055613458 * a - 0.0638541728 * b
+ local s = L - 0.0894841775 * a - 1.2914855480 * b
+
+ -- LMS to linear RGB
+ -- Cube the LMS values (inverse of cube root)
+ local l3, m3, s3 = l * l * l, m * m * m, s * s * s
+
+ -- Linear RGB transformation matrix
+ local r = 4.0767416621 * l3 - 3.3077115913 * m3 + 0.2309699292 * s3
+ local g = -1.2684380046 * l3 + 2.6097574011 * m3 - 0.3413193965 * s3
+ local b_out = -0.0041960863 * l3 - 0.7034186147 * m3 + 1.7076147010 * s3
+
+ return r, g, b_out
+end
+
+local function linear_to_srgb_component(c)
+ -- sRGB gamma correction (companding)
+ -- Reference: IEC 61966-2-1:1999
+ if c <= 0.0031308 then
+ return c * 12.92 -- Linear segment
+ else
+ return 1.055 * (c ^ (1 / 2.4)) - 0.055 -- Power function (gamma ≈ 2.2)
+ end
+end
+
+local function oklab_to_srgb(L, a, b)
+ local r, g, b_comp = oklab_to_linear_rgb(L, a, b)
+
+ r = linear_to_srgb_component(r)
+ g = linear_to_srgb_component(g)
+ b_comp = linear_to_srgb_component(b_comp)
+
+ -- Clamp and convert to 8-bit
+ r = math.floor(math.max(0, math.min(1, r)) * 255 + 0.5)
+ g = math.floor(math.max(0, math.min(1, g)) * 255 + 0.5)
+ b_comp = math.floor(math.max(0, math.min(1, b_comp)) * 255 + 0.5)
+
+ return string.format('#%02x%02x%02x', r, g, b_comp)
+end
+
+-- ═══════════════════════════════════════════════════════════════════════════
+-- MONOTONE COLORS
+-- ═══════════════════════════════════════════════════════════════════════════
+local base03 = oklab_to_srgb(0.267337, -0.037339, -0.031128)
+local base02 = oklab_to_srgb(0.309207, -0.039852, -0.033029)
+local base01 = oklab_to_srgb(0.523013, -0.021953, -0.017864)
+local base00 = oklab_to_srgb(0.568165, -0.021219, -0.019038)
+
+local base0 = oklab_to_srgb(0.709236, -0.023223, -0.013451)
+local base1 = oklab_to_srgb(0.697899, -0.015223, -0.004594)
+local base2 = oklab_to_srgb(0.930609, -0.001091, 0.026010)
+local base3 = oklab_to_srgb(0.973528, -0.000043, 0.026053)
+
+-- ═══════════════════════════════════════════════════════════════════════════
+-- ACCENT COLORS
+-- ═══════════════════════════════════════════════════════════════════════════
+local yellow = oklab_to_srgb(0.654479, 0.010005, 0.133641)
+local orange = oklab_to_srgb(0.63, 0.133661 * 0.69, 0.110183 * 0.69)
+local red = oklab_to_srgb(0.63, 0.183749 * 0.72, 0.094099 * 0.72)
+local magenta = oklab_to_srgb(0.592363, 0.201958, -0.014497)
+local violet = oklab_to_srgb(0.582316, 0.019953, -0.124557)
+local blue = oklab_to_srgb(0.614879, -0.059069, -0.126255)
+local cyan = oklab_to_srgb(0.643664, -0.101063, -0.013097)
+local green = oklab_to_srgb(0.644391, -0.072203, 0.132448)
+
+-- ═══════════════════════════════════════════════════════════════════════════
+-- MODE SELECTION
+-- ═══════════════════════════════════════════════════════════════════════════
+
+-- Set to 'dark' or 'light'
+local mode = vim.o.background or 'dark'
+
+local colors = {}
+
+if mode == 'dark' then
+ -- Dark mode: dark background, light text
+ colors.bg = base03
+ colors.bg_highlight = base02
+ colors.fg_comment = base01
+ colors.fg = base0
+ colors.fg_emphasis = base1
+else
+ colors.bg = base3
+ colors.bg_highlight = base2
+ colors.fg_comment = base1
+ colors.fg = base00
+ colors.fg_emphasis = base01
+end
+
+-- Accent colors are the same in both modes
+colors.yellow = yellow
+colors.orange = orange
+colors.red = red
+colors.magenta = magenta
+colors.violet = violet
+colors.blue = blue
+colors.cyan = cyan
+colors.green = green
+
+colors.cursorline_bg = colors.bg_highlight
+colors.selection_bg = base02
+colors.visual_bg = base02
+
+vim.g.colors_name = 'dicom'
+
+local function h(group, properties)
+ vim.api.nvim_set_hl(0, group, properties)
+end
+
+local function hex_to_rgb(hex)
+ hex = hex:gsub('#', '')
+ return {
+ tonumber(hex:sub(1, 2), 16),
+ tonumber(hex:sub(3, 4), 16),
+ tonumber(hex:sub(5, 6), 16),
+ }
+end
+
+local function rgb_to_hex(c)
+ return string.format('#%02x%02x%02x', c[1], c[2], c[3])
+end
+
+local function blend(fg, t, target_bg)
+ local a, b = hex_to_rgb(fg), hex_to_rgb(target_bg or colors.bg)
+ local c = {
+ math.floor(a[1] * (1 - t) + b[1] * t + 0.5),
+ math.floor(a[2] * (1 - t) + b[2] * t + 0.5),
+ math.floor(a[3] * (1 - t) + b[3] * t + 0.5),
+ }
+ return rgb_to_hex(c)
+end
+
+-- =============================================================================
+-- Research-Driven Syntax Highlighting Strategy
+-- Based on: Hannebauer et al. (2018), Tonsky (2025), Schloss (2023)
+-- =============================================================================
+
+-- 1. Core Editor Surface
+h('Normal', { fg = colors.fg, bg = colors.bg })
+h('EndOfBuffer', { fg = colors.bg })
+h('CursorLine', { bg = colors.cursorline_bg })
+h('CursorLineNr', { fg = colors.yellow, bold = true })
+h('LineNr', { fg = colors.fg_comment })
+h('WinSeparator', { fg = colors.bg_highlight, bg = colors.bg })
+
+-- 2. Visual & Search (High Arousal)
+h('Visual', { bg = colors.selection_bg })
+h('Search', { fg = colors.bg, bg = colors.yellow })
+h('IncSearch', { fg = colors.bg, bg = colors.orange })
+
+h('Keyword', { fg = colors.green })
+h('Statement', { fg = colors.green })
+h('Conditional', { fg = colors.green })
+h('Repeat', { fg = colors.green })
+
+h('Function', { fg = colors.blue })
+
+-- Types
+h('Type', { fg = colors.yellow })
+h('StorageClass', { fg = colors.yellow })
+h('Structure', { fg = colors.yellow })
+h('Typedef', { fg = colors.yellow })
+
+-- Constants
+h('Constant', { fg = colors.cyan })
+h('String', { fg = colors.cyan })
+h('Character', { fg = colors.cyan })
+h('Number', { fg = colors.cyan })
+h('Boolean', { fg = colors.cyan })
+h('Float', { fg = colors.cyan })
+
+-- PreProc
+h('PreProc', { fg = colors.orange })
+h('Include', { fg = colors.orange })
+h('Define', { fg = colors.orange })
+h('Macro', { fg = colors.orange })
+h('PreCondit', { fg = colors.orange })
+
+-- Special Characters - Cyan (escape/special)
+h('Special', { fg = colors.cyan })
+
+h('Identifier', { fg = colors.fg })
+h('Variable', { fg = colors.fg })
+h('Operator', { fg = colors.fg })
+
+h('Delimiter', { fg = colors.fg })
+h('NonText', { fg = colors.bg_highlight })
+
+-- -----------------------------------------------------------------------------
+-- Layer 6: COMMENTS
+-- Luminance: L=comment (dimmest)
+-- -----------------------------------------------------------------------------
+
+h('Comment', { fg = colors.fg_comment, italic = true })
+
+-- =============================================================================
+-- 4. UI Components
+-- =============================================================================
+
+h('StatusLine', { bg = colors.fg, fg = colors.bg_highlight })
+h('StatusLineNC', { bg = colors.fg_comment, fg = colors.bg_highlight })
+h('WildMenu', { fg = colors.bg, bg = colors.blue })
+h('ColorColumn', { bg = colors.bg_highlight })
+
+-- Popup Menu
+h('Pmenu', { fg = colors.fg, bg = colors.bg_highlight })
+h('PmenuSel', { fg = colors.fg_emphasis, bg = colors.selection, reverse = true })
+h('PmenuSbar', { bg = colors.bg_highlight })
+h('PmenuThumb', { bg = colors.fg_comment })
+h('PmenuMatch', { fg = colors.cyan, bold = true })
+h('PmenuMatchSel', { bg = colors.selection, bold = true, fg = colors.fg_emphasis })
+
+-- Float & Borders
+h('NormalFloat', { bg = colors.bg_highlight })
+h('FloatBorder', { fg = colors.comment })
+h('Title', { fg = colors.bg_highlight, bold = true })
+
+-- =============================================================================
+-- 5. Diagnostics - Semantic Consistency
+-- =============================================================================
+--
+-- Research basis (Schloss 2023):
+-- Color-concept associations are universal:
+-- Red → danger/anger (cross-cultural consistency)
+-- Orange → warning/caution
+-- Blue → information/calm
+-- Cyan → hint/auxiliary
+--
+-- This mapping perfectly aligns with research! ✓
+--
+
+h('ErrorMsg', { fg = colors.red, bold = true })
+h('WarningMsg', { fg = colors.orange })
+h('ModeMsg', { fg = colors.cyan, bold = true })
+h('Todo', { fg = colors.violet, bold = true, reverse = true })
+h('MatchParen', { bg = colors.selection_bg, bold = true })
+
+-- QuickFix & List
+h('qfFileName', { fg = colors.blue })
+h('qfLineNr', { fg = colors.cyan })
+h('qfSeparator', { fg = colors.bg_highlight })
+h('QuickFixLine', { bg = colors.cursorline_bg, bold = true })
+h('qfText', { link = 'Normal' })
+
+-- Underlined/Directory
+h('Underlined', { fg = colors.violet, underline = true })
+h('Directory', { fg = colors.blue })
+
+-- sync to terminal
+h('Magenta', { fg = colors.magenta })
+h('Violet', { fg = colors.violet })
+
+-- =============================================================================
+-- 6. Treesitter Highlights (Optimized)
+-- =============================================================================
+
+-- Neutral Layer ⭐️ KEY OPTIMIZATION
+h('@variable', { link = 'Identifier' }) -- Neutral
+h('@variable.builtin', { link = '@variable' }) -- Neutral
+h('@variable.parameter', { link = '@variable' }) -- Neutral
+h('@variable.parameter.builtin', { link = '@variable.builtin' })
+h('@variable.member', { link = '@variable' }) -- Neutral
+h('@parameter', { fg = colors.fg }) -- Neutral
+h('@property', { fg = colors.fg }) -- Neutral
+
+-- Constants Layer ⭐️ OPTIMIZED
+h('@constant', { fg = colors.cyan }) -- Constants = frozen
+h('@constant.builtin', { fg = colors.cyan })
+h('@constant.macro', { fg = colors.cyan })
+
+-- Modules/Namespaces
+h('@module', { link = 'Identifier' })
+h('@module.builtin', { link = '@module' })
+
+-- Labels
+h('@label', { link = 'Label' })
+
+-- Strings Layer
+h('@string', { link = 'String' })
+h('@string.documentation', { link = 'Comment' })
+h('@string.regexp', { link = '@string' })
+h('@string.escape', { link = 'Special' })
+h('@string.special', { link = '@string' })
+h('@string.special.symbol', { link = '@string' })
+h('@string.special.path', { link = '@string' })
+h('@string.special.url', { link = 'Underlined' })
+
+h('@character', { link = 'String' })
+h('@character.special', { link = '@character' })
+
+-- Numbers Layer
+h('@boolean', { link = 'Constant' })
+h('@number', { link = 'Number' })
+h('@number.float', { link = 'Float' })
+
+-- Types Layer
+h('@type', { link = 'Type' })
+h('@type.builtin', { link = 'Type' })
+h('@type.definition', { link = 'Type' })
+
+-- Attributes/Decorators
+h('@attribute', { link = 'Macro' })
+h('@attribute.builtin', { link = 'Special' })
+
+-- Functions Layer
+h('@function', { link = 'Function' })
+h('@function.builtin', { link = 'Function' })
+h('@function.call', { link = '@function' })
+h('@function.macro', { link = '@function' })
+h('@function.method', { link = '@function' })
+h('@function.method.call', { link = '@function' })
+h('@constructor', { link = 'Function' })
+
+-- Operators - Neutral
+h('@operator', { link = 'Operator' })
+
+-- Keywords Layer
+h('@keyword', { link = 'Keyword' })
+h('@keyword.coroutine', { link = '@keyword' })
+h('@keyword.function', { link = 'Keyword' })
+h('@keyword.operator', { link = '@keyword' })
+h('@keyword.import', { link = 'PreProc' })
+h('@keyword.type', { link = '@keyword' })
+h('@keyword.modifier', { link = '@keyword' })
+h('@keyword.repeat', { link = 'Repeat' })
+h('@keyword.return', { link = '@keyword' })
+h('@keyword.debug', { link = '@keyword' })
+h('@keyword.exception', { link = '@keyword' })
+h('@keyword.conditional', { link = 'Conditional' })
+h('@keyword.conditional.ternary', { link = '@operator' })
+h('@keyword.directive', { link = '@keyword' })
+h('@keyword.directive.define', { link = '@keyword' })
+
+-- Punctuation
+h('@punctuation', { fg = colors.fg })
+h('@punctuation.delimiter', { link = '@punctuation' })
+h('@punctuation.bracket', { link = '@punctuation' })
+h('@punctuation.special', { link = '@punctuation' })
+
+-- Comments Layer
+h('@comment', { link = 'Comment' })
+h('@comment.documentation', { link = '@comment' })
+h('@comment.error', { fg = colors.red, bold = true })
+h('@comment.warning', { fg = colors.yellow, bold = true })
+h('@comment.todo', { link = 'Special' })
+h('@comment.note', { link = 'Special' })
+
+-- Markup (Markdown, etc.)
+h('@markup', { link = 'Comment' })
+h('@markup.strong', { bold = true })
+h('@markup.italic', { italic = true })
+h('@markup.strikethrough', { strikethrough = true })
+h('@markup.underline', { link = 'Underlined' })
+h('@markup.heading', { link = 'Title' })
+h('@markup.heading.1', { link = '@markup.heading' })
+h('@markup.heading.2', { link = '@markup.heading' })
+h('@markup.heading.3', { link = '@markup.heading' })
+h('@markup.heading.4', { link = '@markup.heading' })
+h('@markup.heading.5', { link = '@markup.heading' })
+h('@markup.heading.6', { link = '@markup.heading' })
+h('@markup.quote', {})
+h('@markup.math', { link = 'String' })
+h('@markup.link', { link = 'Underlined' })
+h('@markup.link.label', { link = '@markup.link' })
+h('@markup.link.url', { link = '@markup.link' })
+h('@markup.raw', {})
+h('@markup.raw.block', { link = '@markup.raw' })
+h('@markup.list', {})
+h('@markup.list.checked', { fg = colors.green })
+h('@markup.list.unchecked', { link = '@markup.list' })
+
+-- Diff
+h('@diff.plus', { fg = blend(colors.green, 0.5, colors.statusline_bg) })
+h('@diff.minus', { fg = blend(colors.red, 0.5, colors.statusline_bg) })
+h('@diff.delta', { fg = blend(colors.yellow, 0.5, colors.statusline_bg) })
+
+-- HTML/XML
+h('@tag', { fg = colors.green })
+h('@tag.attribute', { fg = colors.fg })
+h('@tag.delimiter', { fg = colors.fg })
+h('@tag.builtin', { link = 'Special' })
+
+-- Vimdoc Special Handling
+h('@constant.comment', { link = 'SpecialComment' })
+h('@number.comment', { link = 'Comment' })
+h('@punctuation.bracket.comment', { link = 'SpecialComment' })
+h('@punctuation.delimiter.comment', { link = 'SpecialComment' })
+h('@label.vimdoc', { link = 'String' })
+h('@markup.heading.1.delimiter.vimdoc', { link = '@markup.heading.1' })
+h('@markup.heading.2.delimiter.vimdoc', { link = '@markup.heading.2' })
+
+-- Semantic Aliases
+h('@class', { fg = colors.yellow })
+h('@method', { fg = colors.blue })
+h('@interface', { fg = colors.yellow })
+h('@namespace', { fg = colors.fg })
+
+-- =============================================================================
+-- 7. LSP Semantic Highlights
+-- =============================================================================
+
+h('@lsp.type.class', { link = '@type' })
+h('@lsp.type.comment', { link = '@comment' })
+h('@lsp.type.decorator', { link = '@attribute' })
+h('@lsp.type.enum', { link = '@type' })
+h('@lsp.type.enumMember', { link = '@constant' })
+h('@lsp.type.event', { link = '@type' })
+h('@lsp.type.function', { link = '@function' })
+h('@lsp.type.interface', { link = '@type' })
+h('@lsp.type.keyword', { link = '@keyword' })
+h('@lsp.type.macro', { link = 'Macro' })
+h('@lsp.type.method', { link = '@function.method' })
+h('@lsp.type.modifier', { link = '@type.qualifier' })
+h('@lsp.type.namespace', { link = '@module' })
+h('@lsp.type.number', { link = '@number' })
+h('@lsp.type.operator', { link = '@operator' })
+h('@lsp.type.parameter', { fg = colors.fg })
+h('@lsp.type.property', { fg = colors.fg })
+h('@lsp.type.regexp', { link = '@string.regexp' })
+h('@lsp.type.string', { link = '@string' })
+h('@lsp.type.struct', { link = '@type' })
+h('@lsp.type.type', { link = '@type' })
+h('@lsp.type.typeParameter', { link = '@type.definition' })
+h('@lsp.type.variable', { link = '@variable' })
+
+-- LSP Modifiers
+h('@lsp.mod.abstract', {})
+h('@lsp.mod.async', {})
+h('@lsp.mod.declaration', {})
+h('@lsp.mod.defaultLibrary', {})
+h('@lsp.mod.definition', {})
+h('@lsp.mod.deprecated', { link = 'DiagnosticDeprecated' })
+h('@lsp.mod.documentation', {})
+h('@lsp.mod.modification', {})
+h('@lsp.mod.readonly', {})
+h('@lsp.mod.static', {})
+
+-- =============================================================================
+-- 8. Diagnostics - Semantic Consistency (Schloss 2023)
+-- =============================================================================
+
+h('DiagnosticError', { fg = colors.red })
+h('DiagnosticWarn', { fg = colors.yellow })
+h('DiagnosticInfo', { fg = colors.blue })
+h('DiagnosticHint', { fg = colors.cyan })
+
+h('DiagnosticVirtualTextError', { bg = blend(colors.red, 0.4) })
+h('DiagnosticVirtualTextWarn', { bg = blend(colors.yellow, 0.4) })
+h('DiagnosticVirtualTextInfo', { bg = blend(colors.blue, 0.4) })
+h('DiagnosticVirtualTextHint', { bg = blend(colors.cyan, 0.4) })
+
+h('DiagnosticPrefixError', { fg = colors.red, bg = blend(colors.red, 0.25) })
+h('DiagnosticPrefixWarn', { fg = colors.yellow, bg = blend(colors.yellow, 0.25) })
+h('DiagnosticPrefixInfo', { fg = colors.blue, bg = blend(colors.blue, 0.25) })
+h('DiagnosticPrefixHint', { fg = colors.cyan, bg = blend(colors.cyan, 0.25) })
+
+h('DiagnosticUnderlineError', { undercurl = true, sp = colors.red })
+h('DiagnosticUnderlineWarn', { undercurl = true, sp = colors.yellow })
+h('DiagnosticUnderlineInfo', { undercurl = true, sp = colors.blue })
+h('DiagnosticUnderlineHint', { undercurl = true, sp = colors.cyan })
+h('YankHighlight', { fg = colors.bg, bg = colors.fg })
+
+-- =============================================================================
+-- 9. LSP & Other Plugin Support
+-- =============================================================================
+
+h('LspReferenceText', { bg = colors.selection_bg })
+h('LspReferenceRead', { bg = colors.selection_bg })
+h('LspReferenceWrite', { bg = colors.selection_bg })
+h('LspReferenceTarget', { link = 'LspReferenceText' })
+h('LspInlayHint', { link = 'NonText' })
+h('LspCodeLens', { link = 'NonText' })
+h('LspCodeLensSeparator', { link = 'NonText' })
+h('LspSignatureActiveParameter', { link = 'LspReferenceText' })
+
+-- Indentmini
+h('IndentLine', { link = 'Comment' })
+h('IndentLineCurrent', { link = 'Comment' })
+
+-- GitSigns
+h('GitSignsAdd', { fg = colors.green })
+h('GitSignsChange', { fg = colors.orange })
+h('GitSignsDelete', { fg = colors.red })
+
+-- Dashboard
+h('DashboardHeader', { fg = colors.green })
diff --git a/nvim/dot-config/nvim-final/init.lua b/nvim/dot-config/nvim-final/init.lua
new file mode 100644
index 0000000..54dee05
--- /dev/null
+++ b/nvim/dot-config/nvim-final/init.lua
@@ -0,0 +1,713 @@
+vim.loader.enable(true)
+
+vim.pack.add({
+ "https://github.com/nvim-treesitter/nvim-treesitter",
+}, { confirm = false })
+
+vim.pack.add({
+ "https://github.com/zenbones-theme/zenbones.nvim",
+}, { load = false })
+
+require("mo.zen").setup("seoulbones")
+
+require("vim._extui").enable({})
+vim.cmd([[ packadd! nvim.undotree ]])
+
+vim.cmd([[
+nnoremap <expr> [e '<Cmd>.move --' . v:count1 . '<CR>'
+nnoremap <expr> ]e '<Cmd>.move +' . v:count1 . '<CR>'
+xnoremap <expr> [e ':move --' . v:count1 . '<CR>gv'
+xnoremap <expr> ]e ':move +' . (v:count1 + line('''>') - line('''<')) . '<CR>gv'
+
+function! Sort(type, ...) abort
+ '[,']sort
+ call setpos('.', getpos("''"))
+endfunction
+nnoremap gs m'<Cmd>set operatorfunc=Sort<CR>g@
+xnoremap gs :sort<CR>
+]])
+
+vim.keymap.set("n", "gK", "K")
+
+vim.o.breakindent = true
+-- Every wrapped line will continue visually indented (same amount of
+-- space as the beginning of that line), thus preserving horizontal
+-- blocks of text.
+
+vim.o.cinoptions = "l1,:0,g0,E-s,N-s,t0,(s,J1,j1"
+-- The 'cinoptions' affect the way 'cindent' reindents lines in a C
+-- program.
+
+vim.o.colorcolumn = "+1"
+-- 'colorcolumn' is a comma-separated list of screen columns that are
+-- highlighted with ColorColumn |hl-ColorColumn|. Useful to align
+-- text. Will make screen redrawing slower.
+-- The screen column can be an absolute number, or a number preceded with
+-- '+' or '-', which is added to or subtracted from 'textwidth'.
+-- When 'textwidth' is zero then the items with '-' and '+' are not used.
+
+vim.o.completeopt = "menu,menuone,preview,noselect,fuzzy"
+-- 'completeopt' 'cot' string (default "menu,popup")
+-- global or local to buffer |global-local|
+-- A comma-separated list of options for Insert mode completion
+-- |ins-completion|. The supported values are:
+--
+-- fuzzy Enable |fuzzy-matching| for completion candidates. This
+-- allows for more flexible and intuitive matching, where
+-- characters can be skipped and matches can be found even
+-- if the exact sequence is not typed.
+--
+-- longest
+-- When 'autocomplete' is not active, only the longest common
+-- prefix of the matches is inserted. If the popup menu is
+-- displayed, you can use CTRL-L to add more characters.
+-- Whether case is ignored depends on the type of completion.
+-- For buffer text the 'ignorecase' option applies.
+--
+-- When 'autocomplete' is active and no completion item is
+-- selected, the longest common prefix of the matches is
+-- inserted after the cursor. The prefix is taken either
+-- from all displayed items or only from items in the current
+-- buffer. The inserted text is highlighted with
+-- |hl-PreInsert|, and the cursor position does not change
+-- (similar to `"preinsert"`). Press CTRL-Y to accept.
+-- See also |preinserted()|.
+--
+-- menu Use a popup menu to show the possible completions. The
+-- menu is only shown when there is more than one match and
+-- sufficient colors are available. |ins-completion-menu|
+--
+-- menuone Use the popup menu also when there is only one match.
+-- Useful when there is additional information about the
+-- match, e.g., what file it comes from.
+--
+-- nearest Matches are listed based on their proximity to the cursor
+-- position, unlike the default behavior, which only
+-- considers proximity for matches appearing below the
+-- cursor. This applies only to matches from the current
+-- buffer. No effect if "fuzzy" is present.
+--
+-- noinsert Do not insert any text for a match until the user selects
+-- a match from the menu. Only works in combination with
+-- "menu" or "menuone". No effect if "longest" is present.
+--
+-- noselect Same as "noinsert", except that no menu item is
+-- pre-selected. If both "noinsert" and "noselect" are
+-- present, "noselect" takes precedence. This is enabled
+-- automatically when 'autocomplete' is on, unless
+-- "preinsert" is also enabled.
+--
+-- nosort Disable sorting of completion candidates based on fuzzy
+-- scores when "fuzzy" is enabled. Candidates will appear
+-- in their original order.
+--
+-- popup Show extra information about the currently selected
+-- completion in a popup window. Only works in combination
+-- with "menu" or "menuone". Overrides "preview".
+--
+-- preinsert
+-- Inserts the text of the first completion candidate beyond
+-- the current leader, highlighted with |hl-PreInsert|.
+-- The cursor does not move.
+-- Requires "fuzzy" to be unset, and either "menuone" in
+-- 'completeopt' or 'autocomplete' enabled. When
+-- 'autocomplete' is enabled, this does not work if
+-- 'ignorecase' is set without 'infercase'.
+-- See also |preinserted()|.
+--
+-- preview Show extra information about the currently selected
+-- completion in the preview window. Only works in
+-- combination with "menu" or "menuone".
+--
+-- Only "fuzzy", "longest", "popup", "preinsert" and "preview" have an
+-- effect when 'autocomplete' is enabled.
+--
+-- This option does not apply to |cmdline-completion|. See 'wildoptions'
+-- for that.
+vim.opt.cpoptions:remove("~")
+-- 'cpoptions' 'cpo' string (default "aABceFs_")
+-- global
+-- A sequence of single character flags. When a character is present
+-- this indicates Vi-compatible behavior. This is used for things where
+-- not being Vi-compatible is mostly or sometimes preferred.
+-- 'cpoptions' stands for "compatible-options".
+-- Commas can be added for readability.
+-- To avoid problems with flags that are added in the future, use the
+-- "+=" and "-=" feature of ":set" |add-option-flags|.
+vim.o.cursorline = true
+vim.o.cursorlineopt = "number"
+vim.o.foldlevelstart = 99
+-- 'foldlevelstart' 'fdls' number (default -1)
+-- global
+-- Sets 'foldlevel' when starting to edit another buffer in a window.
+-- Useful to always start editing with all folds closed (value zero),
+-- some folds closed (one) or no folds closed (99).
+-- This is done before reading any modeline, thus a setting in a modeline
+-- overrules this option. Starting to edit a file for |diff-mode| also
+-- ignores this option and closes all folds.
+-- It is also done before BufReadPre autocommands, to allow an autocmd to
+-- overrule the 'foldlevel' value for specific files.
+-- When the value is negative, it is not used.
+vim.o.foldtext = ""
+-- 'foldtext' 'fdt' string (default "foldtext()")
+-- local to window
+-- An expression which is used to specify the text displayed for a closed
+-- fold. The context is set to the script where 'foldexpr' was set,
+-- script-local items can be accessed. See |fold-foldtext| for the
+-- usage.
+--
+-- The expression will be evaluated in the |sandbox| if set from a
+-- modeline, see |sandbox-option|.
+-- This option cannot be set in a modeline when 'modelineexpr' is off.
+--
+-- It is not allowed to change text or jump to another window while
+-- evaluating 'foldtext' |textlock|.
+--
+-- When set to an empty string, foldtext is disabled, and the line
+-- is displayed normally with highlighting and no line wrapping.
+vim.o.ignorecase = true
+-- 'ignorecase' 'ic' boolean (default off)
+-- global
+-- Ignore case in search patterns, |cmdline-completion|, when
+-- searching in the tags file, |expr-==| and for Insert-mode completion
+-- |ins-completion|.
+-- Also see 'smartcase' and 'tagcase'.
+-- Can be overruled by using "\c" or "\C" in the pattern, see
+-- |/ignorecase|.
+vim.o.smartcase = true
+-- Override the 'ignorecase' option if the search pattern contains upper
+-- case characters. Only used when the search pattern is typed and
+-- 'ignorecase' option is on. Used for the commands "/", "?", "n", "N",
+-- ":g" and ":s" and when filtering matches for the completion menu
+-- |compl-states|.
+-- Not used for "*", "#", "gd", tag search, etc. After "*" and "#" you
+-- can make 'smartcase' used by doing a "/" command, recalling the search
+-- pattern from history and hitting <Enter>.
+vim.o.jumpoptions = "view,clean"
+-- 'jumpoptions' 'jop' string (default "clean")
+-- global
+-- List of words that change the behavior of the |jumplist|.
+-- stack Make the jumplist behave like the tagstack.
+-- Relative location of entries in the jumplist is
+-- preserved at the cost of discarding subsequent entries
+-- when navigating backwards in the jumplist and then
+-- jumping to a location. |jumplist-stack|
+--
+-- view When moving through the jumplist, |changelist|,
+-- |alternate-file|, using |mark-motions| or when popping
+-- the |tagstack| try to restore the |mark-view| in which
+-- the action occurred.
+--
+-- clean Remove unloaded buffers from the jumplist.
+-- EXPERIMENTAL: this flag may change in the future.
+vim.o.linebreak = true
+-- 'linebreak' 'lbr' boolean (default off)
+-- local to window
+-- If on, Vim will wrap long lines at a character in 'breakat' rather
+-- than at the last character that fits on the screen. Unlike
+-- 'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
+-- it only affects the way the file is displayed, not its contents.
+-- If 'breakindent' is set, line is visually indented. Then, the value
+-- of 'showbreak' is used to put in front of wrapped lines. This option
+-- is not used when the 'wrap' option is off.
+-- Note that <Tab> characters after an <EOL> are mostly not displayed
+-- with the right amount of white space.
+vim.o.list = true
+-- 'list' boolean (default off)
+-- local to window
+-- List mode: By default, show tabs as ">", trailing spaces as "-", and
+-- non-breakable space characters as "+". Useful to see the difference
+-- between tabs and spaces and for trailing blanks. Further changed by
+-- the 'listchars' option.
+--
+-- When 'listchars' does not contain "tab" field, tabs are shown as "^I"
+-- or "<09>", like how unprintable characters are displayed.
+--
+-- The cursor is displayed at the start of the space a Tab character
+-- occupies, not at the end as usual in Normal mode. To get this cursor
+-- position while displaying Tabs with spaces, use: >vim
+-- set list lcs=tab:\ \
+-- <
+-- Note that list mode will also affect formatting (set with 'textwidth'
+-- or 'wrapmargin') when 'cpoptions' includes 'L'. See 'listchars' for
+-- changing the way tabs are displayed.
+vim.opt.listchars:append("precedes:<", "extends:>")
+-- 'listchars' 'lcs' string (default "tab:> ,trail:-,nbsp:+")
+-- global or local to window |global-local|
+-- Strings to use in 'list' mode and for the |:list| command. It is a
+-- comma-separated list of string settings. *E1511*
+--
+-- *lcs-eol*
+-- eol:c Character to show at the end of each line. When
+-- omitted, there is no extra character at the end of the
+-- line.
+-- *lcs-tab*
+-- tab:xy[z] Two or three characters to be used to show a tab.
+-- The third character is optional.
+--
+-- tab:xy The 'x' is always used, then 'y' as many times as will
+-- fit. Thus "tab:>-" displays: >
+-- >
+-- >-
+-- >--
+-- etc.
+-- <
+-- tab:xyz The 'z' is always used, then 'x' is prepended, and
+-- then 'y' is used as many times as will fit. Thus
+-- "tab:<->" displays: >
+-- >
+-- <>
+-- <->
+-- <-->
+-- etc.
+-- <
+-- When "tab:" is omitted, a tab is shown as ^I.
+-- *lcs-space*
+-- space:c Character to show for a space. When omitted, spaces
+-- are left blank.
+-- *lcs-multispace*
+-- multispace:c...
+-- One or more characters to use cyclically to show for
+-- multiple consecutive spaces. Overrides the "space"
+-- setting, except for single spaces. When omitted, the
+-- "space" setting is used. For example,
+-- `:set listchars=multispace:---+` shows ten consecutive
+-- spaces as: >
+-- ---+---+--
+-- <
+-- *lcs-lead*
+-- lead:c Character to show for leading spaces. When omitted,
+-- leading spaces are blank. Overrides the "space" and
+-- "multispace" settings for leading spaces. You can
+-- combine it with "tab:", for example: >vim
+-- set listchars+=tab:>-,lead:.
+-- <
+-- *lcs-leadmultispace*
+-- leadmultispace:c...
+-- Like the |lcs-multispace| value, but for leading
+-- spaces only. Also overrides |lcs-lead| for leading
+-- multiple spaces.
+-- `:set listchars=leadmultispace:---+` shows ten
+-- consecutive leading spaces as: >
+-- ---+---+--XXX
+-- <
+-- Where "XXX" denotes the first non-blank characters in
+-- the line.
+-- *lcs-trail*
+-- trail:c Character to show for trailing spaces. When omitted,
+-- trailing spaces are blank. Overrides the "space" and
+-- "multispace" settings for trailing spaces.
+-- *lcs-extends*
+-- extends:c Character to show in the last column, when 'wrap' is
+-- off and the line continues beyond the right of the
+-- screen.
+-- *lcs-precedes*
+-- precedes:c Character to show in the first visible column of the
+-- physical line, when there is text preceding the
+-- character visible in the first column.
+-- *lcs-conceal*
+-- conceal:c Character to show in place of concealed text, when
+-- 'conceallevel' is set to 1. A space when omitted.
+-- *lcs-nbsp*
+-- nbsp:c Character to show for a non-breakable space character
+-- (0xA0 (160 decimal) and U+202F). Left blank when
+-- omitted.
+--
+-- The characters ':' and ',' should not be used. UTF-8 characters can
+-- be used. All characters must be single width. *E1512*
+--
+-- Each character can be specified as hex: >vim
+-- set listchars=eol:\\x24
+-- set listchars=eol:\\u21b5
+-- set listchars=eol:\\U000021b5
+-- < Note that a double backslash is used. The number of hex characters
+-- must be exactly 2 for \\x, 4 for \\u and 8 for \\U.
+--
+-- Examples: >vim
+-- set lcs=tab:>-,trail:-
+-- set lcs=tab:>-,eol:<,nbsp:%
+-- set lcs=extends:>,precedes:<
+-- < |hl-NonText| highlighting will be used for "eol", "extends" and
+-- "precedes". |hl-Whitespace| for "nbsp", "space", "tab", "multispace",
+-- "lead" and "trail".
+vim.o.number = true
+vim.o.pumheight = 10
+-- 'pumheight' 'ph' number (default 0)
+-- global
+-- Maximum number of items to show in the popup menu
+-- (|ins-completion-menu|). Zero means "use available screen space".
+vim.o.scrolloff = 2
+-- 'scrolloff' 'so' number (default 0)
+-- global or local to window |global-local|
+-- Minimal number of screen lines to keep above and below the cursor.
+-- This will make some context visible around where you are working. If
+-- you set it to a very large value (999) the cursor line will always be
+-- in the middle of the window (except at the start or end of the file or
+-- when long lines wrap).
+-- After using the local value, go back the global value with one of
+-- these two: >vim
+-- setlocal scrolloff<
+-- setlocal scrolloff=-1
+-- < For scrolling horizontally see 'sidescrolloff'.
+vim.o.shada =
+ "'100,<50,s10,:100,/100,h,r/tmp/,r/private/,rfugitive:,rzipfile:,rterm:"
+-- 'shada' 'sd' string (default for
+-- Win32: !,'100,<50,s10,h,rA:,rB:
+-- others: !,'100,<50,s10,h)
+-- global
+-- When non-empty, the shada file is read upon startup and written
+-- when exiting Vim (see |shada-file|). The string should be a comma-
+-- separated list of parameters, each consisting of a single character
+-- identifying the particular parameter, followed by a number or string
+-- which specifies the value of that parameter. If a particular
+-- character is left out, then the default value is used for that
+-- parameter. The following is a list of the identifying characters and
+-- the effect of their value.
+-- CHAR VALUE ~
+-- *shada-!*
+-- ! When included, save and restore global variables that start
+-- with an uppercase letter, and don't contain a lowercase
+-- letter. Thus "KEEPTHIS and "K_L_M" are stored, but "KeepThis"
+-- and "_K_L_M" are not. Nested List and Dict items may not be
+-- read back correctly, you end up with an empty item.
+-- *shada-quote*
+-- " Maximum number of lines saved for each register. Old name of
+-- the '<' item, with the disadvantage that you need to put a
+-- backslash before the ", otherwise it will be recognized as the
+-- start of a comment!
+-- *shada-%*
+-- % When included, save and restore the buffer list. If Vim is
+-- started with a file name argument, the buffer list is not
+-- restored. If Vim is started without a file name argument, the
+-- buffer list is restored from the shada file. Quickfix
+-- ('buftype'), unlisted ('buflisted'), unnamed and buffers on
+-- removable media (|shada-r|) are not saved.
+-- When followed by a number, the number specifies the maximum
+-- number of buffers that are stored. Without a number all
+-- buffers are stored.
+-- *shada-'*
+-- ' Maximum number of previously edited files for which the marks
+-- are remembered. This parameter must always be included when
+-- 'shada' is non-empty.
+-- If non-zero, then the |jumplist| and the |changelist| are also
+-- stored in the shada file.
+-- *shada-/*
+-- / Maximum number of items in the search pattern history to be
+-- saved. If non-zero, then the previous search and substitute
+-- patterns are also saved. When not included, the value of
+-- 'history' is used.
+-- *shada-:*
+-- : Maximum number of items in the command-line history to be
+-- saved. When not included, the value of 'history' is used.
+-- *shada-<*
+-- < Maximum number of lines saved for each register. If zero then
+-- registers are not saved. When not included, all lines are
+-- saved. '"' is the old name for this item.
+-- Also see the 's' item below: limit specified in KiB.
+-- *shada-@*
+-- @ Maximum number of items in the input-line history to be
+-- saved. When not included, the value of 'history' is used.
+-- *shada-c*
+-- c Dummy option, kept for compatibility reasons. Has no actual
+-- effect: ShaDa always uses UTF-8 and 'encoding' value is fixed
+-- to UTF-8 as well.
+-- *shada-f*
+-- f Whether file marks need to be stored. If zero, file marks ('0
+-- to '9, 'A to 'Z) are not stored. When not present or when
+-- non-zero, they are all stored. '0 is used for the current
+-- cursor position (when exiting or when doing |:wshada|).
+-- *shada-h*
+-- h Disable the effect of 'hlsearch' when loading the shada
+-- file. When not included, it depends on whether ":nohlsearch"
+-- has been used since the last search command.
+-- *shada-n*
+-- n Name of the shada file. The name must immediately follow
+-- the 'n'. Must be at the end of the option! If the
+-- 'shadafile' option is set, that file name overrides the one
+-- given here with 'shada'. Environment variables are
+-- expanded when opening the file, not when setting the option.
+-- *shada-r*
+-- r Removable media. The argument is a string (up to the next
+-- ','). This parameter can be given several times. Each
+-- specifies the start of a path for which no marks will be
+-- stored. This is to avoid removable media. For Windows you
+-- could use "ra:,rb:". You can also use it for temp files,
+-- e.g., for Unix: "r/tmp". Case is ignored.
+-- *shada-s*
+-- s Maximum size of an item contents in KiB. If zero then nothing
+-- is saved. Unlike Vim this applies to all items, except for
+-- the buffer list and header. Full item size is off by three
+-- unsigned integers: with `s10` maximum item size may be 1 byte
+-- (type: 7-bit integer) + 9 bytes (timestamp: up to 64-bit
+-- integer) + 3 bytes (item size: up to 16-bit integer because
+-- 2^8 < 10240 < 2^16) + 10240 bytes (requested maximum item
+-- contents size) = 10253 bytes.
+--
+-- Example: >vim
+-- set shada='50,<1000,s100,:0,n~/nvim/shada
+-- <
+-- '50 Marks will be remembered for the last 50 files you
+-- edited.
+-- <1000 Contents of registers (up to 1000 lines each) will be
+-- remembered.
+-- s100 Items with contents occupying more then 100 KiB are
+-- skipped.
+-- :0 Command-line history will not be saved.
+-- n~/nvim/shada The name of the file to use is "~/nvim/shada".
+-- no / Since '/' is not specified, the default will be used,
+-- that is, save all of the search history, and also the
+-- previous search and substitute patterns.
+-- no % The buffer list will not be saved nor read back.
+-- no h 'hlsearch' highlighting will be restored.
+--
+-- When setting 'shada' from an empty value you can use |:rshada| to
+-- load the contents of the file, this is not done automatically.
+--
+-- This option cannot be set from a |modeline| or in the |sandbox|, for
+-- security reasons.
+vim.o.sidescrolloff = 5
+-- 'sidescrolloff' 'siso' number (default 0)
+-- global or local to window |global-local|
+-- The minimal number of screen columns to keep to the left and to the
+-- right of the cursor if 'nowrap' is set. Setting this option to a
+-- value greater than 0 while having 'sidescroll' also at a non-zero
+-- value makes some context visible in the line you are scrolling in
+-- horizontally (except at beginning of the line). Setting this option
+-- to a large value (like 999) has the effect of keeping the cursor
+-- horizontally centered in the window, as long as one does not come too
+-- close to the beginning of the line.
+-- After using the local value, go back the global value with one of
+-- these two: >vim
+-- setlocal sidescrolloff<
+-- setlocal sidescrolloff=-1
+-- <
+-- Example: Try this together with 'sidescroll' and 'listchars' as in the
+-- following example to never allow the cursor to move onto the
+-- "extends" character: >vim
+--
+-- set nowrap sidescroll=1 listchars=extends:>,precedes:<
+-- set sidescrolloff=1
+-- <
+vim.o.smartcase = true
+-- 'smartcase' 'scs' boolean (default off)
+-- global
+-- Override the 'ignorecase' option if the search pattern contains upper
+-- case characters. Only used when the search pattern is typed and
+-- 'ignorecase' option is on. Used for the commands "/", "?", "n", "N",
+-- ":g" and ":s" and when filtering matches for the completion menu
+-- |compl-states|.
+-- Not used for "*", "#", "gd", tag search, etc. After "*" and "#" you
+-- can make 'smartcase' used by doing a "/" command, recalling the search
+-- pattern from history and hitting <Enter>.
+vim.o.smoothscroll = true
+-- 'smoothscroll' 'sms' boolean (default off)
+-- local to window
+-- Scrolling works with screen lines. When 'wrap' is set and the first
+-- line in the window wraps part of it may not be visible, as if it is
+-- above the window. "<<<" is displayed at the start of the first line,
+-- highlighted with |hl-NonText|.
+-- You may also want to add "lastline" to the 'display' option to show as
+-- much of the last line as possible.
+-- NOTE: partly implemented, doesn't work yet for |gj| and |gk|.
+vim.o.splitright = true
+-- 'splitright' 'spr' boolean (default off)
+-- global
+-- When on, splitting a window will put the new window right of the
+-- current one. |:vsplit|
+vim.o.statuscolumn = "%s%=%l%{%&nu||&rnu?'%#WinSeparator#│':''%}"
+-- 'statuscolumn' 'stc' string (default "")
+-- local to window
+-- When non-empty, this option determines the content of the area to the
+-- side of a window, normally containing the fold, sign and number columns.
+-- The format of this option is like that of 'statusline'.
+--
+-- Some of the items from the 'statusline' format are different for
+-- 'statuscolumn':
+--
+-- %l line number column for currently drawn line
+-- %s sign column for currently drawn line
+-- %C fold column for currently drawn line
+--
+-- The 'statuscolumn' width follows that of the default columns and
+-- adapts to the 'numberwidth', 'signcolumn' and 'foldcolumn' option values
+-- (regardless of whether the sign and fold items are present).
+-- Additionally, the 'statuscolumn' grows with the size of the evaluated
+-- format string, up to a point (following the maximum size of the default
+-- fold, sign and number columns). Shrinking only happens when the number
+-- of lines in a buffer changes, or the 'statuscolumn' option is set.
+--
+-- The |v:lnum| variable holds the line number to be drawn.
+-- The |v:relnum| variable holds the relative line number to be drawn.
+-- The |v:virtnum| variable is negative when drawing virtual lines, zero
+-- when drawing the actual buffer line, and positive when
+-- drawing the wrapped part of a buffer line.
+--
+-- When using |v:relnum|, keep in mind that cursor movement by itself will
+-- not cause the 'statuscolumn' to update unless 'relativenumber' is set.
+--
+-- NOTE: The %@ click execute function item is supported as well but the
+-- specified function will be the same for each row in the same column.
+-- It cannot be switched out through a dynamic 'statuscolumn' format, the
+-- handler should be written with this in mind.
+--
+-- Examples: >vim
+-- " Line number with bar separator and click handlers:
+-- set statuscolumn=%@SignCb@%s%=%T%@NumCb@%l│%T
+--
+-- " Line numbers in hexadecimal for non wrapped part of lines:
+-- let &stc='%=%{v:virtnum>0?"":printf("%x",v:lnum)} '
+--
+-- " Human readable line numbers with thousands separator:
+-- let &stc='%{substitute(v:lnum,"\\d\\zs\\ze\\'
+-- . '%(\\d\\d\\d\\)\\+$",",","g")}'
+--
+-- " Both relative and absolute line numbers with different
+-- " highlighting for odd and even relative numbers:
+-- let &stc='%#NonText#%{&nu?v:lnum:""}' .
+-- '%=%{&rnu&&(v:lnum%2)?"\ ".v:relnum:""}' .
+-- '%#LineNr#%{&rnu&&!(v:lnum%2)?"\ ".v:relnum:""}'
+--
+-- < WARNING: this expression is evaluated for each screen line so defining
+-- an expensive expression can negatively affect render performance.
+--
+vim.o.tagcase = "match"
+-- 'tagcase' 'tc' string (default "followic")
+-- global or local to buffer |global-local|
+-- This option specifies how case is handled when searching the tags
+-- file:
+-- followic Follow the 'ignorecase' option
+-- followscs Follow the 'smartcase' and 'ignorecase' options
+-- ignore Ignore case
+-- match Match case
+-- smart Ignore case unless an upper case letter is used
+vim.o.title = true
+-- 'title' boolean (default off)
+-- global
+-- When on, the title of the window will be set to the value of
+-- 'titlestring' (if it is not empty), or to:
+-- filename [+=-] (path) - Nvim
+-- Where:
+-- filename the name of the file being edited
+-- - indicates the file cannot be modified, 'ma' off
+-- + indicates the file was modified
+-- = indicates the file is read-only
+-- =+ indicates the file is read-only and modified
+-- (path) is the path of the file being edited
+-- - Nvim the server name |v:servername| or "Nvim"
+vim.o.undofile = true
+-- 'undofile' 'udf' boolean (default off)
+-- local to buffer
+-- When on, Vim automatically saves undo history to an undo file when
+-- writing a buffer to a file, and restores undo history from the same
+-- file on buffer read.
+-- The directory where the undo file is stored is specified by 'undodir'.
+-- For more information about this feature see |undo-persistence|.
+-- The undo file is not read when 'undoreload' causes the buffer from
+-- before a reload to be saved for undo.
+-- When 'undofile' is turned off the undo file is NOT deleted.
+vim.o.updatetime = 250
+-- 'updatetime' 'ut' number (default 4000)
+-- global
+-- If this many milliseconds nothing is typed the swap file will be
+-- written to disk (see |crash-recovery|). Also used for the
+-- |CursorHold| autocommand event.
+vim.opt.wildignore:append({ "*.pyc", "__pycache__", "*~", "#*#", "*.o" })
+-- 'wildignore' 'wig' string (default "")
+-- global
+-- A list of file patterns. A file that matches with one of these
+-- patterns is ignored when expanding |wildcards|, completing file or
+-- directory names, and influences the result of |expand()|, |glob()| and
+-- |globpath()| unless a flag is passed to disable this.
+-- The pattern is used like with |:autocmd|, see |autocmd-pattern|.
+-- Also see 'suffixes'.
+-- Example: >vim
+-- set wildignore=*.o,*.obj
+-- < The use of |:set+=| and |:set-=| is preferred when adding or removing
+-- a pattern from the list. This avoids problems when a future version
+-- uses another default.
+vim.o.wildignorecase = true
+-- 'wildignorecase' 'wic' boolean (default off)
+-- global
+-- When set case is ignored when completing file names and directories.
+-- Has no effect when 'fileignorecase' is set.
+-- Does not apply when the shell is used to expand wildcards, which
+-- happens when there are special characters.
+vim.o.wildmode = "longest:full,full"
+-- 'wildmode' 'wim' string (default "full")
+-- global
+-- Completion mode used for the character specified with 'wildchar'.
+-- This option is a comma-separated list of up to four parts,
+-- corresponding to the first, second, third, and fourth presses of
+-- 'wildchar'. Each part is a colon-separated list of completion
+-- behaviors, which are applied simultaneously during that phase.
+--
+-- The possible behavior values are:
+-- "" Only complete (insert) the first match. No further
+-- matches are cycled or listed.
+-- "full" Complete the next full match. Cycles through all
+-- matches, returning to the original input after the
+-- last match. If 'wildmenu' is enabled, it will be
+-- shown.
+-- "longest" Complete to the longest common substring. If this
+-- doesn't extend the input, the next 'wildmode' part is
+-- used.
+-- "list" If multiple matches are found, list all of them.
+-- "lastused" When completing buffer names, sort them by most
+-- recently used (excluding the current buffer). Only
+-- applies to buffer name completion.
+-- "noselect" If 'wildmenu' is enabled, show the menu but do not
+-- preselect the first item.
+-- If only one match exists, it is completed fully, unless "noselect" is
+-- specified.
+--
+-- Some useful combinations of colon-separated values:
+-- "longest:full" Start with the longest common string and show
+-- 'wildmenu' (if enabled). Does not cycle
+-- through full matches.
+-- "list:full" List all matches and complete first match.
+-- "list:longest" List all matches and complete till the longest
+-- common prefix.
+-- "list:lastused" List all matches. When completing buffers,
+-- sort them by most recently used (excluding the
+-- current buffer).
+-- "noselect:lastused" Do not preselect the first item in 'wildmenu'
+-- if it is active. When completing buffers,
+-- sort them by most recently used (excluding the
+-- current buffer).
+--
+-- Examples: >vim
+-- set wildmode=full
+-- < Complete full match on every press (default behavior) >vim
+-- set wildmode=longest,full
+-- < First press: longest common substring
+-- Second press: cycle through full matches >vim
+-- set wildmode=list:full
+-- < First press: list all matches and complete the first one >vim
+-- set wildmode=list,full
+-- < First press: list matches only
+-- Second press: complete full matches >vim
+-- set wildmode=longest,list
+-- < First press: longest common substring
+-- Second press: list all matches >vim
+-- set wildmode=noselect:full
+-- < First press: show 'wildmenu' without completing or selecting
+-- Second press: cycle full matches >vim
+-- set wildmode=noselect:lastused,full
+-- < Same as above, but buffer matches are sorted by time last used
+-- More info here: |cmdline-completion|.
+vim.o.winborder = "none"
+-- 'winborder' string (default "")
+-- global
+-- Defines the default border style of floating windows. The default value
+-- is empty, which is equivalent to "none". Valid values include:
+-- - "bold": Bold line box.
+-- - "double": Double-line box.
+-- - "none": No border.
+-- - "rounded": Like "single", but with rounded corners ("╭" etc.).
+-- - "shadow": Drop shadow effect, by blending with the background.
+-- - "single": Single-line box.
+-- - "solid": Adds padding by a single whitespace cell.
+-- - custom: comma-separated list of exactly 8 characters in clockwise
+-- order starting from topleft. Example: >lua
+-- vim.o.winborder='+,-,+,|,+,-,+,|'
+-- <
diff --git a/nvim/dot-config/nvim-final/lua/mo/zen.lua b/nvim/dot-config/nvim-final/lua/mo/zen.lua
new file mode 100644
index 0000000..eb674ba
--- /dev/null
+++ b/nvim/dot-config/nvim-final/lua/mo/zen.lua
@@ -0,0 +1,89 @@
+local M = {}
+M.themes = {
+ dark = {
+ "seoulbones",
+ "rosebones",
+ "forestbones",
+ "zenwritten",
+ },
+ light = {
+ "seoulbones",
+ "vimbones",
+ "rosebones",
+ "forestbones",
+ },
+}
+M.current = {
+ dark = 1,
+ light = 1,
+}
+M.bg = "dark"
+
+M.cycle = function()
+ M.current[M.bg] = M.current[M.bg] + 1
+ if M.current[M.bg] > #M.themes[M.bg] then M.current[M.bg] = 1 end
+ M.set()
+end
+
+M.set = function()
+ vim.o.background = M.bg
+ local theme = M.themes[M.bg][M.current[M.bg]]
+ vim.print("Switching to " .. theme)
+
+ vim.g[theme .. "_compat"] = 1
+ vim.cmd.colorscheme(theme)
+
+ -- make strings nonitalic
+ local str_highlight =
+ vim.api.nvim_get_hl(0, { name = "String", link = false })
+ vim.api.nvim_set_hl(
+ 0,
+ "String",
+ { fg = str_highlight.fg, italic = false, force = true }
+ )
+
+ -- make booleans nonitalic and bold
+ local bool_highlight =
+ vim.api.nvim_get_hl(0, { name = "Boolean", link = false })
+ vim.api.nvim_set_hl(
+ 0,
+ "Boolean",
+ { fg = bool_highlight.fg, italic = false, bold = true, force = true }
+ )
+
+ -- make normals in seoulbones darker
+ if theme == "seoulbones" and M.bg == "dark" then
+ local norm_highlight =
+ vim.api.nvim_get_hl(0, { name = "Normal", link = false })
+ vim.api.nvim_set_hl(
+ 0,
+ "Normal",
+ { fg = norm_highlight.fg, bg = "#313131", force = true }
+ )
+ end
+end
+
+M.togglebg = function()
+ M.bg = M.bg == "dark" and "light" or "dark"
+ M.set()
+end
+
+---@param theme string?
+---@param bg "dark"|"light"|nil
+M.setup = function(theme, bg)
+ vim.cmd("packadd zenbones.nvim")
+ if bg then M.bg = bg end
+ if theme then
+ for i, th in ipairs(M.themes[M.bg]) do
+ if th == theme then
+ M.current[M.bg] = i
+ break
+ end
+ end
+ end
+ M.set()
+ vim.keymap.set("n", "<F3>", M.cycle, {})
+ vim.keymap.set("n", "<F12>", M.togglebg, {})
+end
+
+return M
diff --git a/nvim/dot-config/nvim-final/nvim-pack-lock.json b/nvim/dot-config/nvim-final/nvim-pack-lock.json
new file mode 100644
index 0000000..506d313
--- /dev/null
+++ b/nvim/dot-config/nvim-final/nvim-pack-lock.json
@@ -0,0 +1,12 @@
+{
+ "plugins": {
+ "nvim-treesitter": {
+ "rev": "300b906a9514d5e0ce02911d371445382fe35a31",
+ "src": "https://github.com/nvim-treesitter/nvim-treesitter"
+ },
+ "zenbones.nvim": {
+ "rev": "4635a3f46d1066975d1074cd9f61f93cb1e32f64",
+ "src": "https://github.com/zenbones-theme/zenbones.nvim"
+ }
+ }
+} \ No newline at end of file
diff --git a/nvim/dot-config/nvim-final/plugin/autocommands.lua b/nvim/dot-config/nvim-final/plugin/autocommands.lua
new file mode 100644
index 0000000..b64ac07
--- /dev/null
+++ b/nvim/dot-config/nvim-final/plugin/autocommands.lua
@@ -0,0 +1,7 @@
+vim.api.nvim_create_autocmd("BufWritePre", {
+ pattern = "*",
+ callback = function(ev)
+ vim.cmd('execute "normal! mz" | keeppatterns %s/\\v\\s+$//e | normal `z')
+ end,
+ desc = "Strip whitespace from file"
+})
diff --git a/nvim/dot-config/nvim-final/stylua.toml b/nvim/dot-config/nvim-final/stylua.toml
new file mode 100644
index 0000000..4ac5841
--- /dev/null
+++ b/nvim/dot-config/nvim-final/stylua.toml
@@ -0,0 +1,12 @@
+call_parentheses = "Always"
+collapse_simple_statement = "Always"
+column_width = 80
+indent_type = "Spaces"
+indent_width = 4
+line_endings = "Unix"
+quote_style = "AutoPreferDouble"
+space_after_function_names = "Never"
+syntax = "LuaJIT"
+
+[sort_requires]
+enabled = true