Compare commits

...

11 Commits

22 changed files with 461 additions and 1098 deletions
Executable
+120
View File
@@ -0,0 +1,120 @@
#!/usr/bin/env bash
set -e
if [ "$EUID" -eq 0 ]; then
echo "Please run this script as your normal user, not with sudo."
exit 1
fi
echo "==> Updating system..."
sudo xbps-install -Syu
echo "==> Installing KDE and desktop essentials..."
sudo xbps-install -y \
kde-plasma \
kde-baseapps \
NetworkManager \
sddm \
xorg-minimal \
xorg-server-xwayland \
mesa-dri \
qt6-wayland \
kwayland \
elogind \
pipewire \
alsa-pipewire \
libspa-bluetooth \
bluez \
xdg-desktop-portal \
xdg-desktop-portal-kde \
git \
curl \
neovim
echo "==> Disabling conflicting DHCP service..."
if [ -e /var/service/dhcpcd ]; then
sudo sv down dhcpcd || true
sudo rm -f /var/service/dhcpcd
fi
echo "==> Enabling system services..."
enable_service() {
service="$1"
if [ ! -e "/var/service/$service" ]; then
sudo ln -s "/etc/sv/$service" "/var/service/$service"
fi
}
enable_service dbus
enable_service NetworkManager
enable_service sddm
enable_service bluetoothd
echo "==> Adding user to required groups..."
sudo usermod -aG network,audio,video,bluetooth "$USER"
echo "==> Configuring ALSA for PipeWire..."
sudo mkdir -p /etc/alsa/conf.d
sudo ln -sf \
/usr/share/alsa/alsa.conf.d/50-pipewire.conf \
/etc/alsa/conf.d/50-pipewire.conf
sudo ln -sf \
/usr/share/alsa/alsa.conf.d/99-pipewire-default.conf \
/etc/alsa/conf.d/99-pipewire-default.conf
echo "==> Configuring PipeWire PulseAudio compatibility..."
sudo mkdir -p /etc/pipewire/pipewire.conf.d
sudo ln -sf \
/usr/share/examples/pipewire/20-pipewire-pulse.conf \
/etc/pipewire/pipewire.conf.d/20-pipewire-pulse.conf
echo "==> Enabling PipeWire desktop autostart..."
mkdir -p "$HOME/.config/autostart"
ln -sf \
/usr/share/applications/pipewire.desktop \
"$HOME/.config/autostart/pipewire.desktop"
echo "==> Reconfiguring packages..."
sudo xbps-reconfigure -fa
echo
echo "========================================"
echo " Void KDE bootstrap complete"
echo "========================================"
echo
echo "Installed:"
echo " KDE Plasma"
echo " SDDM"
echo " Plasma Wayland"
echo " NetworkManager"
echo " PipeWire + WirePlumber"
echo " Bluetooth"
echo " XWayland"
echo " Neovim"
echo
echo "Enabled services:"
sudo sv status dbus NetworkManager bluetoothd sddm
echo
echo "NOTE: elogind is installed but intentionally"
echo "not enabled as a runit service."
echo
echo "Reboot, then select 'Plasma (Wayland)' in SDDM."
echo
echo " sudo reboot"
echo
-39
View File
@@ -1,39 +0,0 @@
[general]
[font]
size = 12.4
offset = { x = 0, y = 3 }
normal = { family = "JetBrainsMono Nerd Font", style = "Regular" }
[window]
# startup_mode = "Maximized"
padding.x = 10
padding.y = 10
[cursor]
style.shape = "Beam"
style.blinking = "Always"
[colors.primary]
background = '#101010'
foreground = '#ebdbb2'
[colors.normal]
black = '#282828'
red = '#cc241d'
green = '#98971a'
yellow = '#d79921'
blue = '#458588'
magenta = '#b16286'
cyan = '#689d6a'
white = '#a89984'
[colors.bright]
black = '#928374'
red = '#fb4934'
green = '#b8bb26'
yellow = '#fabd2f'
blue = '#83a598'
magenta = '#d3869b'
cyan = '#8ec07c'
white = '#ebdbb2'
-425
View File
@@ -1,425 +0,0 @@
pcall(require, "luarocks.loader")
local gears = require("gears")
local awful = require("awful")
local naughty = require("naughty")
local wibox = require("wibox")
local beautiful = require("beautiful")
local hotkeys_popup = require("awful.hotkeys_popup")
local menubar = require("menubar")
require("awful.autofocus")
-- Pick a random image from the folder on start/reload
awful.spawn.with_shell("feh --bg-fill --randomize /home/jason/Pictures/Wallpapers/")
-- Global config
-- Alt. Use "Mod4" for the Super/Windows key.
modkey = "Mod4"
terminal = "alacritty"
theChurch = "emacs"
editor = os.getenv("EDITOR") or "nano"
-- Layouts: suit.tile = master column LEFT, stack column RIGHT.
awful.layout.layouts = { awful.layout.suit.tile, awful.layout.suit.max }
-- Kill xfce4-notifyd on startup (with a short delay + retry, in case it
-- hasn't started yet at this point in the session)
awful.spawn.easy_async_with_shell("pkill xfce4-notifyd", function() end)
gears.timer.start_new(3, function()
awful.spawn.easy_async_with_shell("pkill xfce4-notifyd", function() end)
return false -- don't repeat
end)
-- Error handling
if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical, title = "Error during startup", text = awesome.startup_errors })
end
do
local in_error = false
awesome.connect_signal("debug::error", function(err)
if in_error then return end
in_error = true
naughty.notify({ preset = naughty.config.presets.critical, title = "An error happened", text = tostring(err) })
in_error = false
end)
end
-- ================================================
-- THEME
-- ================================================
local colors = {
background = "#111111",
background_alt = "#1a1a1a",
foreground = "#dcd7ba", -- kanagawa foreground
accent = "#6a9589", -- black (bright) - muted gray, same role as old #6e6e6e
accent_alt = "#7fb4ca", -- blue (normal) - crystalBlue
red = "#e82424", -- red (bright) - samuraiRed, vivid
green = "#98bb6c", -- green (bright) - springGreen
yellow = "#e6c384", -- yellow (bright) - carpYellow
disabled = "#6a9589", -- cyan (normal) - muted, low-contrast
white = "#ffffff", -- white (normal) - dimmer than foreground
}
beautiful.wallpaper = nil
beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua")
beautiful.useless_gap = 8
beautiful.gap_single_client = true
beautiful.font = "JetBrainsMono Nerd Font 11"
beautiful.border_width = 4
beautiful.border_normal = colors.background_alt
beautiful.border_focus = colors.accent
beautiful.taglist_bg_focus = colors.accent
beautiful.taglist_fg_focus = colors.background
beautiful.taglist_fg_occupied = colors.accent
beautiful.taglist_bg_occupied = colors.background
beautiful.taglist_fg_empty = colors.white
beautiful.taglist_bg_empty = colors.background
beautiful.taglist_bg_urgent = colors.red
beautiful.taglist_fg_urgent = colors.background
beautiful.bg_systray = colors.background
beautiful.systray_icon_spacing = 4
-- Notifications, styled to match the wibar/client theme
naughty.config.defaults.position = "top_right"
naughty.config.defaults.timeout = 5
naughty.config.padding = 12
naughty.config.defaults.margin = 12
naughty.config.defaults.spacing = 8
naughty.config.defaults.icon_size = 48
naughty.config.defaults.border_width = 3
naughty.config.defaults.font = "JetBrainsMono Nerd Font 12"
naughty.config.defaults.shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 13) end
naughty.config.presets.normal = {
bg = colors.background, fg = colors.foreground, border_color = colors.accent,
border_width = 3, font = "JetBrainsMono Nerd Font 12", timeout = 5,
}
naughty.config.presets.low = naughty.config.presets.normal
naughty.config.presets.critical = {
bg = colors.background, fg = colors.red, border_color = colors.red,
border_width = 3, font = "JetBrainsMono Nerd Font 12", timeout = 0, -- stays until dismissed
}
-- ================================================
-- WIDGETS
-- ================================================
local widgets = {}
-- "ICON value" with ICON tinted accent, like polybar's *-prefix-foreground.
function widgets.label(icon, val)
return string.format("<span foreground='%s'>%s</span> %s", colors.white, icon, val or "")
end
-- A slim separator in the disabled color, like polybar's separator.
function widgets.sep()
local w = wibox.widget.textbox()
w.markup = string.format("<span foreground='%s00'> </span>", colors.disabled)
return w
end
-- Wrap a widget in a small margin so bar modules aren't crammed together.
function widgets.padded(w, left, right)
return wibox.container.margin(w, left or 8, right or 8)
end
-- Focused window title (polybar xwindow / %title%)
function widgets.make_title()
local t = wibox.widget.textbox()
t.align = "center"
local function update()
local c = client.focus
t.markup = c and string.format("<span foreground='%s'>%s</span>", colors.white, gears.string.xml_escape(c.name or "")) or ""
end
client.connect_signal("focus", update)
client.connect_signal("unfocus", update)
client.connect_signal("property::name", update)
return t
end
-- CPU usage % (two top samples so the reading is accurate)
function widgets.make_cpu()
return awful.widget.watch(
{ "bash", "-c", [[LANG=C top -bn2 -d0.3 | grep -m2 '^%Cpu' | tail -1 | awk '{printf "%.0f", 100 - $8}']] },
3, function(w, out) w.markup = widgets.label("<span font_size='large'></span>", out:gsub("%s+$", "") .. "%") end)
end
-- Volume: click to mute, scroll to adjust, right-click for the mixer.
-- Keeps its own refresh() so button presses update instantly instead of
-- waiting on the polling timer.
function widgets.make_vol()
local w = wibox.widget.textbox()
local vol_script = [[
sink=$(LANG=C pactl get-default-sink 2>/dev/null)
m=$(LANG=C pactl get-sink-mute "$sink" 2>/dev/null | grep -oE 'yes|no')
v=$(LANG=C pactl get-sink-volume "$sink" 2>/dev/null | grep -oE '[0-9]+%' | head -n1)
echo "$m $v"
]]
local function shell_quote(s) return "'" .. s:gsub("'", "'\\''") .. "'" end
local vol_cmd = "sh -c " .. shell_quote(vol_script)
local function refresh()
awful.spawn.easy_async_with_shell(vol_cmd, function(out)
local muted, pct = out:match("(%a+)%s+(%d+)%%")
if muted == nil and pct == nil then
w.markup = string.format("<span foreground='%s'><span font_size='large'>󱄠</span> n/a</span>", colors.disabled)
return
end
muted = muted == "yes"
pct = pct or "0"
w.markup = muted and string.format("<span foreground='%s'>MUTE</span>", colors.yellow) or widgets.label("<span font_size='large'>󱄠</span>", pct .. "%")
end)
end
w:buttons(gears.table.join(
awful.button({ }, 1, function() awful.spawn("/home/jason/.local/bin/audioswitch") end),
awful.button({ }, 3, function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-mute "$(pactl get-default-sink)" toggle']], function() refresh() end) end),
awful.button({ }, 4, function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" +2%']], function() refresh() end) end),
awful.button({ }, 5, function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" -2%']], function() refresh() end) end)
))
gears.timer { timeout = 2, call_now = true, autostart = true, callback = refresh }
return w
end
-- Brightness: click to toggle between night (default gamma) and day (boosted).
function widgets.make_brightness()
local OUTPUT = "HDMI-A-0"
local DAY_CMD = "xrandr --output " .. OUTPUT .. " --set CTM \"1.1,0,0,0,1.1,0,0,0,1.1\" --gamma 1.08:1.08:1.08"
local NIGHT_CMD = "xrandr --output " .. OUTPUT .. " --set CTM \"1,0,0,0,1,0,0,0,1\" --gamma 1.0:1.0:1.0"
local w = wibox.widget.textbox()
local is_day = true
local function render()
local icon = is_day and "󱁞" or "󱠩"
w.markup = string.format(
"<span font_family='JetBrainsMono Nerd Font' foreground='%s' font_size='large'>%s</span> ",
colors.white, icon
)
end
local function apply(day)
local cmd = day and DAY_CMD or NIGHT_CMD
awful.spawn.easy_async_with_shell(cmd, function()
is_day = day
render()
end)
end
w:buttons(gears.table.join(
awful.button({ }, 1, function() apply(not is_day) end)
))
apply(true)
return w
end
-- ================================================
-- KEYBINDS
-- ================================================
local keys = {}
keys.globalkeys = gears.table.join(
awful.key({ modkey }, "s", hotkeys_popup.show_help, { description = "show help", group = "awesome" }),
-- Directional focus (vim keys)
awful.key({ modkey }, "h", function() awful.client.focus.bydirection("left") end, { description = "focus left", group = "client" }),
awful.key({ modkey }, "j", function() awful.client.focus.bydirection("down") end, { description = "focus down", group = "client" }),
awful.key({ modkey }, "k", function() awful.client.focus.bydirection("up") end, { description = "focus up", group = "client" }),
awful.key({ modkey }, "l", function() awful.client.focus.bydirection("right") end, { description = "focus right", group = "client" }),
-- Directional move (swap clients in the tiling layout)
awful.key({ modkey, "Control" }, "h", function() awful.client.swap.bydirection("left") end, { description = "move left", group = "client" }),
awful.key({ modkey, "Control" }, "j", function() awful.client.swap.bydirection("down") end, { description = "move down", group = "client" }),
awful.key({ modkey, "Control" }, "k", function() awful.client.swap.bydirection("up") end, { description = "move up", group = "client" }),
awful.key({ modkey, "Control" }, "l", function() awful.client.swap.bydirection("right") end, { description = "move right", group = "client" }),
-- Resize the master/other split
awful.key({ modkey, "Shift" }, "h", function() awful.tag.incmwfact(-0.05) end, { description = "shrink master", group = "layout" }),
awful.key({ modkey, "Shift" }, "l", function() awful.tag.incmwfact( 0.05) end, { description = "grow master", group = "layout" }),
-- Launching / layout
awful.key({ modkey }, "Return", function() awful.spawn(theChurch) end, { description = "open the church of emacs", group = "launcher" }),
awful.key({ modkey }, "t", function() awful.spawn(terminal) end, { description = "open alacritty", group = "launcher" }),
awful.key({ modkey }, "e", function() awful.spawn("thunar") end, { description = "Filemanager", group = "system" }),
awful.key({ modkey }, "w", function() awful.layout.inc(1) end, { description = "next layout", group = "layout" }),
-- screenshooter
awful.key({ modkey, "Control" }, "p", function() awful.spawn("xfce4-screenshooter") end, { description = "screenshot", group = "system" }),
-- Alt tab current workspace windows
awful.key({ modkey }, "Tab", function() awful.client.focus.byidx(1) end, { description = "cycle focus", group = "client" }),
-- Media keys
awful.key({ }, "XF86AudioRaiseVolume", function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" +2%']]) end, { description = "volume up", group = "media" }),
awful.key({ }, "XF86AudioLowerVolume", function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-volume "$(pactl get-default-sink)" -2%']]) end, { description = "volume down", group = "media" }),
awful.key({ }, "XF86AudioMute", function() awful.spawn.easy_async_with_shell([[sh -c 'pactl set-sink-mute "$(pactl get-default-sink)" toggle']]) end, { description = "toggle mute", group = "media" }),
-- rofi menus
awful.key({ modkey }, "space", function() awful.spawn("/home/jason/.local/bin/runrofi") end, { description = "application launcher", group = "launcher" }),
awful.key({ modkey }, "`", function() awful.spawn("/home/jason/.local/bin/powermenu") end, { description = "power menu", group = "system" }),
awful.key({ modkey }, "a", function() awful.spawn("/home/jason/.local/bin/audioswitch") end, { description = "audio output", group = "system" }),
awful.key({ modkey }, "b", function () awful.spawn("/home/jason/.local/bin/bookmarks") end, {description = "bookmarks", group = "internet"}),
-- Awesome control
awful.key({ modkey, "Control" }, "r", awesome.restart, { description = "reload awesome", group = "awesome" })
)
-- Workspace keys 1..5: Alt+N view, Alt+Shift+N move client to tag
for i = 1, 5 do
keys.globalkeys = gears.table.join(keys.globalkeys,
awful.key({ modkey }, "#" .. i + 9, function()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then tag:view_only() end
end, { description = "view tag #" .. i, group = "tag" }),
awful.key({ modkey, "Control" }, "#" .. i + 9, function()
if client.focus then
local tag = client.focus.screen.tags[i]
if tag then client.focus:move_to_tag(tag) end
end
end, { description = "move focused client to tag #" .. i, group = "tag" })
)
end
keys.clientkeys = gears.table.join(
awful.key({ modkey }, "q", function(c) c:kill() end, { description = "kill window", group = "client" }),
awful.key({ modkey }, "f", function(c) c.fullscreen = not c.fullscreen; c:raise() end, { description = "toggle fullscreen", group = "client" }),
-- awful.key({ modkey }, "m", function(c) c:swap(awful.client.getmaster()) end, { description = "make master", group = "client" }),
awful.key({ modkey }, "m", function (c) c.maximized = not c.maximized c:raise() end, {description = "(un)maximize", group = "client"}),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle, { description = "toggle floating", group = "client" })
)
keys.clientbuttons = gears.table.join(
awful.button({ }, 1, function(c) c:emit_signal("request::activate", "mouse_click", { raise = true }) end),
awful.button({ modkey }, 1, function(c) c:emit_signal("request::activate", "mouse_click", { raise = true }); awful.mouse.client.move(c) end),
awful.button({ modkey }, 3, function(c) c:emit_signal("request::activate", "mouse_click", { raise = true }); awful.mouse.client.resize(c) end)
)
root.keys(keys.globalkeys)
-- ================================================
-- BAR
-- ================================================
local taglist_buttons = gears.table.join(
awful.button({ }, 1, function(t) t:view_only() end),
awful.button({ modkey }, 1, function(t) if client.focus then client.focus:move_to_tag(t) end end),
awful.button({ }, 3, awful.tag.viewtoggle)
)
local function bar_setup()
awful.screen.connect_for_each_screen(function(s)
awful.tag({ "1", "2", "3", "4", "5" }, s, awful.layout.layouts[1])
s.mypromptbox = awful.widget.prompt()
s.mylayoutbox = awful.widget.layoutbox(s)
s.mylayoutbox:buttons(gears.table.join(
awful.button({ }, 1, function() awful.layout.inc(1) end),
awful.button({ }, 3, function() awful.layout.inc(-1) end)
))
s.mytaglist = awful.widget.taglist {
screen = s, filter = awful.widget.taglist.filter.all, buttons = taglist_buttons,
style = { shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 4) end },
layout = { spacing = 8, layout = wibox.layout.fixed.horizontal },
widget_template = {
{ { id = "text_role", widget = wibox.widget.textbox }, left = 10, right = 10, top = 4, bottom = 4, widget = wibox.container.margin },
id = "background_role", widget = wibox.container.background,
},
}
-- Per-screen monitor widgets (created here so multi-monitor stays valid)
local title = widgets.make_title()
local vol = widgets.make_vol()
local cpu = widgets.make_cpu()
local brightness = widgets.make_brightness()
local clock = wibox.widget.textclock("%Y-%m-%d %H:%M")
local right = wibox.layout.fixed.horizontal()
right.spacing = 16 -- one uniform gap between all right-hand modules
right:add(wibox.widget.systray())
right:add(vol)
right:add(cpu)
right:add(clock)
right:add(brightness)
s.mywibox = awful.wibar {
position = "top", screen = s, height = 45, bg = colors.background, fg = colors.white,
shape = function(cr, w, h) gears.shape.rounded_rect(cr, w, h, 0) end,
}
s.mywibox:setup {
layout = wibox.container.margin, left = 8, right = 8, top = 10, bottom = 10,
{
layout = wibox.layout.align.horizontal,
expand = "none", -- center widget is centered on the whole bar
-- Left: layout indicator + workspaces
{
layout = wibox.layout.fixed.horizontal,
widgets.padded(s.mylayoutbox, 8, 8),
widgets.padded(s.mytaglist, 4, 4), s.mypromptbox,
},
-- Center: focused window title
title,
-- Right
widgets.padded(right, 4, 12),
}
}
end)
-- Overlay for rofi launchers.
-- Real dim colour; the overlay is created fully transparent so the
-- startup prime (below) can run without ever showing on screen.
local DIM_BG = "#00000099"
local dim_overlay = wibox({
visible = false,
ontop = true,
type = "splash",
bg = "#00000000",
})
dim_overlay.name = "awesome_dim_overlay"
awful.screen.connect_for_each_screen(function(s)
dim_overlay.screen = s -- adjust if you want it per-screen vs spanning all
end)
-- span the primary screen's geometry (or loop over all screens if you use a multi-monitor dim)
local function update_dim_geometry()
local geo = screen.primary.geometry
dim_overlay:geometry(geo)
end
update_dim_geometry()
screen.connect_signal("property::geometry", update_dim_geometry)
-- expose functions over awesome-client
_G.show_dim = function() dim_overlay.visible = true end
_G.hide_dim = function() dim_overlay.visible = false end
-- Prime the overlay invisibly at startup. While it is fully
-- transparent we map it once, so picom plays and finishes its one-time
-- "open" animation now -- with alpha 00 there is nothing to see, so no
-- flash. We then hide it and swap in the real dim colour. Every later
-- show_dim() is a re-map ("show"), which picom doesn't animate, so the
-- overlay simply appears: no startup flash, no grow.
dim_overlay.visible = true
gears.timer.start_new(1.0, function()
dim_overlay.visible = false
dim_overlay.bg = DIM_BG
return false -- one-shot
end)
end
bar_setup()
-- ================================================
-- WINDOW RULES
-- ================================================
awful.rules.rules = {
{
rule = { },
properties = {
border_width = beautiful.border_width, border_color = beautiful.border_normal,
focus = awful.client.focus.filter, raise = true,
keys = keys.clientkeys, buttons = keys.clientbuttons,
screen = awful.screen.preferred,
placement = awful.placement.no_overlap + awful.placement.no_offscreen,
}
},
{
rule_any = {
instance = { "pinentry" },
class = { "Arandr", "Blueman-manager", "Gpick", "Pavucontrol" },
name = { "Event Tester" },
role = { "AlarmWindow", "pop-up" },
},
properties = { floating = true }
},
{
rule = { name = "Sublime Terminal", },
properties = { floating = false, },
callback = function(c)
awful.client.setslave(c)
local t = c.first_tag
if t then
t.master_width_factor = 0.67
end
end,
},
}
-- ================================================
-- SIGNALS
-- ================================================
client.connect_signal("manage", function(c)
if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then
awful.placement.no_offscreen(c)
end
-- New windows open into the stack (to the right); first window becomes master.
if not awesome.startup then awful.client.setslave(c) end
-- 0 or ie 13 = corner radius
c.shape = function(cr, width, height) gears.shape.rounded_rect(cr, width, height, 0) end
end)
client.connect_signal("property::floating", function(c)
if c.floating and c.type ~= "notification" then awful.placement.centered(c, { honor_workarea = true }) end
end)
client.connect_signal("manage", function(c)
if c.floating and c.type ~= "notification" then awful.placement.centered(c, { honor_workarea = true }) end
end)
-- Focus follows mouse (i3-like). Comment out for click-to-focus only.
client.connect_signal("mouse::enter", function(c) c:emit_signal("request::activate", "mouse_enter", { raise = false }) end)
client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
+36 -9
View File
@@ -11,14 +11,11 @@ export GOOGLE_DEFAULT_CLIENT_ID="no"
export GOOGLE_DEFAULT_CLIENT_SECRET="no" export GOOGLE_DEFAULT_CLIENT_SECRET="no"
# Core settings # Core settings
export EDITOR="nvim" export EDITOR="evi"
export VISUAL="nvim" export VISUAL="evi"
export MANPAGER="nvim +Man!" export MANPAGER="evi +Man!"
export BROWSER="firefox" export BROWSER="firefox"
# export TERM=xterm-256color
export COLORTERM="truecolor" export COLORTERM="truecolor"
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
# Development # Development
export DEBUG=1 export DEBUG=1
@@ -68,9 +65,38 @@ add_to_path "$HOME/.odin/"
export PATH export PATH
# ==============================================================================
# AUTO COMPLETE
# ==============================================================================
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
fi
# ============================================================================== # ==============================================================================
# ALIASES # ALIASES
# ============================================================================== # ==============================================================================
# Void linux helpers
# System update (sync + update all packages)
alias void-update='sudo xbps-install -Su'
# Remove orphaned dependencies + clean cache
alias void-clean='sudo xbps-remove -Oo'
# List explicitly installed (manual) packages
alias void-installed='xbps-query -m'
# List all installed packages
alias void-installedall='xbps-query -l'
# Show which package owns a file
alias void-owns='xbps-query -o'
# Remove a package and its unused deps in one go (usage: purge <pkgname>)
alias void-purge='sudo xbps-remove -R'
# Install a package (usage: install <pkgname>)
alias void-install='sudo xbps-install'
# Remove a package (usage: remove <pkgname>)
alias void-remove='sudo xbps-remove'
# Search for a package
alias void-search='xbps-query -Rs'
# Show info about a package
alias void-query='xbps-query -R'
# List commands # List commands
alias ls='ls -lh --color=auto --group-directories-first' alias ls='ls -lh --color=auto --group-directories-first'
alias ll='ls -lAh --color=auto --group-directories-first' alias ll='ls -lAh --color=auto --group-directories-first'
@@ -91,14 +117,15 @@ alias free='free -h'
alias bat='bat --theme="ansi" --paging=never' alias bat='bat --theme="ansi" --paging=never'
# Application shortcuts # Application shortcuts
alias vi='nvim'
alias :q='exit' alias :q='exit'
alias files='thunar .' alias files='thunar .'
alias fetch='pfetch' alias fetch='pfetch'
# Custom shortcuts # Custom shortcuts
alias v='evi'
alias vi='evi'
alias reload='source ~/.bashrc' alias reload='source ~/.bashrc'
alias dots='cd ~/.dotfiles && nvim' alias dots='cd ~/.dotfiles && evi'
alias doti='bash ~/.dotfiles/install.sh -i' alias doti='bash ~/.dotfiles/install.sh -i'
alias dotl='bash ~/.dotfiles/install.sh -l' alias dotl='bash ~/.dotfiles/install.sh -l'
alias myip='curl ipinfo.io/ip; echo ""' alias myip='curl ipinfo.io/ip; echo ""'
@@ -154,4 +181,4 @@ git_prompt_info() {
echo " ${esc}[1;35m(${branch})${esc}[0m${marker}" echo " ${esc}[1;35m(${branch})${esc}[0m${marker}"
} }
PS1='\[\033[32m\]\u\[\033[0m\]@\[\033[34m\]\h\[\033[0m\]:\[\033[36m\]\w\[\033[0m\]$(git_prompt_info)\$ ' PS1='\[\033[32m\]\u\[\033[0m\]@\[\033[34m\]\h\[\033[0m\]:\[\033[36m\]\w\[\033[0m\]$(git_prompt_info)\$ '
+12
View File
@@ -0,0 +1,12 @@
let g:netrw_dirhistmax =10
let g:netrw_dirhistcnt =1
let g:netrw_dirhist_1='/home/jason/Projects/dotfiles'
let g:netrw_dirhist_0='/home/jason/Projects/GraveKeeper/src'
let g:netrw_dirhist_9='/home/jason/Projects/GraveKeeper'
let g:netrw_dirhist_8='/home/jason/.config/kitty/kitty.conf'
let g:netrw_dirhist_7='/home/jason/.evi'
let g:netrw_dirhist_6='/home/jason/Projects/GraveKeeper'
let g:netrw_dirhist_5='/home/jason/.evi'
let g:netrw_dirhist_4='/home/jason/.evi/pack'
let g:netrw_dirhist_3='/home/jason/.evi'
let g:netrw_dirhist_2='/home/jason/.evi/autoload'
+202
View File
@@ -0,0 +1,202 @@
" ============================================================================
" EVi Configuration
" ============================================================================
" General
" ----------------------------------------------------------------------------
set nocompatible
set encoding=utf-8
set hidden
set history=1000
set clipboard=unnamedplus
set splitright
set splitbelow
" ----------------------------------------------------------------------------
" UI
" ----------------------------------------------------------------------------
set number
set relativenumber
set wildmenu
set showcmd
colorscheme jellybeans
" ----------------------------------------------------------------------------
" Transparent UI
" ----------------------------------------------------------------------------
augroup VimTransparent
autocmd!
autocmd ColorScheme * highlight Normal ctermbg=NONE guibg=NONE
\ | highlight NonText ctermbg=NONE guibg=NONE
\ | highlight LineNr ctermbg=NONE guibg=NONE
\ | highlight SignColumn ctermbg=NONE guibg=NONE
\ | highlight EndOfBuffer ctermbg=NONE guibg=NONE
augroup END
" ----------------------------------------------------------------------------
" Status Line
" ----------------------------------------------------------------------------
set laststatus=2
highlight EviStatus cterm=NONE ctermfg=White ctermbg=236
set statusline=%#EviStatus#%f\ %m%r\ %=%{&filetype}\ \ %l:%c\ %p%%
" ----------------------------------------------------------------------------
" Editing
" ----------------------------------------------------------------------------
set tabstop=4
set shiftwidth=4
set expandtab
set smartindent
set nowrap
set incsearch
set hlsearch
set ignorecase
set smartcase
set completeopt=menu,menuone,noselect
" ----------------------------------------------------------------------------
" File Types
" ----------------------------------------------------------------------------
syntax on
filetype plugin indent on
" ----------------------------------------------------------------------------
" fzf
" ----------------------------------------------------------------------------
if executable('rg')
let $FZF_DEFAULT_COMMAND =
\ 'rg --files --hidden --follow --glob "!.git/*"'
endif
nnoremap <C-p> :Files<CR>
nnoremap <C-o> :Buffers<CR>
nnoremap <C-s> :Rg<CR>
nnoremap <C-b> :Build<CR>
" ----------------------------------------------------------------------------
" Search
" ----------------------------------------------------------------------------
nnoremap <Esc><Esc> :nohlsearch<CR>
nnoremap n nzzzv
nnoremap N Nzzzv
" ----------------------------------------------------------------------------
" Window Navigation
" ----------------------------------------------------------------------------
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
nnoremap <C-x> <C-w>q
" ----------------------------------------------------------------------------
" LSP - OLS
" ----------------------------------------------------------------------------
packadd lsp
call LspOptionsSet(#{
\ autoComplete: v:false,
\ autoHighlight: v:false,
\ autoHighlightDiags: v:true,
\ autoPopulateDiags: v:true,
\ semanticHighlight: v:false,
\ showSignature: v:false,
\ completionInPreview: v:false,
\ condensedCompletionMenu: v:true,
\ })
if executable('ols')
call LspAddServer([#{
\ name: 'ols',
\ filetype: ['odin'],
\ path: 'ols',
\ args: ['--stdio'],
\ features: #{
\ diagnostic: v:false,
\ completion: v:true,
\ hover: v:true,
\ signatureHelp: v:false,
\ documentHighlight: v:true,
\ semanticHighlight: v:true,
\ },
\ }])
endif
command! Action LspCodeAction
command! Rename LspRename
autocmd FileType odin setlocal omnifunc=LspOmniFunc
inoremap <C-@> <C-X><C-O>
nnoremap K :LspHover<CR>
" ----------------------------------------------------------------------------
" Go to Definition
" ----------------------------------------------------------------------------
function! GotoDefinitionSplit() abort
vsplit
LspGotoDefinition
endfunction
nnoremap gd :call GotoDefinitionSplit()<CR>
" ----------------------------------------------------------------------------
" Diagnostics
" ----------------------------------------------------------------------------
function! ToggleDiagnostics() abort
for l:win in getwininfo()
if get(l:win, 'quickfix', 0)
execute l:win.winnr .. 'close'
return
endif
endfor
LspDiag show
endfunction
command! Diagnostics call ToggleDiagnostics()
nnoremap <C-i> :Diagnostics<CR>
" ----------------------------------------------------------------------------
" Netrw / File Tree
" ----------------------------------------------------------------------------
let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 0
let g:netrw_altv = 1
let g:netrw_winsize = 33
let g:netrw_keepdir = 0
nnoremap <C-e> :Lexplore<CR>
" ----------------------------------------------------------------------------
" Build System
" ----------------------------------------------------------------------------
function! Build(...) abort
" Already in the build terminal → close it.
if get(b:, 'build_terminal', 0) && &buftype ==# 'terminal'
close
echo ''
return
endif
if !filereadable('build.sh')
echohl WarningMsg
echo 'No build.sh found in current directory.'
echohl None
return
endif
wall
let l:command = './build.sh'
if a:0 > 0
let l:command .= ' ' .. join(a:000, ' ')
endif
botright vsplit
execute 'vertical resize ' .. float2nr(&columns * 0.37)
execute 'terminal ++curwin ' .. l:command
let b:build_terminal = 1
tnoremap <buffer> <CR> <Nop>
endfunction
command! -nargs=* Build call Build(<f-args>)
Submodule config/evi/pack/downloads/opt/lsp added at 6ab67121fa
Submodule config/evi/pack/plugins/start/fzf added at ca4c1b80e3
Submodule config/evi/pack/plugins/start/fzf.vim added at d2a59a992a
Submodule config/evi/pack/plugins/start/jellybeans added at ef83bf4dc8
Submodule config/evi/pack/plugins/start/vim-polyglot added at f061eddb7c
+19 -12
View File
@@ -2,21 +2,32 @@
process-unmapped-keys yes process-unmapped-keys yes
) )
;; HHKB Classic layout ;; HHKB Professional Classic (Linux)
;;
;; Small key left of Space = Muhenkan
;; Large key left of Space = Left Alt
;;
;; AwesomeWM:
;; modkey = "Mod4"
(defsrc (defsrc
esc 1 2 3 4 5 6 7 8 9 0 - = \ grv esc 1 2 3 4 5 6 7 8 9 0 - = \ grv
tab q w e r t y u i o p [ ] bspc tab q w e r t y u i o p [ ] bspc
lctl a s d f g h j k l ; ' ret lctl a s d f g h j k l ; ' ret
lsft z x c v b n m , . / rsft lsft z x c v b n m , . / rsft
lmet lalt spc ralt rmet ;; swapped here muhenkan lalt spc ralt rmet
)
(defalias
nav (tap-hold 200 200 esc (layer-while-held navigation))
) )
(deflayer base (deflayer base
@nav 1 2 3 4 5 6 7 8 9 0 - = \ grv @nav 1 2 3 4 5 6 7 8 9 0 - = \ grv
tab q w e r t y u i o p [ ] bspc tab q w e r t y u i o p [ ] bspc
lctl a s d f g h j k l ; ' ret lctl a s d f g h j k l ; ' ret
lsft z x c v b n m , . / rsft lsft z x c v b n m , . / rsft
lmet lalt spc ralt rmet ;; swapped here lmet lalt spc ralt rmet
) )
(deflayer navigation (deflayer navigation
@@ -24,9 +35,5 @@
tab _ _ _ _ _ _ _ _ _ _ _ _ _ tab _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ left down up rght _ _ _ _ _ _ _ _ _ left down up rght _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ lalt _ _ _ _ lalt _ _ _
) )
(defalias
nav (tap-hold 200 200 esc (layer-while-held navigation))
)
+56
View File
@@ -0,0 +1,56 @@
# ============================================================================
# Kitty Configuration
# ============================================================================
enable_audio_bell no
term xterm-256color
# ----------------------------------------------------------------------------
# Font
# ----------------------------------------------------------------------------
font_family JetBrainsMono Nerd Font
font_size 12.0
# ----------------------------------------------------------------------------
# Window
# ----------------------------------------------------------------------------
window_padding_width 10
window_padding_height 10
# ----------------------------------------------------------------------------
# Cursor
# ----------------------------------------------------------------------------
cursor_shape beam
cursor_blink_interval 0.5
# ----------------------------------------------------------------------------
# Layout
# ----------------------------------------------------------------------------
enabled_layouts splits
# ----------------------------------------------------------------------------
# Splits
# ----------------------------------------------------------------------------
# Vertical split
map ctrl+v launch --location=vsplit --cwd=current
# Close current kitty split
map ctrl+q close_window
# ----------------------------------------------------------------------------
# Colors
# ----------------------------------------------------------------------------
foreground #e8e8e8
background #121212
cursor #D4D4D4
cursor_text_color #1F1F1F
color0 #1F1F1F
color1 #F44747
color2 #6A9955
color3 #DCDCAA
color4 #569CD6
color5 #C586C0
color6 #56B6C2
color7 #D4D4D4
color8 #808080
-89
View File
@@ -1,89 +0,0 @@
require("vim._core.ui2").enable({})
map = vim.keymap.set
vim.o.termguicolors = true
vim.o.showmode = false
vim.o.laststatus = 3
vim.o.nu = true
vim.o.swapfile = false
vim.o.winborder = "single"
vim.o.winblend = 0
vim.o.pumblend = 0
vim.o.scrolloff = 20
vim.o.shiftwidth = 4
vim.o.tabstop = 4
vim.o.softtabstop = 4
vim.o.ignorecase = true
vim.o.smartcase = true
vim.o.incsearch = true
vim.o.hlsearch = true
vim.o.mouse = "a"
vim.o.path = "**"
vim.o.clipboard = "unnamedplus"
vim.o.foldenable = true
vim.o.foldmethod = "expr"
vim.o.foldlevel = 99
vim.o.splitright = true
vim.o.splitbelow = true
vim.o.signcolumn = "yes"
vim.o.completeopt = "menu,menuone,noselect,popup,fuzzy"
vim.o.undofile = true
vim.o.undodir = vim.fn.stdpath("state") .. "/undo"
vim.o.errorformat = "%f(%l:%c) %m,%-G%.%#"
vim.cmd.colorscheme('retrobox')
-- -----------------------------
-- @BINDS
-- -----------------------------
map("t", "<ESC><ESC>", "<C-\\><C-n>")
map({"t", "n"}, "<C-h>", "<C-\\><C-n><C-w><C-h>")
map({"t", "n"}, "<C-j>", "<C-\\><C-n><C-w><C-j>")
map({"t", "n"}, "<C-k>", "<C-\\><C-n><C-w><C-k>")
map({"t", "n"}, "<C-l>", "<C-\\><C-n><C-w><C-l>")
map({"i", "n"}, "<C- >", "<C-x><C-o>")
map("n", '<Esc>', '<Cmd>noh<CR><Esc>')
map("v", "J", ":m '>+1<CR>gv=gv")
map("v", "K", ":m '<-2<CR>gv=gv")
map("v", "<S-Tab>", "<gv")
map("v", "<Tab>" , ">gv")
map("n", "<C-p>", ":find ")
map("n", "<C-e>", ":Lex<CR>")
map("n", "<C-backspace>", ":bd<CR>")
map("i", "<C-h>", vim.lsp.buf.signature_help)
-- -----------------------------
-- @AUTOCMDS
-- -----------------------------
-- Terminals should open with insert mode
vim.api.nvim_create_autocmd({ "BufEnter", "TermEnter", "WinEnter" }, {
pattern = "term://*",
callback = function()
if vim.bo.buftype == "terminal" then
vim.schedule(function()
vim.cmd("startinsert")
end)
end
end
})
-- highlights yanked text
vim.api.nvim_create_autocmd("TextYankPost", {
callback = function()
vim.highlight.on_yank({
higroup = "IncSearch",
timeout = 200,
})
end,
})
-- removes trailing whitespace on save
vim.api.nvim_create_autocmd("BufWritePre", {
callback = function()
local save_cursor = vim.fn.getpos(".")
vim.cmd([[%s/\s\+$//e]])
vim.fn.setpos(".", save_cursor)
end,
})
vim.api.nvim_create_augroup('AutoResizeWindows', { clear = true })
vim.api.nvim_create_autocmd('VimResized', {
group = 'AutoResizeWindows',
callback = function()
vim.cmd('wincmd =')
end,
})
-286
View File
@@ -1,286 +0,0 @@
#################################
# Fading #
#################################
fading = false;
fade-in-step = 0.04;
fade-out-step = 0.04;
#################################
# Corners #
#################################
corner-radius = 5;
#################################
# FAST SNAPPY ANIMATIONS #
#################################
match = "window_type = 'normal'";
animations = (
{
triggers = ["close"];
opacity = {
curve = "cubic-bezier(0,1,1,1)";
duration = 0.3;
start = "window-raw-opacity-before";
end = 0;
};
blur-opacity = "opacity";
shadow-opacity = "opacity";
scale-x = {
curve = "cubic-bezier(0,1.3,1,1)";
duration = 0.3;
start = 1;
end = 0.6;
};
scale-y = "scale-x";
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
shadow-scale-x = "scale-x";
shadow-scale-y = "scale-y";
shadow-offset-x = "offset-x";
shadow-offset-y = "offset-y";
},
{
triggers = ["open"];
opacity = {
curve = "cubic-bezier(0,1,1,1)";
duration = 0.5;
start = 0;
end = "window-raw-opacity";
};
blur-opacity = "opacity";
shadow-opacity = "opacity";
scale-x = {
curve = "cubic-bezier(0,1.3,1,1)";
duration = 0.5;
start = 0.6;
end = 1;
};
scale-y = "scale-x";
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
shadow-scale-x = "scale-x";
shadow-scale-y = "scale-y";
shadow-offset-x = "offset-x";
shadow-offset-y = "offset-y";
},
{
triggers = ["geometry"];
scale-x = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-width-before / window-width";
end = 1;
};
scale-x-reverse = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.3;
start = "window-width / window-width-before";
end = 1;
};
scale-y = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-height-before / window-height";
end = 1;
};
scale-y-reverse = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-height / window-height-before";
end = 1;
};
offset-x = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-x-before - window-x";
end = 0;
};
offset-y = {
curve = "cubic-bezier(0,0,0,1.28)";
duration = 0.5;
start = "window-y-before - window-y";
end = 0;
};
shadow-scale-x = "scale-x";
shadow-scale-y = "scale-y";
shadow-offset-x = "offset-x";
shadow-offset-y = "offset-y";
},
)
#################################
# General Settings #
#################################
backend = "glx";
dithered-present = false;
vsync = true;
detect-rounded-corners = true;
detect-client-opacity = true;
detect-transient = true;
use-damage = true;
log-level = "warn";
#################################
# Window Rules #
#################################
rules: (
# No rounded corners on dock and desktop
{
match = "window_type = 'dock' || window_type = 'desktop'";
corner-radius = 0;
},
{
match = "class_g = 'Rofi'";
animations = (
{
triggers = ["open", "show"];
opacity = {
curve = "cubic-bezier(0, 1, 1, 1)";
duration = 0.2;
start = 0;
end = "window-raw-opacity";
};
shadow-opacity = "opacity";
scale-y = {
curve = "cubic-bezier(0.2, 0, 0, 1)";
duration = 0.2;
start = 0.55;
end = 1;
};
shadow-scale-y = "scale-y";
},
{
triggers = ["close", "hide"];
opacity = {
curve = "cubic-bezier(0, 1, 1, 1)";
duration = 0.15;
start = "window-raw-opacity-before";
end = 0;
};
shadow-opacity = "opacity";
scale-y = {
curve = "cubic-bezier(0.2, 0, 0, 1)";
duration = 0.15;
start = 1;
end = 0.55;
};
shadow-scale-y = "scale-y";
},
);
},
{
match = "window_type = 'splash' && name = 'awesome_dim_overlay'";
animations = ();
shadow = false;
corner-radius = 0;
fade = false;
},
)
-125
View File
@@ -1,125 +0,0 @@
* {
/* -- Palette, matches colors{} in awesome rc.lua -- */
bg0: #111111; /* colors.background */
bg1: #1a1a1a; /* colors.background_alt */
fg0: #dcd7ba; /* colors.foreground */
fg-selected: #ffffff; /* colors.white */
accent: #6a9589; /* colors.accent */
accent-alt: #727169; /* colors.accent_alt */
red: #e82424; /* colors.red */
disabled: #6a9589; /* colors.disabled */
font: "JetBrainsMono Nerd Font 14";
background-color: transparent;
text-color: @fg0;
}
window {
transparency: "real";
/* Anchor top-center, right below the wibar. */
location: north;
anchor: north;
y-offset: 48px;
width: 32em;
height: 26em; /* fixed — box size no longer changes with result count */
background-color: @bg0;
border: 3px;
border-color: @accent;
border-radius: -1px; /* matches gears.shape.rounded_rect radius in rc.lua */
padding: 14px;
}
mainbox {
children: [ inputbar, message, listview, mode-switcher ];
spacing: 10px;
background-color: transparent;
}
/* -- Search field -- */
inputbar {
children: [ prompt, entry ];
spacing: 10px;
background-color: @bg1;
border-radius: 10px;
padding: 10px 14px;
}
prompt {
text-color: @accent-alt;
}
entry {
placeholder: "Search";
placeholder-color: @disabled;
text-color: @fg0;
cursor: text;
}
/* -- List/grid toggle icons, top-right (matches screenshot) -- */
mode-switcher {
/* flip to true if you use rofis built-in mode tabs */
enabled: false;
}
/* -- Results -- */
listview {
lines: 8;
columns: 1;
spacing: 6px;
scrollbar: false;
background-color: transparent;
/* box height stays locked, doesnt shrink/grow with result count */
fixed-height: true;
/* dont resize dynamically as you type either */
dynamic: false;
}
/*
* Rofi tracks row state as a combination of position (normal/alternate,
* i.e. even/odd rows for banding) and status (normal/urgent/active/selected).
* Each combination needs its own selector or a competing @theme import
* (if you have one elsewhere in your rofi config) can still win on states
* this file doesnt explicitly cover. Pinning all of them here.
*/
element {
padding: 10px 12px;
border-radius: 10px;
orientation: horizontal;
}
element normal.normal,
element alternate.normal {
background-color: @bg1;
text-color: @fg0;
}
element normal.urgent,
element alternate.urgent {
background-color: @bg1;
text-color: @red;
}
element normal.active,
element alternate.active {
background-color: @bg1;
text-color: @accent-alt;
}
element selected.normal {
background-color: @accent-alt;
text-color: @fg-selected;
}
element selected.urgent {
background-color: @red;
text-color: @fg-selected;
}
element selected.active {
background-color: @accent-alt;
text-color: @bg0;
}
element-icon {
size: 24px;
padding: 0 12px 0 0;
vertical-align: 0.5;
background-color: transparent;
}
element-text {
vertical-align: 0.5;
text-color: inherit;
background-color: transparent;
}
message {
background-color: @bg1;
border-radius: 10px;
padding: 8px 12px;
}
textbox {
text-color: @fg0;
}
+6 -9
View File
@@ -86,9 +86,6 @@ if [ "$DO_LINKS" = true ]; then
link_file "$DOTFILES_DIR/config/bash/bashrc" "$HOME/.bashrc" link_file "$DOTFILES_DIR/config/bash/bashrc" "$HOME/.bashrc"
link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata" link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata"
link_file "$DOTFILES_DIR/config/alacritty" "$HOME/.config/alacritty" link_file "$DOTFILES_DIR/config/alacritty" "$HOME/.config/alacritty"
link_file "$DOTFILES_DIR/config/picom" "$HOME/.config/picom"
link_file "$DOTFILES_DIR/config/awesome" "$HOME/.config/awesome"
link_file "$DOTFILES_DIR/config/rofi" "$HOME/.config/rofi"
link_file "$DOTFILES_DIR/config/nvim" "$HOME/.config/nvim" link_file "$DOTFILES_DIR/config/nvim" "$HOME/.config/nvim"
link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin" link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin"
@@ -152,15 +149,15 @@ if [ "$DO_INSTALL" = true ]; then
# network & download # network & download
wget curl ca-certificates gnupg rsync wget curl ca-certificates gnupg rsync
# core utilities # core utilities
git unzip jq fzf tree direnv make git fd jq fzf ripgrep tree direnv make bat
# modern shell and cli tools ark unzip p7zip tar gzip bzip2 xz kanata
fish-shell alacritty fd ripgrep bat gitu
# build & dev tools # build & dev tools
base-devel valgrind tree-sitter-cli go alacritty base-devel valgrind tree-sitter-cli go nodejs
# window manager & desktop
picom xdotool wmctrl rofi kanata feh
# fonts # fonts
noto-fonts-ttf noto-fonts-emoji noto-fonts-ttf noto-fonts-emoji
# kde
xdg-desktop-portal xdg-desktop-portal-kde
) )
MISSING_PACKAGES=() MISSING_PACKAGES=()
-68
View File
@@ -1,68 +0,0 @@
#!/usr/bin/env bash
# rofi-audio-switch: pick a PulseAudio/PipeWire sink via rofi
set -euo pipefail
awesome-client 'show_dim()' >/dev/null 2>&1
trap 'awesome-client "hide_dim()" >/dev/null 2>&1' EXIT
# Get list of sinks: index, name, description
mapfile -t sinks < <(pactl list sinks | awk -F': ' '
/^Sink #/ { idx=$2 }
/Name:/ { name=$2 }
/Description:/ { desc=$2; print idx"\t"name"\t"desc }
')
if [ "${#sinks[@]}" -eq 0 ]; then
notify-send "Audio Switch" "No sinks found"
exit 1
fi
current_sink=$(pactl get-default-sink)
# Build rofi menu: show description, mark current with a star
menu=""
for line in "${sinks[@]}"; do
name=$(echo "$line" | cut -f2)
desc=$(echo "$line" | cut -f3)
if [ "$name" = "$current_sink" ]; then
menu+="* $desc\n"
else
menu+=" $desc\n"
fi
done
chosen=$(echo -e "$menu" | rofi -dmenu -i -p "Audio Output" -markup-rows \
-theme-str 'listview { lines: 3; }' \
-theme-str 'window { height: 220px; }')
[ -z "$chosen" ] && exit 0
# Strip the leading marker to match description text
chosen_desc=$(echo "$chosen" | sed 's/^[* ] //')
# Find matching sink name for that description
target_name=""
for line in "${sinks[@]}"; do
desc=$(echo "$line" | cut -f3)
if [ "$desc" = "$chosen_desc" ]; then
target_name=$(echo "$line" | cut -f2)
break
fi
done
if [ -z "$target_name" ]; then
notify-send "Audio Switch" "Could not resolve selection"
exit 1
fi
# Set as default sink
pactl set-default-sink "$target_name"
# Move all currently running streams to the new sink
mapfile -t inputs < <(pactl list short sink-inputs | cut -f1)
for input in "${inputs[@]}"; do
pactl move-sink-input "$input" "$target_name"
done
notify-send "Audio Switch" "Switched to: $chosen_desc"
-27
View File
@@ -1,27 +0,0 @@
#!/usr/bin/env bash
# rofi-power-menu: logout / restart / shutdown via rofi
set -euo pipefail
awesome-client 'show_dim()' >/dev/null 2>&1
trap 'awesome-client "hide_dim()" >/dev/null 2>&1' EXIT
options=" Logout\n Restart\n Shutdown"
chosen=$(echo -e "$options" | rofi -dmenu -i -p "Power" -markup-rows \
-theme-str 'listview { lines: 3; }' \
-theme-str 'window { height: 240px; }')
[ -z "$chosen" ] && exit 0
case "$chosen" in
*Logout*)
loginctl terminate-session ${XDG_SESSION_ID-}
;;
*Restart*)
loginctl reboot
;;
*Shutdown*)
loginctl poweroff
;;
esac
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
awesome-client 'show_dim()'
rofi -show drun "$@"
awesome-client 'hide_dim()'
+3 -2
View File
@@ -5,10 +5,11 @@
# Builds from source - recommended method on Linux # Builds from source - recommended method on Linux
# --------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------
set -e set -e
ODIN_DIR="$HOME/odin" ODIN_DIR="$HOME/.odin"
echo "Installing Odin build dependencies..." echo "Installing Odin build dependencies..."
sudo xbps-install -Sy llvm18 llvm18-devel clang18 libstdc++-devel sudo xbps-install -Sy llvm18 llvm18-devel clang18 libstdc++-devel git-lfs
git lfs install
echo "Cloning Odin repository..." echo "Cloning Odin repository..."
git clone https://github.com/odin-lang/Odin "$ODIN_DIR" git clone https://github.com/odin-lang/Odin "$ODIN_DIR"
+2 -3
View File
@@ -1,9 +1,8 @@
#!/bin/bash #!/bin/bash
# --------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------
# Golang install recipe # PHP install recipe
# Fetches the void php version # Fetches the void php version and composer package
# then installs composer with php
# --------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------
set -e set -e