commit d16e497c837470d508526211922be2f8f93026c9 Author: bartal laearsson Date: Mon Jun 29 12:42:38 2026 +0100 initial commit 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 0000000..e8a4392 Binary files /dev/null and b/sway/.config/sway/tux.png differ 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)"