diff options
| author | venomade <venomade@venomade.com> | 2026-02-16 17:31:16 +0000 |
|---|---|---|
| committer | venomade <venomade@venomade.com> | 2026-02-16 17:31:16 +0000 |
| commit | a568a964fd6a9efba388b2b4919339c0b7dfe51d (patch) | |
| tree | 0c6adbf753de1c0b469e911668a82c6b2002f5f8 /config | |
| parent | 9d2c3f898a97de16b986d4e494f31e6c6f3d176a (diff) | |
Asahi is just not perfectly usable yet. Moved stuff, went nix.
Diffstat (limited to 'config')
42 files changed, 3201 insertions, 0 deletions
diff --git a/config/bat/config b/config/bat/config new file mode 100644 index 0000000..2d65ccf --- /dev/null +++ b/config/bat/config @@ -0,0 +1 @@ +--theme="modus_vivendi" diff --git a/config/bat/themes/modus_vivendi.tmTheme b/config/bat/themes/modus_vivendi.tmTheme new file mode 100644 index 0000000..15d2429 --- /dev/null +++ b/config/bat/themes/modus_vivendi.tmTheme @@ -0,0 +1,439 @@ +<!-- Modus Themes for Bat --> +<!-- Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/bat.lua --> + +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>name</key> + <string>modus_vivendi</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#000000</string> + <key>caret</key> + <string>#989898</string> + <key>foreground</key> + <string>#ffffff</string> + <key>invisibles</key> + <string>#989898</string> + <key>lineHighlight</key> + <string>#2f3849</string> + <key>selection</key> + <string>#7030af</string> + <key>findHighlight</key> + <string>#7a6100</string> + <key>selectionBorder</key> + <string>#646464</string> + <key>gutterForeground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Ruby's @variable</string> + <key>scope</key> + <string>variable.other.readwrite.instance</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String interpolation</string> + <key>scope</key> + <string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#4f1119</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00381f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#363300</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#2fafff</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>message.error</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#ff7f9f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Structure</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.value.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00c06f</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>09CE9B40-0137-442C-8512-7CEAFC78C153</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>Modus Vivendi</string> + </dict> +</plist> diff --git a/config/eza/theme.yml b/config/eza/theme.yml new file mode 100644 index 0000000..f74a128 --- /dev/null +++ b/config/eza/theme.yml @@ -0,0 +1,147 @@ +# Modus Themes for eza +# Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/eza.lua +colourful: true + +# base colors +define: &bg_main "#000000" +define: &bg_dim = "#1e1e1e" +define: &bg_alt = "#0f0f0f" +define: &fg_main = "#ffffff" +define: &fg_dim = "#989898" +define: &fg_alt = "#c6daff" +define: &border = "#646464" +define: &border_highlight = "#C4C4C4" + +# foreground colors +define: &red "#ff5f59" +define: &red_warmer "#ff6b55" +define: &red_cooler "#ff7f9f" +define: &red_faint "#ff9580" +define: &green "#44bc44" +define: &green_warmer "#70b900" +define: &green_cooler "#00c06f" +define: &green_faint "#88ca9f" +define: &yellow "#d0bc00" +define: &yellow_warmer "#fec43f" +define: &yellow_cooler "#dfaf7a" +define: &yellow_faint "#d2b580" +define: &blue "#2fafff" +define: &blue_warmer "#79a8ff" +define: &blue_cooler "#00bcff" +define: &blue_faint "#82b0ec" +define: &magenta "#feacd0" +define: &magenta_warmer "#f78fe7" +define: &magenta_cooler "#b6a0ff" +define: &magenta_faint "#caa6df" +define: &cyan "#00d3d0" +define: &cyan_warmer "#4ae2f0" +define: &cyan_cooler "#6ae4b9" +define: &cyan_faint "#9ac8e0" +define: &rust "#db7b5f" +define: &gold "#c0965b" +define: &olive "#9cbd6f" +define: &slate "#76afbf" +define: &indigo "#9099d9" +define: &maroon "#cf7fa7" +define: &pink "#d09dc0" + +filekinds: + normal: {foreground: *fg_main} + directory: {foreground: *blue_warmer} + symlink: {foreground: *blue} + pipe: {foreground: *fg_dim} + block_device: {foreground: *magenta_cooler} + char_device: {foreground: *yellow_warmer} + socket: {foreground: *magenta} + special: {foreground: *pink} + executable: {foreground: *green} + mount_point: {foreground: *cyan} + +perms: + user_read: {foreground: *fg_dim} + user_write: {foreground: *red} + user_execute_file: {foreground: *green} + user_execute_other: {foreground: *green} + group_read: {foreground: *fg_dim} + group_write: {foreground: *red} + group_execute: {foreground: *green} + other_read: {foreground: *fg_dim} + other_write: {foreground: *red} + other_execute: {foreground: *green} + special_user_file: {foreground: *magenta_cooler} + special_other: {foreground: *red} + attribute: {foreground: *pink} + +size: + major: {foreground: *fg_dim} + minor: {foreground: *blue_warmer} + number_byte: {foreground: *pink} + number_kilo: {foreground: *rust} + number_mega: {foreground: *blue_warmer} + number_giga: {foreground: *magenta_cooler} + number_huge: {foreground: *magenta} + unit_byte: {foreground: *pink} + unit_kilo: {foreground: *rust} + unit_mega: {foreground: *blue_warmer} + unit_giga: {foreground: *magenta_cooler} + unit_huge: {foreground: *magenta} + +users: + user_you: {foreground: *yellow_warmer} + user_root: {foreground: *red} + user_other: {foreground: *magenta_cooler} + group_yours: {foreground: *pink} + group_other: {foreground: *fg_dim} + group_root: {foreground: *red} + +links: + normal: {foreground: *blue} + multi_link_file: {foreground: *cyan} + +git: + new: {foreground: *green} + modified: {foreground: *yellow_warmer} + deleted: {foreground: *red} + renamed: {foreground: *cyan} + typechange: {foreground: *magenta_cooler} + ignored: {foreground: *pink} + conflicted: {foreground: *magenta} + +git_repo: + branch_main: {foreground: *fg_dim} + branch_other: {foreground: *magenta_cooler} + git_clean: {foreground: *green} + git_dirty: {foreground: *red} + +security_context: + colon: {foreground: *fg_dim} + user: {foreground: *blue_warmer} + role: {foreground: *magenta_cooler} + typ: {foreground: *pink} + range: {foreground: *magenta_cooler} + +file_type: + image: {foreground: *yellow_warmer} + video: {foreground: *magenta} + music: {foreground: *blue_warmer} + lossless: {foreground: *cyan} + crypto: {foreground: *pink} + document: {foreground: *fg_dim} + compressed: {foreground: *magenta_cooler} + temp: {foreground: *yellow_warmer} + compiled: {foreground: *cyan} + build: {foreground: *pink} + source: {foreground: *green} + +punctuation: {foreground: *pink} +date: {foreground: *cyan} +inode: {foreground: *fg_dim} +blocks: {foreground: *pink} +header: {foreground: *fg_dim} +octal: {foreground: *blue_warmer} +flags: {foreground: *magenta_cooler} + +symlink_path: {foreground: *blue} +control_char: {foreground: *cyan} +broken_symlink: {foreground: *red} +broken_path_overlay: {foreground: *pink} diff --git a/config/lazygit/.gitignore b/config/lazygit/.gitignore new file mode 100644 index 0000000..ace2661 --- /dev/null +++ b/config/lazygit/.gitignore @@ -0,0 +1 @@ +state.yml diff --git a/config/lazygit/config.yml b/config/lazygit/config.yml new file mode 100644 index 0000000..0151f13 --- /dev/null +++ b/config/lazygit/config.yml @@ -0,0 +1,182 @@ +gui: + border: single + +keybinding: + universal: + quit: q + quit-alt1: <c-c> + suspendApp: <c-z> + return: <esc> + quitWithoutChangingDirectory: Q + togglePanel: <tab> + prevItem: <up> + nextItem: <down> + prevItem-alt: e + nextItem-alt: n + prevPage: ',' + nextPage: . + scrollLeft: H + scrollRight: I + gotoTop: < + gotoBottom: '>' + gotoTop-alt: <home> + gotoBottom-alt: <end> + toggleRangeSelect: v + rangeSelectDown: <s-down> + rangeSelectUp: <s-up> + prevBlock: <left> + nextBlock: <right> + prevBlock-alt: h + nextBlock-alt: i + nextBlock-alt2: <tab> + prevBlock-alt2: <backtab> + jumpToBlock: + - "1" + - "2" + - "3" + - "4" + - "5" + focusMainView: "0" + nextMatch: "k" + prevMatch: "K" + startSearch: / + optionMenu: <disabled> + optionMenu-alt1: '?' + select: <space> + goInto: <enter> + confirm: <enter> + confirmMenu: <enter> + confirmSuggestion: <enter> + confirmInEditor: <a-enter> + confirmInEditor-alt: <c-s> + remove: d + new: "n" + edit: j + openFile: o + scrollUpMain: <pgup> + scrollDownMain: <pgdown> + scrollUpMain-alt1: E + scrollDownMain-alt1: N + scrollUpMain-alt2: <c-u> + scrollDownMain-alt2: <c-d> + executeShellCommand: ':' + createRebaseOptionsMenu: m + + # 'Files' appended for legacy reasons + pushFiles: P + + # 'Files' appended for legacy reasons + pullFiles: p + refresh: R + createPatchOptionsMenu: <c-p> + nextTab: ']' + prevTab: '[' + nextScreenMode: + + prevScreenMode: _ + cyclePagers: '|' + undo: z + redo: Z + filteringMenu: <c-s> + diffingMenu: W + diffingMenu-alt: <c-j> + copyToClipboard: <c-o> + openRecentRepos: <c-r> + submitEditorText: <enter> + extrasMenu: '@' + toggleWhitespaceInDiffView: <c-w> + increaseContextInDiffView: '}' + decreaseContextInDiffView: '{' + increaseRenameSimilarityThreshold: ) + decreaseRenameSimilarityThreshold: ( + openDiffTool: <c-t> + status: + checkForUpdate: u + recentRepos: <enter> + allBranchesLogGraph: a + files: + commitChanges: c + commitChangesWithoutHook: w + amendLastCommit: A + commitChangesWithEditor: C + findBaseCommitForFixup: <c-f> + confirmDiscard: x + ignoreFile: l + refreshFiles: r + stashAllChanges: s + viewStashOptions: S + toggleStagedAll: a + viewResetOptions: D + fetch: f + toggleTreeView: '`' + openMergeOptions: M + openStatusFilter: <c-b> + copyFileInfoToClipboard: "y" + collapseAll: '-' + expandAll: = + branches: + createPullRequest: o + viewPullRequestOptions: O + copyPullRequestURL: <c-y> + checkoutBranchByName: c + forceCheckoutBranch: F + checkoutPreviousBranch: '-' + rebaseBranch: r + renameBranch: R + mergeIntoCurrentBranch: M + moveCommitsToNewBranch: "K" + viewGitFlowOptions: l + fastForward: f + createTag: T + pushTag: P + setUpstream: u + fetchRemote: f + addForkRemote: F + sortOrder: s + worktrees: + viewWorktreeOptions: w + commits: + squashDown: s + renameCommit: r + renameCommitWithEditor: R + viewResetOptions: g + markCommitAsFixup: f + setFixupMessage: c + createFixupCommit: F + squashAboveCommits: S + moveDownCommit: <c-n> + moveUpCommit: <c-e> + amendToCommit: A + resetCommitAuthor: a + pickCommit: p + revertCommit: t + cherryPickCopy: C + pasteCommits: V + markCommitAsBaseForRebase: B + tagCommit: T + checkoutCommit: <space> + resetCherryPick: <c-R> + copyCommitAttributeToClipboard: "y" + openLogMenu: <c-l> + openInBrowser: o + viewBisectOptions: b + startInteractiveRebase: l + selectCommitsOfCurrentBranch: '*' + amendAttribute: + resetAuthor: a + setAuthor: A + addCoAuthor: c + stash: + popStash: g + renameStash: r + commitFiles: + checkoutCommitFile: c + main: + toggleSelectHunk: a + pickBothHunks: b + editSelectHunk: J + submodules: + init: l + update: u + bulkMenu: b + commitMessage: + commitMenu: <c-o> diff --git a/config/nvim/.gitignore b/config/nvim/.gitignore new file mode 100644 index 0000000..e033bc6 --- /dev/null +++ b/config/nvim/.gitignore @@ -0,0 +1 @@ +lazy-lock.json diff --git a/config/nvim/.luarc.json b/config/nvim/.luarc.json new file mode 100644 index 0000000..bd8a14b --- /dev/null +++ b/config/nvim/.luarc.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", + "Lua.runtime.version": "LuaJIT", + "diagnostics.globals": ["vim"], + "workspace.checkThirdParty": false, + "workspace.library": [ + "$VIMRUNTIME" + ], + "Lua.diagnostics.enable": true, + "Lua.format.defaultConfig": { + "indent_style": "space", + "indent_size": "2" + }, + "typeFormat.config": false, + "completion.callSnippet": "Replace", + "completion.showWord": "Disable", + "completion.workspaceWord": false +} diff --git a/config/nvim/ftplugin/markdown.lua b/config/nvim/ftplugin/markdown.lua new file mode 100644 index 0000000..4f658e4 --- /dev/null +++ b/config/nvim/ftplugin/markdown.lua @@ -0,0 +1,10 @@ +vim.keymap.set('n', 'n', 'gj', { buffer = true, noremap = true }) +vim.keymap.set('n', 'e', 'gk', { buffer = true, noremap = true }) + +vim.opt_local.wrap = true +vim.opt_local.linebreak = true + +vim.opt_local.number = false +vim.opt_local.relativenumber = false + +vim.treesitter.start(vim.api.nvim_get_current_buf(), 'markdown') diff --git a/config/nvim/init.lua b/config/nvim/init.lua new file mode 100644 index 0000000..4b53a96 --- /dev/null +++ b/config/nvim/init.lua @@ -0,0 +1,10 @@ +-- Setup Config +require("config.colemak") +require("config.options") +require("config.keymaps") + +-- Setup Lazy Plugin Manager +require("manager") + +-- Test Script +require("scripts") diff --git a/config/nvim/lua/config/colemak.lua b/config/nvim/lua/config/colemak.lua new file mode 100644 index 0000000..e6ce33b --- /dev/null +++ b/config/nvim/lua/config/colemak.lua @@ -0,0 +1,32 @@ +local function map(mode, lhs, rhs, opts) + local options = { noremap = true, silent = true } + if opts then + options = vim.tbl_extend("force", options, opts) + end + vim.keymap.set(mode, lhs, rhs, options) +end + +map("", "n", "j") +map("", "e", "k") +map("", "i", "l") +map("", "j", "n") +map("", "k", "e") +map("", "l", "i") +map("", "K", "E") +map("", "N", "J") +map("", "E", "K") -- As in 'Explore' documentation +map("", "L", "I") +map("", "I", "L") +map("", "J", "N") + +map("n", "<c-w>h", "<c-w>h") +map("n", "<c-w>n", "<c-w>j") +map("n", "<c-w>e", "<c-w>k") +map("n", "<C-w>i", "<c-w>l") + +map ("", "gn", "gj") +map ("", "ge", "gk") + +-- Kakoune Holdover +map ("", "gh", "0") +map ("", "gi", "$") diff --git a/config/nvim/lua/config/keymaps.lua b/config/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..f30283e --- /dev/null +++ b/config/nvim/lua/config/keymaps.lua @@ -0,0 +1,53 @@ +vim.g.mapleader = " " +vim.keymap.set("n", "<leader>bk", vim.cmd.bdelete, + { desc = "Kill Buffer" }) +vim.keymap.set("n", "<leader>bn", vim.cmd.bnext, + { desc = "Next Buffer" }) +vim.keymap.set("n", "<leader>bp", vim.cmd.bprev, + { desc = "Previous Buffer" }) + +vim.keymap.set("n", "E", vim.lsp.buf.hover) +vim.keymap.set("n", "<C-e>", vim.diagnostic.open_float) +vim.keymap.set("n", "<leader>ld", vim.lsp.buf.definition, + { desc = "Go to Definition" }) +vim.keymap.set("n", "<leader>lt", vim.lsp.buf.type_definition, + { desc = "Go to Type Definition"} ) +vim.keymap.set("n", "<leader>li", vim.lsp.buf.implementation, + { desc = "Go to Implementation" }) +vim.keymap.set("n", "<leader>la", vim.lsp.buf.code_action, + { desc = "Show Code Actions" }) +vim.keymap.set("n", "<leader>lf", vim.lsp.buf.format, + { desc = "Format Document" }) +vim.keymap.set("n", "<leader>lr", vim.lsp.buf.rename, + { desc = "Rename" }) +vim.keymap.set("n", "<leader>le", function() + vim.diagnostic.jump({ count = 1, float = true }) +end, + { desc = "Next Error" }) +-- vim.keymap.set("n", "<leader>lh", vim.lsp.buf.hover, +-- { desc = "Hover Diagnostics" }) + +vim.keymap.set("n", "<leader>wh", vim.cmd.split, + { desc = "Split Window Horizontally" }) +vim.keymap.set("n", "<leader>wv", vim.cmd.vsplit, + { desc = "Split Window Vertically" }) +vim.keymap.set("n", "<leader>wc", "<C-w>q", + { desc = "Close Window" }) +vim.keymap.set("n", "<leader>ww", "<C-w>w", + { desc = "Next Window" }) + +vim.keymap.set("n", "<leader>foc", function() + vim.cmd('edit ~/.config/nvim/init.lua') +end, { desc = "Open Config File" }) + +vim.keymap.set("n", "<leader>fot", function() + vim.cmd('edit ~/Documents/TODO.org') +end, { desc = "Open Todo File" }) + +vim.keymap.set("n", "<leader>fon", function() + vim.cmd('edit ~/Documents/Notes.org') +end, { desc = "Open Notes File" }) + +vim.keymap.set('n', '<Tab>', '==', { noremap = true, silent = true }) + +vim.keymap.set('n', 'q:', ':q<CR>', { noremap = true }) diff --git a/config/nvim/lua/config/options.lua b/config/nvim/lua/config/options.lua new file mode 100644 index 0000000..ba0bb5a --- /dev/null +++ b/config/nvim/lua/config/options.lua @@ -0,0 +1,107 @@ +vim.opt.nu = true +vim.opt.rnu = true + +vim.opt.tabstop = 2 +vim.opt.softtabstop = 2 +vim.opt.shiftwidth = 2 +vim.opt.expandtab = true +vim.opt.autoindent = true + +vim.opt.smartindent = true + +vim.opt.wrap = false + +vim.opt.swapfile = false +vim.opt.backup = false +vim.opt.undodir = os.getenv("HOME") .. "/.nvim/undodir" +vim.opt.undofile = true + +vim.opt.hlsearch = false +vim.opt.incsearch = true + +vim.opt.termguicolors = true + +vim.opt.scrolloff = 12 + +vim.opt.updatetime = 50 + +vim.opt.splitbelow = true +vim.opt.splitright = true + +vim.opt.encoding = "utf-8" + +vim.opt.shell = "zsh" + +vim.opt.mouse = "a" + +vim.opt.ignorecase = true +vim.opt.smartcase = true +vim.opt.incsearch = true + +-- vim.opt.cursorline = true + +vim.opt.title = true + +vim.opt.clipboard = "unnamedplus" + +vim.opt.colorcolumn = "80" + +vim.opt.signcolumn = 'no' + +vim.cmd "set showtabline=0 | set laststatus=0" + +vim.wo.fillchars='eob: ' + +vim.opt.conceallevel = 3 + +-- Window Borders +vim.o.winborder = 'single' + +-- Remove Whitespaces on File Save +vim.api.nvim_create_autocmd({ "BufWritePre" }, { + pattern = { "*" }, + command = [[%s/\s\+$//e]], +}) + +-- Define highlight groups for line numbers with diagnostics +vim.api.nvim_set_hl(0, "LineNrDiagnosticError", { bg = "#3f1d1d", fg = "#ff6c6b" }) +vim.api.nvim_set_hl(0, "LineNrDiagnosticWarn", { bg = "#3f311d", fg = "#ECBE7B" }) +vim.api.nvim_set_hl(0, "LineNrDiagnosticInfo", { bg = "#1d2d3f", fg = "#51afef" }) +vim.api.nvim_set_hl(0, "LineNrDiagnosticHint", { bg = "#1d3f2d", fg = "#98be65" }) + +local function set_line_number_highlight() + -- Clear existing highlights + vim.fn.sign_unplace("LineNrDiagnostics") + + -- Get diagnostics per buffer + for _, diag in ipairs(vim.diagnostic.get(0)) do + local hl_group = nil + if diag.severity == vim.diagnostic.severity.ERROR then + hl_group = "LineNrDiagnosticError" + elseif diag.severity == vim.diagnostic.severity.WARN then + hl_group = "LineNrDiagnosticWarn" + elseif diag.severity == vim.diagnostic.severity.INFO then + hl_group = "LineNrDiagnosticInfo" + elseif diag.severity == vim.diagnostic.severity.HINT then + hl_group = "LineNrDiagnosticHint" + end + + if hl_group then + vim.fn.sign_place(0, "LineNrDiagnostics", hl_group, vim.api.nvim_get_current_buf(), { + lnum = diag.lnum + 1, -- diagnostics are 0-indexed + priority = 10, + }) + end + end +end + +-- Create the sign definitions +vim.fn.sign_define("LineNrDiagnosticError", { text = "", texthl = "LineNrDiagnosticError", numhl = "LineNrDiagnosticError" }) +vim.fn.sign_define("LineNrDiagnosticWarn", { text = "", texthl = "LineNrDiagnosticWarn", numhl = "LineNrDiagnosticWarn" }) +vim.fn.sign_define("LineNrDiagnosticInfo", { text = "", texthl = "LineNrDiagnosticInfo", numhl = "LineNrDiagnosticInfo" }) +vim.fn.sign_define("LineNrDiagnosticHint", { text = "", texthl = "LineNrDiagnosticHint", numhl = "LineNrDiagnosticHint" }) + +-- Update line numbers when diagnostics change +vim.api.nvim_create_autocmd({ "DiagnosticChanged", "BufEnter", "CursorHold" }, { + callback = set_line_number_highlight, +}) diff --git a/config/nvim/lua/manager.lua b/config/nvim/lua/manager.lua new file mode 100644 index 0000000..f450d31 --- /dev/null +++ b/config/nvim/lua/manager.lua @@ -0,0 +1,26 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +vim.g.mapleader = " " +vim.g.maplocalleader = "\\" + +require("lazy").setup({ + spec = { + { import = "plugins" }, + }, + install = { colorscheme = { "modus" } }, + checker = { enabled = true, notify = false }, +}) diff --git a/config/nvim/lua/plugins/autopairs.lua b/config/nvim/lua/plugins/autopairs.lua new file mode 100644 index 0000000..c37e301 --- /dev/null +++ b/config/nvim/lua/plugins/autopairs.lua @@ -0,0 +1,8 @@ +return { + "windwp/nvim-autopairs", + config = function() + require("nvim-autopairs").setup({ + disable_filetype = { "TelescopePrompt" , "vim" } + }) + end, +} diff --git a/config/nvim/lua/plugins/cmp.lua b/config/nvim/lua/plugins/cmp.lua new file mode 100644 index 0000000..69a2396 --- /dev/null +++ b/config/nvim/lua/plugins/cmp.lua @@ -0,0 +1,99 @@ +return { + 'hrsh7th/nvim-cmp', + dependencies = { + 'neovim/nvim-lspconfig', + 'hrsh7th/cmp-nvim-lsp', + 'hrsh7th/cmp-buffer', + 'hrsh7th/cmp-path', + 'lukas-reineke/cmp-rg', + 'onsails/lspkind.nvim' + }, + config = function() + local cmp = require('cmp') + local lspkind = require('lspkind') + cmp.setup({ + -- preselect = cmp.PreselectMode.None, + completion = { + completeopt = "menu,menuone,noinsert", + callSnippet = "Replace", + keywordSnippet = "Replace", + }, + window = { + completion = cmp.config.window.bordered({}), + documentation = cmp.config.window.bordered({}), + }, + snippet = { + expand = function(arg) + vim.snippet.expand(arg.body) + end + }, + mapping = cmp.mapping.preset.insert({ + ['<Tab>'] = cmp.mapping.confirm({ select = true }), + ['<C-n>'] = cmp.mapping.select_next_item(), + ['<C-p>'] = cmp.mapping.select_prev_item(), + ['<C-g>'] = cmp.mapping.abort(), + }), + sources = cmp.config.sources( + { + { name = 'nvim_lsp' }, + }, + { + { name = 'path' }, + } + -- { + -- { name = 'buffer' }, + -- { name = 'rg', keyword_length = 3 } + -- } + ), + formatting = { + format = lspkind.cmp_format({ + mode = 'symbol' + }) + }, + -- view = { + -- entries = 'native' + -- }, + }) + + local capabilities = require('cmp_nvim_lsp').default_capabilities() + vim.lsp.config('lua_ls', { + -- cmd = { '/home/venomade/.local/share/lua-language-server/bin/lua-language-server' }, + capabilities = capabilities, + root_markers = { + ".luarc.json", + ".luarc.jsonc", + ".git", + }, + settings = { + Lua = { + runtime = { + version = 'Lua 5.4', + path = vim.list_extend( + vim.split(package.path, ';'), + { + '?.lua', + '?/init.lua', + './stubs/?.lua', + './stubs/?/init.lua' + }), + }, + workspace = { + library = { + vim.env.HOME .. '/.luarocks/share/lua/5.4', + './stubs' + }, + }, + diagnostics = { + enable = true, + }, + }, + }, + }) + + vim.lsp.enable('lua_ls') + vim.lsp.config('clangd', { + capabilities = capabilities + }) + vim.lsp.enable('clangd') + end +} diff --git a/config/nvim/lua/plugins/colorizer.lua b/config/nvim/lua/plugins/colorizer.lua new file mode 100644 index 0000000..460eb5c --- /dev/null +++ b/config/nvim/lua/plugins/colorizer.lua @@ -0,0 +1,15 @@ +return { + 'norcalli/nvim-colorizer.lua', + config = function() + require("colorizer").setup({ "*" }, { + RGB = true, + RRGGBB = true, + names = false, + RRGGBBAA = true, + rgb_fn = true, + hsl_fn = true, + css = false, + css_fn = false, + }) + end +} diff --git a/config/nvim/lua/plugins/compile.lua b/config/nvim/lua/plugins/compile.lua new file mode 100644 index 0000000..8d824de --- /dev/null +++ b/config/nvim/lua/plugins/compile.lua @@ -0,0 +1,20 @@ +return { + "ej-shafran/compile-mode.nvim", + branch = "latest", + dependencies = { + "nvim-lua/plenary.nvim", + }, + config = function() + vim.g.compile_mode = {} + + local compile_mode = require("compile-mode") + + vim.keymap.set("n", "<leader>cc", compile_mode.compile, + { desc = "Compile" }) + vim.keymap.set("n", "<leader>cr", compile_mode.recompile, + { desc = "Recompile" }) + vim.keymap.set("n", "<leader>cq", compile_mode.interrupt, + { desc = "Quit Compile (Interrupt)" }) + + end +} diff --git a/config/nvim/lua/plugins/image.lua b/config/nvim/lua/plugins/image.lua new file mode 100644 index 0000000..32c3540 --- /dev/null +++ b/config/nvim/lua/plugins/image.lua @@ -0,0 +1,20 @@ +return { + '3rd/image.nvim', + config = function() + require("image").setup({ + backend = "sixel", + processor = "magick_cli", + integrations = { + markdown = { + enabled = true, + only_render_image_at_cursor = true, + only_render_image_at_cursor_mode = "popup", -- or "inline" + floating_windows = true, -- if true, images will be rendered in floating markdown windows + }, + }, + window_overlap_clear_ft_ignore = { "cmp_menu", "cmp_docs" }, + editor_only_render_when_focused = true, -- auto show/hide images when the editor gains/looses focus + }) + end + +} diff --git a/config/nvim/lua/plugins/lastplace.lua b/config/nvim/lua/plugins/lastplace.lua new file mode 100644 index 0000000..a393a90 --- /dev/null +++ b/config/nvim/lua/plugins/lastplace.lua @@ -0,0 +1,7 @@ +return { + 'ethanholz/nvim-lastplace', + config = function() + require'nvim-lastplace'.setup({}) + end +} + diff --git a/config/nvim/lua/plugins/lazygit.lua b/config/nvim/lua/plugins/lazygit.lua new file mode 100644 index 0000000..f9ddc84 --- /dev/null +++ b/config/nvim/lua/plugins/lazygit.lua @@ -0,0 +1,20 @@ +return { + "kdheepak/lazygit.nvim", + lazy = true, + cmd = { + "LazyGit", + "LazyGitConfig", + "LazyGitCurrentFile", + "LazyGitFilter", + "LazyGitFilterCurrentFile", + }, + -- optional for floating window border decoration + dependencies = { + "nvim-lua/plenary.nvim", + }, + -- setting the keybinding for LazyGit with 'keys' is recommended in + -- order to load the plugin when the command is run for the first time + keys = { + { "<leader>g", "<cmd>LazyGit<cr>", desc = "LazyGit" } + } +} diff --git a/config/nvim/lua/plugins/lualine.lua b/config/nvim/lua/plugins/lualine.lua new file mode 100644 index 0000000..5412061 --- /dev/null +++ b/config/nvim/lua/plugins/lualine.lua @@ -0,0 +1,38 @@ +return { + "nvim-lualine/lualine.nvim", + dependencies = { 'nvim-tree/nvim-web-devicons' }, + config = function() + require("lualine").setup({ + options = { + icons_enabled = true, + component_separators = { left = '|', right = '|'}, + section_separators = { left = '', right = ''}, + theme = { + normal = { + a = { bg = '#000000' }, + b = { bg = '#000000' }, + c = { bg = '#000000' }, + }, + inactive = { + a = { bg = '#000000' }, + b = { bg = '#000000' }, + c = { bg = '#000000' }, + } + }, + }, + sections = { + lualine_a = {"mode", { + "filetype", + icon_only = true, + separator = "", + padding = { right = 0, left = 1 }, + }, "filename" }, + lualine_b = {}, + lualine_c = {}, + lualine_x = {"diagnostics"}, + lualine_y = {}, + lualine_z = {} + } + }) + end, +} diff --git a/config/nvim/lua/plugins/modus-themes.lua b/config/nvim/lua/plugins/modus-themes.lua new file mode 100644 index 0000000..3058078 --- /dev/null +++ b/config/nvim/lua/plugins/modus-themes.lua @@ -0,0 +1,13 @@ +return { + "miikanissi/modus-themes.nvim", + priority = 1000, + config = function () + require("modus-themes").setup({ + style = "modus_vivendi", + sign_column_background = false, + line_nr_column_background = false, + }) + vim.cmd.colorscheme("modus") + end +} + diff --git a/config/nvim/lua/plugins/oil.lua b/config/nvim/lua/plugins/oil.lua new file mode 100644 index 0000000..3eb396d --- /dev/null +++ b/config/nvim/lua/plugins/oil.lua @@ -0,0 +1,28 @@ +return { + 'stevearc/oil.nvim', + dependencies = { "nvim-tree/nvim-web-devicons" }, + config = function() + + function _G.get_oil_winbar() + local bufnr = vim.api.nvim_win_get_buf(vim.g.statusline_winid) + local dir = require("oil").get_current_dir(bufnr) + if dir then + return vim.fn.fnamemodify(dir, ":~") + else + -- If there is no current directory (e.g. over ssh), just show the buffer name + return vim.api.nvim_buf_get_name(0) + end + end + + require('oil').setup({ + win_options = { + winbar = "%!v:lua.get_oil_winbar()", + }, + view_options = { + show_hidden = true + } + }) + vim.keymap.set('n', '-', '<CMD>Oil<CR>', {desc = "Open Dir in Oil"}) + end, + lazy = false, +} diff --git a/config/nvim/lua/plugins/rainbow-delimiters.lua b/config/nvim/lua/plugins/rainbow-delimiters.lua new file mode 100644 index 0000000..9fe4a06 --- /dev/null +++ b/config/nvim/lua/plugins/rainbow-delimiters.lua @@ -0,0 +1,6 @@ +return { + "hiphish/rainbow-delimiters.nvim", + config = function() + require('rainbow-delimiters.setup').setup({}) + end, +} diff --git a/config/nvim/lua/plugins/render-markdown.lua b/config/nvim/lua/plugins/render-markdown.lua new file mode 100644 index 0000000..9d52c5b --- /dev/null +++ b/config/nvim/lua/plugins/render-markdown.lua @@ -0,0 +1,111 @@ +return { + 'MeanderingProgrammer/render-markdown.nvim', + dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-tree/nvim-web-devicons' }, + config = function() + require('render-markdown').setup({ + link = { + enabled = true, + render_modes = false, + footnote = { + enabled = true, + superscript = true, + prefix = '', + suffix = '', + }, + image = ' ', + email = ' ', + hyperlink = ' ', + highlight = 'RenderMarkdownLink', + wiki = { + icon = ' ', + body = function() + return nil + end, + highlight = 'RenderMarkdownWikiLink', + }, + custom = { + web = { pattern = '^http', icon = ' ' }, + github = { pattern = 'github%.com', icon = ' ' }, + stackoverflow = { pattern = 'stackoverflow%.com', icon = ' ' }, + wikipedia = { pattern = 'wikipedia%.org', icon = ' ' }, + youtube = { pattern = 'youtube%.com', icon = ' ' }, + reddit = { pattern = 'reddit%.com', icon = ' ' }, + old_reddit = { pattern = 'old.reddit%.com', icon = ' ' }, + gvc = { pattern = 'git%.venomade%.com', icon = ' ' }, + catechism = { pattern = 'ccc%.directory', icon = ' ' }, + bible = { pattern = 'biblenow%.net', icon = ' ' }, + luarocks = { pattern = 'luarocks%.org', icon = ' ' }, + }, + }, + callout = { + note = { raw = '[!NOTE]', rendered = ' Note', highlight = 'RenderMarkdownInfo' }, + tip = { raw = '[!TIP]', rendered = ' Tip', highlight = 'RenderMarkdownSuccess' }, + important = { raw = '[!IMPORTANT]', rendered = ' Important', highlight = 'RenderMarkdownHint' }, + warning = { raw = '[!WARNING]', rendered = ' Warning', highlight = 'RenderMarkdownWarn' }, + caution = { raw = '[!CAUTION]', rendered = ' Caution', highlight = 'RenderMarkdownError' }, + abstract = { raw = '[!ABSTRACT]', rendered = ' Abstract', highlight = 'RenderMarkdownInfo' }, + summary = { raw = '[!SUMMARY]', rendered = ' Summary', highlight = 'RenderMarkdownInfo' }, + tldr = { raw = '[!TLDR]', rendered = ' Tldr', highlight = 'RenderMarkdownInfo' }, + info = { raw = '[!INFO]', rendered = ' Info', highlight = 'RenderMarkdownInfo' }, + todo = { raw = '[!TODO]', rendered = ' Todo', highlight = 'RenderMarkdownInfo' }, + hint = { raw = '[!HINT]', rendered = ' Hint', highlight = 'RenderMarkdownSuccess' }, + success = { raw = '[!SUCCESS]', rendered = ' Success', highlight = 'RenderMarkdownSuccess' }, + check = { raw = '[!CHECK]', rendered = ' Check', highlight = 'RenderMarkdownSuccess' }, + done = { raw = '[!DONE]', rendered = ' Done', highlight = 'RenderMarkdownSuccess' }, + question = { raw = '[!QUESTION]', rendered = ' Question', highlight = 'RenderMarkdownWarn' }, + help = { raw = '[!HELP]', rendered = ' Help', highlight = 'RenderMarkdownWarn' }, + faq = { raw = '[!FAQ]', rendered = ' Faq', highlight = 'RenderMarkdownWarn' }, + attention = { raw = '[!ATTENTION]', rendered = ' Attention', highlight = 'RenderMarkdownWarn' }, + failure = { raw = '[!FAILURE]', rendered = ' Failure', highlight = 'RenderMarkdownError' }, + fail = { raw = '[!FAIL]', rendered = ' Fail', highlight = 'RenderMarkdownError' }, + missing = { raw = '[!MISSING]', rendered = ' Missing', highlight = 'RenderMarkdownError' }, + danger = { raw = '[!DANGER]', rendered = ' Danger', highlight = 'RenderMarkdownError' }, + error = { raw = '[!ERROR]', rendered = ' Error', highlight = 'RenderMarkdownError' }, + bug = { raw = '[!BUG]', rendered = ' Bug', highlight = 'RenderMarkdownError' }, + example = { raw = '[!EXAMPLE]', rendered = ' Example', highlight = 'RenderMarkdownHint' }, + quote = { raw = '[!QUOTE]', rendered = ' Quote', highlight = 'RenderMarkdownQuote' }, + cite = { raw = '[!CITE]', rendered = ' Cite', highlight = 'RenderMarkdownQuote' }, + }, + checkbox = { + enabled = true, + render_modes = false, + bullet = false, + right_pad = 1, + unchecked = { + icon = ' ', + highlight = 'RenderMarkdownUnchecked', + scope_highlight = nil, + }, + checked = { + icon = ' ', + highlight = 'RenderMarkdownChecked', + scope_highlight = nil, + }, + custom = { + todo = { raw = '[-]', rendered = ' ', highlight = 'RenderMarkdownTodo', scope_highlight = nil }, + }, + }, + bullet = { + enabled = true, + render_modes = false, + icons = { '●', '○', '◆', '◇' }, + ordered_icons = function(ctx) + local value = vim.trim(ctx.value) + local index = tonumber(value:sub(1, #value - 1)) + return ('%d.'):format(index > 1 and index or ctx.index) + end, + left_pad = 0, + right_pad = 0, + highlight = 'RenderMarkdownBullet', + scope_highlight = {}, + }, + quote = { icon = '▋' }, + anti_conceal = { + enabled = false, + }, + heading = { + width = 'block', + } + }) + end +} diff --git a/config/nvim/lua/plugins/scratch-buffer.lua b/config/nvim/lua/plugins/scratch-buffer.lua new file mode 100644 index 0000000..a6526ab --- /dev/null +++ b/config/nvim/lua/plugins/scratch-buffer.lua @@ -0,0 +1,11 @@ +return { + 'miguelcrespo/scratch-buffer.nvim', + event = 'VimEnter', + config = function() + require('scratch-buffer').setup() + end, + dependencies = { + -- Recommended if you want interactive evaluation + "Olical/conjure" + } +} diff --git a/config/nvim/lua/plugins/telescope.lua b/config/nvim/lua/plugins/telescope.lua new file mode 100644 index 0000000..e761994 --- /dev/null +++ b/config/nvim/lua/plugins/telescope.lua @@ -0,0 +1,40 @@ +return { + "nvim-telescope/telescope.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + config = function() + require("telescope").setup({ + defaults = { + borderchars = { "─", "│", "─", "│", "┌", "┐", "┘", "└" }, + }, + }) + + local tscope = require('telescope.builtin') + vim.keymap.set("n", "<leader>ff", function() + local cwd + if vim.bo.filetype == "oil" then + cwd = require("oil").get_current_dir() + else + cwd = vim.fn.expand("%:p:h") + end + tscope.find_files({ cwd = cwd }) + end, { desc = "Find File" }) + + vim.keymap.set("n", "<leader>fp", function() + tscope.find_files({ + cwd = vim.loop.cwd(), + }) + end, { desc = "Find Project File" }) + vim.keymap.set('n', '<leader>bb', tscope.buffers, + { desc = "Find Buffer" }) + vim.keymap.set('n', '<leader>fh', tscope.help_tags, + { desc = "Find Help" }) + vim.keymap.set('n', '<leader>fg', tscope.live_grep, + { desc = "Find by Grep" }) + vim.keymap.set('n', '<leader>fr', tscope.oldfiles, + { desc = "Find Recent Files" }) + vim.keymap.set('n', '<leader>lw', tscope.diagnostics, + { desc = "Search Diagnostics" }) + vim.keymap.set('n', '<leader>lg', tscope.lsp_references, + { desc = "Search References" }) + end, +} diff --git a/config/nvim/lua/plugins/todo-comments.lua b/config/nvim/lua/plugins/todo-comments.lua new file mode 100644 index 0000000..69f907e --- /dev/null +++ b/config/nvim/lua/plugins/todo-comments.lua @@ -0,0 +1,14 @@ +return { + "folke/todo-comments.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + opts = { + + }, + config = function() + require('todo-comments').setup({}) + vim.keymap.set('n', '<leader>ft', function() + vim.cmd('TodoTelescope') + end, + { desc = "Find Buffer" }) + end, +} diff --git a/config/nvim/lua/plugins/ui.lua b/config/nvim/lua/plugins/ui.lua new file mode 100644 index 0000000..5df6f44 --- /dev/null +++ b/config/nvim/lua/plugins/ui.lua @@ -0,0 +1,27 @@ +return { + "OXY2DEV/ui.nvim", + lazy = false, + config = function() + require("ui").setup({ + cmdline = { + enable = true, + row_offset = 0, + }, + messages = { + enable = true, + }, + popupmenu = { + enable = false, + }, + }); + + local spec = require("ui.spec") + + spec.config.message.showcmd.modifier = function(_, lines) + return { + lines = { "" }, + extmarks = { {} }, + } + end + end, +}; diff --git a/config/nvim/lua/plugins/zk.lua b/config/nvim/lua/plugins/zk.lua new file mode 100644 index 0000000..ce2e11a --- /dev/null +++ b/config/nvim/lua/plugins/zk.lua @@ -0,0 +1,26 @@ +return { + "zk-org/zk-nvim", + lazy = false, + config = function() + require("zk").setup({ + picker = "telescope", + lsp = { + config = { + name = "zk", + cmd = { "zk", "lsp" }, + filetypes = { "markdown" }, + }, + auto_attach = { + enabled = true, + }, + }, + }) + end, + keys = { + { "<leader>zz", "<cmd>ZkNotes<cr>", desc = "Notes" }, + { "<leader>zl", "<cmd>ZkLinks<cr>", desc = "Links" }, + { "<leader>zb", "<cmd>ZkBacklinks<cr>", desc = "Backlinks" }, + { "<leader>zi", "<cmd>ZkInsertLink<cr>", desc = "Insert Link" }, + { "<leader>zd", "<cmd>ZkCd<cr>", desc = "Enter Directory" }, + } +} diff --git a/config/nvim/lua/scripts/diagnostics.lua b/config/nvim/lua/scripts/diagnostics.lua new file mode 100644 index 0000000..0855af1 --- /dev/null +++ b/config/nvim/lua/scripts/diagnostics.lua @@ -0,0 +1,760 @@ +--[[ +*Fancy* diagnostics for `Neovim`. + +## Usage + +```lua +require("diagnostics").setup(); +``` + +You can then hit `D` to show diagnostics for the current line. + +## Highlight groups + +This script uses highlight groups provided by [highlights.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/highlights.lua). + +The used groups are, +- `FancyDiagnostic`, Default group for diagnostics. +- `FancyDiagnosticIcon`, Default group for the icons of diagnostics. +- `FancyDiagnosticInfo`, Group for `information` diagnostics. +- `FancyDiagnosticInfoIcon`, Group for the icons of `information` diagnostics. +- `FancyDiagnosticHint`, Group for `hint` diagnostics. +- `FancyDiagnosticHintIcon`, Group for the icons of `hint` diagnostics. +- `FancyDiagnosticWarn`, Group for `warning` diagnostics. +- `FancyDiagnosticWarnIcon`, Group for the icons of `warning` diagnostics. +- `FancyDiagnosticError`, Group for `error` diagnostics. +- `FancyDiagnosticErrorIcon`, Group for the icons of `error` diagnostics. + +## Dependencies + +- [beacon.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/beacon.lua), For highlighting cursor. +- [highlights.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/highlights.lua), For highlight groups. +- [types/diagnostics.lua](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/types/diagnostics.lua), For type definition. + +## Configuration + +Use `setup()` for setting configuration. See [types/diagnostics.lua#diagnostics.config](https://github.com/OXY2DEV/nvim/blob/main/lua/scripts/types/diagnostics.lua#L3-L19) for the type definition. +]] +local diagnostics = {}; + +---@param level string +---@param icon string +---@return table +local function handle_diagnostic_level (level, icon) + ---|fS + + local default = string.format("FancyDiagnostic%s", "Default"); + local default_icon_hl = string.format("FancyDiagnostic%sIcon", "Default"); + + local bg = string.format("FancyDiagnostic%s", level); + local icon_hl = string.format("FancyDiagnostic%sIcon", level); + + return { + width = 3, + + line_hl_group = function (_, current) + return current and bg or default; + end, + icon = function (_, current) + return { + { "▌", current and icon_hl or default_icon_hl }, + { icon, current and icon_hl or default_icon_hl }, + { " ", current and bg or default }, + } + end, + padding = function (_, current) + return { + { "▌", current and icon_hl or default_icon_hl }, + { " ", current and icon_hl or default_icon_hl }, + { " ", current and bg or default }, + } + end + }; + + ---|fE +end + +---@class diagnostics.config +diagnostics.config = { + ---|fS + + keymap = "D", + + decoration_width = 4, + width = function (items) + local max = math.floor(vim.o.columns * 0.4); + local use = 1 + + for _, item in ipairs(items) do + local width = vim.fn.strdisplaywidth(item.message or ""); + + use = math.min( + math.max(width, 0), + max + ); + end + + return use; + end, + + max_height = function () + return math.floor(vim.o.lines * 0.4); + end, + + beacon = { + ---|fS + + default = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "@comment", link = false }).fg; + return fg and string.format("#%06x", fg) or "#9399b2"; + end, + to = function () + local bg = vim.api.nvim_get_hl(0, { name = vim.o.statusline and "Cursorline" or "Normal", link = false }).bg; + return bg and string.format("#%06x", bg) or "#1e1e2e"; + end, + + steps = 10, + interval = 100, + }, + + [vim.diagnostic.severity.INFO] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticInfoIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#94e2d5"; + end + }, + [vim.diagnostic.severity.HINT] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticHintIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#94e2d5"; + end + }, + [vim.diagnostic.severity.WARN] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticWarnIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#f9e2af"; + end + }, + [vim.diagnostic.severity.ERROR] = { + from = function () + local fg = vim.api.nvim_get_hl(0, { name = "FancyDiagnosticErrorIcon", link = false }).fg; + return fg and string.format("#%06x", fg) or "#f38ba8"; + end + }, + + ---|fE + }, + + decorations = { + ---|fS + + [vim.diagnostic.severity.INFO] = handle_diagnostic_level("Info", " "), + [vim.diagnostic.severity.HINT] = handle_diagnostic_level("Hint", " "), + [vim.diagnostic.severity.WARN] = handle_diagnostic_level("Warn", " "), + [vim.diagnostic.severity.ERROR] = handle_diagnostic_level("Error", " "), + + ---|fE + }, + + ---|fE +}; + +--[[ Evaluates `val`. ]] +---@param val any +---@param ... any +---@return any +local function eval(val, ...) + ---|fS + + if type(val) ~= "function" then + return val; + else + local can_call, new_val = pcall(val, ...); + + if can_call and new_val ~= nil then + return new_val; + end + end + + ---|fE +end + +--[[ Gets diagnostic item `decoration`. ]] +---@param level vim.diagnostic.Severity | "default" Diagnostic severity. +---@param ... any Extra arguments to be used for value evaluation. +---@return diagnostics.decorations__static decoration Static version of the diagnostic item's decoration. +local function get_decorations (level, ...) + ---|fS + + local output = {}; + + for k, v in pairs(diagnostics.config.decorations[level]) do + output[k] = eval(v, ...); + end + + return output; + + ---|fE +end + +--[[ Gets `beacon` configuration. ]] +---@param level? vim.diagnostic.Severity | "default" Diagnostic level. +---@param ... any Extra arguments to be used for value evaluation. +---@return table? +local function get_beacon_config (level, ...) + ---|fS + + if not level or not diagnostics.config.beacon then + return; + end + + local output = {}; + + for k, v in pairs(diagnostics.config.beacon[level]) do + output[k] = eval(v, ...); + end + + return output; + + ---|fE +end + +--[[ Turns given **virtual text** into **format string** for the statusline. ]] +---@param virt_text diagnostics.decoration_fragment[] Virtual text. +---@return string sign Virtual text as a sign(use in `statuscolumn`, `statusline`, `tabline` or `winbar`) +local function virt_text_to_sign (virt_text) + ---|fS + + local output = ""; + + for _, item in ipairs(virt_text) do + if type(item[2]) == "string" then + output = output .. string.format("%%#%s#%s", item[2], item[1]) .. "%#Normal#"; + else + output = output .. item[1]; + end + end + + return output; + + ---|fE +end + +------------------------------------------------------------------------------ + +---@type integer Decoration namespace. +diagnostics.ns = vim.api.nvim_create_namespace("fancy_diagnostics"); + +---@type integer, integer Diagnostics buffer & window. +diagnostics.buffer, diagnostics.window = nil, nil; + +--[[ Which *quadrant* the diagnostics window is currently using? ]] +---@type +---| "top_left" +---| "top_right" +---| "bottom_left" +---| "bottom_right" +---| "center" +diagnostics.quad = nil; + +---@type diagnostics.signs.entry[] +diagnostics.sign_data = {}; + +--[[ Prepares the buffer for the diagnostics window. ]] +diagnostics.__prepare = function () + ---|fS + + if not diagnostics.buffer or not vim.api.nvim_buf_is_valid(diagnostics.buffer) then + diagnostics.buffer = vim.api.nvim_create_buf(false, true); + end + + ---|fE +end + +--[[ Updates the *quadrant* which is being used by the diagnostics window. ]] +---@param quad +---| "top_left" +---| "top_right" +---| "bottom_left" +---| "bottom_right" +---| "center" +---@param state boolean +diagnostics.update_quad = function (quad, state) + ---|fS + + if not _G.__used_quads then + -- NIT: Should this set a default state value? + return; + end + + _G.__used_quads[quad] = state; + + ---|fE +end + +--[[ Returns `{opts}` for `nvim_open_win()` based on the parameters. ]] +---@param window integer Window ID. +---@param w integer Window width. +---@param h integer Window height. +---@return string | string[] border Window border. +---@return "editor" | "cursor" relative Relative position for floating window. +---@return "NE" | "NW" | "SE" | "SW" anchor Anchor position. +---@return integer row Window position in Y-axis. +---@return integer col Window position in X-axis. +diagnostics.__win_args = function (window, w, h) + ---|fS + + ---@type [ integer, integer ] + local cursor = vim.api.nvim_win_get_cursor(window); + ---@type table<string, integer> + local screenpos = vim.fn.screenpos(window, cursor[1], cursor[2]); + + local screen_width = vim.o.columns - 2; + local screen_height = vim.o.lines - vim.o.cmdheight - 2; + + local quad_pref = { "bottom_right", "top_right", "bottom_left", "top_left" }; + local quads = { + ---|fS + + center = { + relative = "editor", + anchor = "NW", + + row = math.ceil((vim.o.lines - h) / 2), + col = math.ceil((vim.o.columns - w) / 2), + border = "rounded" + }, + + top_left = { + condition = function () + if h >= screenpos.row then + -- Not enough space above. + return false; + elseif screenpos.curscol <= w then + -- Not enough space before. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "╭", "─", "╮", "│", "┤", "─", "╰", "│" }, + anchor = "SE", + row = 0, + col = 1 + }, + top_right = { + condition = function () + if h >= screenpos.row then + -- Not enough space above. + return false; + elseif screenpos.curscol + w > screen_width then + -- Not enough space after. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "╭", "─", "╮", "│", "╯", "─", "├", "│" }, + anchor = "SW", + row = 0, + col = 0 + }, + + bottom_left = { + condition = function () + if screenpos.row + h > screen_height then + -- Not enough space below. + return false; + elseif screenpos.curscol <= w then + -- Not enough space before. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "╭", "─", "┤", "│", "╯", "─", "╰", "│" }, + anchor = "NE", + row = 1, + col = 1 + }, + bottom_right = { + condition = function () + if screenpos.row + h > screen_height then + -- Not enough space below. + return false; + elseif screenpos.curscol + w > screen_width then + -- Nor enough space after. + return false; + end + + return true; + end, + + relative = "cursor", + border = { "├", "─", "╮", "│", "╯", "─", "╰", "│" }, + anchor = "NW", + row = 1, + col = 0 + } + + ---|fE + }; + + for _, pref in ipairs(quad_pref) do + if _G.__used_quads and _G.__used_quads[pref] == true then + goto continue; + elseif not quads[pref] then + goto continue; + end + + local quad = quads[pref]; + local ran_cond, cond = pcall(quad.condition); + + if ran_cond and cond then + diagnostics.quad = pref; + return quad.border, quad.cursor, quad.anchor, quad.row, quad.col; + end + + ::continue:: + end + + diagnostics.quad = "center"; + + local fallback = quads.center; + return fallback.border, fallback.cursor, fallback.anchor, fallback.row, fallback.col; + + ---|fE +end + +------------------------------------------------------------------------------ + +--[[ Closes diagnostics window. ]] +diagnostics.close = function () + ---|fS + + if diagnostics.window and vim.api.nvim_win_is_valid(diagnostics.window) then + pcall(vim.api.nvim_win_close, diagnostics.window, true); + diagnostics.window = nil; + + if diagnostics.quad then + diagnostics.update_quad(diagnostics.quad, false); + diagnostics.quad = nil; + end + end + + ---|fE +end + +---@type beacon.instance Beacon instance to use for the Cursor. +diagnostics.__beacon = nil; + +--[[ External integrations. ]] +---@param window integer Window Id. +---@param beacon_config beacon.instance.config Configuration for `beacon`. +diagnostics.__integration = function (window, beacon_config) + ---|fS + + -- Markdown rendering. + if package.loaded["markview"] then + package.loaded["markview"].render(diagnostics.buffer, { + enable = true, + hybrid_mode = false + }, { + markdown_inline = { + inline_codes = { + virtual = true + } + } + }); + end + + -- Beacon. + if package.loaded["scripts.beacon"] then + if not diagnostics.__beacon then + diagnostics.__beacon = require("scripts.beacon").new(window, beacon_config); + else + diagnostics.__beacon:update(window, beacon_config); + end + + diagnostics.__beacon:start(); + end + + ---|fE +end + +--- Custom statuscolumn. +---@return string +_G.fancy_diagnostics_statuscolumn = function () + ---|fS + + if vim.tbl_isempty(diagnostics.sign_data) then + return ""; + end + + local lnum = vim.v.lnum; + + local data = diagnostics.sign_data[lnum]; + local start = data.start_row; + + if not data then + return ""; + elseif vim.v.virtnum == 0 and start == lnum then + return virt_text_to_sign(data.icon); + else + return virt_text_to_sign(data.padding or data.icon); + end + + ---|fE +end + +--- Hover function for diagnostics. +---@param window integer +diagnostics.hover = function (window) + ---|fS + + window = window or vim.api.nvim_get_current_win(); + + ---@type integer Source buffer. + local buffer = vim.api.nvim_win_get_buf(window); + ---@type [ integer, integer ] + local cursor = vim.api.nvim_win_get_cursor(window); + + local items = vim.diagnostic.get(buffer, { lnum = cursor[1] - 1 }); + + ---@type boolean Is the window already open? + local already_open = diagnostics.window and vim.api.nvim_win_is_valid(diagnostics.window); + + if #items == 0 then + -- No diagnostics available. + diagnostics.close(); + vim.api.nvim_echo({ + { " diagnostics.lua ", "DiagnosticVirtualTextWarn" }, + { ": ", "@comment" }, + { "No diagnostic under cursor", "@comment" }, + }, true, {}); + return; + elseif already_open then + vim.api.nvim_set_current_win(diagnostics.window); + return; + end + + if diagnostics.quad then + -- If the old window's quadrant wasn't freed, we free it here. + diagnostics.update_quad(diagnostics.quad, false) + end + + diagnostics.__prepare(); + vim.bo[diagnostics.buffer].ft = "markdown"; + + -- Clear old decorations. + vim.api.nvim_buf_clear_namespace(diagnostics.buffer, diagnostics.ns, 0, -1); + vim.api.nvim_buf_set_lines(diagnostics.buffer, 0, -1, false, {}); + + local W = eval(diagnostics.config.width, items); + local D = eval(diagnostics.config.decoration_width, items); + + ---@type table Configuration used for calculating window height. + local height_calc_config = { + relative = "editor", + + row = 0, col = 1, + width = W - D, height = 2, + + style = "minimal", + hide = true, + }; + + if not diagnostics.window or not vim.api.nvim_win_is_valid(diagnostics.window) then + diagnostics.window = vim.api.nvim_open_win(diagnostics.buffer, false, height_calc_config); + else + vim.api.nvim_win_set_config(diagnostics.window, height_calc_config); + end + + vim.wo[diagnostics.window].wrap = true; + vim.wo[diagnostics.window].linebreak = true; + vim.wo[diagnostics.window].breakindent = true; + + local diagnostic_lines = 0; + + ---@type integer Line where the cursor should be placed. + local cursor_y = 1; + local ranges = {}; + + local start_row = 1; + ---@type vim.diagnostic.Severity | nil + local level; + + diagnostics.sign_data = {}; + + for i, item in ipairs(items) do + ---|fS + + local from = i == 1 and 0 or -1; + local lines = vim.split(item.message, "\n", { trimempty = true }) + + local start = item.col; + local stop = item.end_col; + + local current = false; + + if cursor[2] >= start and cursor[2] <= stop then + cursor_y = i; + current = true; + end + + vim.api.nvim_buf_set_lines(diagnostics.buffer, from, -1, false, lines); + local decorations = get_decorations(item.severity, item, current); + + ranges[i] = { item.lnum, item.col }; + + vim.api.nvim_buf_set_extmark(diagnostics.buffer, diagnostics.ns, diagnostic_lines, 0, { + end_row = diagnostic_lines + #lines, + line_hl_group = decorations.line_hl_group, + }); + + diagnostic_lines = diagnostic_lines + #lines; + + if current == true and ( not level or item.severity < level ) then + level = item.severity; + end + + for _ = 1, #lines do + -- Signs + table.insert(diagnostics.sign_data, { + start_row = start_row, + + current = current, + width = decorations.width, + + icon = decorations.icon, + line_hl_group = decorations.line_hl_group, + padding = decorations.padding, + }); + end + + start_row = start_row + #lines; + + ---|fE + end + + local beacon_config = vim.tbl_extend("force", + get_beacon_config("default", {}, true), + get_beacon_config(level, {}, true) or {} + ); + + local H = vim.api.nvim_win_text_height(diagnostics.window, { start_row = 0, end_row = -1 }).all; + + local _, relative, anchor, row, col = diagnostics.__win_args(window, W, H); + + local win_config = { + relative = relative or "cursor", + + row = row or 0, col = col or 0, + width = W, height = H, + + anchor = anchor, + border = "none", + + style = "minimal", + hide = false, + }; + + vim.api.nvim_win_set_config(diagnostics.window, win_config); + vim.api.nvim_win_set_cursor(diagnostics.window, { cursor_y, 0 }); + + -- Update quadrant state. + diagnostics.update_quad(diagnostics.quad, true); + + -- Set necessary options. + vim.wo[diagnostics.window].signcolumn = "no"; + vim.wo[diagnostics.window].statuscolumn = "%!v:lua.fancy_diagnostics_statuscolumn()"; + + vim.wo[diagnostics.window].conceallevel = 3; + vim.wo[diagnostics.window].concealcursor = "ncv"; + + vim.wo[diagnostics.window].winhl = "FloatBorder:@comment,Normal:Normal"; + + diagnostics.__integration(window, beacon_config); + + ---|fS + + + vim.api.nvim_buf_set_keymap(diagnostics.buffer, "n", "<CR>", "", { + desc = "Go to diagnostic location", + callback = function () + ---|fS + + ---@type [ integer, integer ] Selected item. + local _cursor = vim.api.nvim_win_get_cursor(diagnostics.window); + ---@type [ integer, integer ]? Diagnostic location. + local location = ranges[_cursor[1]]; + + if location then + location[1] = location[1] + 1; + + vim.api.nvim_win_set_cursor(window, location); + vim.api.nvim_set_current_win(window); + + diagnostics.close(); + end + + ---|fE + end + }); + + vim.api.nvim_buf_set_keymap(diagnostics.buffer, "n", "q", "", { + desc = "Exit diagnostics window", + callback = function () + pcall(vim.api.nvim_set_current_win, window); + diagnostics.close(); + end + }); + + ---|fE + + ---|fE +end + +--- Configuration for the diagnostics module. +---@param config? diagnostics.config +diagnostics.setup = function (config) + ---|fS + + if type(config) == "table" then + diagnostics.config = vim.tbl_extend("force", diagnostics.config, config); + end + + if diagnostics.config.keymap then + vim.api.nvim_set_keymap("n", diagnostics.config.keymap, "", { + callback = diagnostics.hover + }); + end + + vim.api.nvim_create_autocmd({ + "CursorMoved", "CursorMovedI" + }, { + callback = function () + local win = vim.api.nvim_get_current_win(); + + if diagnostics.window and win ~= diagnostics.window then + diagnostics.close(); + + if diagnostics.quad then + diagnostics.update_quad(diagnostics.quad, false); + diagnostics.quad = nil; + end + end + end + }); + + ---|fE +end + +return diagnostics; diff --git a/config/nvim/lua/scripts/init.lua b/config/nvim/lua/scripts/init.lua new file mode 100644 index 0000000..f0e0f11 --- /dev/null +++ b/config/nvim/lua/scripts/init.lua @@ -0,0 +1,3 @@ +require("scripts.diagnostics").setup({ + keymap = "<leader>lh" +}) diff --git a/config/shell/alias b/config/shell/alias new file mode 100644 index 0000000..84eab84 --- /dev/null +++ b/config/shell/alias @@ -0,0 +1,9 @@ +alias rgf='rg --files | rg' +alias ls='eza --icons=auto' +alias md='mkdir' +alias cat='bat -pp' +alias man='batman' +alias diff='batdiff' +alias fzf="fzf --preview 'bat --style=numbers --color=always {}'" +alias vi="nvim" +alias vim="nvim" diff --git a/config/shell/functions b/config/shell/functions new file mode 100644 index 0000000..a300316 --- /dev/null +++ b/config/shell/functions @@ -0,0 +1,16 @@ +gvc() { + if [[ $1 == "clone" ]]; then + shift + git clone git@git.venomade.com:"$@" + else + ssh git@git.venomade.com "$@" + fi +} + +function y() { + local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd + command yazi "$@" --cwd-file="$tmp" + IFS= read -r -d '' cwd < "$tmp" + [ "$cwd" != "$PWD" ] && [ -d "$cwd" ] && builtin cd -- "$cwd" + rm -f -- "$tmp" +} diff --git a/config/shell/vars b/config/shell/vars new file mode 100644 index 0000000..601d79f --- /dev/null +++ b/config/shell/vars @@ -0,0 +1,6 @@ +export EDITOR=nvim +export ZK_NOTEBOOK_DIR=$HOME/Documents/Notes +export XDG_CONFIG_HOME=$HOME/.config +export GOPATH=$HOME/.go +export LIMA_SHELL=/bin/zsh +export LIMA_INSTANCE=alpine diff --git a/config/starship/config.toml b/config/starship/config.toml new file mode 100644 index 0000000..6165b64 --- /dev/null +++ b/config/starship/config.toml @@ -0,0 +1,91 @@ +# Get editor completions based on the config schema +"$schema" = 'https://starship.rs/config-schema.json' + +# Inserts a blank line between shell prompts +add_newline = true + +format = """ +$nix_shell\ +$directory\ +$git_branch\ +$git_status\ +$git_commit\ +$status\ +$fill\ +$lua\ +$rust\ +$golang\ +$haskell\ +$jobs\ +$cmd_duration\ +$line_break\ +$character""" + +[nix_shell] +format = '[$symbol]($style) ' +symbol = ' ' +style = 'bold #74c7ec' + +[directory] +style = '#b2bbfb' +truncation_length = 2 + +[git_branch] +symbol = ' ' +format = '[$symbol$branch(:$remote_branch)]($style) ' +style = 'bold #eba0ac' +ignore_branches = ['master', 'main'] + +[git_status] +format = '([\[$all_status$ahead_behind\]]($style) )' +style = 'bold #89dceb' + +[git_commit] +format = '[\[#$hash$tag\]]($style) ' +style = 'bold #94e2d5' + +[status] +format = '[\[$status\]]($style)' +disabled = false + +[fill] +symbol = ' ' + +[lua] +format = '[$symbol($version )]($style)' +version_format = '$major.$minor' +symbol = ' ' +detect_files = ['.lua-version', '.luarc.json'] + +[rust] +format = '[$symbol($version )]($style)' +version_format = '$major.$minor' +symbol = ' ' +style = 'bold #fab387' + +[golang] +format = '[$symbol($version )]($style)' +version_format = '$major.$minor' +symbol = ' ' +style = 'bold #94e2d5' + +[haskell] +format = '[$symbol($ghc_version )]($style)' +symbol = ' ' +style = 'bold #cba6f7' + +[cmd_duration] +format = '[ $duration]($style) ' +style = 'bold #f9e2af' + +# Replace the '❯' symbol in the prompt with '➜' +[character] # The name of the module we are configuring is 'character' +success_symbol = '[](bold #a6e3a1)' +error_symbol = '[](bold #f38ba8)' + +# TODO +# - [container] +# - [docker_context] +# - [direnv] +# CONTINUE FROM HERE + diff --git a/config/yazi/keymap.toml b/config/yazi/keymap.toml new file mode 100644 index 0000000..27da4fc --- /dev/null +++ b/config/yazi/keymap.toml @@ -0,0 +1,164 @@ +"$schema" = "https://yazi-rs.github.io/schemas/keymap.json" + +# Manager / File list layer +[[mgr.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[mgr.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + +[[mgr.prepend_keymap]] +on = [ "E" ] +run = "arrow -5" + +[[mgr.prepend_keymap]] +on = [ "N" ] +run = "arrow 5" + +[[mgr.prepend_keymap]] +on = [ "h" ] +run = "leave" + +[[mgr.prepend_keymap]] +on = [ "i" ] +run = "enter" + +[[mgr.prepend_keymap]] +on = [ "H" ] +run = "back" + +[[mgr.prepend_keymap]] +on = [ "I" ] +run = "forward" + +[[mgr.prepend_keymap]] +on = [ "<C-e>" ] +run = "seek -5" + +[[mgr.prepend_keymap]] +on = [ "<C-n>" ] +run = "seek 5" + +[[mgr.prepend_keymap]] +on = [ "k" ] +run = "link" + +[[mgr.prepend_keymap]] +on = [ "K" ] +run = "link --relative" + +[[mgr.prepend_keymap]] +on = [ "j" ] +run = "find_arrow" + +[[mgr.prepend_keymap]] +on = [ "J" ] +run = "find_arrow --previous" + + +# Tasks layer +[[tasks.prepend_keymap]] +on = [ "W" ] +run = "close" + +[[tasks.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[tasks.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + + +# Select layer (spot/picker remnants) +[[spot.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[spot.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + +[[spot.prepend_keymap]] +on = [ "E" ] +run = "arrow -5" + +[[spot.prepend_keymap]] +on = [ "N" ] +run = "arrow 5" + + +# Input layer +[[input.prepend_keymap]] +on = [ "l" ] +run = "insert" + +[[input.prepend_keymap]] +on = [ "<C-h>" ] +run = [ "move -999", "insert" ] + +[[input.prepend_keymap]] +on = [ "<C-i>" ] +run = [ "move 999", "insert --append" ] + +[[input.prepend_keymap]] +on = [ "h" ] +run = "move -1" + +[[input.prepend_keymap]] +on = [ "i" ] +run = "move 1" + +[[input.prepend_keymap]] +on = [ "=" ] +run = "forward --end-of-word" + +[[input.prepend_keymap]] +on = [ "H" ] +run = "move -999" + +[[input.prepend_keymap]] +on = [ "I" ] +run = "move 999" + +[[input.prepend_keymap]] +on = [ "x" ] +run = [ "delete", "move 1 --in-operating" ] + +[[input.prepend_keymap]] +on = [ "u" ] +run = "undo" + +[[input.prepend_keymap]] +on = [ "U" ] +run = "redo" + + +# Completion layer +[[cmp.prepend_keymap]] +on = [ "<C-e>" ] +run = "arrow -1" + +[[cmp.prepend_keymap]] +on = [ "<C-n>" ] +run = "arrow 1" + + +# Help layer +[[help.prepend_keymap]] +on = [ "e" ] +run = "arrow -1" + +[[help.prepend_keymap]] +on = [ "n" ] +run = "arrow 1" + +[[help.prepend_keymap]] +on = [ "E" ] +run = "arrow -5" + +[[help.prepend_keymap]] +on = [ "N" ] +run = "arrow 5" diff --git a/config/yazi/modus_vivendi.tmTheme b/config/yazi/modus_vivendi.tmTheme new file mode 100644 index 0000000..15d2429 --- /dev/null +++ b/config/yazi/modus_vivendi.tmTheme @@ -0,0 +1,439 @@ +<!-- Modus Themes for Bat --> +<!-- Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/bat.lua --> + +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>name</key> + <string>modus_vivendi</string> + <key>settings</key> + <array> + <dict> + <key>settings</key> + <dict> + <key>background</key> + <string>#000000</string> + <key>caret</key> + <string>#989898</string> + <key>foreground</key> + <string>#ffffff</string> + <key>invisibles</key> + <string>#989898</string> + <key>lineHighlight</key> + <string>#2f3849</string> + <key>selection</key> + <string>#7030af</string> + <key>findHighlight</key> + <string>#7a6100</string> + <key>selectionBorder</key> + <string>#646464</string> + <key>gutterForeground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Comment</string> + <key>scope</key> + <string>comment</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String</string> + <key>scope</key> + <string>string</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Number</string> + <key>scope</key> + <string>constant.numeric</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Built-in constant</string> + <key>scope</key> + <string>constant.language</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>User-defined constant</string> + <key>scope</key> + <string>constant.character, constant.other</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Variable</string> + <key>scope</key> + <string>variable</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Ruby's @variable</string> + <key>scope</key> + <string>variable.other.readwrite.instance</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>String interpolation</string> + <key>scope</key> + <string>constant.character.escaped, constant.character.escape, string source, string source.ruby</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Keyword</string> + <key>scope</key> + <string>keyword</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>italic</string> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage</string> + <key>scope</key> + <string>storage</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Storage type</string> + <key>scope</key> + <string>storage.type</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Class name</string> + <key>scope</key> + <string>entity.name.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Inherited class</string> + <key>scope</key> + <string>entity.other.inherited-class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#b6a0ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function name</string> + <key>scope</key> + <string>entity.name.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Function argument</string> + <key>scope</key> + <string>variable.parameter</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag name</string> + <key>scope</key> + <string>entity.name.tag</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Tag attribute</string> + <key>scope</key> + <string>entity.other.attribute-name</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library function</string> + <key>scope</key> + <string>support.function</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library constant</string> + <key>scope</key> + <string>support.constant</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library class/type</string> + <key>scope</key> + <string>support.type, support.class</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#6ae4b9</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Library variable</string> + <key>scope</key> + <string>support.other.variable</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00d3d0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid</string> + <key>scope</key> + <string>invalid</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Invalid deprecated</string> + <key>scope</key> + <string>invalid.deprecated</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#989898</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.header</string> + <key>scope</key> + <string>meta.diff, meta.diff.header</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#feacd0</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.deleted</string> + <key>scope</key> + <string>markup.deleted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#4f1119</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.inserted</string> + <key>scope</key> + <string>markup.inserted</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#00381f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>diff.changed</string> + <key>scope</key> + <string>markup.changed</string> + <key>settings</key> + <dict> + <key>background</key> + <string>#363300</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>constant.numeric.line-number.find-in-files - match</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#82b0ec</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>entity.name.filename</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#2fafff</string> + </dict> + </dict> + <dict> + <key>scope</key> + <string>message.error</string> + <key>settings</key> + <dict> + <key>fontStyle</key> + <string>bold</string> + <key>foreground</key> + <string>#ff7f9f</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Punctuation</string> + <key>scope</key> + <string>punctuation.definition.string.begin.json - meta.structure.dictionary.value.json, punctuation.definition.string.end.json - meta.structure.dictionary.value.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#ffffff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON Structure</string> + <key>scope</key> + <string>meta.structure.dictionary.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>JSON String</string> + <key>scope</key> + <string>meta.structure.dictionary.value.json string.quoted.double.json</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#79a8ff</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Escape Characters</string> + <key>scope</key> + <string>constant.character.escape</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#d2b580</string> + </dict> + </dict> + <dict> + <key>name</key> + <string>Regular Expressions</string> + <key>scope</key> + <string>string.regexp</string> + <key>settings</key> + <dict> + <key>foreground</key> + <string>#00c06f</string> + </dict> + </dict> + </array> + <key>uuid</key> + <string>09CE9B40-0137-442C-8512-7CEAFC78C153</string> + <key>colorSpaceName</key> + <string>sRGB</string> + <key>semanticClass</key> + <string>Modus Vivendi</string> + </dict> +</plist> diff --git a/config/yazi/theme.toml b/config/yazi/theme.toml new file mode 100644 index 0000000..7e83248 --- /dev/null +++ b/config/yazi/theme.toml @@ -0,0 +1,135 @@ +# Modus Themes for Yazi +# Auto generated with https://github.com/miikanissi/modus-themes.nvim/blob/master/lua/modus-themes/extras/yazi.lua + +[manager] +# NOTE: can combined with tmTheme (sublime colorshceme file) for preview code highlight +highlight = "~/.config/yazi/modus_vivendi.tmTheme" + +cwd = { fg = "#00d3d0", italic = true } + +# Hovered +hovered = { bg = "#2f3849" } +preview_hovered = { bg = "#2f3849" } + +# Find +find_keyword = { fg = "#ffffff", bg = "#7030af", bold = true } +find_position = { fg = "#79a8ff", bg = "#1e1e1e", bold = true } + +# Marker +marker_copied = { fg = "#70b900", bg = "#70b900" } +marker_cut = { fg = "#ff5f59", bg = "#ff5f59" } +marker_marked = { fg = "#feacd0", bg = "#feacd0" } +marker_selected = { fg = "#2fafff", bg = "#2fafff" } + +# Tab +tab_active = { fg = "#000000", bg = "#2fafff" } +tab_inactive = { fg = "#989898", bg = "#000000" } +tab_width = 1 + +# Count +count_copied = { fg = "#000000", bg = "#70b900" } +count_cut = { fg = "#000000", bg = "#ff6b55" } +count_selected = { fg = "#000000", bg = "#79a8ff" } + +# Border +border_symbol = "│" +border_style = { fg = "#C4C4C4" } + +[status] +separator_open = "" +separator_close = "" +separator_style = { fg = "#0f0f0f", bg = "#0f0f0f" } + +# Mode +mode_normal = { fg = "#000000", bg = "#2fafff", bold = true } +mode_select = { fg = "#000000", bg = "#f78fe7", bold = true } +mode_unset = { fg = "#000000", bg = "#db7b5f", bold = true } + +# Progress +progress_label = { fg = "#989898", bold = true } +progress_normal = { fg = "#000000" } +progress_error = { fg = "#ff5f59" } + +# Permissions +permissions_t = { fg = "#2fafff" } +permissions_r = { fg = "#d0bc00" } +permissions_w = { fg = "#ff5f59" } +permissions_x = { fg = "#44bc44" } +permissions_s = { fg = "#989898" } + +[select] +border = { fg = "#C4C4C4" } +active = { fg = "#ffffff", bg = "#646464" } +inactive = { fg = "#ffffff" } + +# Input +[input] +border = { fg = "#00bcff" } +title = {} +value = { fg = "#f78fe7" } +selected = { bg = "#646464" } + +# Completion +[completion] +border = { fg = "#00bcff" } +active = { fg = "#ffffff", bg = "#646464" } +inactive = { fg = "#ffffff" } + +# Tasks +[tasks] +border = { fg = "#C4C4C4" } +title = {} +hovered = { fg = "#ffffff", bg="#646464" } + +# Which +[which] +cols = 3 +mask = { bg = "#0f0f0f" } +cand = { fg = "#00d3d0" } +rest = { fg = "#2fafff" } +desc = { fg = "#feacd0" } +separator = " " +separator_style = { fg = "#989898" } + +# Notify +[notify] +title_info = { fg = "#00bcff" } +title_warn = { fg = "#d0bc00" } +title_error = { fg = "#ff5f59" } + +# Help +[help] +on = { fg = "#44bc44" } +run = { fg = "#feacd0" } +hovered = { bg = "#646464" } +footer = { fg = "#ffffff", bg = "#0f0f0f" } + +[filetype] + +rules = [ + # Images + { mime = "image/*", fg = "#00d3d0" }, + + # Media + { mime = "{audio,video}/*", fg = "#fec43f" }, + + # Archives + { mime = "application/*zip", fg = "#feacd0" }, + { mime = "application/x-{tar,bzip*,7z-compressed,xz,rar}", fg = "#feacd0" }, + + # Documents + { mime = "application/{pdf,doc,rtf,vnd.*}", fg = "#00d3d0" }, + + # Empty files + # { mime = "inode/x-empty", fg = "#ff5f59" }, + + # Special files + { name = "*", is = "orphan", bg = "#ff5f59" }, + { name = "*", is = "exec" , fg = "#44bc44" }, + + { name = "*.rs", fg = "#db7b5f" }, + + # Fallback + { name = "*/", fg = "#2fafff" } +] + diff --git a/config/yazi/yazi.toml b/config/yazi/yazi.toml new file mode 100644 index 0000000..4f05c94 --- /dev/null +++ b/config/yazi/yazi.toml @@ -0,0 +1,7 @@ +[mgr] +sort_by = "mtime" +sort_reverse = true +show_hidden = true +linemode = "size" +scrolloff = 12 +ratio = [1,2,0] diff --git a/config/zk/config.toml b/config/zk/config.toml new file mode 100644 index 0000000..b9d3ca2 --- /dev/null +++ b/config/zk/config.toml @@ -0,0 +1,35 @@ +[notebook] +dir = "~/Documents/Notes" + +[note] +filename = "{{slug title}}" +template = "note.md" + +[extra] +author = "Venomade" + +[format.markdown] +link-format = "wiki" +hashtags = true +colon-tags = false +multiword-tags = true + +[tool] +editor = "nvim" +shell = "/bin/zsh" +fzf-preview = "bat -p --color always {-1}" + +[alias] +todo = "zk edit TODO" + +push = "git fetch && if [ \"$(git rev-parse @)\" = \"$(git rev-parse @{u})\" ]; then git add -A && git commit -m \"Update: $(date '+%Y-%m-%d %H:%M:%S')\" && git push; else echo \"Local branch is not up‑to‑date with the remote; aborting.\"; fi" +pull = "git pull" +history = "git log --pretty=format:\"%s\" | tail -10; echo" + +rm = "rm -i $@.md" + +[lsp] +[lsp.diagnostics] +wiki-title = "hint" +dead-link = "error" +missing-backlink = { level = "warning", position = "bottom" } diff --git a/config/zk/templates/note.md b/config/zk/templates/note.md new file mode 100644 index 0000000..be4c1d2 --- /dev/null +++ b/config/zk/templates/note.md @@ -0,0 +1,6 @@ +--- +title: {{title}} +tags: [] +--- + +{{content}} |
