diff --git a/.config/nvim/.gitignore b/.config/nvim/.gitignore new file mode 100644 index 00000000..3ac74089 --- /dev/null +++ b/.config/nvim/.gitignore @@ -0,0 +1,2 @@ +lazy-lock.json +lazy-lock.json diff --git a/.config/nvim/LICENSE b/.config/nvim/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/.config/nvim/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/.config/nvim/README.md b/.config/nvim/README.md new file mode 100644 index 00000000..64e1bb5f --- /dev/null +++ b/.config/nvim/README.md @@ -0,0 +1,5 @@ +# đŸ’€ FicVim + +My personal Neovim configuration based on [LazyVim](https://github.com/LazyVim/LazyVim). + +Currently I'm using `obsidian.nvim` along with the Obsidian app for my notes and task management. I write all my notes in Neovim and read them or interact with my tasklist in the app. I'm also planning out a plugin which will scan the Obsidian vault for checklist items, populating a buffer as a sort of master todo list. diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 00000000..2514f9ed --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,2 @@ +-- bootstrap lazy.nvim, LazyVim and your plugins +require("config.lazy") diff --git a/.config/nvim/lazyvim.json b/.config/nvim/lazyvim.json new file mode 100644 index 00000000..bef24937 --- /dev/null +++ b/.config/nvim/lazyvim.json @@ -0,0 +1,43 @@ +{ + "extras": [ + "lazyvim.plugins.extras.coding.copilot", + "lazyvim.plugins.extras.coding.copilot-chat", + "lazyvim.plugins.extras.coding.mini-comment", + "lazyvim.plugins.extras.coding.mini-surround", + "lazyvim.plugins.extras.coding.yanky", + "lazyvim.plugins.extras.dap.core", + "lazyvim.plugins.extras.editor.dial", + "lazyvim.plugins.extras.editor.inc-rename", + "lazyvim.plugins.extras.editor.leap", + "lazyvim.plugins.extras.editor.mini-diff", + "lazyvim.plugins.extras.editor.mini-files", + "lazyvim.plugins.extras.editor.mini-move", + "lazyvim.plugins.extras.editor.refactoring", + "lazyvim.plugins.extras.formatting.black", + "lazyvim.plugins.extras.formatting.prettier", + "lazyvim.plugins.extras.lang.clangd", + "lazyvim.plugins.extras.lang.cmake", + "lazyvim.plugins.extras.lang.docker", + "lazyvim.plugins.extras.lang.git", + "lazyvim.plugins.extras.lang.go", + "lazyvim.plugins.extras.lang.java", + "lazyvim.plugins.extras.lang.json", + "lazyvim.plugins.extras.lang.php", + "lazyvim.plugins.extras.lang.python", + "lazyvim.plugins.extras.lang.rust", + "lazyvim.plugins.extras.lang.sql", + "lazyvim.plugins.extras.lang.tex", + "lazyvim.plugins.extras.lang.toml", + "lazyvim.plugins.extras.lang.typescript", + "lazyvim.plugins.extras.lang.yaml", + "lazyvim.plugins.extras.ui.edgy", + "lazyvim.plugins.extras.ui.mini-indentscope", + "lazyvim.plugins.extras.ui.treesitter-context", + "lazyvim.plugins.extras.util.dot", + "lazyvim.plugins.extras.util.mini-hipatterns" + ], + "news": { + "NEWS.md": "6520" + }, + "version": 6 +} \ No newline at end of file diff --git a/.config/nvim/lua/command-key.lua b/.config/nvim/lua/command-key.lua new file mode 100644 index 00000000..bd0c9086 --- /dev/null +++ b/.config/nvim/lua/command-key.lua @@ -0,0 +1,8 @@ +-- TODO: turn this into a plugin? lol +local M = {} + +function M.command(command_name) + vim.cmd('call feedkeys(":' .. command_name .. ' ", "n")') +end + +return M diff --git a/.config/nvim/lua/config/autocmds.lua b/.config/nvim/lua/config/autocmds.lua new file mode 100644 index 00000000..ca561cbc --- /dev/null +++ b/.config/nvim/lua/config/autocmds.lua @@ -0,0 +1,74 @@ +-- Autocmds are automatically loaded on the VeryLazy event +-- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua +-- Add any additional autocmds here +vim.cmd("let &t_ut=''") +vim.api.nvim_create_autocmd({ "FileType" }, { + pattern = { "markdown" }, + callback = function() + vim.opt_local.breakindent = true + vim.opt_local.wrap = true + vim.opt_local.spell = true + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "__", + { desc = "Markdown: Italics", noremap = true, silent = true } + ) + vim.api.nvim_buf_set_keymap(0, "i", "", "- [ ] ", { desc = "Markdown: Task", noremap = true, silent = true }) + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "I# ", + { desc = "Markdown: Heading", noremap = true, silent = true } + ) + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "I## ", + { desc = "Markdown: Heading", noremap = true, silent = true } + ) + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "I### ", + { desc = "Markdown: Heading", noremap = true, silent = true } + ) + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "I#### ", + { desc = "Markdown: Heading", noremap = true, silent = true } + ) + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "I##### ", + { desc = "Markdown: Heading", noremap = true, silent = true } + ) + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "****", + { desc = "Markdown: Bold", noremap = true, silent = true } + ) + vim.api.nvim_buf_set_keymap( + 0, + "i", + "", + "I- ", + { desc = "Markdown: Bullet Point", noremap = true, silent = true } + ) + local wk = require("which-key") + wk.add({ + { "", mode = "i", desc = "Markdown Italics" }, + { "", mode = "i", desc = "Markdown Bold" }, + }) + end, +}) diff --git a/.config/nvim/lua/config/keymaps.lua b/.config/nvim/lua/config/keymaps.lua new file mode 100644 index 00000000..019a515b --- /dev/null +++ b/.config/nvim/lua/config/keymaps.lua @@ -0,0 +1,120 @@ +-- Keymaps are automatically loaded on the VeryLazy event +-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua +-- Add any additional keymaps here +local map = vim.keymap.set +local wk = require("which-key") + +-- unbind ctrl S since it's tmux prefix +-- vim.keymap.del({ "i", "n" }, "") +vim.keymap.set({ "i", "n" }, "", "") + +local dirmap = { + up = "w0", + down = "w$", +} + +local function move_cursor_to(direction) end + +-- TODO: finish this +-- local function scroll(direction) +-- -- current window for now; could extend later +-- local win_id = 0 +-- -- in form {line, column} +-- local current_cursor = vim.api.nvim_win_get_cursor(win_id) +-- +-- -- this is the height of the window in lines +-- local win_height = vim.api.nvim_win_get_height(win_id) +-- +-- local new_top = vim.fn.line(dirmap[direction]) +-- +-- end + +-- Bind arrows to hjkl to my colemak-dh motions work as expected +map({ "n", "x" }, "", "k", { desc = "Up", remap = true }) +map({ "n", "x" }, "", "j", { desc = "Down", remap = true }) +map({ "n", "x" }, "", "h", { desc = "Left", remap = true }) +map({ "n", "x" }, "", "l", { desc = "Right", remap = true }) +-- map({ "n", "x" }, "", function() +-- move_cursor_to("down") +-- end, { desc = "Move cursor to bottom", remap = true }) +-- map({ "n", "x" }, "", function() +-- move_cursor_to("up") +-- end, { desc = "Move cursor to top", remap = true }) +-- map({ "n", "t" }, "", "", { desc = "Switch Window Left", remap = true }) +-- map({ "n", "t" }, "", "", { desc = "Switch Window Right", remap = true }) +-- map({ "n", "t" }, "", "", { remap = true }) +-- map({ "n", "t" }, "", "", { desc = "Switch Window Down", remap = true }) + +map({ "n", "t", "i" }, "", " TmuxNavigateLeft", { desc = "Switch Window Left", remap = true }) +map({ "n", "t", "i" }, "", " TmuxNavigateRight", { desc = "Switch Window Right", remap = true }) +map({ "n", "t", "i" }, "", " TmuxNavigateUp", { remap = true }) +map({ "n", "t", "i" }, "", " TmuxNavigateDown", { desc = "Switch Window Down", remap = true }) + +map({ "x" }, "", "", { remap = true }) +map({ "x" }, "", "", { remap = true }) +map({ "n", "x", "v" }, "", "", { remap = true }) +map({ "n", "x", "v" }, "", "", { remap = true }) +map({ "n" }, "", "H", { desc = "Left Buffer", remap = true }) +map({ "n" }, "", "L", { desc = "Right Buffer", remap = true }) +map({ "n" }, "", "5j", { remap = true }) +map({ "n" }, "", "5k", { remap = true }) +map({ "i" }, "", "", { desc = "Escape insert mode", remap = true }) +-- + +-- Remap spelling suggestions +-- map({ "n" }, "z-", "z=", { desc = "Spelling Suggestions", remap = true }) + +-- Oil.nvim open parent directory +map("n", "-", "Oil", { desc = "Open Oil" }) + +-- TODO: add leader + y for save current buf, leader + Y to write all +map({ "n", "x" }, "y", "w", { desc = "Save" }) +map({ "n", "x" }, "Y", "wa", { desc = "Save All" }) + +-- Zen Mode +map("n", "uz", "ZenMode", { desc = "Toggle Zen Mode" }) + +-- Source Current File +map("n", "x", "source %", { desc = "Source current file" }) + +-- Obsidian +-- o is the prefix for all Obsidian bindings + +wk.add({ + { "o", group = "Obsidian" }, + { "od", group = "Daily Note" }, + { "ol", group = "Follow Link" }, +}) + +map("n", "oo", "ObsidianQuickSwitch", { desc = "Obsidian Quick Switch" }) +map("n", "o/", "ObsidianSearch", { desc = "Obsidian Grep" }) +-- This one will open the command line and let the user type the arg +map("n", "on", function() + require("command-key").command("ObsidianNew") +end, { desc = "Obsidian New Note" }) +map("n", "ob", "ObsidianBacklinks", { desc = "Obsidian Backlinks" }) +-- map("n", "ot", function() +-- require("command-key").command("ObsidianTags") +-- end, { desc = "Obsidian Tags" }) + +map("n", "ot", "ObsidianTags", { desc = "Obsidian Tags" }) +map("n", "olv", "ObsidianFollowLink vsplit", { desc = "Obsidian Follow Link Vsplit" }) +map("n", "olh", "ObsidianFollowLink hsplit", { desc = "Obsidian Follow Link Hsplit" }) +map("n", "odt", "ObsidianToday", { desc = "Obsidian Open Today's Daily" }) +map("n", "ods", "ObsidianDailies", { desc = "Obsidian Search Dailies" }) +map("n", "ols", "ObsidianLinks", { desc = "Obsidian Search Links" }) +map("x", "oll", function() + require("command-key").command("ObsidianLink") +end, { desc = "Obsidian Link Visual To Existing Note" }) +map("x", "oln", function() + require("command-key").command("ObsidianLinkNew") +end, { desc = "Obsidian Link Visual To New Note" }) +map("x", "ole", function() + require("command-key").command("ObsidianExtractNote") +end, { desc = "Obsidian Copy Selection To New Note & Link" }) + +map("n", "or", function() + require("command-key").command("ObsidianRename") +end, { desc = "Obsidian Rename" }) +map("n", "oc", "ObsidianTOC", { desc = "Obsidian Table Of Contents" }) +-- TODO: Add binds for templates diff --git a/.config/nvim/lua/config/lazy.lua b/.config/nvim/lua/config/lazy.lua new file mode 100644 index 00000000..d73bfa10 --- /dev/null +++ b/.config/nvim/lua/config/lazy.lua @@ -0,0 +1,53 @@ +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) + +require("lazy").setup({ + spec = { + -- add LazyVim and import its plugins + { "LazyVim/LazyVim", import = "lazyvim.plugins" }, + -- import/override with your plugins + { import = "plugins" }, + }, + defaults = { + -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. + -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. + lazy = false, + -- It's recommended to leave version=false for now, since a lot the plugin that support versioning, + -- have outdated releases, which may break your Neovim install. + version = false, -- always use the latest git commit + -- version = "*", -- try installing the latest stable version for plugins that support semver + }, + install = { colorscheme = { "tokyonight", "habamax" } }, + checker = { + enabled = true, -- check for plugin updates periodically + notify = false, -- notify on update + }, -- automatically check for plugin updates + performance = { + rtp = { + -- disable some rtp plugins + disabled_plugins = { + "gzip", + -- "matchit", + -- "matchparen", + -- "netrwPlugin", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/.config/nvim/lua/config/options.lua b/.config/nvim/lua/config/options.lua new file mode 100644 index 00000000..545f7973 --- /dev/null +++ b/.config/nvim/lua/config/options.lua @@ -0,0 +1,4 @@ +-- Options are automatically loaded before lazy.nvim startup +-- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua +-- Add any additional options here +vim.o.scrolloff = 2 diff --git a/.config/nvim/lua/plugins/colorscheme-old b/.config/nvim/lua/plugins/colorscheme-old new file mode 100644 index 00000000..58ee783a --- /dev/null +++ b/.config/nvim/lua/plugins/colorscheme-old @@ -0,0 +1,103 @@ +local dev = false +-- local theme = "darkvoid" +local theme = "kanagawa-dragon" + +-- #0f0f0f +-- #933737 +-- #A23D3D +-- #994848 +-- #7B7F80 +-- #7C8080 +-- #8D8D8D +-- #d4d4d4 +-- #949494 +-- #933737 +-- #A23D3D +-- #994848 +-- #7B7F80 +-- #7C8080 +-- #8D8D8D +-- #d4d4d4 +return { + -- { "rebelot/kanagawa.nvim" }, + { + "aliqyan-21/darkvoid.nvim", + -- dir = dev and "~/dev/darkvoid.nvim" or false, + opts = { + glow = false, + -- colors = { + -- fg = "#c0c0c0", + -- bg = "#1c1c1c", + -- -- bg = "#000000", + -- cursor = "#bdfe58", + -- line_nr = "#404040", + -- visual = "#303030", + -- comment = "#585858", + -- string = "#d1d1d1", + -- func = "#e1e1e1", + -- kw = "#f1f1f1", + -- identifier = "#b1b1b1", + -- type = "#a1a1a1", + -- type_builtin = "#c5c5c5", -- current + -- -- type_builtin = "#8cf8f7", -- glowy blue old (was present by default before type_builtin was introduced added here for people who may like it) + -- search_highlight = "#1bfd9c", + -- operator = "#1bfd9c", + -- bracket = "#e6e6e6", + -- preprocessor = "#4b8902", + -- bool = "#66b2b2", + -- constant = "#b2d8d8", + -- -- special = "#8cf8f7", + -- + -- -- enable or disable specific plugin highlights + -- plugins = { + -- gitsigns = true, + -- nvim_cmp = true, + -- treesitter = true, + -- nvimtree = true, + -- telescope = true, + -- lualine = true, + -- bufferline = true, + -- oil = true, + -- whichkey = true, + -- nvim_notify = true, + -- -- leap = true, + -- }, + -- + -- -- gitsigns colors + -- added = "#baffc9", + -- changed = "#ffffba", + -- removed = "#ffb3ba", + -- + -- -- Pmenu colors + -- pmenu_bg = "#1c1c1c", + -- pmenu_sel_bg = "#1bfd9c", + -- pmenu_fg = "#c0c0c0", + -- + -- -- EndOfBuffer color + -- eob = "#3c3c3c", + -- + -- -- Telescope specific colors + -- border = "#585858", + -- title = "#bdfe58", + -- + -- -- bufferline specific colors + -- bufferline_selection = "#1bfd9c", + -- + -- -- LSP diagnostics colors + -- error = "#dea6a0", + -- warning = "#d6efd8", + -- hint = "#bedc74", + -- info = "#7fa1c3", + -- }, + }, + }, + { + "LazyVim/LazyVim", + opts = { + -- colorscheme = theme, + colorscheme = function() + return { require("darkvoid").load() } + end, + }, + }, +} diff --git a/.config/nvim/lua/plugins/copilot.lua b/.config/nvim/lua/plugins/copilot.lua new file mode 100644 index 00000000..82428823 --- /dev/null +++ b/.config/nvim/lua/plugins/copilot.lua @@ -0,0 +1,28 @@ +return { + { + "zbirenbaum/copilot-cmp", + opts = function() + local copilot_toggle = require("lazyvim.util.toggle").wrap({ + name = "Copilot Completion", + get = function() + return not require("copilot.client").is_disabled() + end, + set = function(state) + if state then + require("copilot.command").enable() + else + require("copilot.command").disable() + end + end, + }) + + -- disable by default + require("copilot.command").disable() + + LazyVim.toggle.map("at", copilot_toggle) + end, + }, + { "CopilotC-Nvim/CopilotChat.nvim", opts = { + auto_insert_mode = false, + } }, +} diff --git a/.config/nvim/lua/plugins/copliot.lua.bak b/.config/nvim/lua/plugins/copliot.lua.bak new file mode 100644 index 00000000..d6b70f2d --- /dev/null +++ b/.config/nvim/lua/plugins/copliot.lua.bak @@ -0,0 +1,112 @@ +-- return { +-- { +-- "zbirenbaum/copilot.lua", +-- cmd = "Copilot", +-- build = ":Copilot auth", +-- opts = { +-- suggestion = { enabled = false }, +-- panel = { enabled = false }, +-- filetypes = { +-- markdown = true, +-- help = true, +-- }, +-- }, +-- keys = { +-- { +-- "at", +-- function() +-- if require("copilot.client").is_disabled() then +-- require("copilot.command").enable() +-- else +-- require("copilot.command").disable() +-- end +-- end, +-- desc = "Toggle (Copilot)", +-- }, +-- }, +-- }, +-- { +-- "folke/which-key.nvim", +-- opts = { +-- icons = { +-- rules = { +-- { plugin = "copilot.lua", icon = " ", color = "orange" } +-- } +-- } +-- } +-- }, +-- { +-- "nvim-cmp", +-- dependencies = { +-- { +-- "zbirenbaum/copilot-cmp", +-- dependencies = "copilot.lua", +-- opts = {}, +-- config = function(_, opts) +-- local copilot_cmp = require("copilot_cmp") +-- copilot_cmp.setup(opts) +-- -- attach cmp source whenever copilot attaches +-- -- fixes lazy-loading issues with the copilot cmp source +-- LazyVim.lsp.on_attach(function(client) +-- copilot_cmp._on_insert_enter({}) +-- end, "copilot") +-- end, +-- }, +-- }, +-- ---@param opts cmp.ConfigSchema +-- opts = function(_, opts) +-- table.insert(opts.sources, 1, { +-- name = "copilot", +-- group_index = 1, +-- priority = 100, +-- }) +-- end, +-- }, +-- { +-- "zbirenbaum/copilot-cmp", +-- -- enabled = false, +-- dependencies = "copilot.lua", +-- opts = {}, +-- config = function(_, opts) +-- local copilot_cmp = require("copilot_cmp") +-- copilot_cmp.setup(opts) +-- -- attach cmp source whenever copilot attaches +-- -- fixes lazy-loading issues with the copilot cmp source +-- LazyVim.lsp.on_attach(function(client) +-- copilot_cmp._on_insert_enter({}) +-- end, "copilot") +-- end, +-- }, +-- { +-- "CopilotC-Nvim/CopilotChat.nvim", +-- opts = function() +-- local user = vim.env.USER or "User" +-- user = user:sub(1, 1):upper() .. user:sub(2) +-- return { +-- auto_insert_mode = false, +-- show_help = true, +-- question_header = " " .. user .. " ", +-- answer_header = "ï’ž Copilot ", +-- window = { +-- width = 0.4, +-- }, +-- selection = function(source) +-- local select = require("CopilotChat.select") +-- return select.visual(source) or select.buffer(source) +-- end, +-- } +-- end, +-- }, +-- { +-- "folke/edgy.nvim", +-- optional = true, +-- opts = function(_, opts) +-- opts.right = opts.right or {} +-- table.insert(opts.right, { +-- ft = "copilot-chat", +-- title = "Copilot Chat", +-- size = { width = 100 }, +-- }) +-- end, +-- }, +-- } diff --git a/.config/nvim/lua/plugins/dashboard.lua b/.config/nvim/lua/plugins/dashboard.lua new file mode 100644 index 00000000..1291f452 --- /dev/null +++ b/.config/nvim/lua/plugins/dashboard.lua @@ -0,0 +1,102 @@ +return { + "nvimdev/dashboard-nvim", + lazy = false, -- As https://github.com/nvimdev/dashboard-nvim/pull/450, dashboard-nvim shouldn't be lazy-loaded to properly handle stdin. + opts = function() + -- local logo = [[ + -- ██╗ █████╗ ███████╗██╗ ██╗██╗ ██╗██╗███╗ ███╗ Z + -- ██║ ██╔══██╗╚══███╔╝╚██╗ ██╔╝██║ ██║██║████╗ ████║ Z + -- ██║ ███████║ ███╔╝ ╚████╔╝ ██║ ██║██║██╔████╔██║ z + -- ██║ ██╔══██║ ███╔╝ ╚██╔╝ ╚██╗ ██╔╝██║██║╚██╔╝██║ z + -- ███████╗██║ ██║███████╗ ██║ ╚████╔╝ ██║██║ ╚═╝ ██║ + -- ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝ + -- ]] + + local saturn = [[ + _.oo. + _.u[[/;:,. .odMMMMMM' + .o888UU[[[/;:-. .o@P^ MMM^ + oN88888UU[[[/;::-. dP^ + dNMMNN888UU[[[/;:--. .o@P^ + ,MMMMMMN888UU[[/;::-. o@^ + NNMMMNN888UU[[[/~.o@P^ + 888888888UU[[[/o@^-.. + oI8888UU[[[/o@P^:--.. + .@^ YUU[[[/o@^;::---.. + oMP ^/o@P^;:::---.. + .dMMM .o@^ ^;::---... + dMMMMMMM@^` `^^^^ +YMMMUP^ + ^^ +]] + + -- logo = string.rep("\n", 8) .. logo .. "\n\n" + saturn = string.rep("\n", 8) .. saturn .. "\n\n" + + local function loadObsidian() + -- require("lazy").setup(require("plugins.obsidian")) + require("obsidian") + -- vim.api.nvim_input("ObsidianWorkspace") + vim.api.nvim_input("ObsidianTags") + end + local function openConfig() + local dir = "~/.config/nvim/" + vim.api.nvim_set_current_dir(dir) + vim.cmd("edit" .. dir) + end + + local opts = { + theme = "doom", + hide = { + -- this is taken care of by lualine + -- enabling this messes up the actual laststatus setting after loading a file + statusline = false, + }, + config = { + -- header = vim.split(logo, "\n"), + header = vim.split(saturn, "\n"), + -- stylua: ignore + center = { + -- { action = function() vim.cmd("edit " .. "~/second-brain/00-index/00-index.md") end, desc = " Open Obsidian Vault", icon = " ", key = "o" }, + -- { action = 'lua LazyVim.pick()()', desc = " Find File", icon = " ", key = "f" }, + -- { action = loadObsidian, desc = " Obsidian Tags", icon = "󱀇 ", key = "o" }, + { action = "ene | startinsert", desc = " New File", icon = " ", key = "n" }, + { action = 'lua LazyVim.pick("oldfiles")()', desc = " Recent Files", icon = " ", key = "r" }, + -- { action = 'lua LazyVim.pick("live_grep")()', desc = " Grep", icon = "ï€ą ", key = "/" }, + -- { action = function() LazyVim.lazygit( { cwd = LazyVim.root.git() }) end, desc = " Git", icon = " ", key = "g" }, + { action = 'lua LazyVim.pick.config_files()()', desc = " Search Config", icon = "ïŁ ", key = "c" }, + -- { action = openConfig, desc = " Open Config", icon = " ", key = "c" }, + { action = 'lua require("persistence").load()', desc = " Restore Session", icon = " ", key = "s" }, + -- { action = 'lua require("persistence").select()', desc = " Select Session", icon = "󱊞 ", key = "S" }, + { action = "LazyExtras", desc = " Lazy Extras", icon = "îȘŒ ", key = "x" }, + { action = "Lazy", desc = " Lazy", icon = "ó°’Č ", key = "l" }, + { action = function() vim.api.nvim_input("qa") end, desc = " Quit", icon = " ", key = "q" }, + }, + footer = function() + local stats = require("lazy").stats() + local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100) + return { "⚡ Neovim loaded " .. stats.loaded .. "/" .. stats.count .. " plugins in " .. ms .. "ms" } + end, + }, + } + + for _, button in ipairs(opts.config.center) do + button.desc = button.desc .. string.rep(" ", 43 - #button.desc) + button.key_format = " %s" + end + + -- open dashboard after closing lazy + if vim.o.filetype == "lazy" then + vim.api.nvim_create_autocmd("WinClosed", { + pattern = tostring(vim.api.nvim_get_current_win()), + once = true, + callback = function() + vim.schedule(function() + vim.api.nvim_exec_autocmds("UIEnter", { group = "dashboard" }) + end) + end, + }) + end + + return opts + end, +} diff --git a/.config/nvim/lua/plugins/disabled.lua b/.config/nvim/lua/plugins/disabled.lua new file mode 100644 index 00000000..7267f046 --- /dev/null +++ b/.config/nvim/lua/plugins/disabled.lua @@ -0,0 +1,8 @@ +return { + { "nvim-neo-tree/neo-tree.nvim", enabled = false }, + { "folke/tokyonight.nvim", enabled = false }, +} +-- TODO: +-- figure out how to make markdown extra work together with Obsidian, disable it for now +-- either I can use the extra in markdown files but disable it and use obsidian in vault md files +-- OR find some way for them to coexist? diff --git a/.config/nvim/lua/plugins/example.lua b/.config/nvim/lua/plugins/example.lua new file mode 100644 index 00000000..4ad9825d --- /dev/null +++ b/.config/nvim/lua/plugins/example.lua @@ -0,0 +1,193 @@ +-- since this is just an example spec, don't actually load anything here and return an empty spec +-- stylua: ignore +if true then return {} end + +-- every spec file under the "plugins" directory will be loaded automatically by lazy.nvim +-- +-- In your plugin files, you can: +-- * add extra plugins +-- * disable/enabled LazyVim plugins +-- * override the configuration of LazyVim plugins +return { + -- add gruvbox + { "ellisonleao/gruvbox.nvim" }, + + -- Configure LazyVim to load gruvbox + { + "LazyVim/LazyVim", + opts = { + colorscheme = "gruvbox", + }, + }, + + -- change trouble config + { + "folke/trouble.nvim", + -- opts will be merged with the parent spec + opts = { use_diagnostic_signs = true }, + }, + + -- disable trouble + { "folke/trouble.nvim", enabled = false }, + + -- override nvim-cmp and add cmp-emoji + { + "hrsh7th/nvim-cmp", + dependencies = { "hrsh7th/cmp-emoji" }, + ---@param opts cmp.ConfigSchema + opts = function(_, opts) + table.insert(opts.sources, { name = "emoji" }) + end, + }, + + -- change some telescope options and a keymap to browse plugin files + { + "nvim-telescope/telescope.nvim", + keys = { + -- add a keymap to browse plugin files + -- stylua: ignore + { + "fp", + function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end, + desc = "Find Plugin File", + }, + }, + -- change some options + opts = { + defaults = { + layout_strategy = "horizontal", + layout_config = { prompt_position = "top" }, + sorting_strategy = "ascending", + winblend = 0, + }, + }, + }, + + -- add pyright to lspconfig + { + "neovim/nvim-lspconfig", + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- pyright will be automatically installed with mason and loaded with lspconfig + pyright = {}, + }, + }, + }, + + -- add tsserver and setup with typescript.nvim instead of lspconfig + { + "neovim/nvim-lspconfig", + dependencies = { + "jose-elias-alvarez/typescript.nvim", + init = function() + require("lazyvim.util").lsp.on_attach(function(_, buffer) + -- stylua: ignore + vim.keymap.set( "n", "co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" }) + vim.keymap.set("n", "cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer }) + end) + end, + }, + ---@class PluginLspOpts + opts = { + ---@type lspconfig.options + servers = { + -- tsserver will be automatically installed with mason and loaded with lspconfig + tsserver = {}, + }, + -- you can do any additional lsp server setup here + -- return true if you don't want this server to be setup with lspconfig + ---@type table + setup = { + -- example to setup with typescript.nvim + tsserver = function(_, opts) + require("typescript").setup({ server = opts }) + return true + end, + -- Specify * to use this function as a fallback for any server + -- ["*"] = function(server, opts) end, + }, + }, + }, + + -- for typescript, LazyVim also includes extra specs to properly setup lspconfig, + -- treesitter, mason and typescript.nvim. So instead of the above, you can use: + { import = "lazyvim.plugins.extras.lang.typescript" }, + + -- add more treesitter parsers + { + "nvim-treesitter/nvim-treesitter", + opts = { + ensure_installed = { + "bash", + "html", + "javascript", + "json", + "lua", + "markdown", + "markdown_inline", + "python", + "query", + "regex", + "tsx", + "typescript", + "vim", + "yaml", + }, + }, + }, + + -- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above + -- would overwrite `ensure_installed` with the new value. + -- If you'd rather extend the default config, use the code below instead: + { + "nvim-treesitter/nvim-treesitter", + opts = function(_, opts) + -- add tsx and treesitter + vim.list_extend(opts.ensure_installed, { + "tsx", + "typescript", + }) + end, + }, + + -- the opts function can also be used to change the default opts: + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function(_, opts) + table.insert(opts.sections.lualine_x, "😄") + end, + }, + + -- or you can return new options to override all the defaults + { + "nvim-lualine/lualine.nvim", + event = "VeryLazy", + opts = function() + return { + --[[add your custom lualine config here]] + } + end, + }, + + -- use mini.starter instead of alpha + { import = "lazyvim.plugins.extras.ui.mini-starter" }, + + -- add jsonls and schemastore packages, and setup treesitter for json, json5 and jsonc + { import = "lazyvim.plugins.extras.lang.json" }, + + -- add any tools you want to have installed below + { + "williamboman/mason.nvim", + opts = { + ensure_installed = { + "stylua", + "shellcheck", + "shfmt", + "flake8", + }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/extend-mini-animate.lua.bak b/.config/nvim/lua/plugins/extend-mini-animate.lua.bak new file mode 100644 index 00000000..4d975015 --- /dev/null +++ b/.config/nvim/lua/plugins/extend-mini-animate.lua.bak @@ -0,0 +1,52 @@ +return { + "echasnovski/mini.animate", + recommended = true, + event = "VeryLazy", + opts = function() + -- don't use animate when scrolling with the mouse + local mouse_scrolled = false + for _, scroll in ipairs({ "Up", "Down" }) do + local key = "" + vim.keymap.set({ "", "i" }, key, function() + mouse_scrolled = true + return key + end, { expr = true }) + end + + vim.api.nvim_create_autocmd("FileType", { + pattern = "grug-far", + callback = function() + vim.b.minianimate_disable = true + end, + }) + + LazyVim.toggle.map("ua", { + name = "Mini Animate", + get = function() + return not vim.g.minianimate_disable + end, + set = function(state) + vim.g.minianimate_disable = not state + end, + }) + + local animate = require("mini.animate") + return { + resize = { + timing = animate.gen_timing.linear({ duration = 50, unit = "total" }), + }, + scroll = { + timing = animate.gen_timing.linear({ duration = 50, unit = "total" }), + subscroll = animate.gen_subscroll.equal({ + predicate = function(total_scroll) + if mouse_scrolled then + mouse_scrolled = false + return false + end + return total_scroll > 1 + end, + }), + }, + } + end, +} diff --git a/.config/nvim/lua/plugins/extend-mini-files.lua b/.config/nvim/lua/plugins/extend-mini-files.lua new file mode 100644 index 00000000..42c2a958 --- /dev/null +++ b/.config/nvim/lua/plugins/extend-mini-files.lua @@ -0,0 +1,33 @@ +return { + "echasnovski/mini.files", + keys = { + { + "e", + function() + require("mini.files").open(vim.api.nvim_buf_get_name(0), true) + end, + desc = "Open mini.files (current file directory)", + }, + { + "E", + function() + require("mini.files").open(vim.uv.cwd(), true) + end, + desc = "Open mini.files (cwd)", + }, + { + "fm", + function() + require("mini.files").open(LazyVim.root(), true) + end, + desc = "Open mini.files (root)", + }, + }, + opts = { + mappings = { + go_in_plus = "", + -- go_out = "", + -- reset = "-", + }, + }, +} diff --git a/.config/nvim/lua/plugins/lazy.lua b/.config/nvim/lua/plugins/lazy.lua new file mode 100644 index 00000000..00a24a93 --- /dev/null +++ b/.config/nvim/lua/plugins/lazy.lua @@ -0,0 +1,8 @@ +return { + "folke/lazy.nvim", + opts = { + install = { + colorscheme = { "noirbuddy" }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/lualine.lua b/.config/nvim/lua/plugins/lualine.lua new file mode 100644 index 00000000..0618251d --- /dev/null +++ b/.config/nvim/lua/plugins/lualine.lua @@ -0,0 +1,20 @@ +-- local noirbuddy_lualine = require("noirbuddy.plugins.lualine") +return { + "nvim-lualine/lualine.nvim", + dependencies = { + "jesseleite/nvim-noirbuddy", + }, + config = function() + local noirbuddy_lualine = require("noirbuddy.plugins.lualine") + local theme = noirbuddy_lualine.theme + local sections = noirbuddy_lualine.sections + local inactive_sections = noirbuddy_lualine.inactive_sections + require("lualine").setup({ + options = { + theme = theme, + }, + sections = sections, + inactive_sections = inactive_sections, + }) + end, +} diff --git a/.config/nvim/lua/plugins/neorg.lua.bak b/.config/nvim/lua/plugins/neorg.lua.bak new file mode 100644 index 00000000..4d55710d --- /dev/null +++ b/.config/nvim/lua/plugins/neorg.lua.bak @@ -0,0 +1,52 @@ +-- return { +-- { +-- "nvim-neorg/neorg", +-- lazy = true, -- Disable lazy loading as some `lazy.nvim` distributions set `lazy = true` by default +-- version = "*", -- Pin Neorg to the latest stable release +-- config = { +-- load = { +-- -- ["external.conceal-wrap"] = {}, +-- -- ["external.context"] = {}, +-- ["core.defaults"] = {}, +-- ["core.concealer"] = {}, +-- ["core.export"] = {}, +-- ["core.export.markdown"] = {}, +-- ["core.journal"] = {}, +-- ["core.queries.native"] = {}, +-- -- ["core.integrations.zen_mode"] = {}, +-- -- ["core.presenter"] = { +-- -- config = { +-- -- zen_mode = "zen-mode", +-- -- }, +-- -- }, +-- ["core.summary"] = {}, +-- ["core.text-objects"] = {}, +-- -- ["core.latex.renderer"] = {}, +-- ["core.completion"] = { +-- config = { +-- engine = "nvim-cmp", +-- }, +-- }, +-- ["core.keybinds"] = { +-- config = { +-- default_keybinds = true, +-- preset = "neorg", +-- }, +-- }, +-- ["core.dirman"] = { +-- config = { +-- workspaces = { +-- notes = "/home/fic/notes", +-- }, +-- default_workspace = "notes", +-- index = "index.norg", +-- }, +-- }, +-- }, +-- }, +-- dependencies = { +-- -- "benlubas/neorg-conceal-wrap", +-- "max397574/neorg-contexts", +-- }, +-- }, +-- } diff --git a/.config/nvim/lua/plugins/noirbuddy.lua b/.config/nvim/lua/plugins/noirbuddy.lua new file mode 100644 index 00000000..e4de632d --- /dev/null +++ b/.config/nvim/lua/plugins/noirbuddy.lua @@ -0,0 +1,48 @@ +-- #0f0f0f +-- #933737 +-- #A23D3D +-- #994848 +-- #7B7F80 +-- #7C8080 +-- #8D8D8D +-- #d4d4d4 +-- #949494 +-- #933737 +-- #A23D3D +-- #994848 +-- #7B7F80 +-- #7C8080 +-- #8D8D8D +-- #d4d4d4 +local noiropts = { + -- preset = "miami-nights", + colors = { + primary = "#994848", + secondary = "#933737", + -- background = "#0f0f0f", + diagnostic_error = "#EC0034", + diagnostic_warning = "#ff7700", + diagnostic_info = "#d5d5d5", + diagnostic_hint = "#f5f5f5", + diff_add = "#f5f5f5", + diff_change = "#737373", + diff_delete = "#EC0034", + }, +} +return { + { + "jesseleite/nvim-noirbuddy", + lazy = false, + dependencies = { + { "tjdevries/colorbuddy.nvim" }, + }, + }, + { + "LazyVim/LazyVim", + opts = { + colorscheme = function() + require("noirbuddy").setup(noiropts) + end, + }, + }, +} diff --git a/.config/nvim/lua/plugins/nvim-cmp.lua b/.config/nvim/lua/plugins/nvim-cmp.lua new file mode 100644 index 00000000..f6096794 --- /dev/null +++ b/.config/nvim/lua/plugins/nvim-cmp.lua @@ -0,0 +1,14 @@ +return { + { + "hrsh7th/nvim-cmp", + -- dependencies = { + -- "jesseleite/nvim-noirbuddy", + -- }, + -- config = function() + -- require("cmp").setup({ + -- window = require("noirbuddy.plugins.cmp").window, + -- }) + -- end, + -- }, + }, +} diff --git a/.config/nvim/lua/plugins/nvim-orgmode.lua.bak b/.config/nvim/lua/plugins/nvim-orgmode.lua.bak new file mode 100644 index 00000000..4fdcee5b --- /dev/null +++ b/.config/nvim/lua/plugins/nvim-orgmode.lua.bak @@ -0,0 +1,19 @@ +-- return { +-- "nvim-orgmode/orgmode", +-- event = "VeryLazy", +-- ft = { "org" }, +-- config = function() +-- -- Setup orgmode +-- require("orgmode").setup({ +-- org_agenda_files = "~/orgfiles/**/*", +-- org_default_notes_file = "~/orgfiles/refile.org", +-- }) +-- +-- -- NOTE: If you are using nvim-treesitter with ~ensure_installed = "all"~ option +-- -- add ~org~ to ignore_install +-- -- require('nvim-treesitter.configs').setup({ +-- -- ensure_installed = 'all', +-- -- ignore_install = { 'org' }, +-- -- }) +-- end, +-- } diff --git a/.config/nvim/lua/plugins/obsidian.lua b/.config/nvim/lua/plugins/obsidian.lua new file mode 100644 index 00000000..beb6db6b --- /dev/null +++ b/.config/nvim/lua/plugins/obsidian.lua @@ -0,0 +1,117 @@ +return { + "epwalsh/obsidian.nvim", + version = "*", -- recommended, use latest release instead of latest commit + lazy = false, + -- lazy = true, + -- ft = "markdown", + -- Replace the above line with this if you only want to load obsidian.nvim for markdown files in your vault: + event = { + -- If you want to use the home shortcut '~' here you need to call 'vim.fn.expand'. + -- E.g. "BufReadPre " .. vim.fn.expand "~" .. "/my-vault/*.md" + -- refer to `:h file-pattern` for more examples + "BufReadPre /home/fic/second-brain/*.md", + "BufNewFile /home/fic/second-brain/*.md", + }, + dependencies = { + -- Required. + "nvim-lua/plenary.nvim", + "epwalsh/pomo.nvim", + }, + opts = { + workspaces = { + { + name = "second-brain", + path = "~/second-brain", + }, + }, + notes_subdir = "fleeting", + daily_notes = { + folder = "dailies", + date_format = "%Y-%m-%d", + alias_format = "%m %d %Y", + default_tags = { "daily_notes" }, + template = nil, + }, + completion = { + -- Set to false to disable completion. + nvim_cmp = true, + -- Trigger completion at 2 chars. + min_chars = 2, + }, + mappings = { + -- Overrides the 'gf' mapping to work on markdown/wiki links within your vault. + ["gf"] = { + action = function() + return require("obsidian").util.gf_passthrough() + end, + opts = { noremap = false, expr = true, buffer = true }, + }, + -- Toggle check-boxes. + ["ch"] = { + action = function() + return require("obsidian").util.toggle_checkbox() + end, + opts = { buffer = true }, + }, + + -- Smart action depending on context, either follow link or toggle checkbox. + [""] = { + action = function() + local o = require("obsidian").util + if o.cursor_on_markdown_link(nil, nil, true) then + return "ObsidianFollowLink" + end + -- return require("obsidian").util.smart_action() + -- end, + end, + opts = { buffer = true, expr = true }, + }, + }, + new_notes_location = "current_dir", + -- Optional, customize how note IDs are generated given an optional title. + ---@param title string|? + ---@return string + note_id_func = function(title) + -- Create note IDs in a Zettelkasten format with a timestamp and a suffix. + -- In this case a note with the title 'My new note' will be given an ID that looks + -- like '1657296016-my-new-note', and therefore the file name '1657296016-my-new-note.md' + local suffix = "" + if title ~= nil then + -- If title is given, transform it into valid file name. + suffix = title:gsub(" ", "-"):gsub("[^A-Za-z0-9-]", ""):lower() + else + -- If title is nil, just add 4 random uppercase letters to the suffix. + for _ = 1, 4 do + suffix = suffix .. string.char(math.random(65, 90)) + end + end + return tostring(os.time()) .. "-" .. suffix + end, + + -- Optional, customize how note file names are generated given the ID, target directory, and title. + ---@param spec { id: string, dir: obsidian.Path, title: string|? } + ---@return string|obsidian.Path The full path to the new note. + note_path_func = function(spec) + -- This is equivalent to the default behavior. + local path + if spec.title then + path = spec.dir / tostring(spec.title) + else + path = spec.dir / tostring(spec.id) + end + return path:with_suffix(".md") + end, + templates = { + folder = "Utility/Templates", + date_format = "%M %d %Y", + time_format = "%H:%M", + -- A map for custom variables, the key should be the variable and the value a function + substitutions = {}, + }, + picker = { + name = "telescope.nvim", + }, + search_max_lines = 1000, + -- open_notes_in = "vsplit", + }, +} diff --git a/.config/nvim/lua/plugins/oil.lua b/.config/nvim/lua/plugins/oil.lua new file mode 100644 index 00000000..494cfe1e --- /dev/null +++ b/.config/nvim/lua/plugins/oil.lua @@ -0,0 +1,23 @@ +return { + "stevearc/oil.nvim", + ---@module 'oil' + ---@type oil.SetupOpts + opts = { + default_file_explorer = true, + delete_to_trash = true, + columns = { + "icon", + "size", + -- TODO: + -- Add a keybind to toggle permissions view? + -- There's a recipe for this in the docs + -- "permissions", + }, + keymaps = { + -- [""] = "actions.parent", + }, + }, + -- Optional dependencies + dependencies = { { "echasnovski/mini.icons", opts = {} } }, + -- dependencies = { "nvim-tree/nvim-web-devicons" }, -- use if prefer nvim-web-devicons +} diff --git a/.config/nvim/lua/plugins/ts.lua b/.config/nvim/lua/plugins/ts.lua new file mode 100644 index 00000000..5b5ae19d --- /dev/null +++ b/.config/nvim/lua/plugins/ts.lua @@ -0,0 +1 @@ +return { "nvim-treesitter/playground" } diff --git a/.config/nvim/lua/plugins/twilight.lua b/.config/nvim/lua/plugins/twilight.lua new file mode 100644 index 00000000..6e61e904 --- /dev/null +++ b/.config/nvim/lua/plugins/twilight.lua @@ -0,0 +1,25 @@ +return { + "folke/twilight.nvim", + opts = { + { + dimming = { + alpha = 0.25, -- amount of dimming + -- we try to get the foreground from the highlight groups or fallback color + color = { "Normal", "#ffffff" }, + term_bg = "#000000", -- if guibg=NONE, this will be used to calculate text color + inactive = false, -- when true, other windows will be fully dimmed (unless they contain the same buffer) + }, + context = 20, -- amount of lines we will try to show around the current line + treesitter = true, -- use treesitter when available for the filetype + -- treesitter is used to automatically expand the visible text, + -- but you can further control the types of nodes that should always be fully expanded + expand = { -- for treesitter, we we always try to expand to the top-most ancestor with these types + "function", + "method", + "table", + "if_statement", + }, + exclude = {}, -- exclude these filetypes + }, + }, +} diff --git a/.config/nvim/lua/plugins/vim-dirtytalk.lua b/.config/nvim/lua/plugins/vim-dirtytalk.lua new file mode 100644 index 00000000..517e938c --- /dev/null +++ b/.config/nvim/lua/plugins/vim-dirtytalk.lua @@ -0,0 +1,9 @@ +return { + "psliwka/vim-dirtytalk", + build = ":DirtytalkUpdate", + config = function() + vim.opt.spelllang = { "en", "programming" } + end, + -- Note: let g:dirtytalk_blacklist=['lorem-ipsum'] to disable a wordlist + -- Mus run :DirtytalkUpdate after making this change +} diff --git a/.config/nvim/lua/plugins/vim-tmux-navigator.lua b/.config/nvim/lua/plugins/vim-tmux-navigator.lua new file mode 100644 index 00000000..6efe1fe5 --- /dev/null +++ b/.config/nvim/lua/plugins/vim-tmux-navigator.lua @@ -0,0 +1,4 @@ +return { + "christoomey/vim-tmux-navigator", + lazy = false, +} diff --git a/.config/nvim/lua/plugins/zen-mode.lua b/.config/nvim/lua/plugins/zen-mode.lua new file mode 100644 index 00000000..8171b55e --- /dev/null +++ b/.config/nvim/lua/plugins/zen-mode.lua @@ -0,0 +1,24 @@ +return { + "folke/zen-mode.nvim", + opts = { + window = { + options = { + signcolumn = "no", + -- number = false, + -- relativenumber = false, + -- cursorline = false, + foldcolumn = "0", + list = false, + }, + }, + plugins = { + options = {}, + twilight = { enabled = false }, + kitty = { + enabled = false, + -- enabled = true, + font = "+4", + }, + }, + }, +} diff --git a/.config/nvim/spell/en.utf-8.add b/.config/nvim/spell/en.utf-8.add new file mode 100644 index 00000000..41c1f437 --- /dev/null +++ b/.config/nvim/spell/en.utf-8.add @@ -0,0 +1,13 @@ +Zotero +trsrst +#arsttarst +tarsttarst/! +Javascript +RQs +underexplored +SoundID +MITM +todo +MPC +Alaca +SoundProof diff --git a/.config/nvim/spell/en.utf-8.add.spl b/.config/nvim/spell/en.utf-8.add.spl new file mode 100644 index 00000000..3228a8c3 Binary files /dev/null and b/.config/nvim/spell/en.utf-8.add.spl differ diff --git a/.config/nvim/stylua.toml b/.config/nvim/stylua.toml new file mode 100644 index 00000000..5d6c50dc --- /dev/null +++ b/.config/nvim/stylua.toml @@ -0,0 +1,3 @@ +indent_type = "Spaces" +indent_width = 2 +column_width = 120 \ No newline at end of file