debian-btw
debian-btw
https://git.tonybtw.com/debian-btw.git
git://git.tonybtw.com/debian-btw.git
initial commit
Diff
diff --git a/alacritty/alacritty.toml b/alacritty/alacritty.toml
new file mode 100644
index 0000000..11f8351
--- /dev/null
+++ b/alacritty/alacritty.toml
@@ -0,0 +1,39 @@
+[window]
+# opacity=0.9
+[window.padding]
+y = 6
+x = 6
+
+[font]
+# normal = { family = "JetBrainsMono Nerd Font Propo", style = "Regular" }
+# normal = { family = "Iosevka Nerd Font Propo", style = "Regular" }
+normal = { family = "UbuntuMono Nerd Font Propo", style = "Regular" }
+
+# size = 20
+size = 14
+
+[colors.bright]
+black = "#444b6a"
+blue = "#7da6ff"
+cyan = "#0db9d7"
+green = "#b9f27c"
+magenta = "#bb9af7"
+red = "#ff7a93"
+white = "#acb0d0"
+yellow = "#ff9e64"
+
+
+[colors.primary]
+background = "#1a1b26"
+foreground = "#c0caf5"
+
+[colors.normal]
+black = "#15161e"
+red = "#f7768e"
+green = "#9ece6a"
+yellow = "#e0af68"
+blue = "#7aa2f7"
+magenta = "#bb9af7"
+cyan = "#7dcfff"
+white = "#a9b1d6"
+
diff --git a/alacritty/readme.org b/alacritty/readme.org
new file mode 100644
index 0000000..6921c5f
--- /dev/null
+++ b/alacritty/readme.org
@@ -0,0 +1,44 @@
+#+title: Alacritty Config
+#+AUTHOR: Tony
+
+* Introduction
+This is my literately defined alacritty.toml readme using
+my first emacs org mode file.
+
+* Font
+Here I will define my font to be JetBrains Mono
+#+begin_src toml :tangle alacritty.toml
+[font]
+normal = { family = "JetBrainsMono Nerd Font Mono", style = "Regular" }
+size = 20
+#+end_src
+
+* Colors
+Using a TokyoNight theme, I note why I like it here.
+
+#+BEGIN_SRC toml :tangle alacritty.toml
+[colors.primary]
+background = "#1a1b26"
+foreground = "#c0caf5"
+
+[colors.normal]
+black = "#15161e"
+red = "#f7768e"
+green = "#9ece6a"
+yellow = "#e0af68"
+blue = "#7aa2f7"
+magenta = "#bb9af7"
+cyan = "#7dcfff"
+white = "#a9b1d6"
+#+END_SRC
+
+* Terminal Stuff
+This is required to set the terminal to /bin/bash instead of /bin/zsh, and login automatically to bash.
+#+begin_src toml :tangle alacritty.toml
+[terminal]
+
+[terminal.shell]
+program = "/bin/bash"
+args = ["--login"]
+
+#+end_src
diff --git a/hello.go b/hello.go
new file mode 100644
index 0000000..fcbaab3
--- /dev/null
+++ b/hello.go
@@ -0,0 +1,31 @@
+package main
+
+import (
+ "fmt"
+ "runtime"
+ "strings"
+)
+
+func hello_world(s string) {
+ pc, _, _, _ := runtime.Caller(0)
+ fn := runtime.FuncForPC(pc)
+ funcName := strings.Split(fn.Name(), ".")[1]
+
+ words := strings.Split(funcName, "_")
+ for i := range words {
+ words[i] = strings.Title(words[i])
+ }
+
+ message := strings.Join(words, ", ") + "!!"
+ funcs := map[string]func(...interface{})(int, error) {
+ "println": fmt.Println,
+ "print": fmt.Print,
+ }
+ MrBeast := funcs[strings.ToLower(s)+"ln"]
+ MrBeast(message)
+}
+
+func main() {
+ hello_world("print")
+}
+
diff --git a/nvim/.gitignore b/nvim/.gitignore
new file mode 100644
index 0000000..e033bc6
--- /dev/null
+++ b/nvim/.gitignore
@@ -0,0 +1 @@
+lazy-lock.json
diff --git a/nvim/README.md b/nvim/README.md
new file mode 100644
index 0000000..1779e97
--- /dev/null
+++ b/nvim/README.md
@@ -0,0 +1,117 @@
+# Neovim Keybinds Documentation
+
+This document provides a simple and organized overview of all the custom keybinds defined in my Neovim configuration.
+
+## General Keybinds
+
+| Mode | Key | Action |
+|------|-----------------|---------------------------------------------------------------------------------------------|
+| `n` | `<leader>cd` | Open Ex mode (`:Ex`) |
+| `n` | `J` | Join lines while keeping the cursor in place |
+| `n` | `<C-d>` | Scroll half-page down and keep the cursor centered |
+| `n` | `<C-u>` | Scroll half-page up and keep the cursor centered |
+| `n` | `n` | Move to next search result and keep it centered |
+| `n` | `N` | Move to previous search result and keep it centered |
+| `n` | `Q` | Disable Ex mode |
+| `n` | `<C-k>` | Jump to next quickfix entry and keep it centered |
+| `n` | `<C-j>` | Jump to previous quickfix entry and keep it centered |
+| `n` | `<leader>k` | Jump to next location entry and keep it centered |
+| `n` | `<leader>j` | Jump to previous location entry and keep it centered |
+| `i` | `<C-c>` | Exit insert mode (acts like `Esc`) |
+| `n` | `<leader>x` | Make current file executable (`chmod +x`) |
+| `n` | `<leader>u` | Toggle Undotree |
+| `n` | `<leader>rl` | Reload the Neovim config (`~/.config/nvim/init.lua`) |
+| `n` | `<leader><leader>` | Source the current file (`:so`) |
+
+---
+
+## Visual Mode Keybinds
+
+| Mode | Key | Action |
+|------|-----------------|---------------------------------------------------------------------------------------------|
+| `v` | `J` | Move selected block down |
+| `v` | `K` | Move selected block up |
+| `x` | `<leader>p` | Paste without overwriting clipboard |
+| `v` | `<leader>y` | Yank into system clipboard (even on SSH) |
+
+---
+
+## Linting and Formatting
+
+| Mode | Key | Action |
+|------|-----------------|---------------------------------------------------------------------------------------------|
+| `n` | `<leader>cc` | Run `php-cs-fixer` to lint and format PHP files |
+| `n` | `<F3>` | Format code (`LSP`) |
+
+---
+
+## Telescope Keybinds
+
+| Mode | Key | Action |
+|------|-----------------|---------------------------------------------------------------------------------------------|
+| `n` | `<leader>ff` | Find files |
+| `n` | `<leader>fg` | Find git-tracked files |
+| `n` | `<leader>fo` | Open recent files |
+| `n` | `<leader>fq` | Open quickfix list |
+| `n` | `<leader>fh` | Open help tags |
+| `n` | `<leader>fb` | Open buffer list |
+| `n` | `<leader>fs` | Grep current string |
+| `n` | `<leader>fc` | Grep instances of the current file name without the extension |
+| `n` | `<leader>fi` | Find files in Neovim configuration directory (`~/.config/nvim/`) |
+
+---
+
+## Harpoon Integration
+
+| Mode | Key | Action |
+|------|-----------------|---------------------------------------------------------------------------------------------|
+| `n` | `<leader>a` | Add current file to Harpoon list |
+| `n` | `<C-e>` | Toggle Harpoon quick menu |
+| `n` | `<leader>fl` | Open Harpoon window with Telescope |
+| `n` | `<C-p>` | Go to previous Harpoon mark |
+| `n` | `<C-n>` | Go to next Harpoon mark |
+
+---
+
+## LSP Keybinds
+
+| Mode | Key | Action |
+|-----------|------------|---------------------------------------------------------------------------------------------|
+| `n` | `K` | Show hover information |
+| `n` | `gd` | Go to definition |
+| `n` | `gD` | Go to declaration |
+| `n` | `gi` | Go to implementation |
+| `n` | `go` | Go to type definition |
+| `n` | `gr` | Show references |
+| `n` | `gs` | Show signature help |
+| `n` | `gl` | Show diagnostics in a floating window |
+| `n` | `<F2>` | Rename symbol |
+| `n`, `x` | `<F3>` | Format code asynchronously |
+| `n` | `<F4>` | Show code actions |
+
+---
+
+## Miscellaneous
+
+| Mode | Key | Action |
+|------|-----------------|---------------------------------------------------------------------------------------------|
+| `n` | `<leader>dg` | Run `DogeGenerate` (comment documentation generation) |
+| `n` | `<leader>s` | Replace all instances of the word under the cursor on the current line |
+
+---
+
+# LSP servers:
+
+I am migrating my lsp config to /lua/plugins/lsp.lua because nvim v0.11 allows a very minimal debloated way to setup language server protocols.
+
+Below is a running list of what and how to install the lsp's that are going to be configured in this build. I will avoid mason for now because I think its better to have full control over your system, and not outsource it to mason. Just uncommonet `return {` in /plugins/lsp.lua from the original lspconfig if you want to go that route.
+
+1. { lua-language-server }
+ - refer to distro ( pacman -Ss lua-language-server )
+2. { css-language-server --studio, html-language-server }
+ - npm install -g vscode-langservers-extracted
+3. { intelephense }
+ - npm install -g intelephense
+4. { typescript-language-server }
+ - npm install -g typescript-language-server typescript
+
diff --git a/nvim/after/ftplugin/goon.lua b/nvim/after/ftplugin/goon.lua
new file mode 100644
index 0000000..2059624
--- /dev/null
+++ b/nvim/after/ftplugin/goon.lua
@@ -0,0 +1,2 @@
+vim.bo.commentstring = "// %s"
+vim.bo.comments = "s:/*,m: *,ex:*/,://"
diff --git a/nvim/after/ftplugin/hare.lua b/nvim/after/ftplugin/hare.lua
new file mode 100644
index 0000000..539428b
--- /dev/null
+++ b/nvim/after/ftplugin/hare.lua
@@ -0,0 +1,12 @@
+local set = vim.opt_local
+
+vim.bo.commentstring = "// %s"
+vim.bo.comments = "s:/*,m: *,ex:*/,://"
+
+set.shiftwidth = 4
+set.tabstop = 4
+set.softtabstop = 4
+set.expandtab = true
+
+set.number = true
+set.relativenumber = true
diff --git a/nvim/after/ftplugin/jsonc.lua b/nvim/after/ftplugin/jsonc.lua
new file mode 100644
index 0000000..e1833b8
--- /dev/null
+++ b/nvim/after/ftplugin/jsonc.lua
@@ -0,0 +1,9 @@
+local set = vim.opt_local
+
+set.shiftwidth = 2
+set.tabstop = 2
+set.softtabstop = 2
+set.expandtab = true
+
+set.number = true
+set.relativenumber = true
diff --git a/nvim/after/ftplugin/man.lua b/nvim/after/ftplugin/man.lua
new file mode 100644
index 0000000..f21d675
--- /dev/null
+++ b/nvim/after/ftplugin/man.lua
@@ -0,0 +1,8 @@
+local set = vim.opt_local
+set.number = true
+set.relativenumber = true
+set.number = true
+set.relativenumber = false
+set.wrap = true
+set.linebreak = true
+set.conceallevel = 0
diff --git a/nvim/after/ftplugin/nix.lua b/nvim/after/ftplugin/nix.lua
new file mode 100644
index 0000000..6425eda
--- /dev/null
+++ b/nvim/after/ftplugin/nix.lua
@@ -0,0 +1,8 @@
+local set = vim.opt_local
+
+set.shiftwidth = 2
+set.tabstop = 2
+set.softtabstop = 2
+set.expandtab = true
+set.number = true
+set.relativenumber = true
diff --git a/nvim/after/plugin/colors.lua b/nvim/after/plugin/colors.lua
new file mode 100644
index 0000000..e9af665
--- /dev/null
+++ b/nvim/after/plugin/colors.lua
@@ -0,0 +1,6 @@
+vim.cmd.colorscheme("tokyonight")
+vim.cmd("hi Directory guibg=NONE")
+vim.cmd("hi SignColumn guibg=NONE")
+vim.api.nvim_set_hl(0, "Normal", { bg = "none" })
+vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" })
+vim.api.nvim_set_hl(0, "LineNr", { bg = "none" })
diff --git a/nvim/after/plugin/completion.lua b/nvim/after/plugin/completion.lua
new file mode 100644
index 0000000..da77d42
--- /dev/null
+++ b/nvim/after/plugin/completion.lua
@@ -0,0 +1,27 @@
+local cmp = require("cmp")
+
+cmp.setup({
+ preselect = cmp.PreselectMode.Item,
+ completion = { completeopt = "menu,menuone,noinsert" },
+ window = { documentation = cmp.config.window.bordered() },
+ mapping = cmp.mapping.preset.insert({
+ ["<CR>"] = cmp.mapping.confirm({ select = false }),
+ ["<C-e>"] = cmp.mapping.abort(),
+ ["<C-Space>"] = cmp.mapping.complete(),
+ ["<C-n>"] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }),
+ ["<C-p>"] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }),
+ ["<C-f>"] = cmp.mapping.scroll_docs(4),
+ ["<C-u>"] = cmp.mapping.scroll_docs(-4),
+ ["<Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then cmp.select_next_item() else fallback() end
+ end, { "i", "s" }),
+ ["<S-Tab>"] = cmp.mapping(function()
+ if cmp.visible() then cmp.select_prev_item() end
+ end, { "i", "s" }),
+ }),
+ sources = {
+ { name = "nvim_lsp" },
+ { name = "path" },
+ { name = "buffer", keyword_length = 3 },
+ },
+})
diff --git a/nvim/after/plugin/harpoon.lua b/nvim/after/plugin/harpoon.lua
new file mode 100644
index 0000000..cb0ddfc
--- /dev/null
+++ b/nvim/after/plugin/harpoon.lua
@@ -0,0 +1,21 @@
+local harpoon = require("harpoon")
+harpoon:setup()
+
+vim.keymap.set("n", "<leader>a", function() harpoon:list():add() end)
+vim.keymap.set("n", "<C-e>", function() harpoon.ui:toggle_quick_menu(harpoon:list()) end)
+vim.keymap.set("n", "<C-p>", function() harpoon:list():prev() end)
+vim.keymap.set("n", "<C-n>", function() harpoon:list():next() end)
+
+vim.keymap.set("n", "<leader>fl", function()
+ local conf = require("telescope.config").values
+ local themes = require("telescope.themes")
+ local file_paths = {}
+ for _, item in ipairs(harpoon:list().items) do
+ table.insert(file_paths, item.value)
+ end
+ require("telescope.pickers").new(themes.get_ivy({ prompt_title = "Working List" }), {
+ finder = require("telescope.finders").new_table({ results = file_paths }),
+ previewer = conf.file_previewer({}),
+ sorter = conf.generic_sorter({}),
+ }):find()
+end, { desc = "Open harpoon window" })
diff --git a/nvim/after/plugin/one-liners.lua b/nvim/after/plugin/one-liners.lua
new file mode 100644
index 0000000..63ed17e
--- /dev/null
+++ b/nvim/after/plugin/one-liners.lua
@@ -0,0 +1,6 @@
+require("lualine").setup({ options = { theme = "tokyonight" } })
+require("nvim-highlight-colors").setup({})
+require("orgmode").setup({
+ org_agenda_files = "~/orgfiles/**/*",
+ org_default_notes_file = "~/orgfiles/refile.org",
+})
diff --git a/nvim/after/plugin/telescope.lua b/nvim/after/plugin/telescope.lua
new file mode 100644
index 0000000..081311c
--- /dev/null
+++ b/nvim/after/plugin/telescope.lua
@@ -0,0 +1,31 @@
+local actions = require("telescope.actions")
+require("telescope").setup({
+ defaults = {
+ mappings = {
+ i = {
+ ["<C-k>"] = actions.move_selection_previous,
+ ["<C-j>"] = actions.move_selection_next,
+ ["<C-q>"] = actions.smart_send_to_qflist + actions.open_qflist,
+ },
+ },
+ },
+})
+
+local builtin = require("telescope.builtin")
+vim.keymap.set("n", "<leader>ff", builtin.find_files)
+vim.keymap.set("n", "<leader>fo", builtin.oldfiles)
+vim.keymap.set("n", "<leader>fq", builtin.quickfix)
+vim.keymap.set("n", "<leader>fh", builtin.help_tags, { desc = "Telescope help tags" })
+vim.keymap.set("n", "<leader>fb", builtin.buffers, { desc = "Telescope buffers" })
+vim.keymap.set("n", "<leader>fg", function()
+ builtin.grep_string({ search = vim.fn.input("Grep > ") })
+end)
+vim.keymap.set("n", "<leader>fc", function()
+ builtin.grep_string({ search = vim.fn.expand("%:t:r") })
+end, { desc = "Find current file" })
+vim.keymap.set("n", "<leader>fs", function()
+ builtin.grep_string({})
+end, { desc = "Find current string" })
+vim.keymap.set("n", "<leader>fi", function()
+ builtin.find_files({ cwd = "~/.config/nvim/" })
+end)
diff --git a/nvim/after/plugin/treesitter.lua b/nvim/after/plugin/treesitter.lua
new file mode 100644
index 0000000..32815ad
--- /dev/null
+++ b/nvim/after/plugin/treesitter.lua
@@ -0,0 +1,42 @@
+vim.filetype.add({ extension = { goon = "goon" } })
+
+-- Register custom goon parser with treesitter (old API)
+local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
+parser_config.goon = {
+ install_info = {
+ url = "/home/tony/repos/tree-sitter-goon",
+ files = { "src/parser.c" },
+ },
+ filetype = "goon",
+}
+
+-- Configure nvim-treesitter with ensure_installed
+require("nvim-treesitter.configs").setup({
+ ensure_installed = {
+ "json", "python", "ron", "javascript", "haskell", "d", "query",
+ "typescript", "tsx", "rust", "zig", "php", "yaml", "html", "css",
+ "markdown", "markdown_inline", "bash", "lua", "vim", "vimdoc", "c",
+ "dockerfile", "gitignore", "astro", "go", "templ"
+ },
+ highlight = {
+ enable = true,
+ },
+ indent = {
+ enable = true,
+ },
+})
+
+require("nvim-treesitter-textobjects").setup({
+ select = {
+ lookahead = true,
+ },
+})
+
+vim.keymap.set({ "x", "o" }, "af", function()
+ require("nvim-treesitter-textobjects.select").select_textobject("@function.outer", "textobjects")
+end)
+vim.keymap.set({ "x", "o" }, "if", function()
+ require("nvim-treesitter-textobjects.select").select_textobject("@function.inner", "textobjects")
+end)
+
+require("treesitter-context").setup({})
diff --git a/nvim/init.lua b/nvim/init.lua
new file mode 100644
index 0000000..36a1d08
--- /dev/null
+++ b/nvim/init.lua
@@ -0,0 +1,3 @@
+require("config.options")
+require("config.keybinds")
+require("manage").setup()
diff --git a/nvim/lua/config/keybinds.lua b/nvim/lua/config/keybinds.lua
new file mode 100644
index 0000000..a2979b8
--- /dev/null
+++ b/nvim/lua/config/keybinds.lua
@@ -0,0 +1,66 @@
+-- KEYBINDS
+vim.g.mapleader = " "
+vim.keymap.set("n", "<leader>cd", vim.cmd.Ex)
+
+vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv") -- Alt Up/Down in vscode
+vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv")
+
+vim.keymap.set("n", "J", "mzJ`z") -- Remap joining lines
+vim.keymap.set("n", "<C-d>", "<C-d>zz") -- Keep cursor in place while moving up/down page
+vim.keymap.set("n", "<C-u>", "<C-u>zz")
+vim.keymap.set("n", "n", "nzzzv") -- center screen when looping search results
+vim.keymap.set("n", "N", "Nzzzv")
+
+-- paste and don't replace clipboard over deleted text
+vim.keymap.set("x", "<leader>p", [["_dP]])
+vim.keymap.set({ "n", "v" }, "<leader>d", [["_d]])
+
+
+-- sometimes in insert mode, control-c doesn't exactly work like escape
+vim.keymap.set("i", "<C-c>", "<Esc>")
+
+-- add binds for Control J/K to scroll thru quickfix list
+vim.keymap.set("n", "<C-j>", "<cmd>cnext<CR>zz")
+vim.keymap.set("n", "<C-k>", "<cmd>cprev<CR>zz")
+
+-- What the heck is Ex mode?
+vim.keymap.set("n", "Q", "<nop>")
+
+vim.keymap.set("n", "<leader>k", "<cmd>lnext<CR>zz")
+vim.keymap.set("n", "<leader>j", "<cmd>lprev<CR>zz")
+
+-- getting Alex off my back :)
+vim.keymap.set("n", "<leader>dg", "<cmd>DogeGenerate<cr>")
+
+-- lint / format php files for LC
+vim.keymap.set("n", "<leader>cc", "<cmd>!php-cs-fixer fix % --using-cache=no<cr>")
+
+-- Replace all instances of whatever is under cursor (on line)
+vim.keymap.set("n", "<leader>s", [[:s/\<<C-r><C-w>\>//gI<Left><Left><Left>]])
+
+-- make file executable
+vim.keymap.set("n", "<leader>x", "<cmd>!chmod +x %<CR>", { silent = true })
+
+-- yank into clipboard even if on ssh
+vim.keymap.set('n', '<leader>y', '<Plug>OSCYankOperator')
+vim.keymap.set('v', '<leader>y', '<Plug>OSCYankVisual')
+
+-- reload without exiting vim
+vim.keymap.set("n", "<leader>rl", "<cmd>source ~/.config/nvim/init.lua<cr>")
+
+vim.keymap.set("n", "<leader>u", vim.cmd.UndotreeToggle)
+
+-- Quickfix list stuff
+vim.keymap.set("n", "<leader>cl", ":cclose<CR>", { silent = true })
+vim.keymap.set("n", "<leader>co", ":copen<CR>", { silent = true })
+vim.keymap.set("n", "<leader>cn", ":cnext<CR>zz")
+vim.keymap.set("n", "<leader>cp", ":cprev<CR>zz")
+vim.keymap.set("n", "<leader>li", ":checkhealth vim.lsp<CR>", { desc = "LSP Info" })
+
+-- run make in current working directory
+vim.keymap.set("n", "<leader>mm", "<cmd>make<CR>")
+
+-- source file
+vim.keymap.set("n", "<leader><leader>", function()
+ vim.cmd("so")
+end)
diff --git a/nvim/lua/config/options.lua b/nvim/lua/config/options.lua
new file mode 100644
index 0000000..52de0a7
--- /dev/null
+++ b/nvim/lua/config/options.lua
@@ -0,0 +1,55 @@
+-- OPTIONS
+local set = vim.opt
+
+--line nums
+set.relativenumber = true
+set.number = true
+
+-- indentation and tabs
+set.tabstop = 4
+set.shiftwidth = 4
+set.autoindent = true
+set.expandtab = true
+
+-- search settings
+set.ignorecase = true
+set.smartcase = true
+
+-- appearance
+set.termguicolors = true
+set.background = "dark"
+set.signcolumn = "yes"
+
+-- cursor line
+set.cursorline = true
+
+-- 80th column
+set.colorcolumn = "80"
+
+-- clipboard
+set.clipboard:append("unnamedplus")
+
+-- backspace
+set.backspace = "indent,eol,start"
+
+-- split windows
+set.splitbelow = true
+set.splitright = true
+
+-- dw/diw/ciw works on full-word
+set.iskeyword:append("-")
+
+-- keep cursor at least 8 rows from top/bot
+set.scrolloff = 8
+
+-- undo dir settings
+set.swapfile = false
+set.backup = false
+set.undodir = os.getenv("HOME") .. "/.vim/undodir"
+set.undofile = true
+
+-- incremental search
+set.incsearch = true
+
+-- faster cursor hold
+set.updatetime = 50
diff --git a/nvim/lua/manage.lua b/nvim/lua/manage.lua
new file mode 100644
index 0000000..97d24c0
--- /dev/null
+++ b/nvim/lua/manage.lua
@@ -0,0 +1,35 @@
+local M = {}
+local plug_dir = vim.fn.stdpath("data") .. "/plugins"
+
+local function ensure(spec)
+ local repo = type(spec) == "string" and spec or spec[1]
+ local name = repo:match(".+/(.+)$")
+ local path = plug_dir .. "/" .. name
+
+ if not vim.uv.fs_stat(path) then
+ vim.fn.mkdir(plug_dir, "p")
+ local cmd = { "git", "clone", "--depth=1" }
+ if spec.branch then
+ table.insert(cmd, "-b")
+ table.insert(cmd, spec.branch)
+ end
+ table.insert(cmd, "https://github.com/" .. repo)
+ table.insert(cmd, path)
+ print("Installing " .. name .. "...")
+ vim.fn.system(cmd)
+ end
+
+ vim.opt.rtp:append(path)
+ local lua_path = path .. "/lua"
+ if vim.uv.fs_stat(lua_path) then
+ package.path = package.path .. ";" .. lua_path .. "/?.lua;" .. lua_path .. "/?/init.lua"
+ end
+end
+
+function M.setup()
+ for _, spec in ipairs(require("plugin-list")) do
+ ensure(spec)
+ end
+end
+
+return M
diff --git a/nvim/lua/plugin-list.lua b/nvim/lua/plugin-list.lua
new file mode 100644
index 0000000..33f3d4c
--- /dev/null
+++ b/nvim/lua/plugin-list.lua
@@ -0,0 +1,22 @@
+return {
+ "nvim-lua/plenary.nvim",
+ "nvim-tree/nvim-web-devicons",
+ { "nvim-treesitter/nvim-treesitter", branch = "master" },
+ { "nvim-treesitter/nvim-treesitter-textobjects", branch = "main" },
+ "nvim-treesitter/nvim-treesitter-context",
+ "hrsh7th/nvim-cmp",
+ "hrsh7th/cmp-nvim-lsp",
+ "hrsh7th/cmp-path",
+ "hrsh7th/cmp-buffer",
+ "nvim-telescope/telescope.nvim",
+ { "ThePrimeagen/harpoon", branch = "harpoon2" },
+ "folke/tokyonight.nvim",
+ "nvim-lualine/lualine.nvim",
+ "brenoprata10/nvim-highlight-colors",
+ "nvim-orgmode/orgmode",
+ "tpope/vim-fugitive",
+ "mbbill/undotree",
+ "ojroques/vim-oscyank",
+ "kkoomen/vim-doge",
+ "captbaritone/better-indent-support-for-php-with-html",
+}
diff --git a/nvim/plugin/flterm.lua b/nvim/plugin/flterm.lua
new file mode 100644
index 0000000..d766181
--- /dev/null
+++ b/nvim/plugin/flterm.lua
@@ -0,0 +1,55 @@
+-- Remap leaving 'terminal mode' to double tap esc
+vim.keymap.set("t", "<esc><esc>", "<c-\\><c-n>")
+
+local state = {
+ floating = {
+ buf = -1,
+ win = -1,
+ }
+}
+
+local function open_floating_terminal(opts)
+ opts = opts or {}
+ local width = opts.width or math.floor(vim.o.columns * 0.8)
+ local height = opts.height or math.floor(vim.o.lines * 0.8)
+
+ local row = math.floor((vim.o.lines - height) / 2)
+ local col = math.floor((vim.o.columns - width) / 2)
+
+ local buf = nil
+ if vim.api.nvim_buf_is_valid(opts.buf) then
+ buf = opts.buf
+ else
+ buf = vim.api.nvim_create_buf(false, true)
+ end
+ if not buf then
+ error("Failed to create buffer")
+ end
+
+ local win = vim.api.nvim_open_win(buf, true, {
+ relative = 'editor',
+ width = width,
+ height = height,
+ row = row,
+ col = col,
+ style = 'minimal',
+ border = 'rounded',
+ })
+
+ return { buf = buf, win = win }
+end
+
+local toggle_terminal = function()
+ if not vim.api.nvim_win_is_valid(state.floating.win) then
+ state.floating = open_floating_terminal({ buf = state.floating.buf });
+ if vim.bo[state.floating.buf].buftype ~= "terminal" then
+ vim.cmd.terminal()
+ vim.cmd("startinsert!")
+ end
+ else
+ vim.api.nvim_win_hide(state.floating.win)
+ end
+end
+
+vim.api.nvim_create_user_command("Flterm", toggle_terminal, {})
+vim.api.nvim_set_keymap('n', '<leader>ft', [[:Flterm<CR>]], { noremap = true, silent = true })
diff --git a/nvim/plugin/lsp.lua b/nvim/plugin/lsp.lua
new file mode 100644
index 0000000..9986ca4
--- /dev/null
+++ b/nvim/plugin/lsp.lua
@@ -0,0 +1,280 @@
+vim.lsp.config('*', {
+ root_markers = { '.git' },
+})
+
+vim.diagnostic.config({
+ virtual_text = true,
+ severity_sort = true,
+ float = {
+ style = 'minimal',
+ border = 'rounded',
+ source = 'if_many',
+ header = '',
+ prefix = '',
+ },
+ signs = {
+ text = {
+ [vim.diagnostic.severity.ERROR] = '✘',
+ [vim.diagnostic.severity.WARN] = '▲',
+ [vim.diagnostic.severity.HINT] = '⚑',
+ [vim.diagnostic.severity.INFO] = '»',
+ },
+ },
+})
+
+local orig = vim.lsp.util.open_floating_preview
+---@diagnostic disable-next-line: duplicate-set-field
+function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...)
+ opts = opts or {}
+ opts.border = opts.border or 'rounded'
+ opts.max_width = opts.max_width or 80
+ opts.max_height = opts.max_height or 24
+ opts.wrap = opts.wrap ~= false
+ return orig(contents, syntax, opts, ...)
+end
+
+vim.api.nvim_create_autocmd('LspAttach', {
+ group = vim.api.nvim_create_augroup('my.lsp', {}),
+ callback = function(args)
+ local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
+ local buf = args.buf
+ local map = function(mode, lhs, rhs) vim.keymap.set(mode, lhs, rhs, { buffer = buf }) end
+
+ map('n', 'K', vim.lsp.buf.hover)
+ map('n', 'gd', vim.lsp.buf.definition)
+ map('n', 'gD', vim.lsp.buf.declaration)
+ map('n', 'gi', vim.lsp.buf.implementation)
+ map('n', 'go', vim.lsp.buf.type_definition)
+ map('n', 'gr', vim.lsp.buf.references)
+ map('n', 'gs', vim.lsp.buf.signature_help)
+ map('n', 'gl', vim.diagnostic.open_float)
+ map('n', '<F2>', vim.lsp.buf.rename)
+ map({ 'n', 'x' }, '<F3>', function() vim.lsp.buf.format({ async = true }) end)
+ map('n', '<F4>', vim.lsp.buf.code_action)
+
+ if client:supports_method('textDocument/documentHighlight') then
+ local highlight_augroup = vim.api.nvim_create_augroup('my.lsp.highlight', { clear = false })
+ vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
+ buffer = buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.document_highlight,
+ })
+ vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
+ buffer = buf,
+ group = highlight_augroup,
+ callback = vim.lsp.buf.clear_references,
+ })
+ end
+
+ local excluded_filetypes = { php = true, c = true, cpp = true }
+ if not client:supports_method('textDocument/willSaveWaitUntil')
+ and client:supports_method('textDocument/formatting')
+ and not excluded_filetypes[vim.bo[buf].filetype]
+ then
+ vim.api.nvim_create_autocmd('BufWritePre', {
+ group = vim.api.nvim_create_augroup('my.lsp.format', { clear = false }),
+ buffer = buf,
+ callback = function()
+ vim.lsp.buf.format({ bufnr = buf, id = client.id, timeout_ms = 1000 })
+ end,
+ })
+ end
+ end,
+})
+local caps = require("cmp_nvim_lsp").default_capabilities()
+vim.lsp.config['luals'] = {
+ cmd = { 'lua-language-server' },
+ filetypes = { 'lua' },
+ root_markers = { { '.luarc.json', '.luarc.jsonc' }, '.git' },
+ capabilities = caps,
+ settings = {
+ Lua = {
+ runtime = { version = 'LuaJIT' },
+ diagnostics = { globals = { 'vim' } },
+ workspace = {
+ checkThirdParty = false,
+ library = vim.api.nvim_get_runtime_file('', true),
+ },
+ telemetry = { enable = false },
+ },
+ },
+}
+
+vim.lsp.config['cssls'] = {
+ cmd = { 'vscode-css-language-server', '--stdio' },
+ filetypes = { 'css', 'scss', 'less' },
+ root_markers = { 'package.json', '.git' },
+ capabilities = caps,
+ settings = {
+ css = { validate = true },
+ scss = { validate = true },
+ less = { validate = true },
+ },
+}
+
+vim.lsp.config['phpls'] = {
+ cmd = { 'intelephense', '--stdio' },
+ filetypes = { 'php' },
+ root_markers = { 'composer.json', '.git' },
+ capabilities = caps,
+ settings = {
+ intelephense = {
+ files = {
+ maxSize = 5000000, -- default 5MB
+ },
+ },
+ },
+}
+
+vim.lsp.config['ts_ls'] = {
+ cmd = { 'typescript-language-server', '--stdio' },
+ filetypes = {
+ 'javascript', 'javascriptreact', 'javascript.jsx',
+ 'typescript', 'typescriptreact', 'typescript.tsx',
+ },
+ root_markers = { 'package.json', 'tsconfig.json', 'jsconfig.json', '.git' },
+ capabilities = caps,
+ settings = {
+ completions = {
+ completeFunctionCalls = true,
+ },
+ },
+}
+
+vim.lsp.config['zls'] = {
+ cmd = { 'zls' },
+ filetypes = { 'zig', 'zir' },
+ root_markers = { 'zls.json', 'build.zig', '.git' },
+ capabilities = caps,
+ settings = {
+ zls = {
+ enable_build_on_save = true,
+ build_on_save_step = "install",
+ warn_style = false,
+ enable_snippets = true,
+ }
+ }
+}
+
+vim.lsp.config['nil_ls'] = {
+ cmd = { 'nil' },
+ filetypes = { 'nix' },
+ root_markers = { 'flake.nix', 'default.nix', '.git' },
+ capabilities = caps,
+ settings = {
+ ['nil'] = {
+ formatting = {
+ command = { "alejandra" }
+ }
+ }
+ }
+}
+
+vim.lsp.config['rust_analyzer'] = {
+ cmd = { 'rust-analyzer' },
+ filetypes = { 'rust' },
+ root_markers = { 'Cargo.toml', 'rust-project.json', '.git' },
+ capabilities = caps,
+ settings = {
+ ['rust-analyzer'] = {
+ cargo = { allFeatures = true },
+ formatting = {
+ command = { "rustfmt" }
+ },
+ },
+ },
+}
+
+-- C / C++ via clangd
+vim.lsp.config['clangd'] = {
+ cmd = {
+ 'clangd',
+ '--background-index',
+ '--clang-tidy',
+ '--header-insertion=never',
+ '--completion-style=detailed',
+ '--query-driver=/nix/store/*-gcc-*/bin/gcc*,/nix/store/*-clang-*/bin/clang*,/run/current-system/sw/bin/cc*',
+ },
+ filetypes = { 'c', 'cpp', 'objc', 'objcpp' },
+ root_markers = { 'compile_commands.json', '.clangd', 'configure.ac', 'Makefile', '.git' },
+ capabilities = caps,
+ init_options = {
+ fallbackFlags = { '-std=c23' }, -- Default to C23
+ },
+}
+
+vim.lsp.config['c3lsp'] = {
+ cmd = { 'c3-lsp' },
+ filetypes = { 'c3' },
+ root_markers = { 'project.json', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['serve_d'] = {
+ cmd = { 'serve-d' },
+ filetypes = { 'd' },
+ root_markers = { 'dub.sdl', 'dub.json', '.git' },
+ capabilities = caps,
+}
+
+vim.lsp.config['jsonls'] = {
+ cmd = { 'vscode-json-languageserver', '--stdio' },
+ filetypes = { 'json', 'jsonc' },
+ root_markers = { 'package.json', '.git', 'config.jsonc' },
+ capabilities = caps,
+}
+
+vim.lsp.config['hls'] = {
+ cmd = { 'haskell-language-server-wrapper', '--lsp' },
+ filetypes = { 'haskell', 'lhaskell' },
+ root_markers = { 'stack.yaml', 'cabal.project', 'package.yaml', '*.cabal', 'hie.yaml', '.git' },
+ capabilities = caps,
+ settings = {
+ haskell = {
+ formattingProvider = 'fourmolu',
+ plugin = {
+ semanticTokens = { globalOn = false }
+ },
+ },
+ },
+}
+
+vim.lsp.config['gopls'] = {
+ cmd = { 'gopls' },
+ filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' },
+ root_markers = { 'go.mod', 'go.work', '.git' },
+ capabilities = caps,
+ settings = {
+ gopls = {
+ analyses = {
+ unusedparams = false,
+ ST1003 = false,
+ ST1000 = false,
+ },
+ staticcheck = true,
+ },
+ },
+}
+
+vim.lsp.config['templ'] = {
+ cmd = { 'templ', 'lsp' },
+ filetypes = { 'templ' },
+ root_markers = { 'go.mod', '.git' },
+ capabilities = caps,
+}
+
+vim.filetype.add({
+ extension = {
+ h = 'c',
+ c3 = 'c3',
+ d = 'd',
+ templ = 'templ',
+ },
+})
+
+---@diagnostic disable-next-line: invisible
+for name, _ in pairs(vim.lsp.config._configs) do
+ if name ~= '*' then
+ vim.lsp.enable(name)
+ end
+end
diff --git a/nvim/plugin/quickformat.lua b/nvim/plugin/quickformat.lua
new file mode 100644
index 0000000..038dadf
--- /dev/null
+++ b/nvim/plugin/quickformat.lua
@@ -0,0 +1,40 @@
+local function reformat_parenthesized_content()
+ local bufnr = vim.api.nvim_get_current_buf()
+ local row = vim.api.nvim_win_get_cursor(0)[1]
+ local line = vim.api.nvim_buf_get_lines(bufnr, row - 1, row, false)[1]
+
+ local inside = line:match("%((.-)%)")
+ if not inside then
+ vim.notify(
+ "No content found inside parentheses",
+ vim.log.levels.ERROR
+ )
+ return
+ end
+
+ local prefix = line:match("^(.-)%(") or ""
+ local suffix = line:match("%)(.*)$") or ""
+
+ local parts = vim.split(inside, ",%s*")
+ if #parts == 0 then
+ vim.notify("No comma-separated content found", vim.log.levels.ERROR)
+ return
+ end
+
+ local new_lines = {}
+ table.insert(new_lines, prefix .. "(")
+ for i, part in ipairs(parts) do
+ if i < #parts then
+ table.insert(new_lines, " " .. part .. ",")
+ else
+ table.insert(new_lines, " " .. part)
+ end
+ end
+ table.insert(new_lines, " )" .. suffix)
+
+ vim.api.nvim_buf_set_lines(bufnr, row - 1, row, false, new_lines)
+end
+
+vim.keymap.set("n", "<leader>qq", function()
+ reformat_parenthesized_content()
+end)
diff --git a/nvim/queries/goon/highlights.scm b/nvim/queries/goon/highlights.scm
new file mode 100644
index 0000000..893c012
--- /dev/null
+++ b/nvim/queries/goon/highlights.scm
@@ -0,0 +1,55 @@
+; Keywords
+"let" @keyword
+"if" @keyword.conditional
+"then" @keyword.conditional
+"else" @keyword.conditional
+"import" @keyword.import
+
+; Literals
+(string) @string
+(string_content) @string
+(escape_sequence) @string.escape
+(number) @number
+(boolean) @boolean
+
+; Identifiers
+(identifier) @variable
+
+; Types
+(type_annotation) @type
+
+; Fields
+(record_field
+ key: (identifier) @property)
+
+(field_access
+ (identifier) @property)
+
+; Functions
+(call_expression
+ function: (identifier) @function.call)
+
+; Operators
+"=" @operator
+":" @punctuation.delimiter
+"?" @operator
+"..." @operator
+"." @punctuation.delimiter
+
+; Punctuation
+"{" @punctuation.bracket
+"}" @punctuation.bracket
+"[" @punctuation.bracket
+"]" @punctuation.bracket
+"(" @punctuation.bracket
+")" @punctuation.bracket
+";" @punctuation.delimiter
+"," @punctuation.delimiter
+
+; Interpolation
+(interpolation
+ "${" @punctuation.special
+ "}" @punctuation.special)
+
+; Comments
+(comment) @comment
diff --git a/oxwm/.luarc.json b/oxwm/.luarc.json
new file mode 100644
index 0000000..2234f28
--- /dev/null
+++ b/oxwm/.luarc.json
@@ -0,0 +1,5 @@
+{
+ "workspace.library": [
+ "/usr/share/oxwm"
+ ]
+}
diff --git a/oxwm/colors/custom-colors.lua b/oxwm/colors/custom-colors.lua
new file mode 100644
index 0000000..d8c2075
--- /dev/null
+++ b/oxwm/colors/custom-colors.lua
@@ -0,0 +1,14 @@
+return {
+ bg = "#000000",
+ fg = "#d4d4d4",
+ red = "#f14c4c",
+ cyan = "#9cdcfe",
+ green = "#6a9955",
+ light_blue = "#4ec9b0",
+ blue = "#569cd6",
+ purple = "#c586c0",
+ yellow = "#dcdcaa",
+ orange = "#ce9178",
+ grey = "#808080",
+ sep = "#3c3c3c",
+}
diff --git a/oxwm/config.lua b/oxwm/config.lua
new file mode 100644
index 0000000..537773c
--- /dev/null
+++ b/oxwm/config.lua
@@ -0,0 +1,287 @@
+---@meta
+-------------------------------------------------------------------------------
+-- OXWM Configuration File
+-------------------------------------------------------------------------------
+
+---Load type definitions for LSP
+---@module 'oxwm'
+
+-------------------------------------------------------------------------------
+-- Variables
+-------------------------------------------------------------------------------
+-- Define your variables here for easy customization throughout the config.
+-- This makes it simple to change keybindings, colors, and settings in one place.
+
+-- Modifier key: "Mod4" is the Super/Windows key, "Mod1" is Alt
+local modkey = "Mod1"
+
+-- Terminal emulator command (defualts to alacritty)
+local terminal = "alacritty"
+
+-- Color palette - customize these to match your theme
+-- Alternatively you can import other files in here, such as
+-- local colors = require("colors.lua") and make colors.lua a file
+-- in the ~/.config/oxwm directory
+-- local colors = require("tokyonight");
+local colors = require("colors.custom-colors");
+
+local tags = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }
+-- local tags = { "", "", "", "", "", "", "", "", "" } -- Example of nerd font icon tags
+
+local bar_font = "UbuntuMono Nerd Font Propo:style=Bold:size=12"
+
+local blocks = {
+ oxwm.bar.block.shell({
+ format = " {}",
+ command = "uname -r",
+ interval = 999999999,
+ color = colors.red,
+ underline = true,
+ }),
+ oxwm.bar.block.static({
+ text = "│",
+ interval = 999999999,
+ color = colors.sep,
+ underline = false,
+ }),
+ oxwm.bar.block.ram({
+ format = " Ram: {used}/{total} GB",
+ interval = 5,
+ color = colors.light_blue,
+ underline = true,
+ }),
+ oxwm.bar.block.static({
+ text = "│",
+ interval = 999999999,
+ color = colors.sep,
+ underline = false,
+ }),
+ oxwm.bar.block.datetime({
+ format = " {}",
+ date_format = "%a, %b %d - %-I:%M %P",
+ interval = 1,
+ color = colors.cyan,
+ underline = true,
+ }),
+ -- Uncomment to add battery status (useful for laptops)
+ -- oxwm.bar.block.battery({
+ -- format = "Bat: {}%",
+ -- charging = "⚡ Bat: {}%",
+ -- discharging = "- Bat: {}%",
+ -- full = "✓ Bat: {}%",
+ -- interval = 30,
+ -- color = colors.green,
+ -- underline = true,
+ -- }),
+};
+
+-------------------------------------------------------------------------------
+-- Basic Settings
+-------------------------------------------------------------------------------
+oxwm.set_terminal(terminal)
+oxwm.set_modkey(modkey)
+oxwm.set_tags(tags)
+
+-------------------------------------------------------------------------------
+-- Layouts
+-------------------------------------------------------------------------------
+oxwm.set_layout_symbol("tiling", "[T]")
+oxwm.set_layout_symbol("normie", "[F]")
+oxwm.set_layout_symbol("tabbed", "[=]")
+
+-------------------------------------------------------------------------------
+-- Appearance
+-------------------------------------------------------------------------------
+oxwm.border.set_width(0)
+oxwm.border.set_focused_color(colors.purple)
+oxwm.border.set_unfocused_color(colors.grey)
+
+-- Smart Enabled = No border if 1 window
+oxwm.gaps.set_smart(false)
+-- Inner gaps (horizontal, vertical) in pixels
+oxwm.gaps.set_inner(5, 5)
+-- Outer gaps (horizontal, vertical) in pixels
+oxwm.gaps.set_outer(5, 5)
+
+-------------------------------------------------------------------------------
+-- Window Rules
+-------------------------------------------------------------------------------
+-- Rules allow you to automatically configure windows based on their properties
+-- You can match windows by class, instance, title, or role
+-- Available properties: floating, tag, fullscreen, etc.
+--
+-- Common use cases:
+-- - Force floating for certain applications (dialogs, utilities)
+-- - Send specific applications to specific workspaces
+-- - Configure window behavior based on title or class
+
+-- Examples (uncomment to use):
+oxwm.rule.add({ instance = "gimp", floating = true })
+oxwm.rule.add({ instance = "brave-browser", tag = 2 })
+oxwm.rule.add({ class = "firefox", tag = 3 })
+oxwm.rule.add({ instance = "slack", tag = 4 })
+oxwm.rule.add({ instance = "discord", tag = 5 })
+
+-- To find window properties, use xprop and click on the window
+-- WM_CLASS(STRING) shows both instance and class (instance, class)
+
+-------------------------------------------------------------------------------
+-- Status Bar Configuration
+-------------------------------------------------------------------------------
+-- Font configuration
+oxwm.bar.set_font(bar_font)
+
+-- Set your blocks here (defined above)
+oxwm.bar.set_blocks(blocks)
+
+-- Bar color schemes (for workspace tag display)
+-- Parameters: foreground, background, border
+
+-- Unoccupied tags
+oxwm.bar.set_scheme_normal(colors.fg, colors.bg, "#444444")
+-- Occupied tags
+oxwm.bar.set_scheme_occupied(colors.blue, colors.bg, colors.cyan)
+-- Currently selected tag
+oxwm.bar.set_scheme_selected(colors.blue, colors.bg, colors.purple)
+
+-------------------------------------------------------------------------------
+-- Keybindings
+-------------------------------------------------------------------------------
+-- Basic window management
+
+oxwm.key.bind({ modkey }, "Return", oxwm.spawn_terminal())
+-- Launch Dmenu
+-- oxwm.key.bind({ modkey }, "D", oxwm.spawn({ "sh", "-c", "dmenu_run -l 10" }))
+oxwm.key.bind({ modkey }, "D", oxwm.spawn({ "sh", "-c", "rofi -show drun" }))
+-- Copy screenshot to clipboard
+oxwm.key.bind({ modkey }, "S", oxwm.spawn({ "sh", "-c", "maim -s | xclip -selection clipboard -t image/png" }))
+oxwm.key.bind({ modkey }, "Q", oxwm.client.kill())
+
+-- Keybind overlay - Shows important keybindings on screen
+oxwm.key.bind({ modkey, "Shift" }, "Slash", oxwm.show_keybinds())
+
+-- Window state toggles
+oxwm.key.bind({ modkey, "Shift" }, "F", oxwm.client.toggle_fullscreen())
+oxwm.key.bind({ modkey, "Shift" }, "Space", oxwm.client.toggle_floating())
+
+-- Layout management
+oxwm.key.bind({ modkey }, "C", oxwm.layout.set("tiling"))
+-- Cycle through layouts
+oxwm.key.bind({ modkey }, "N", oxwm.layout.cycle())
+
+-- Master area controls (tiling layout)
+
+-- Decrease/Increase master area width
+oxwm.key.bind({ modkey }, "H", oxwm.set_master_factor(-5))
+oxwm.key.bind({ modkey }, "L", oxwm.set_master_factor(5))
+-- Increment/Decrement number of master windows
+oxwm.key.bind({ modkey }, "I", oxwm.inc_num_master(1))
+oxwm.key.bind({ modkey }, "P", oxwm.inc_num_master(-1))
+
+-- Gaps toggle
+oxwm.key.bind({ modkey }, "A", oxwm.toggle_gaps())
+
+-- Window manager controls
+oxwm.key.bind({ modkey, "Shift" }, "Q", oxwm.quit())
+oxwm.key.bind({ modkey, "Shift" }, "R", oxwm.restart())
+
+-- Focus movement [1 for up in the stack, -1 for down]
+oxwm.key.bind({ modkey }, "J", oxwm.client.focus_stack(1))
+oxwm.key.bind({ modkey }, "K", oxwm.client.focus_stack(-1))
+
+-- Window movement (swap position in stack)
+oxwm.key.bind({ modkey, "Shift" }, "J", oxwm.client.move_stack(1))
+oxwm.key.bind({ modkey, "Shift" }, "K", oxwm.client.move_stack(-1))
+
+-- Multi-monitor support
+
+-- Focus next/previous Monitors
+oxwm.key.bind({ modkey }, "Comma", oxwm.monitor.focus(-1))
+oxwm.key.bind({ modkey }, "Period", oxwm.monitor.focus(1))
+-- Move window to next/previous Monitors
+oxwm.key.bind({ modkey, "Shift" }, "Comma", oxwm.monitor.tag(-1))
+oxwm.key.bind({ modkey, "Shift" }, "Period", oxwm.monitor.tag(1))
+
+-- Workspace (tag) navigation
+-- Switch to workspace N (tags are 0-indexed, so tag "1" is index 0)
+oxwm.key.bind({ modkey }, "1", oxwm.tag.view(0))
+oxwm.key.bind({ modkey }, "2", oxwm.tag.view(1))
+oxwm.key.bind({ modkey }, "3", oxwm.tag.view(2))
+oxwm.key.bind({ modkey }, "4", oxwm.tag.view(3))
+oxwm.key.bind({ modkey }, "5", oxwm.tag.view(4))
+oxwm.key.bind({ modkey }, "6", oxwm.tag.view(5))
+oxwm.key.bind({ modkey }, "7", oxwm.tag.view(6))
+oxwm.key.bind({ modkey }, "8", oxwm.tag.view(7))
+oxwm.key.bind({ modkey }, "9", oxwm.tag.view(8))
+
+-- Move focused window to workspace N
+oxwm.key.bind({ modkey, "Shift" }, "1", oxwm.tag.move_to(0))
+oxwm.key.bind({ modkey, "Shift" }, "2", oxwm.tag.move_to(1))
+oxwm.key.bind({ modkey, "Shift" }, "3", oxwm.tag.move_to(2))
+oxwm.key.bind({ modkey, "Shift" }, "4", oxwm.tag.move_to(3))
+oxwm.key.bind({ modkey, "Shift" }, "5", oxwm.tag.move_to(4))
+oxwm.key.bind({ modkey, "Shift" }, "6", oxwm.tag.move_to(5))
+oxwm.key.bind({ modkey, "Shift" }, "7", oxwm.tag.move_to(6))
+oxwm.key.bind({ modkey, "Shift" }, "8", oxwm.tag.move_to(7))
+oxwm.key.bind({ modkey, "Shift" }, "9", oxwm.tag.move_to(8))
+
+-- Combo view (view multiple tags at once) {argos_nothing}
+-- Example: Mod+Ctrl+2 while on tag 1 will show BOTH tags 1 and 2
+oxwm.key.bind({ modkey, "Control" }, "1", oxwm.tag.toggleview(0))
+oxwm.key.bind({ modkey, "Control" }, "2", oxwm.tag.toggleview(1))
+oxwm.key.bind({ modkey, "Control" }, "3", oxwm.tag.toggleview(2))
+oxwm.key.bind({ modkey, "Control" }, "4", oxwm.tag.toggleview(3))
+oxwm.key.bind({ modkey, "Control" }, "5", oxwm.tag.toggleview(4))
+oxwm.key.bind({ modkey, "Control" }, "6", oxwm.tag.toggleview(5))
+oxwm.key.bind({ modkey, "Control" }, "7", oxwm.tag.toggleview(6))
+oxwm.key.bind({ modkey, "Control" }, "8", oxwm.tag.toggleview(7))
+oxwm.key.bind({ modkey, "Control" }, "9", oxwm.tag.toggleview(8))
+
+-- Multi tag (window on multiple tags)
+-- Example: Mod+Ctrl+Shift+2 puts focused window on BOTH current tag and tag 2
+oxwm.key.bind({ modkey, "Control", "Shift" }, "1", oxwm.tag.toggletag(0))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "2", oxwm.tag.toggletag(1))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "3", oxwm.tag.toggletag(2))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "4", oxwm.tag.toggletag(3))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "5", oxwm.tag.toggletag(4))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "6", oxwm.tag.toggletag(5))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "7", oxwm.tag.toggletag(6))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "8", oxwm.tag.toggletag(7))
+oxwm.key.bind({ modkey, "Control", "Shift" }, "9", oxwm.tag.toggletag(8))
+
+-------------------------------------------------------------------------------
+-- Advanced: Keychords
+-------------------------------------------------------------------------------
+-- Keychords allow you to bind multiple-key sequences (like Emacs or Vim)
+-- Format: {{modifiers}, key1}, {{modifiers}, key2}, ...
+-- Example: Press Mod4+Space, then release and press T to spawn a terminal
+oxwm.key.chord({
+ { { modkey }, "Space" },
+ { {}, "T" }
+}, oxwm.spawn_terminal())
+
+oxwm.key.chord({
+ { { modkey }, "F" },
+ { {}, "B" }
+}, oxwm.spawn({ "sh", "-c", "$HOME/repos/dmenu-scripts/bookmarks-dmenu.sh" }))
+
+oxwm.key.chord({
+ { { modkey }, "F" },
+ { {}, "F" }
+}, oxwm.spawn({ "sh", "-c", "$HOME/repos/dmenu-scripts/repos-dmenu.sh" }))
+
+oxwm.key.chord({
+ { { modkey }, "F" },
+ { {}, "O" }
+}, oxwm.spawn({ "sh", "-c", "$HOME/repos/dmenu-scripts/tmux-dmenu.sh" }))
+
+-------------------------------------------------------------------------------
+-- Autostart
+-------------------------------------------------------------------------------
+-- Commands to run once when OXWM starts
+-- Uncomment and modify these examples, or add your own
+
+-- oxwm.autostart("picom")
+-- oxwm.autostart("xwallpaper --zoom ~/walls/dune.jpg")
+-- oxwm.autostart("dunst")
+-- oxwm.autostart("nm-applet")
diff --git a/oxwm/custom-colors.lua b/oxwm/custom-colors.lua
new file mode 100644
index 0000000..d8c2075
--- /dev/null
+++ b/oxwm/custom-colors.lua
@@ -0,0 +1,14 @@
+return {
+ bg = "#000000",
+ fg = "#d4d4d4",
+ red = "#f14c4c",
+ cyan = "#9cdcfe",
+ green = "#6a9955",
+ light_blue = "#4ec9b0",
+ blue = "#569cd6",
+ purple = "#c586c0",
+ yellow = "#dcdcaa",
+ orange = "#ce9178",
+ grey = "#808080",
+ sep = "#3c3c3c",
+}
diff --git a/oxwm/gruvbox.lua b/oxwm/gruvbox.lua
new file mode 100644
index 0000000..140c36a
--- /dev/null
+++ b/oxwm/gruvbox.lua
@@ -0,0 +1,13 @@
+return {
+ fg = "#ebdbb2",
+ red = "#fb4934",
+ bg = "#282828",
+ cyan = "#8ec07c",
+ green = "#b8bb26",
+ lavender = "#d3869b",
+ light_blue = "#83a598",
+ grey = "#928374",
+ blue = "#83a598",
+ purple = "#d3869b",
+ sep = "#504945",
+}
diff --git a/oxwm/nord.lua b/oxwm/nord.lua
new file mode 100644
index 0000000..1754d2a
--- /dev/null
+++ b/oxwm/nord.lua
@@ -0,0 +1,13 @@
+return {
+ fg = "#d8dee9",
+ red = "#bf616a",
+ bg = "#2e3440",
+ cyan = "#88c0d0",
+ green = "#a3be8c",
+ lavender = "#b48ead",
+ light_blue = "#88c0d0",
+ grey = "#4c566a",
+ blue = "#81a1c1",
+ purple = "#b48ead",
+ sep = "#434c5e",
+}
diff --git a/oxwm/tokyonight.lua b/oxwm/tokyonight.lua
new file mode 100644
index 0000000..16df343
--- /dev/null
+++ b/oxwm/tokyonight.lua
@@ -0,0 +1,13 @@
+return {
+ fg = "#bbbbbb",
+ red = "#f7768e",
+ bg = "#1a1b26",
+ cyan = "#0db9d7",
+ green = "#9ece6a",
+ lavender = "#a9b1d6",
+ light_blue = "#7aa2f7",
+ grey = "#bbbbbb",
+ blue = "#6dade3",
+ purple = "#ad8ee6",
+ sep = "#444b6a",
+}
diff --git a/picom/picom.conf b/picom/picom.conf
new file mode 100644
index 0000000..6b9de4e
--- /dev/null
+++ b/picom/picom.conf
@@ -0,0 +1,51 @@
+shadow-radius = 7;
+shadow-offset-x = -7;
+shadow-offset-y = -7;
+shadow-exclude = [
+ "name = 'Notification'",
+ "class_g ?= 'Notify-osd'",
+ "_GTK_FRAME_EXTENTS@:c"
+];
+
+fading = true;
+fade-in-step = 0.03;
+fade-out-step = 0.03;
+
+inactive-opacity = 0.8;
+
+frame-opacity = 1.0
+
+inactive-opacity-override = false;
+
+opacity-rule = [
+ "100:class_g = 'Alacritty' && fullscreen",
+ "90:class_g = 'Alacritty'"
+];
+
+blur-kern = "3x3box";
+
+blur-background-exclude = [
+ "window_type = 'dock'",
+ "window_type = 'desktop'",
+ "_GTK_FRAME_EXTENTS@:c"
+];
+
+# backend = "glx"
+backend = "xrender";
+dithered-present = false;
+vsync = true;
+mark-wmwin-focused = true;
+mark-ovredir-focused = true;
+detect-client-opacity = true;
+detect-transient = true;
+use-damage = false;
+log-level = "warn";
+
+wintypes:
+{
+ tooltip = { fade = true; shadow = true; opacity = 0.95; focus = true; full-shadow = false; };
+ dock = { shadow = false; clip-shadow-above = true; }
+ dnd = { shadow = false; }
+ popup_menu = { opacity = 0.95; }
+ dropdown_menu = { opacity = 0.95; }
+};
diff --git a/rofi/backup-config b/rofi/backup-config
new file mode 100644
index 0000000..57fdb88
--- /dev/null
+++ b/rofi/backup-config
@@ -0,0 +1,48 @@
+configuration {
+ modi: "drun,run";
+ show-icons: false;
+ font: "monospace 10";
+ fullscreen: false;
+ dpi: 96;
+}
+
+* {
+ background: #2E3440; /* Nord0 */
+ foreground: #D8DEE9; /* Nord4 */
+ selected-background: #88C0D0; /* Nord8 */
+ selected-foreground: #2E3440; /* Nord0 */
+ border: 0;
+ padding: 6;
+ spacing: 5;
+ width: 50%;
+}
+
+window {
+ location: center;
+ border-radius: 6px;
+}
+
+inputbar {
+ background: @background;
+ text-color: @foreground;
+ padding: 10px;
+ border-radius: 6px;
+}
+
+listview {
+ padding: 5px;
+ lines: 10;
+}
+
+element {
+ background: transparent;
+ text-color: @foreground;
+}
+
+element selected {
+ background: @selected-background;
+ text-color: @selected-foreground;
+ border-radius: 4px;
+}
+
+@theme "/usr/share/rofi/themes/DarkBlue.rasi"
diff --git a/rofi/config.rasi b/rofi/config.rasi
new file mode 100644
index 0000000..488136c
--- /dev/null
+++ b/rofi/config.rasi
@@ -0,0 +1,29 @@
+configuration{
+ modi: ["drun", "window", "run"];
+ icon-theme: "Papirus-Dark";
+ show-icons: true;
+ terminal: "alacritty";
+ drun-display-format: "{icon} {name}";
+ location: 0;
+ disable-history: false;
+ sidebar-mode: false;
+ display-drun: " ";
+ display-run: " ";
+ display-window: " ";
+
+ //adding vim keybindings
+ kb-row-up: "Up,Control+k";
+ kb-row-left: "Left,Control+h";
+ kb-row-right: "Right,Control+l";
+ kb-row-down: "Down,Control+j";
+
+ kb-accept-entry: "Control+z,Control+y,Return,KP_Enter";
+
+ //fixing up
+ kb-remove-to-eol: "";
+ kb-move-char-back: "Control+b";
+ kb-remove-char-back: "BackSpace";
+ kb-move-char-forward: "Control+f";
+ kb-mode-complete: "Control+o";
+}
+@theme "tokyonight.rasi"
diff --git a/rofi/dwm-config.rasi b/rofi/dwm-config.rasi
new file mode 100644
index 0000000..e2ae40c
--- /dev/null
+++ b/rofi/dwm-config.rasi
@@ -0,0 +1,93 @@
+configuration {
+ modi: "drun";
+ font: "JetBrainsMono Nerd Font 10";
+ show-icons: false;
+ terminal: "alacritty";
+ icon-theme: "Papirus-Dark";
+ drun-display-format: "{name}";
+ display-drun: "";
+ timeout {
+ action: "kb-cancel";
+ delay: 0;
+ }
+ filebrowser {
+ directories-first: true;
+ sorting-method: "name";
+ }
+}
+
+@theme "/dev/null"
+
+* {
+ bg: #232933;
+ fg: #d8dee9;
+ selected: #2d3543;
+ accent: #4d6a8e;
+ background-color: @bg;
+
+ color: @fg;
+ border: 0;
+ border-color: @bg;
+ margin: 0;
+ padding: 0;
+ spacing: 0;
+ highlight: none;
+}
+
+window {
+ width: 700px;
+}
+
+element {
+ padding: 6 5 7 5;
+ text-color: @fg;
+}
+
+element-text {
+ vertical-align: 0.5;
+ padding: 5px;
+}
+
+element selected {
+ background-color: @selected;
+}
+
+element-text selected {
+ background-color: @selected;
+}
+
+element-icon selected {
+ background-color: @selected;
+}
+
+element-icon {
+ size: 30;
+}
+
+entry {
+ background-color: @bg;
+ columns: 1;
+ lines: 20;
+}
+
+inputbar {
+ children: [prompt, entry];
+}
+
+prompt {
+ text-color: @bg;
+ background-color: @accent;
+ padding: 12 12 12 12;
+}
+
+entry {
+ text-color: @bg;
+ background-color: @accent;
+ padding: 12 5 12 0;
+}
+
+listview {
+ background-color: @bg;
+ columns: 3;
+ lines: 6;
+}
diff --git a/rofi/tokyonight.rasi b/rofi/tokyonight.rasi
new file mode 100644
index 0000000..bd64a99
--- /dev/null
+++ b/rofi/tokyonight.rasi
@@ -0,0 +1,137 @@
+/*
+ * Tokyonight colorscheme (big icons) for rofi
+ * User: w8ste
+ */
+
+
+// define colors etc.
+* {
+ bg: #24283b;
+ hv: #9274ca;
+ primary: #444b6a; // TokyoNight bright black
+ ug: #0B2447;
+ font: "Monospace 11";
+ background-color: @bg;
+ //dark: @bg;
+ border: 0px;
+ kl: #7aa2f7;
+ black: #000000;
+
+ transparent: rgba(46,52,64,0);
+}
+
+// defines different aspects of the window
+window {
+ width: 700;
+ /*since line wont work with height, i comment it out
+ if you rather control the size via height
+ just comment it out */
+ //height: 500;
+
+ orientation: horizontal;
+ location: center;
+ anchor: center;
+ transparency: "screenshot";
+ border-color: @transparent;
+ border: 0px;
+ border-radius: 6px;
+ spacing: 0;
+ children: [ mainbox ];
+}
+
+mainbox {
+ spacing: 0;
+ children: [ inputbar, message, listview ];
+}
+
+inputbar {
+ color: @kl;
+ padding: 11px;
+ border: 3px 3px 2px 3px;
+ border-color: @primary;
+ border-radius: 6px 6px 0px 0px;
+}
+
+message {
+ padding: 0;
+ border-color: @primary;
+ border: 0px 1px 1px 1px;
+}
+
+entry, prompt, case-indicator {
+ text-font: inherit;
+ text-color: inherit;
+}
+
+entry {
+ cursor: pointer;
+}
+
+prompt {
+ margin: 0px 5px 0px 0px;
+}
+
+listview {
+ layout: vertical;
+ //spacing: 5px;
+ padding: 8px;
+ lines: 7;
+ columns: 2;
+ border: 0px 3px 3px 3px;
+ border-radius: 0px 0px 6px 6px;
+ border-color: @primary;
+ dynamic: false;
+}
+
+element {
+ padding: 2px;
+ vertical-align: 1;
+ color: @kl;
+ font: inherit;
+}
+
+element-text {
+ background-color: inherit;
+ text-color: inherit;
+ vertical-align: 0.5;
+}
+
+element selected.normal {
+ color: @black;
+ background-color: @hv;
+}
+
+element normal active {
+ background-color: @hv;
+ color: @black;
+}
+
+element-icon {
+ background-color: inherit;
+ text-color: inherit;
+ size: 2.5em;
+}
+
+element normal urgent {
+ background-color: @primary;
+}
+
+element selected active {
+ background: @hv;
+ foreground: @bg;
+}
+
+button {
+ padding: 6px;
+ color: @primary;
+ horizonatal-align: 0.5;
+
+ border: 2px 0px 2px 2px;
+ border-radius: 4px 0px 0px 4px;
+ border-color: @primary;
+}
+
+button selected normal {
+ border: 2px 0px 2px 2px;
+ border-color: @primary;
+}
diff --git a/wall1.jpg b/wall1.jpg
new file mode 100644
index 0000000..f288fc6
Binary files /dev/null and b/wall1.jpg differ