From d16e497c837470d508526211922be2f8f93026c9 Mon Sep 17 00:00:00 2001 From: bartal laearsson Date: Mon, 29 Jun 2026 12:42:38 +0100 Subject: [PATCH] initial commit --- foot/.config/foot/foot.ini | 30 ++ git/.gitconfig | 26 ++ nvim/.config/nvim/init.lua | 490 +++++++++++++++++++++++ ssh/.ssh/config | 9 + sway/.config/sway/config | 118 ++++++ sway/.config/sway/tux.png | Bin 0 -> 50253 bytes tmux/.config/tmux/theme.conf | 28 ++ tmux/.config/tmux/tmux.conf | 12 + waybar/.config/waybar/config | 44 ++ waybar/.config/waybar/launch.sh | 21 + waybar/.config/waybar/style.css | 49 +++ waybar/.config/waybar/themes/current.css | 7 + waybar/.config/waybar/themes/dark.css | 6 + waybar/.config/waybar/themes/light.css | 6 + zsh/.zshrc | 36 ++ 15 files changed, 882 insertions(+) create mode 100644 foot/.config/foot/foot.ini create mode 100644 git/.gitconfig create mode 100644 nvim/.config/nvim/init.lua create mode 100644 ssh/.ssh/config create mode 100644 sway/.config/sway/config create mode 100644 sway/.config/sway/tux.png create mode 100644 tmux/.config/tmux/theme.conf create mode 100644 tmux/.config/tmux/tmux.conf create mode 100644 waybar/.config/waybar/config create mode 100755 waybar/.config/waybar/launch.sh create mode 100644 waybar/.config/waybar/style.css create mode 100644 waybar/.config/waybar/themes/current.css create mode 100644 waybar/.config/waybar/themes/dark.css create mode 100644 waybar/.config/waybar/themes/light.css create mode 100644 zsh/.zshrc diff --git a/foot/.config/foot/foot.ini b/foot/.config/foot/foot.ini new file mode 100644 index 0000000..2922f17 --- /dev/null +++ b/foot/.config/foot/foot.ini @@ -0,0 +1,30 @@ +[main] +font=DejaVu Sans Mono:size=14 +pad=10x10 +term=foot + +[cursor] +style=block +blink=no + +[colors] +alpha=0.90 +background=1a1b26 +foreground=c0caf5 +regular0=15161e +regular1=f7768e +regular2=9ece6a +regular3=e0af68 +regular4=7aa2f7 +regular5=bb9af7 +regular6=7dcfff +regular7=a9b1d6 +bright0=414868 +bright1=f7768e +bright2=9ece6a +bright3=e0af68 +bright4=7aa2f7 +bright5=bb9af7 +bright6=7dcfff +bright7=c0caf5 + diff --git a/git/.gitconfig b/git/.gitconfig new file mode 100644 index 0000000..92abd47 --- /dev/null +++ b/git/.gitconfig @@ -0,0 +1,26 @@ +[user] + name = Bartal Læarsson + email = bartal@flo.fo + signingkey = ~/.ssh/id_ed25519.pub +[commit] + gpgsign = true +[tag] + gpgsign = true +[gpg] + format = ssh +[gpg "ssh"] + allowedSignersFile = ~/.ssh/allowed_signers +[core] + editor = nvim + autocrlf = input +[pull] + rebase = true +[push] + autoSetupRemote = true +[init] + defaultBranch = main +[merge] + conflictstyle = diff3 +[diff] + colorMoved = zebra + diff --git a/nvim/.config/nvim/init.lua b/nvim/.config/nvim/init.lua new file mode 100644 index 0000000..d9a83f4 --- /dev/null +++ b/nvim/.config/nvim/init.lua @@ -0,0 +1,490 @@ +vim.g.mapleader = " " +vim.g.maplocalleader = " " +vim.g.have_nerd_font = true +vim.o.number = true +vim.o.relativenumber = true +vim.o.mouse = "a" +vim.o.showmode = false +vim.schedule(function() + vim.o.clipboard = "unnamedplus" +end) +vim.o.breakindent = true +vim.o.undofile = true +vim.o.ignorecase = true +vim.o.smartcase = true +vim.o.signcolumn = "yes" +vim.o.updatetime = 250 +vim.o.timeoutlen = 300 +vim.o.splitright = true +vim.o.splitbelow = true +vim.o.list = true +vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "␣" } +vim.o.inccommand = "split" +vim.o.cursorline = true +vim.o.scrolloff = 15 +vim.o.confirm = true + +vim.keymap.set("n", "", "nohlsearch") + +vim.diagnostic.config({ + update_in_insert = false, + severity_sort = true, + float = { border = "rounded", source = "if_many" }, + underline = { severity = { min = vim.diagnostic.severity.WARN } }, + virtual_text = true, + virtual_lines = false, + jump = { float = true }, +}) + +vim.keymap.set("n", "q", vim.diagnostic.setloclist, { desc = "Open diagnostic [Q]uickfix list" }) +vim.keymap.set("t", "", "", { desc = "Exit terminal mode" }) +vim.keymap.set("n", "", "", { desc = "Move focus to the left window" }) +vim.keymap.set("n", "", "", { desc = "Move focus to the right window" }) +vim.keymap.set("n", "", "", { desc = "Move focus to the lower window" }) +vim.keymap.set("n", "", "", { desc = "Move focus to the upper window" }) + +vim.api.nvim_create_autocmd("TextYankPost", { + desc = "Highlight when yanking (copying) text", + group = vim.api.nvim_create_augroup("kickstart-highlight-yank", { clear = true }), + callback = function() + vim.hl.on_yank() + end, +}) + +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + error("Error cloning lazy.nvim:\n" .. out) + end +end + +---@type vim.Option +local rtp = vim.opt.rtp +rtp:prepend(lazypath) + +require("lazy").setup({ + { "NMAC427/guess-indent.nvim", opts = {} }, + + { + "lewis6991/gitsigns.nvim", + ---@module 'gitsigns' + ---@type Gitsigns.Config + ---@diagnostic disable-next-line: missing-fields + opts = { + signs = { + add = { text = "+" }, ---@diagnostic disable-line: missing-fields + change = { text = "~" }, ---@diagnostic disable-line: missing-fields + delete = { text = "_" }, ---@diagnostic disable-line: missing-fields + topdelete = { text = "‾" }, ---@diagnostic disable-line: missing-fields + changedelete = { text = "~" }, ---@diagnostic disable-line: missing-fields + }, + }, + }, + + { + "nvim-telescope/telescope.nvim", + enabled = true, + event = "VimEnter", + dependencies = { + "nvim-lua/plenary.nvim", + { + "nvim-telescope/telescope-fzf-native.nvim", + build = "make", + cond = function() + return vim.fn.executable("make") == 1 + end, + }, + { "nvim-telescope/telescope-ui-select.nvim" }, + { "nvim-tree/nvim-web-devicons", enabled = vim.g.have_nerd_font }, + }, + config = function() + require("telescope").setup({ + extensions = { + ["ui-select"] = { require("telescope.themes").get_dropdown() }, + }, + }) + pcall(require("telescope").load_extension, "fzf") + pcall(require("telescope").load_extension, "ui-select") + + local builtin = require("telescope.builtin") + vim.keymap.set("n", "sh", builtin.help_tags, { desc = "[S]earch [H]elp" }) + vim.keymap.set("n", "sk", builtin.keymaps, { desc = "[S]earch [K]eymaps" }) + vim.keymap.set("n", "sf", builtin.find_files, { desc = "[S]earch [F]iles" }) + vim.keymap.set("n", "ss", builtin.builtin, { desc = "[S]earch [S]elect Telescope" }) + vim.keymap.set({ "n", "v" }, "sw", builtin.grep_string, { desc = "[S]earch current [W]ord" }) + vim.keymap.set("n", "sg", builtin.live_grep, { desc = "[S]earch by [G]rep" }) + vim.keymap.set("n", "sd", builtin.diagnostics, { desc = "[S]earch [D]iagnostics" }) + vim.keymap.set("n", "sr", builtin.resume, { desc = "[S]earch [R]esume" }) + vim.keymap.set("n", "s.", builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' }) + vim.keymap.set("n", "sc", builtin.commands, { desc = "[S]earch [C]ommands" }) + vim.keymap.set("n", "", builtin.buffers, { desc = "[ ] Find existing buffers" }) + + vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("telescope-lsp-attach", { clear = true }), + callback = function(event) + local buf = event.buf + vim.keymap.set("n", "grr", builtin.lsp_references, { buffer = buf, desc = "[G]oto [R]eferences" }) + vim.keymap.set( + "n", + "gri", + builtin.lsp_implementations, + { buffer = buf, desc = "[G]oto [I]mplementation" } + ) + vim.keymap.set("n", "grd", builtin.lsp_definitions, { buffer = buf, desc = "[G]oto [D]efinition" }) + vim.keymap.set( + "n", + "gO", + builtin.lsp_document_symbols, + { buffer = buf, desc = "Open Document Symbols" } + ) + vim.keymap.set( + "n", + "gW", + builtin.lsp_dynamic_workspace_symbols, + { buffer = buf, desc = "Open Workspace Symbols" } + ) + vim.keymap.set( + "n", + "grt", + builtin.lsp_type_definitions, + { buffer = buf, desc = "[G]oto [T]ype Definition" } + ) + end, + }) + + vim.keymap.set("n", "/", function() + builtin.current_buffer_fuzzy_find(require("telescope.themes").get_dropdown({ + winblend = 20, + previewer = false, + })) + end, { desc = "[/] Fuzzily search in current buffer" }) + + vim.keymap.set("n", "s/", function() + builtin.live_grep({ + grep_open_files = true, + prompt_title = "Live Grep in Open Files", + }) + end, { desc = "[S]earch [/] in Open Files" }) + + vim.keymap.set("n", "sn", function() + builtin.find_files({ cwd = vim.fn.stdpath("config") }) + end, { desc = "[S]earch [N]eovim files" }) + end, + }, + +{ + "neovim/nvim-lspconfig", + dependencies = { + { "j-hui/fidget.nvim", opts = {} }, + }, + config = function() + vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }), + callback = function(event) + local map = function(keys, func, desc, mode) + mode = mode or "n" + vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) + end + + map("grn", vim.lsp.buf.rename, "[R]e[n]ame") + map("gra", vim.lsp.buf.code_action, "[G]oto Code [A]ction", { "n", "x" }) + map("grD", vim.lsp.buf.declaration, "[G]oto [D]eclaration") + + local client = vim.lsp.get_client_by_id(event.data.client_id) + + if client and client:supports_method("textDocument/documentHighlight", event.buf) then + local highlight_augroup = + vim.api.nvim_create_augroup("kickstart-lsp-highlight", { clear = false }) + + vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.document_highlight, + }) + + vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.clear_references, + }) + + vim.api.nvim_create_autocmd("LspDetach", { + group = vim.api.nvim_create_augroup("kickstart-lsp-detach", { clear = true }), + callback = function(event2) + vim.lsp.buf.clear_references() + vim.api.nvim_clear_autocmds({ + group = "kickstart-lsp-highlight", + buffer = event2.buf, + }) + end, + }) + end + + if client and client:supports_method("textDocument/inlayHint", event.buf) then + map("th", function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf })) + end, "[T]oggle Inlay [H]ints") + end + end, + }) + + local servers = { + clangd = {}, + zls = {}, + gopls = {}, + rust_analyzer = {}, + omnisharp = {}, + jdtls = {}, + + ts_ls = {}, + + lua_ls = { + on_init = function(client) + if client.workspace_folders then + local path = client.workspace_folders[1].name + if + path ~= vim.fn.stdpath("config") + and (vim.uv.fs_stat(path .. "/.luarc.json") or vim.uv.fs_stat(path .. "/.luarc.jsonc")) + then + return + end + end + + client.config.settings.Lua = vim.tbl_deep_extend("force", client.config.settings.Lua, { + runtime = { + version = "LuaJIT", + path = { "lua/?.lua", "lua/?/init.lua" }, + }, + workspace = { + checkThirdParty = false, + library = vim.tbl_extend("force", vim.api.nvim_get_runtime_file("", true), { + "${3rd}/luv/library", + "${3rd}/busted/library", + }), + }, + }) + end, + settings = { + Lua = {}, + }, + }, + } + + for name, server in pairs(servers) do + vim.lsp.config(name, server) + vim.lsp.enable(name) + end + end, +}, + + { + "stevearc/conform.nvim", + event = { "BufWritePre" }, + cmd = { "ConformInfo" }, + keys = { + { + "f", + function() + require("conform").format({ async = true, lsp_format = "fallback" }) + end, + mode = "", + desc = "[F]ormat buffer", + }, + }, + ---@module 'conform' + ---@type conform.setupOpts + opts = { + notify_on_error = false, + format_on_save = function(bufnr) + local disable_filetypes = { c = true, cpp = true } + if disable_filetypes[vim.bo[bufnr].filetype] then + return nil + else + return { + timeout_ms = 500, + lsp_format = "fallback", + } + end + end, + formatters_by_ft = { + lua = { "stylua" }, + python = { "isort", "black" }, + }, + }, + }, + + { + "saghen/blink.cmp", + event = "VimEnter", + version = "1.*", + dependencies = { + { + "L3MON4D3/LuaSnip", + version = "2.*", + build = (function() + if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then + return + end + return "make install_jsregexp" + end)(), + dependencies = {}, + opts = {}, + }, + }, + ---@module 'blink.cmp' + ---@type blink.cmp.Config + opts = { + keymap = { + preset = "default", + }, + appearance = { + nerd_font_variant = "mono", + }, + completion = { + documentation = { auto_show = false, auto_show_delay_ms = 500 }, + }, + sources = { + default = { "lsp", "path", "snippets" }, + }, + snippets = { preset = "luasnip" }, + fuzzy = { implementation = "prefer_rust_with_warning" }, + signature = { enabled = true }, + }, + }, + + { + "folke/tokyonight.nvim", + priority = 1000, + config = function() + ---@diagnostic disable-next-line: missing-fields + require("tokyonight").setup({ + styles = { + comments = { italic = true }, + }, + }) + vim.cmd.colorscheme("tokyonight-night") + end, + }, + + { + "folke/todo-comments.nvim", + event = "VimEnter", + dependencies = { "nvim-lua/plenary.nvim" }, + ---@module 'todo-comments' + ---@type TodoOptions + ---@diagnostic disable-next-line: missing-fields + opts = { signs = false }, + }, + + { + "nvim-mini/mini.nvim", + config = function() + require("mini.ai").setup({ n_lines = 500 }) + require("mini.surround").setup() + local statusline = require("mini.statusline") + statusline.setup({ use_icons = vim.g.have_nerd_font }) + ---@diagnostic disable-next-line: duplicate-set-field + statusline.section_location = function() + return "%2l:%-2v" + end + end, + }, + + { + "nvim-treesitter/nvim-treesitter", + lazy = false, + branch = "main", + build = ":TSUpdate", + config = function() + -- Pre-install parsers for languages we know we use. + -- For any other filetype, the FileType autocmd below will + -- auto-install the parser on first open. + local parsers = { + "javascript", + "typescript", + "tsx", + "json", + "bash", + "c", + "c_sharp", + "diff", + "go", + "html", + "java", + "lua", + "luadoc", + "markdown", + "markdown_inline", + "python", + "query", + "rust", + "vim", + "vimdoc", + "zig", + } + + local installed = require("nvim-treesitter.config").get_installed() + local to_install = vim.tbl_filter(function(p) + return not vim.tbl_contains(installed, p) + end, parsers) + if #to_install > 0 then + require("nvim-treesitter").install(to_install) + end + + -- Helper: try to start treesitter highlighting + indentation for a buffer + local function treesitter_try_attach(buf, language) + if not pcall(vim.treesitter.start, buf, language) then + return + end + local has_indent_query = pcall(vim.treesitter.query.get, language, "indents") + if has_indent_query then + vim.bo[buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" + end + end + + -- On every FileType event: + -- 1. If the parser is already installed, attach immediately. + -- 2. If not, auto-install it then attach once done. + vim.api.nvim_create_autocmd("FileType", { + callback = function(args) + local buf, filetype = args.buf, args.match + local language = vim.treesitter.language.get_lang(filetype) + if not language then + return + end + + if vim.treesitter.language.add(language) then + -- Parser already available — attach right away + treesitter_try_attach(buf, language) + else + -- Parser missing — install it, then attach + require("nvim-treesitter").install(language):await(function() + treesitter_try_attach(buf, language) + end) + end + end, + }) + end, + }, +}, { ---@diagnostic disable-line: missing-fields + ui = { + icons = vim.g.have_nerd_font and {} or { + cmd = "⌘", + config = "🛠", + event = "📅", + ft = "📂", + init = "⚙", + keys = "🗝", + plugin = "🔌", + runtime = "💻", + require = "🌙", + source = "📄", + start = "🚀", + task = "📌", + lazy = "💤 ", + }, + }, +}) + diff --git a/ssh/.ssh/config b/ssh/.ssh/config new file mode 100644 index 0000000..7d3b425 --- /dev/null +++ b/ssh/.ssh/config @@ -0,0 +1,9 @@ +Host flo-homeserver + HostName 10.0.0.2 + User bl + ProxyJump vps + +Host vps + HostName 139.59.166.35 + User bl + IdentityFile ~/.ssh/id_ed25519 diff --git a/sway/.config/sway/config b/sway/.config/sway/config new file mode 100644 index 0000000..bce920f --- /dev/null +++ b/sway/.config/sway/config @@ -0,0 +1,118 @@ +# Sway workstation configuration translated from NixOS behavior. +set $mod Mod4 +set $term foot -e tmux new-session -A -s main +set $browser zen +set $menu rofi -show drun + +font pango:DejaVu Sans Mono 10 + +output * scale 1 +output * bg ~/.config/sway/tux.png fill + +input type:keyboard { + xkb_layout fo + xkb_model pc105 +} + +input type:touchpad { + natural_scroll disabled + tap enabled +} + +gaps inner 5 +gaps outer 10 +smart_gaps on +default_border pixel 2 +default_floating_border pixel 2 + +client.focused #33ccff #33ccff #1a1b26 #33ccff #33ccff +client.focused_inactive #595959 #595959 #c0caf5 #595959 #595959 +client.unfocused #595959 #595959 #c0caf5 #595959 #595959 + +floating_modifier $mod normal + +# Applications and session +bindsym $mod+t exec $term +bindsym $mod+b exec $browser +bindsym $mod+d exec $menu +bindsym $mod+q kill +bindsym $mod+Shift+c reload +bindsym $mod+Shift+e exec swaynag -t warning -m 'Exit Sway?' -B 'Exit' 'swaymsg exit' + +# Focus movement +bindsym $mod+h focus left +bindsym $mod+j focus down +bindsym $mod+k focus up +bindsym $mod+l focus right +bindsym $mod+Left focus left +bindsym $mod+Down focus down +bindsym $mod+Up focus up +bindsym $mod+Right focus right + +# Move windows +bindsym $mod+Shift+h move left +bindsym $mod+Shift+j move down +bindsym $mod+Shift+k move up +bindsym $mod+Shift+l move right +bindsym $mod+Shift+Left move left +bindsym $mod+Shift+Down move down +bindsym $mod+Shift+Up move up +bindsym $mod+Shift+Right move right + +# Workspaces +set $ws1 1 +set $ws2 2 +set $ws3 3 +set $ws4 4 +set $ws5 5 +set $ws6 6 +set $ws7 7 +set $ws8 8 +set $ws9 9 +set $ws10 10 + +bindsym $mod+1 workspace number $ws1 +bindsym $mod+2 workspace number $ws2 +bindsym $mod+3 workspace number $ws3 +bindsym $mod+4 workspace number $ws4 +bindsym $mod+5 workspace number $ws5 +bindsym $mod+6 workspace number $ws6 +bindsym $mod+7 workspace number $ws7 +bindsym $mod+8 workspace number $ws8 +bindsym $mod+9 workspace number $ws9 +bindsym $mod+0 workspace number $ws10 + +bindsym $mod+Shift+1 move container to workspace number $ws1 +bindsym $mod+Shift+2 move container to workspace number $ws2 +bindsym $mod+Shift+3 move container to workspace number $ws3 +bindsym $mod+Shift+4 move container to workspace number $ws4 +bindsym $mod+Shift+5 move container to workspace number $ws5 +bindsym $mod+Shift+6 move container to workspace number $ws6 +bindsym $mod+Shift+7 move container to workspace number $ws7 +bindsym $mod+Shift+8 move container to workspace number $ws8 +bindsym $mod+Shift+9 move container to workspace number $ws9 +bindsym $mod+Shift+0 move container to workspace number $ws10 + +# Layout and scratchpad +bindsym $mod+s layout toggle split +bindsym $mod+e layout toggle split +bindsym $mod+f fullscreen toggle +bindsym $mod+Shift+space floating toggle +bindsym $mod+minus scratchpad show +bindsym $mod+Shift+minus move scratchpad + +# Hardware controls +bindsym XF86AudioRaiseVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +bindsym XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindsym XF86AudioMute exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindsym XF86AudioMicMute exec wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindsym XF86MonBrightnessUp exec brightnessctl set 5%+ +bindsym XF86MonBrightnessDown exec brightnessctl set 5%- +bindsym Print exec grim -g "$(slurp)" "$HOME/Pictures/screenshot-$(date +%Y%m%d-%H%M%S).png" + +# Session services +exec dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP +exec /usr/libexec/lxqt-policykit-agent +exec nm-applet --indicator +exec mako +exec ~/.config/waybar/launch.sh diff --git a/sway/.config/sway/tux.png b/sway/.config/sway/tux.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a43924f6fd87d7ea459040d03ccecbd4ee3375 GIT binary patch literal 50253 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 literal 0 HcmV?d00001 diff --git a/tmux/.config/tmux/theme.conf b/tmux/.config/tmux/theme.conf new file mode 100644 index 0000000..79e6d12 --- /dev/null +++ b/tmux/.config/tmux/theme.conf @@ -0,0 +1,28 @@ +set -ga terminal-overrides ",xterm-256color:RGB" +set -g display-time 4000 +set -g status-position top +setw -g pane-base-index 1 + +# Tokyo Night Colors +bg="#1a1b26" +default_fg="#c0caf5" +session_fg="#9ece6a" +session_selection_fg="#1a1b26" +session_selection_bg="#7aa2f7" +active_window_fg="#7dcfff" +active_pane_border="#7aa2f7" + +set -g status-left-length 200 +set -g status-right-length 200 +set -g status-left "#[fg=${session_fg},bold,bg=${bg}] #S #[fg=${default_fg},nobold,bg=${bg}] | " +set -g status-right "#[fg=${active_window_fg},bg=${bg}] 󰁹 #(acpi -b | awk -F', ' '{print $2}') #[fg=${default_fg},nobold,bg=${bg}] | #[fg=${active_window_fg},bg=${bg}] %H:%M #[fg=${default_fg},nobold,bg=${bg}] | #[fg=${session_fg},bg=${bg}] %a %Y-%m-%d " +set -g status-justify left +set -g status-style "bg=${bg}" +set -g window-status-format "#[fg=${default_fg},bg=default] #I:#W" +set -g window-status-current-format "#[fg=${active_window_fg},bold,bg=default] #[underscore]#I:#W" +set -g window-status-last-style "fg=${default_fg},bg=default" +set -g message-command-style "bg=default,fg=${default_fg}" +set -g message-style "bg=default,fg=${default_fg}" +set -g mode-style "bg=${session_selection_bg},fg=${session_selection_fg}" +set -g pane-active-border-style "fg=${active_pane_border},bg=default" +set -g pane-border-style "fg=brightblack,bg=default" diff --git a/tmux/.config/tmux/tmux.conf b/tmux/.config/tmux/tmux.conf new file mode 100644 index 0000000..27e906a --- /dev/null +++ b/tmux/.config/tmux/tmux.conf @@ -0,0 +1,12 @@ +set -g prefix C-b +setw -g mode-keys vi +set -g default-shell /usr/bin/zsh +set -sg escape-time 0 +set -g focus-events on +set -g default-terminal tmux-256color +set -g history-limit 10000 +setw -g aggressive-resize on +set -g base-index 1 +setw -g pane-base-index 1 + +source-file ~/.config/tmux/theme.conf diff --git a/waybar/.config/waybar/config b/waybar/.config/waybar/config new file mode 100644 index 0000000..7f939cc --- /dev/null +++ b/waybar/.config/waybar/config @@ -0,0 +1,44 @@ +{ + "layer": "top", + "position": "top", + "height": 34, + "margin-top": 8, + "margin-left": 0, + "margin-right": 0, + + "modules-left": ["sway/workspaces", "sway/window"], + "modules-center": ["clock"], + "modules-right": ["pulseaudio", "network", "battery", "tray"], + + "sway/workspaces": { + "all-outputs": true, + "disable-scroll": true, + "format": "{name}" + }, + + "sway/window": { + "max-length": 40 + }, + + "clock": { + "format": "{:%a %b %d %I:%M %p}" + }, + + "battery": { + "format": "{capacity}%" + }, + + "network": { + "format-wifi": "wifi {essid}", + "format-ethernet": "wired", + "format-disconnected": "offline", + "on-click": "nm-connection-editor" + }, + + "pulseaudio": { + "format": "vol {volume}%", + "format-muted": "muted", + "on-click": "pavucontrol" + } +} + diff --git a/waybar/.config/waybar/launch.sh b/waybar/.config/waybar/launch.sh new file mode 100755 index 0000000..e71f4a5 --- /dev/null +++ b/waybar/.config/waybar/launch.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -euo pipefail + +config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/waybar" +base_config="$config_dir/config" +runtime_config="$config_dir/config.runtime" + +width=$(swaymsg -r -t get_outputs | jq -r '[.[] | select(.focused)][0] // .[0] // {rect: {width: 1440}} | .rect.width // 1440') + +if ! [[ "$width" =~ ^[0-9]+$ ]] || (( width == 0 )); then + width=1440 +fi + +margin=$((width * 125 / 1000)) +jq --argjson margin "$margin" ' + .["margin-left"] = $margin + | .["margin-right"] = $margin +' "$base_config" > "$runtime_config" + +exec waybar -c "$runtime_config" + diff --git a/waybar/.config/waybar/style.css b/waybar/.config/waybar/style.css new file mode 100644 index 0000000..7d881de --- /dev/null +++ b/waybar/.config/waybar/style.css @@ -0,0 +1,49 @@ +@import "themes/current.css"; + +* { + font-family: "DejaVu Sans Mono", monospace; + font-size: 13px; + border: none; + border-radius: 10px; +} + +window#waybar { + background: @bar-bg; + color: @text; + border-radius: 18px; + border: 1px solid @border; +} + +window#waybar > box { + padding: 0 4px; +} + +#workspaces label { + padding: 0 10px; + margin: 5px 3px; + color: @text; + background: transparent; +} + +#workspaces .active { + background: @accent; + color: @accent-fg; +} + +#window { + padding: 0 12px; + margin: 5px 4px; + background: @accent; + color: @accent-fg; + font-weight: bold; +} + +#clock, +#battery, +#network, +#pulseaudio, +#tray { + padding: 0 12px; + margin: 5px 4px; + background: @module-bg; +} diff --git a/waybar/.config/waybar/themes/current.css b/waybar/.config/waybar/themes/current.css new file mode 100644 index 0000000..8a61a94 --- /dev/null +++ b/waybar/.config/waybar/themes/current.css @@ -0,0 +1,7 @@ +@define-color bar-bg rgba(17, 17, 27, 0.82); +@define-color module-bg rgba(49, 50, 68, 0.85); +@define-color border rgba(203, 166, 247, 0.35); +@define-color text #cdd6f4; +@define-color accent #cba6f7; +@define-color accent-fg #11111b; + diff --git a/waybar/.config/waybar/themes/dark.css b/waybar/.config/waybar/themes/dark.css new file mode 100644 index 0000000..8b67941 --- /dev/null +++ b/waybar/.config/waybar/themes/dark.css @@ -0,0 +1,6 @@ +@define-color bar-bg rgba(17, 17, 27, 0.82); +@define-color module-bg rgba(49, 50, 68, 0.85); +@define-color border rgba(203, 166, 247, 0.35); +@define-color text #cdd6f4; +@define-color accent #cba6f7; +@define-color accent-fg #11111b; diff --git a/waybar/.config/waybar/themes/light.css b/waybar/.config/waybar/themes/light.css new file mode 100644 index 0000000..92d4878 --- /dev/null +++ b/waybar/.config/waybar/themes/light.css @@ -0,0 +1,6 @@ +@define-color bar-bg rgba(249, 245, 215, 0.88); +@define-color module-bg rgba(235, 219, 178, 0.86); +@define-color border rgba(181, 118, 20, 0.35); +@define-color text #3c3836; +@define-color accent #b57614; +@define-color accent-fg #f9f5d7; diff --git a/zsh/.zshrc b/zsh/.zshrc new file mode 100644 index 0000000..6b77129 --- /dev/null +++ b/zsh/.zshrc @@ -0,0 +1,36 @@ +HISTFILE="$HOME/.zsh_history" +HISTSIZE=10000 +SAVEHIST=10000 + +setopt append_history + +alias gp='git push' +alias gcm='git commit -am' +alias gsw='git switch' +alias gst='git status' +alias ga='git add .' +alias gtree="git log --graph --all --pretty=format:'%C(yellow)%h%Creset%C(cyan)%d%Creset %s %C(dim)(%cr) <%an>%Creset'" +alias typ='typora --enable-features=UseOzonePlatform --ozone-platform=wayland &' + +export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}" +export GOPATH="${GOPATH:-$HOME/go}" +export PATH="$HOME/.scripts:$HOME/.local/bin:$HOME/.cargo/bin:$HOME/.bun/bin:$HOME/bin/zig:$HOME/bin/zls:$GOPATH/bin:$PATH" + +start-ssh-agent() { + local agent_env="$HOME/.ssh/agent.env" + if [[ -f "$agent_env" ]]; then + source "$agent_env" >/dev/null + fi + if ! ssh-add -l &>/dev/null; then + eval "$(ssh-agent -s)" >/dev/null + ssh-agent -s >"$agent_env" + chmod 600 "$agent_env" + ssh-add ~/.ssh/id_ed25519 2>/dev/null || ssh-add ~/.ssh/id_rsa 2>/dev/null + fi +} + +source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh +source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +eval "$(fzf --zsh)" +eval "$(starship init zsh)"