From 05670570f1e327e7c33bb8a254777e40c5dd3288 Mon Sep 17 00:00:00 2001 From: rootiest Date: Wed, 24 Jul 2024 13:45:52 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=99=20Implement=20Rootiest=20Module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Major Update!!! - Implements a rootiest module - Consolidates much of the settings - Improves usability and efficiency - Faster Loading - Cleaner Structure - More keymaps and plugins now have conditional loading --- .gitignore | 1 + README.md | 154 ++++++++++++++----------- init.lua | 6 +- lua/config/autocmds.lua | 27 ----- lua/config/check-files.lua | 48 -------- lua/config/keymaps.lua | 180 +++++++++++++++++++++-------- lua/config/lazy.lua | 1 - lua/config/options.lua | 25 +--- lua/config/rootiest.lua | 230 +++++++++++++++++++++++++++++++++++++ lua/config/ui.lua | 120 ------------------- lua/config/user.lua | 17 --- lua/plugins/coding.lua | 29 +---- lua/plugins/editor.lua | 132 ++++++++++++++------- lua/plugins/terminal.lua | 19 +-- lua/plugins/themes.lua | 32 +++++- lua/plugins/util.lua | 37 +++--- 16 files changed, 618 insertions(+), 440 deletions(-) delete mode 100644 lua/config/check-files.lua create mode 100644 lua/config/rootiest.lua delete mode 100644 lua/config/ui.lua delete mode 100644 lua/config/user.lua diff --git a/.gitignore b/.gitignore index e637916..5029dd1 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ debug/ .leader .useimage .wakatime +.ignore-deps diff --git a/README.md b/README.md index 1e2b8c1..d3e6e13 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ + # Rootiest NeoVim Configuration + + + + ```none ██████╗ ██████╗ ██████╗ ████████╗██╗███████╗███████╗████████╗ ██╔══██╗██╔═══██╗██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝╚══██╔══╝ @@ -32,71 +37,108 @@ lllllllc ,loooooool,:ol |VVVVVVV//##/+/#/+/#/'/#/ The rootiest neovim configuration you will ever see! -## Installation +## Pre-requisites -This is the traditional method to install a NeoVim configuration. -You will need to manually install NeoVim if you do not already have it. +> Note: +> While NeoVim may run without these prerequisites, +> functionality will be limited. +> For the full experience, it is recommended to install the pre-requisites. + +### Required + +- [git](https://git-scm.com/) - + Version control system +- [luarocks](https://luarocks.org/) - + Lua package manager +- [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/) - + Font with extended glyphs + +Your terminal/client application ***must*** have a Nerd Font installed +and support the Nerd Font glyphs. + +Kitty or NeoVide are recommended. + +### Optional + +- [ripgrep](https://github.com/BurntSushi/ripgrep) - + A faster grep +- [fzf](https://github.com/junegunn/fzf) - + A command-line fuzzy finder +- [fd](https://github.com/sharkdp/fd) - + A simple, fast and user-friendly alternative to 'find' +- [lazygit](https://github.com/jesseduffield/lazygit) - + A simple terminal UI for git commands +- [kitty](https://sw.kovidgoyal.net/kitty/) - + A fast, feature-rich, GPU based terminal emulator +- [NeoVide](https://neovide.dev/) - + A fast, feature-rich, and modern NeoVim GUI +- [fish](https://fishshell.com/) - + A smart and user-friendly command line shell + +## Installation 1. Install [NeoVim](https://github.com/neovim/neovim/blob/master/INSTALL.md) (0.9+) 2. Install Pre-requisites - - - Required - - - [git](https://git-scm.com/) - - Version control system - - [luarocks](https://luarocks.org/) - - Lua package manager - - A terminal that has - [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/) support - - - Optional (but recommended for the full experience) - - [ripgrep](https://github.com/BurntSushi/ripgrep) - - A faster grep - - [fzf](https://github.com/junegunn/fzf) - - A command-line fuzzy finder - - [fd](https://github.com/sharkdp/fd) - - A simple, fast and user-friendly alternative to 'find' - - [lazygit](https://github.com/jesseduffield/lazygit) - - A simple terminal UI for git commands - - [tree-sitter](https://github.com/tree-sitter/tree-sitter/) - - A parser generator tool and an incremental parsing library - - [kitty](https://sw.kovidgoyal.net/kitty/) - - A fast, feature-rich, GPU based terminal emulator - - [NeoVide](https://neovide.dev/) - - A fast, feature-rich, and modern NeoVim GUI - - [fish](https://fishshell.com/) - - A smart and user-friendly command line shell - 3. Backup your current nvim configuration (if you have one) - ```bash + ```sh mv ~/.config/nvim ~/.config/nvim.bak ``` 4. Clone the repository - ```bash - git clone https://github.com/rootiest/rootiest-nvim.git ~/.config/nvim + ```sh + git clone git@github.com:rootiest/rootiest-nvim ~/.config/nvim ``` 5. Enjoy! 🎉 -## Alternative Install +## Keep your current nvim configuration -This is a more automatic method to install the Rootiest NeoVim configuration. -This method will automatically download the NeoVim AppImage if required. -It will then automatically install the Rootiest NeoVim configuration. +This will download and open the Rootiest NeoVim configuration +without replacing your current NeoVim configuration. -1. Run the install script +1. Clone the repository - ```bash - curl -sL https://raw.githubusercontent.com/rootiest/rootiest-nvim/main/install.sh | bash - ``` + ```sh + git clone git@github.com:rootiest/rootiest-nvim ~/.config/rootiest/rootiest-nvim + ``` -2. Install pre-requisites +2. Open Neovim with this config: + + ```sh + NVIM_APPNAME=rootiest/rootiest-nvim/ nvim + ``` 3. Enjoy! 🎉 +4. Fall in love and see [Installation](#installation) + +## Features + +- Comfortable keybindings and IDE-like features +- Designed to be quick to load and easy to use without compromising on features +- Leans heavily on lazy and luarocks for plugin management and lazy-loading +- Catppuccin theme is default but a selection of others are also included +- Automatic light/dark mode switching based on system theme +- Extensive special configurations for kitty, including theme matching +- Kitty scrollback and keybinding support +- Special configuration for neovide +- Detects terminal client and adjusts accordingly +- ToggleTerm, fzf, telescope, neotree, etc. for quick access to files and terminal +- Many UI elements to enhance the experience +- LSP support for many languages and automatic setup for many more +- Remotely spawn a NeoVim instance over ssh, in a container, or from a git repo +- Dashboard logo adjusts to the size of the window +- Warnings for missing dependencies +- User-selected AI completion tool: + `codeium`, `copilot`, `tabnine`, `minuet`, or `none` +- WakaTime integration: Tracking time spent on code +- Hardtime integration: Trains better use of vim motions and shortcuts +- Colorscheme is remembered between sessions +- Lean and fast while providing a complete professional experience +- Achieves sub-75ms startup time on my laptop + ## Options There are some hidden files in the configuration directory that can be @@ -126,29 +168,9 @@ used to configure user options. This file defines whether the Hardtime plugin is enabled. The options are `true` or `false`. -## Features - -- Comfortable keybindings and IDE-like features -- Designed to be quick to load and easy to use without compromising on features -- Leans heavily on lazy and luarocks for plugin management and lazy-loading -- Catppuccin theme is default but a selection of others are also included -- Automatic light/dark mode switching based on system theme -- Extensive special configurations for kitty, including theme matching -- Kitty scrollback and keybinding support -- Special configuration for neovide -- Detects terminal client and adjusts accordingly -- ToggleTerm, fzf, telescope, neotree, etc. for quick access to files and terminal -- Many UI elements to enhance the experience -- LSP support for many languages and automatic setup for many more -- Remotely spawn a NeoVim instance over ssh, in a container, or from a git repo -- Dashboard logo adjusts to the size of the window -- User-selected AI completion tool: - `codeium`, `copilot`, `tabnine`, `minuet`, or `none` -- WakaTime integration: Tracking time spent on code -- Hardtime integration: Trains better use of vim motions and shortcuts -- Colorscheme is remembered between sessions -- Lean and fast while providing a complete professional experience -- Achieves sub-75ms startup time on my laptop +- `.ignore-deps` : **Disables dependency check** + This file defines whether the dependency check is enabled. + The options are `true` or `false`. ## Companion Tools diff --git a/init.lua b/init.lua index 20e3501..2647dfe 100644 --- a/init.lua +++ b/init.lua @@ -51,7 +51,9 @@ -- ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ -- The rootiest NeoVim configuration! -- ---------------------------------- LAZY ------------------------------------- +-- Load Lazy package manager and plugins require("config.lazy") --- ---------------------------------- USER ------------------------------------- -require("config.user") +-- -------------------------------- ROOTIEST ----------------------------------- +-- Load the rootiest configuration +require("config.rootiest").setup() diff --git a/lua/config/autocmds.lua b/lua/config/autocmds.lua index 9d5a674..b1b3e2d 100644 --- a/lua/config/autocmds.lua +++ b/lua/config/autocmds.lua @@ -1,33 +1,6 @@ -- ----------------------------------------------------------------------------- -- -------------------------------- AUTOCMDS ----------------------------------- -- ----------------------------------------------------------------------------- - --- -------------------------------- Commands ----------------------------------- --- Make :Q close all of the buffers -vim.api.nvim_create_user_command("Q", function() - vim.cmd.qall() -end, { force = true, desc = "Close all buffers" }) - --- Yank line without leading/trailing whitespace -vim.api.nvim_create_user_command("YankLine", function() - -- Yank line without leading/trailing whitespace - vim.api.nvim_feedkeys("_v$hy$", "n", true) -end, { force = true, desc = "Yank line without leading whitespace" }) - --- Restore Colorscheme -vim.api.nvim_create_user_command("RestoreColorscheme", function() - vim.cmd.colorscheme( - STORED_THEME or KITTY_THEME or "catppuccin-frappe" or "tokyonight" - ) -end, { force = true }) - --- Load/start Remote -vim.api.nvim_create_user_command("LoadRemote", function() - require("remote-nvim").setup() - vim.cmd("RemoteStart") -end, { force = true, desc = "Load/start Remote" }) - --- ------------------------------ Auto-Commands -------------------------------- -- Autosave Colorscheme -- When the colorscheme changes, store the name in .colorscheme vim.api.nvim_create_autocmd("ColorScheme", { diff --git a/lua/config/check-files.lua b/lua/config/check-files.lua deleted file mode 100644 index 0c5c0a3..0000000 --- a/lua/config/check-files.lua +++ /dev/null @@ -1,48 +0,0 @@ --- ----------------------------------------------------------------------------- --- ------------------------------ CHECK-FILES ---------------------------------- --- ----------------------------------------------------------------------------- ------ Verify settings files exist and create them if they don't exist ----- --- ----------------------------------------------------------------------------- - --- Check if the .leader file exists -if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.leader") ~= 1 then - vim.fn.writefile({ vim.g.mapleader }, vim.fn.stdpath("config") .. "/.leader") -end - --- Check if the .colorscheme file exists -if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.colorscheme") ~= 1 then - -- Use the kitty theme - if os.getenv("KITTY_THEME") then - KITTY_THEME = os.getenv("KITTY_THEME") - vim.fn.writefile( - { KITTY_THEME }, - vim.fn.stdpath("config") .. "/.colorscheme" - ) - else - -- Use the default colorscheme - vim.fn.writefile( - { vim.g.colors_name }, - vim.fn.stdpath("config") .. "/.colorscheme" - ) - end -end - --- Check if the .aitool file exists -if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.aitool") ~= 1 then - vim.fn.writefile({ "codeium" }, vim.fn.stdpath("config") .. "/.aitool") -end - --- Check if the .useimage file exists -if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.useimage") ~= 1 then - vim.fn.writefile({ "true" }, vim.fn.stdpath("config") .. "/.useimage") -end - --- Check if the .wakatime file exists -if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.wakatime") ~= 1 then - vim.fn.writefile({ "true" }, vim.fn.stdpath("config") .. "/.wakatime") -end - --- Check if the .hardtime file exists -if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.hardtime") ~= 1 then - vim.fn.writefile({ "false" }, vim.fn.stdpath("config") .. "/.hardtime") -end diff --git a/lua/config/keymaps.lua b/lua/config/keymaps.lua index dbc2660..1b769b6 100644 --- a/lua/config/keymaps.lua +++ b/lua/config/keymaps.lua @@ -3,6 +3,13 @@ -- ----------------------------------------------------------------------------- -- --------------------------------- Keymaps ----------------------------------- + +local substitute_loaded, substitute = pcall(require, "substitute") +local codesnap_loaded = pcall(require, "codesnap") +local icon_picker_loaded = pcall(require, "icon-picker") +local gist_loaded = pcall(require, "gist") +local rootiest = require("config.rootiest") + local wk = require("which-key") wk.add({ { @@ -13,35 +20,52 @@ wk.add({ { "gt", rhs = function() - local Terminal = require("toggleterm.terminal").Terminal - local lazygit = Terminal:new({ cmd = "lazygit", hidden = true }) - lazygit:toggle() + rootiest.toggle_lazygit_term() end, desc = "LazyGit Terminal", }, + -- Icon Picker group { - "I", + mode = "n", + lhs = "I", group = "IconPicker", icon = { icon = "󰥸", color = "orange" }, + cond = function() + return icon_picker_loaded + end, }, + -- Pick Icon { - "Ii", - "IconPickerNormal", + mode = "n", + lhs = "Ii", + rhs = "IconPickerNormal", desc = "Pick Icon", group = "IconPicker", + cond = function() + return icon_picker_loaded + end, }, + -- Yank Icon { - "Iy", - "IconPickerYank", + mode = "n", + lhs = "Iy", + rhs = "IconPickerYank", desc = "Yank Icon", group = "IconPicker", + cond = function() + return icon_picker_loaded + end, }, + -- Insert Icon in insert mode { mode = "i", - "", - "IconPickerInsert", + lhs = "", + rhs = "IconPickerInsert", desc = "Insert Icon", group = "IconPicker", + cond = function() + return icon_picker_loaded + end, }, { "gS", @@ -50,21 +74,35 @@ wk.add({ end, desc = "LazyGit", }, + -- Gists group { - "gn", + mode = "n", + lhs = "gn", group = "Gists", icon = { icon = "", color = "orange" }, + cond = function() + return gist_loaded + end, }, + -- Create Gist { mode = { "n", "x" }, - "gnc", - "GistCreate", + lhs = "gnc", + rhs = "GistCreate", desc = "Create Gist", + cond = function() + return gist_loaded + end, }, + -- Find Gists { - "gnf", - "GistList", + mode = "n", + lhs = "gnf", + rhs = "GistList", desc = "Find Gists", + cond = function() + return gist_loaded + end, }, { "l", @@ -85,29 +123,45 @@ wk.add({ group = "MiniMap", icon = { icon = "", color = "yellow" }, }, + -- Save selected code snapshot into clipboard { - "cy", - "CodeSnap", mode = "x", + lhs = "cy", + rhs = "CodeSnap", desc = "Save selected code snapshot into clipboard", + cond = function() + return codesnap_loaded + end, }, + -- Save selected code snapshot in ~/Pictures { - "cs", - "CodeSnapSave", mode = "x", + lhs = "cs", + rhs = "CodeSnapSave", desc = "Save selected code snapshot in ~/Pictures", + cond = function() + return codesnap_loaded + end, }, + -- Highlight and snapshot selected code into clipboard { - "ch", - "CodeSnapHighlight", mode = "x", + lhs = "ch", + rhs = "CodeSnapHighlight", desc = "Highlight and snapshot selected code into clipboard", + cond = function() + return codesnap_loaded + end, }, + -- Save ASCII code snapshot into clipboard { - "ci", - "CodeSnapASCII", mode = "x", + lhs = "ci", + rhs = "CodeSnapASCII", desc = "Save ASCII code snapshot into clipboard", + cond = function() + return codesnap_loaded + end, }, { "gx", @@ -135,9 +189,7 @@ wk.add({ end, desc = "KittyNavigateLeft", cond = function() -- Using Kitty - local term = os.getenv("TERM") or "" - local kit = string.find(term, "kitty") - return kit ~= nil + return rootiest.using_kitty() end, }, { @@ -147,9 +199,7 @@ wk.add({ end, desc = "KittyNavigateDown", cond = function() -- Using Kitty - local term = os.getenv("TERM") or "" - local kit = string.find(term, "kitty") - return kit ~= nil + return rootiest.using_kitty() end, }, { @@ -159,9 +209,7 @@ wk.add({ end, desc = "KittyNavigateUp", cond = function() -- Using Kitty - local term = os.getenv("TERM") or "" - local kit = string.find(term, "kitty") - return kit ~= nil + return rootiest.using_kitty() end, }, { @@ -171,15 +219,13 @@ wk.add({ end, desc = "KittyNavigateRight", cond = function() -- Using Kitty - local term = os.getenv("TERM") or "" - local kit = string.find(term, "kitty") - return kit ~= nil + return rootiest.using_kitty() end, }, { "zk", rhs = function() - require("precognition").toggle() + rootiest.toggle_precognition() end, desc = "Toggle Precognition", }, @@ -213,14 +259,15 @@ wk.add({ }, { "yo", - "YankLine", + rhs = function() + rootiest.yank_line() + end, desc = "Yank Line-text", }, { -- Toggle Hardmode with Hints "h", rhs = function() - vim.cmd("Hardtime toggle") - require("precognition").toggle() + rootiest.toggle_hardmode() end, desc = "Toggle Hardmode", }, @@ -231,14 +278,55 @@ wk.add({ end, desc = "Toggle ZenMode", }, + -- Substitute operator in normal mode + { + mode = "n", + lhs = "x", + rhs = function() + substitute.operator() + end, + desc = "Substitute operator", + cond = function() + return substitute_loaded + end, + }, + -- Substitute line in normal mode + { + mode = "n", + lhs = "xx", + rhs = function() + substitute.line() + end, + desc = "Substitute line", + cond = function() + return substitute_loaded + end, + }, + -- Substitute end of line in normal mode + { + mode = "n", + lhs = "X", + rhs = function() + substitute.eol() + end, + desc = "Substitute end of line", + cond = function() + return substitute_loaded + end, + }, + -- Substitute visual selection in visual mode + { + mode = "x", + lhs = "x", + rhs = function() + substitute.visual() + end, + desc = "Substitute visual selection", + cond = function() + return substitute_loaded + end, + }, }) --- Substitute --- Define substitue mappings -vim.keymap.set("n", "x", require("substitute").operator, { noremap = true }) -vim.keymap.set("n", "xx", require("substitute").line, { noremap = true }) -vim.keymap.set("n", "X", require("substitute").eol, { noremap = true }) -vim.keymap.set("x", "x", require("substitute").visual, { noremap = true }) - -- ---------------------------- Spell Correction ------------------------------- require("config.spellcheck") diff --git a/lua/config/lazy.lua b/lua/config/lazy.lua index 038ebe0..8b1d844 100644 --- a/lua/config/lazy.lua +++ b/lua/config/lazy.lua @@ -20,7 +20,6 @@ vim.opt.rtp:prepend(vim.env.LAZY or lazypath) require("lazy").setup({ spec = { { "LazyVim/LazyVim", import = "lazyvim.plugins" }, - { import = "config.ui" }, -- UI Plugins { import = "plugins" }, -- General Plugins }, defaults = { lazy = false, version = false }, diff --git a/lua/config/options.lua b/lua/config/options.lua index 371235c..8001014 100644 --- a/lua/config/options.lua +++ b/lua/config/options.lua @@ -2,29 +2,8 @@ -- --------------------------------- OPTIONS ----------------------------------- -- ----------------------------------------------------------------------------- --- Set Default Leader Key -vim.g.mapleader = " " - --- Correct missing settings files -require("config.check-files") - --- Load Stored Leader Key -vim.g.mapleader = vim.fn.readfile(vim.fn.stdpath("config") .. "/.leader")[1] - --- Load the stored colorscheme -STORED_THEME = vim.fn.readfile(vim.fn.stdpath("config") .. "/.colorscheme")[1] - -- ----------------------------------- LSP -------------------------------------- +-- We don't need perl vim.g.loaded_perl_provider = 0 +-- Prefer basedpyright vim.g.lazyvim_python_lsp = "basedpyright" - --- ----------------------------------- FOLDS -------------------------------------- -vim.opt.foldmethod = "expr" -vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()" -vim.opt.foldlevelstart = 99 -- load buffers with folds open - --- ------------------------------- CLIENT APPS --------------------------------- -if vim.g.neovide then - -- ----------------------- Neovide ------------------------- - require("config.neovide") -end diff --git a/lua/config/rootiest.lua b/lua/config/rootiest.lua new file mode 100644 index 0000000..7aeafe9 --- /dev/null +++ b/lua/config/rootiest.lua @@ -0,0 +1,230 @@ +local M = {} + +local precog_first_time = true + +-- Define the config path and default values +local config_path = vim.fn.stdpath("config") + +function M.set_defaults() + -- Set Default Leader Key + vim.g.mapleader = " " + vim.g.maplocalleader = "\\" +end + +function M.eval_settings_files() + -- Function to ensure a file exists and write a default value if it doesn't + local function ensure_file_exists(file_path, default_value, setup_func) + if vim.fn.filereadable(file_path) ~= 1 then + if setup_func then + -- Call the setup function if provided + setup_func() + else + -- Write default value to file + vim.fn.writefile({ default_value }, file_path) + end + end + end + + local defaults = { + [config_path .. "/.aitool"] = "codeium", + [config_path .. "/.useimage"] = "true", + [config_path .. "/.wakatime"] = "true", + [config_path .. "/.hardtime"] = "false", + [config_path .. "/.ignore-deps"] = "false", + [config_path .. "/.leader"] = vim.g.mapleader, + } + + -- Function to handle special logic for the .colorscheme file + local function setup_colorscheme() + local color_file = config_path .. "/.colorscheme" + if M.kitty_theme then + vim.fn.writefile({ M.kitty_theme }, color_file) + else + vim.fn.writefile({ vim.g.colors_name }, color_file) + end + end + + -- Ensure each file exists with the corresponding default value or special logic + for file_path, default_value in pairs(defaults) do + ensure_file_exists(file_path, default_value) + end + + -- Ensure the .colorscheme file exists with special logic + ensure_file_exists(config_path .. "/.colorscheme", nil, setup_colorscheme) +end + +function M.restore_colorscheme() + -- Restore colorscheme + vim.cmd.colorscheme(M.colortheme or "catppuccin-frappe" or "tokyonight") +end + +function M.yank_line() + -- Yank line without leading/trailing whitespace + vim.api.nvim_feedkeys("_v$hy$", "n", true) +end + +function M.using_kitty() + local term = os.getenv("TERM") or "" + local kit = string.find(term, "kitty") + return kit ~= nil +end + +function M.toggle_precognition() + if precog_first_time then + require("precognition").toggle() + require("precognition").toggle() -- Call toggle twice + precog_first_time = false -- Update variable after the first call + else + require("precognition").toggle() -- Call toggle once + end +end + +function M.toggle_hardmode() + require("hardtime").toggle() + M.toggle_precognition() +end + +function M.toggle_lazygit_term() + local Terminal = require("toggleterm.terminal").Terminal + local lazygit = Terminal:new({ cmd = "lazygit", hidden = true }) + lazygit:toggle() +end + +-- Function to check if a given string matches the content of the .aitool file +function M.using_aitool(input) + local aitool_file = config_path .. "/.aitool" + + -- Ensure the .aitool file exists + if vim.fn.filereadable(aitool_file) ~= 1 then + vim.fn.writefile({ "codeium" }, aitool_file) + end + + -- Read the file and normalize its content + local content = vim.fn.readfile(aitool_file)[1] or "" + local normalized_content = content:lower():gsub("%s+", "") + + -- Normalize the input and compare + local normalized_input = input:lower():gsub("%s+", "") + return normalized_input == normalized_content +end + +function M.load_remote() + ---@diagnostic disable-next-line: missing-parameter + require("remote-nvim").setup() + vim.cmd("RemoteStart") +end + +function M.set_cursor_icons() + -- Define last cursor position icon + vim.fn.sign_define("smoothcursor_n", { text = "" }) + vim.fn.sign_define("smoothcursor_v", { text = " " }) + vim.fn.sign_define("smoothcursor_V", { text = "" }) + vim.fn.sign_define("smoothcursor_i", { text = "" }) + vim.fn.sign_define("smoothcursor_�", { text = "" }) + vim.fn.sign_define("smoothcursor_R", { text = "󰊄" }) +end + +function M.eval_dependencies() + -- Function to read the .ignore-deps file and return whether warnings should be suppressed + local function should_suppress_warnings() + local ignore_file = config_path .. "/.ignore-deps" + local file = io.open(ignore_file, "r") + if file then + local content = file:read("*a") + file:close() + content = content:lower():gsub("%s+", "") -- convert to lowercase and remove whitespace + local suppress_values = { ["true"] = true, ["1"] = true, ["yes"] = true } + return suppress_values[content] or false + end + return false + end + + -- Function to check if an executable is installed and generate a warning if not + local function check_executable(executable) + if vim.fn.executable(executable) ~= 1 then + vim.api.nvim_notify( + executable .. " is not installed!", + vim.log.levels.WARN, + {} + ) + end + end + + -- Check if warnings should be suppressed + if not should_suppress_warnings() then + -- List of executables to check + local executables = + { "lazygit", "gh", "rg", "fzf", "fd", "git", "luarocks" } + + -- Check each executable + for _, executable in ipairs(executables) do + check_executable(executable) + end + end +end + +function M.eval_neovide() + if vim.g.neovide then + require("config.neovide") + end +end + +-- -------------------------------- Commands ----------------------------------- +function M.define_commands() + -- Make :Q close all of the buffers + vim.api.nvim_create_user_command("Q", function() + vim.cmd.qall() + end, { force = true, desc = "Close all buffers" }) + + -- Yank line without leading/trailing whitespace + vim.api.nvim_create_user_command("YankLine", function() + M.yank_line() + end, { force = true, desc = "Yank line without leading whitespace" }) + + -- Restore Colorscheme + -- Define the RestoreColorscheme command + vim.api.nvim_create_user_command( + "RestoreColorscheme", -- Command name + function() -- Callback function + M.restore_colorscheme() + end, + { desc = "Restore colorscheme" } + ) + + -- Load/start Remote + vim.api.nvim_create_user_command("LoadRemote", function() + M.load_remote() + end, { force = true, desc = "Load/start Remote" }) +end + +-- ------------------------------- Variables ----------------------------------- +-- Load the kitty theme +M.kitty_theme = os.getenv("KITTY_THEME") + +-- Load the stored colorscheme +M.colortheme = vim.fn.readfile(config_path .. "/.colorscheme")[1] + +-- Load Stored Leader Key +M.leader = vim.fn.readfile(config_path .. "/.leader")[1] + +-- --------------------------------- Setup ------------------------------------- +function M.setup() + -- Set Defaults + M.set_defaults() + -- Define Commands + M.define_commands() + -- Evaluate settings files + M.eval_settings_files() + -- Evaluate dependencies + M.eval_dependencies() + -- Evaluate neovide settings + M.eval_neovide() + -- Restore colorscheme + M.restore_colorscheme() + -- Set cursor icons + M.set_cursor_icons() + -- Load Stored Leader Key + vim.g.mapleader = M.leader +end + +return M diff --git a/lua/config/ui.lua b/lua/config/ui.lua deleted file mode 100644 index a5d6f3c..0000000 --- a/lua/config/ui.lua +++ /dev/null @@ -1,120 +0,0 @@ --- ----------------------------------------------------------------------------- --- ----------------------------------- UI -------------------------------------- --- ----------------------------------------------------------------------------- - -return { - { -- Edgy - import = "lazyvim.plugins.extras.ui.edgy", - }, - { -- Mini-animate - import = "lazyvim.plugins.extras.ui.mini-animate", - }, - { -- Transparent - "xiyaowong/transparent.nvim", - lazy = true, - config = true, - }, - { -- Auto Dark Mode - "f-person/auto-dark-mode.nvim", - lazy = true, - opts = { - update_interval = 2000, - set_dark_mode = function() - vim.o.background = "dark" - vim.cmd.colorscheme( - STORED_THEME or KITTY_THEME or "catppuccin-frappe" or "tokyonight" - ) - end, - set_light_mode = function() - vim.o.background = "light" - vim.cmd.colorscheme( - STORED_THEME or KITTY_THEME or "catppuccin-frappe" or "tokyonight" - ) - end, - }, - cond = function() -- Not Using SSH - local ssh = os.getenv("SSH_TTY") or false - return not ssh - end, - }, - { -- Hlchunk - "shellRaining/hlchunk.nvim", - event = "BufEnter", - config = function() - local cb = function() - if vim.g.colors_name == "tokyonight" then - return "#806d9c" - elseif vim.g.colors_name:find("catppuccin") then - local catpalette = require("catppuccin.palettes").get_palette() - return catpalette.teal - elseif vim.g.colors_name == "monochrome" or "github_dark" then - return "#CCCCCC" - elseif vim.g.colors_name == "gruvbox" then - return "#a9b665" - elseif vim.g.colors_name == "dracula" or "eldritch" then - return "#50fa7b" - elseif vim.g.colors_name == "onedark" or "nightfox" then - return "#98C379" - elseif vim.g.colors_name == "nord" then - return "#81A1C1" - elseif vim.g.colors_name == "kanagawa" then - return "#73C8AD" - elseif vim.g.colors_name == "everforest" then - return "#8FBCBB" - elseif vim.g.colors_name == "github_light" or "paper" then - return "#3f3f5a" - elseif vim.g.colors_name == "neofusion" then - return "#420ADD" - else - return "#7581FF" - end - end - local common_config = { - chunk = { - style = { - { fg = cb }, - }, - enable = true, - }, - indent = { - enable = true, - use_treesitter = true, - chars = { - "․․", - "⁚⁚", - "⁖⁖", - "⁘⁘", - "⁙⁙", - "󱗿󱗿", - "󱗽󱗽", - "󱗼󱗼", - }, - }, - } - if vim.o.background == "dark" then - common_config.indent.style = { - { fg = "#434437" }, - { fg = "#2f4440" }, - { fg = "#433054" }, - { fg = "#284251" }, - { fg = "#3e4451" }, - { fg = "#565c64" }, - { fg = "#6b737f" }, - { fg = "#848a91" }, - } - else - common_config.indent.style = { - { fg = "#d0b0b0" }, - { fg = "#b0b0d0" }, - { fg = "#b0d0b0" }, - { fg = "#a0a0a0" }, - { fg = "#c0c0c0" }, - { fg = "#e0e0e0" }, - { fg = "#f0f0f0" }, - { fg = "#ffffff" }, - } - end - require("hlchunk").setup(common_config) - end, - }, -} diff --git a/lua/config/user.lua b/lua/config/user.lua deleted file mode 100644 index 34317fb..0000000 --- a/lua/config/user.lua +++ /dev/null @@ -1,17 +0,0 @@ --- ----------------------------------------------------------------------------- --- ---------------------------------- USER ------------------------------------- --- ----------------------------------------------------------------------------- --- --- ---------------------------------- STYLE ------------------------------------ ------------------------------ Apply the colorscheme ---------------------------- --------- 1. Restore last colorscheme if it exists -------- --------- 2. Use kitty theme if it exists -------- --------- 3. Fallback to Catppuccin Frappe -------- --------- 4. Fallback to Tokyonight -------- --------------------------------------------------------------------------------- -vim.cmd.colorscheme( - STORED_THEME or KITTY_THEME or "catppuccin-frappe" or "tokyonight" -) - --- ---------------------------------- CUSTOM ------------------------------------ --- Add any custom configuration below diff --git a/lua/plugins/coding.lua b/lua/plugins/coding.lua index 0e34d13..bcfc678 100644 --- a/lua/plugins/coding.lua +++ b/lua/plugins/coding.lua @@ -1,39 +1,25 @@ -- ----------------------------------------------------------------------------- -- --------------------------------- CODING ------------------------------------ -- ----------------------------------------------------------------------------- +local rootiest = require("config.rootiest") return { { -- Codeium import = "lazyvim.plugins.extras.coding.codeium", cond = function() - if - vim.fn.readfile(vim.fn.stdpath("config") .. "/.aitool")[1] - == "codeium" - then - return true - end + return rootiest.using_aitool("codeium") end, }, { -- Copilot import = "lazyvim.plugins.extras.coding.copilot", cond = function() - if - vim.fn.readfile(vim.fn.stdpath("config") .. "/.aitool")[1] - == "copilot" - then - return true - end + return rootiest.using_aitool("copilot") end, }, { -- Tabnine import = "lazyvim.plugins.extras.coding.tabnine", cond = function() - if - vim.fn.readfile(vim.fn.stdpath("config") .. "/.aitool")[1] - == "tabnine" - then - return true - end + return rootiest.using_aitool("tabnine") end, }, { -- Minuet-AI @@ -43,12 +29,7 @@ return { require("minuet").setup({ provider = "openai" }) end, cond = function() - if - vim.fn.readfile(vim.fn.stdpath("config") .. "/.aitool")[1] - == "minuet" - then - return true - end + return rootiest.using_aitool("minuet") end, }, { -- Yanky diff --git a/lua/plugins/editor.lua b/lua/plugins/editor.lua index c9049ad..bfbc962 100644 --- a/lua/plugins/editor.lua +++ b/lua/plugins/editor.lua @@ -1,8 +1,16 @@ -- ----------------------------------------------------------------------------- -- --------------------------------- EDITOR ------------------------------------ -- ----------------------------------------------------------------------------- +local rootiest = require("config.rootiest") return { + { -- Edgy + import = "lazyvim.plugins.extras.ui.edgy", + }, + { -- Mini-animate + import = "lazyvim.plugins.extras.ui.mini-animate", + }, + { -- Aerial import = "lazyvim.plugins.extras.editor.aerial", }, @@ -159,48 +167,8 @@ return { event = "InsertEnter", lazy = true, config = function() - require("smoothcursor").setup({ - type = "default", - cursor = "", - texthl = "SmoothCursor", - fancy = { - enable = true, -- enable fancy mode - head = { cursor = "" }, - body = {}, - tail = { false }, -- false to disable fancy tail - }, - matrix = { -- Loaded when 'type' is set to "matrix" - head = { - cursor = require("smoothcursor.matrix_chars"), - texthl = { - "SmoothCursor", - }, - }, - body = { - length = 6, -- Specifies the length of the cursor body - cursor = require("smoothcursor.matrix_chars"), - texthl = { - "SmoothCursorGreen", - }, - }, - tail = { - texthl = { - "SmoothCursor", - }, - }, - unstop = false, - }, - autostart = true, -- Automatically start SmoothCursor - always_redraw = true, -- Redraw the screen on each update - flyin_effect = "bottom", -- Choose "bottom" or "top" for flying effect - speed = 25, -- Max speed is 100 to stick with your current position - intervals = 35, -- Update intervals in milliseconds - priority = 10, -- Set marker priority - timeout = 3000, -- Timeout for animations in milliseconds - threshold = 3, -- Animate only if cursor moves more than this many lines - max_threshold = 2000, -- If you move more than this many lines, don't animate (if `nil`, deactivate check) - disable_float_win = false, -- Disable in floating windows - }) + ---@diagnostic disable-next-line: missing-parameter + require("smoothcursor").setup() -- Define last cursor position icon vim.fn.sign_define("smoothcursor_n", { text = "" }) vim.fn.sign_define("smoothcursor_v", { text = " " }) @@ -210,4 +178,84 @@ return { vim.fn.sign_define("smoothcursor_R", { text = "󰊄" }) end, }, + { -- Hlchunk + "shellRaining/hlchunk.nvim", + event = "BufEnter", + config = function() + local cb = function() + if vim.g.colors_name == "tokyonight" then + return "#806d9c" + elseif vim.g.colors_name:find("catppuccin") then + local catpalette = require("catppuccin.palettes").get_palette() + return catpalette.teal + elseif vim.g.colors_name == "monochrome" or "github_dark" then + return "#CCCCCC" + elseif vim.g.colors_name == "gruvbox" then + return "#a9b665" + elseif vim.g.colors_name == "dracula" or "eldritch" then + return "#50fa7b" + elseif vim.g.colors_name == "onedark" or "nightfox" then + return "#98C379" + elseif vim.g.colors_name == "nord" then + return "#81A1C1" + elseif vim.g.colors_name == "kanagawa" then + return "#73C8AD" + elseif vim.g.colors_name == "everforest" then + return "#8FBCBB" + elseif vim.g.colors_name == "github_light" or "paper" then + return "#3f3f5a" + elseif vim.g.colors_name == "neofusion" then + return "#420ADD" + else + return "#7581FF" + end + end + local common_config = { + chunk = { + style = { + { fg = cb }, + }, + enable = true, + }, + indent = { + enable = true, + use_treesitter = true, + chars = { + "․․", + "⁚⁚", + "⁖⁖", + "⁘⁘", + "⁙⁙", + "󱗿󱗿", + "󱗽󱗽", + "󱗼󱗼", + }, + }, + } + if vim.o.background == "dark" then + common_config.indent.style = { + { fg = "#434437" }, + { fg = "#2f4440" }, + { fg = "#433054" }, + { fg = "#284251" }, + { fg = "#3e4451" }, + { fg = "#565c64" }, + { fg = "#6b737f" }, + { fg = "#848a91" }, + } + else + common_config.indent.style = { + { fg = "#d0b0b0" }, + { fg = "#b0b0d0" }, + { fg = "#b0d0b0" }, + { fg = "#a0a0a0" }, + { fg = "#c0c0c0" }, + { fg = "#e0e0e0" }, + { fg = "#f0f0f0" }, + { fg = "#ffffff" }, + } + end + require("hlchunk").setup(common_config) + end, + }, } diff --git a/lua/plugins/terminal.lua b/lua/plugins/terminal.lua index 04f1a2b..fec0887 100644 --- a/lua/plugins/terminal.lua +++ b/lua/plugins/terminal.lua @@ -91,20 +91,23 @@ return { require("image").setup() end, cond = function() - if vim.fn.filereadable(vim.fn.stdpath("config") .. "/.useimage") == 1 then - if - vim.fn.readfile(vim.fn.stdpath("config") .. "/.useimage")[1] - == "true" - then + local function is_useimage_enabled() + local useimage_file = vim.fn.stdpath("config") .. "/.useimage" + local content = vim.fn.readfile(useimage_file)[1] or "" + content = content:lower():gsub("%s+", "") -- convert to lowercase and remove whitespace + local enable_values = { ["true"] = true, ["1"] = true, ["yes"] = true } + + if enable_values[content] then local wterm = os.getenv("TERM_PROGRAM") local kterm = os.getenv("TERM") or "" - local kit = string.find(kterm, "kitty") - if wterm and string.find(wterm, "WezTerm") then + if wterm and wterm:find("WezTerm") then return true -- Using WezTerm else - return kit ~= nil -- Using Kitty + return kterm:find("kitty") ~= nil -- Using Kitty end end + + return false end end, }, diff --git a/lua/plugins/themes.lua b/lua/plugins/themes.lua index 1722b35..f74ecf5 100644 --- a/lua/plugins/themes.lua +++ b/lua/plugins/themes.lua @@ -1,8 +1,10 @@ -- ----------------------------------------------------------------------------- -- --------------------------------- THEMES ------------------------------------ -- ----------------------------------------------------------------------------- +local rootiest = require("config.rootiest") return { + -- ----------------------- Themes -------------------------- { -- Tokyonight "folke/tokyonight.nvim", lazy = false, -- Override @@ -10,7 +12,6 @@ return { { -- Catppuccin "catppuccin/nvim", lazy = false, -- Override - opts = { integrations = { grug_far = true } }, }, { -- Ayu "Shatur/neovim-ayu", @@ -59,4 +60,33 @@ return { "zenbones-theme/zenbones.nvim", dependencies = { "rktjmp/lush.nvim" }, }, + -- ---------------------- Utilities ------------------------ + { -- Transparent + "xiyaowong/transparent.nvim", + lazy = true, + config = true, + }, + { -- Auto Dark Mode + "f-person/auto-dark-mode.nvim", + lazy = true, + opts = { + update_interval = 2000, + set_dark_mode = function() + vim.o.background = "dark" + vim.cmd.colorscheme( + rootiest.colortheme or "catppuccin-frappe" or "tokyonight" + ) + end, + set_light_mode = function() + vim.o.background = "light" + vim.cmd.colorscheme( + rootiest.colortheme or "catppuccin-latte" or "tokyonight-day" + ) + end, + }, + cond = function() -- Not Using SSH + local ssh = os.getenv("SSH_TTY") or false + return not ssh + end, + }, } diff --git a/lua/plugins/util.lua b/lua/plugins/util.lua index cd64e00..7ba47a5 100644 --- a/lua/plugins/util.lua +++ b/lua/plugins/util.lua @@ -22,12 +22,18 @@ return { { -- Wakatime "wakatime/vim-wakatime", cond = function() - if - vim.fn.readfile(vim.fn.stdpath("config") .. "/.wakatime")[1] - == "true" - then - return true + local function is_wakatime_enabled() + local wakatime_file = vim.fn.stdpath("config") .. "/.wakatime" + local content = vim.fn.readfile(wakatime_file)[1] or "" + content = content:lower():gsub("%s+", "") -- convert to lowercase and remove whitespace + local enable_values = { ["true"] = true, ["1"] = true, ["yes"] = true } + if enable_values[content] then + return { enabled = true } + else + return { enabled = false } + end end + return is_wakatime_enabled() end, }, { -- Link following @@ -43,9 +49,6 @@ return { { -- Auto-save "Pocco81/auto-save.nvim", event = "InsertEnter", - config = function() - require("auto-save").setup({}) - end, }, { -- User is bored "mikesmithgh/ugbi", @@ -126,14 +129,18 @@ return { "m4xshen/hardtime.nvim", dependencies = { "MunifTanjim/nui.nvim", "nvim-lua/plenary.nvim" }, opts = function() - if - vim.fn.readfile(vim.fn.stdpath("config") .. "/.hardtime")[1] - == "true" - then - return { enabled = true } - else - return { enabled = false } + local function is_hardtime_enabled() + local hardtime_file = vim.fn.stdpath("config") .. "/.hardtime" + local content = vim.fn.readfile(hardtime_file)[1] or "" + content = content:lower():gsub("%s+", "") -- convert to lowercase and remove whitespace + local enable_values = { ["true"] = true, ["1"] = true, ["yes"] = true } + if enable_values[content] then + return { enabled = true } + else + return { enabled = false } + end end + return is_hardtime_enabled() end, }, { -- GitLinker