{ inputs, config, pkgs, lib, wallpaper, ... }:
let
theme = pkgs.qogir-theme.override { tweaks = [ "square" ]; };
markdownStyleHeader = pkgs.writeText "style.html" ''
'';
markdownCaddyfile = pkgs.writeText "Caddyfile" ''
:8123
encode zstd gzip
templates
file_server browse {
root "/"
hide ".*"
}
@md <
{{ "{file.base}" }}
{{
markdown (include "{path}")
}}
HTML 200
'';
in
{
# Home Manager needs a bit of information about you and the paths it should
# manage.
home.username = "ps";
home.homeDirectory = "/home/ps";
services.xcape = {
enable = true;
mapExpression = {
Caps_Lock = "Escape";
Super_L = "Alt_L|F1";
};
};
xfconf.settings = {
xfce4-desktop = {
"backdrop/screen0/monitor0/image-path" = "${wallpaper}";
"backdrop/screen0/monitor0/image-show" = true;
"backdrop/screen0/monitor0/image-style" = 5;
};
};
systemd.user.services.markdownCaddy = {
Unit = {
Description = "Run a web server serving Markdown files.";
Wants = [ "network-online.target" ];
After = [ "network-online.target" ];
};
Install = {
WantedBy = [ "default.target" ];
};
Service = {
WorkingDirectory = "/";
ExecStart = "${pkgs.writeShellScript "markdown-caddy" ''
${pkgs.caddy}/bin/caddy run --config ${markdownCaddyfile} --adapter caddyfile
''}";
};
};
xsession.windowManager.i3 = {
enable = true;
config = {
bars = [];
modifier = "Mod4";
terminal = "${pkgs.kitty}/bin/kitty";
gaps = {
inner = 5;
};
keybindings =
let
mod = config.xsession.windowManager.i3.config.modifier;
i3-next = pkgs.writers.writePython3 "i3-next" {} ''
import json
from subprocess import check_output
workspaces = json.loads(check_output(
["${pkgs.i3}/bin/i3-msg",
"-t", "get_workspaces"]))
outputs = {}
activeOutput = ""
activeWorkspace = -1
for w in workspaces:
output = w["output"]
workspace = int(w["num"])
if output not in outputs:
outputs[output] = set()
outputs[output].add(workspace)
if w["focused"]:
activeOutput = output
activeWorkspace = workspace
workspacesSorted = sorted(outputs[activeOutput])
activeWorkspaceIndex = workspacesSorted.index(activeWorkspace)
if activeWorkspaceIndex < len(workspacesSorted) - 1:
print(workspacesSorted[activeWorkspaceIndex + 1])
else:
allWorkspaces = set()
for o in outputs.values():
allWorkspaces = allWorkspaces.union(o)
allWorkspacesSorted = sorted(allWorkspaces)
print(allWorkspacesSorted[-1]+1)
'';
i3-empty = pkgs.writers.writePython3 "i3-empty" {} ''
import json
from subprocess import check_output
workspaces = json.loads(check_output(
["${pkgs.i3}/bin/i3-msg",
"-t", "get_workspaces"]))
nextWorkspace = 1
for w in workspaces:
wNum = int(w["num"])
if wNum >= nextWorkspace:
nextWorkspace = wNum + 1
print(nextWorkspace)
'';
i3-max = pkgs.writers.writePython3 "i3-max" {} ''
import json
from subprocess import check_output
workspaces = json.loads(check_output(
["${pkgs.i3}/bin/i3-msg",
"-t", "get_workspaces"]))
result = "MAX"
for w in workspaces:
wName = w["name"]
wFocused = w["focused"]
if wName == "MAX" and wFocused:
result = "back_and_forth"
break
print(f"move window to workspace {result}; workspace {result}")
'';
i3-move-max = pkgs.writers.writePython3 "i3-move-max" {} ''
import json
from subprocess import check_output
workspaces = json.loads(check_output(
["${pkgs.i3}/bin/i3-msg",
"-t", "get_workspaces"]))
result = "MAX"
for w in workspaces:
wName = w["name"]
wFocused = w["focused"]
if wName == "MAX" and wFocused:
result = "back_and_forth"
break
print(f"workspace {result}")
'';
in lib.mkOptionDefault
{
# "${mod}+d" = "exec --no-startup-id krunner";
"${mod}+Shift+p" = "exec --no-startup-id set-wallpaper";
"${mod}+Shift+Return" = "exec --no-startup-id ${pkgs.kitty}/bin/kitty -d $(${pkgs.xcwd}/bin/xcwd)";
"${mod}+BackSpace" = "kill";
"${mod}+Prior" = "workspace prev_on_output";
"${mod}+Next" = "exec --no-startup-id i3-msg workspace number $(${i3-next})";
"${mod}+End" = "exec --no-startup-id i3-msg workspace $(${i3-empty})";
"${mod}+Shift+Prior" = "move container to workspace prev_on_output";
"${mod}+Shift+Next" = "exec --no-startup-id i3-msg move container to workspace number $(${i3-next})";
"${mod}+Shift+End" = "exec --no-startup-id i3-msg move container to workspace $(${i3-empty})";
"${mod}+Ctrl+Left" = "move workspace to output left";
"${mod}+Ctrl+Right" = "move workspace to output right";
"${mod}+y" = "exec ${pkgs.scrcpy}/bin/scrcpy -d --no-audio";
"${mod}+n" = "exec ${pkgs.kitty}/bin/kitty ${pkgs.helix}/bin/hx -w ~/sync/txt ~/sync/txt";
"${mod}+m" = "exec --no-startup-id i3-msg $(${i3-max})";
"${mod}+Shift+m" = "exec --no-startup-id i3-msg $(${i3-move-max})";
};
};
extraConfig = ''
for_window [window_role="pop-up"] floating enable
for_window [window_role="task_dialog"] floating enable
# for_window [workspace="0"] floating enable
for_window [class="kitty-popup"] floating enable
for_window [class="Xfce4-appfinder"] floating enable
for_window [class=".blueman-manager-wrapped"] floating enable
for_window [class="yakuake"] floating enable
for_window [class="systemsettings"] floating enable
for_window [title="win7"] floating enable; border none
# bindsym XF86AudioRaiseVolume exec --no-startup-id qdbus org.kde.kglobalaccel /component/kmix invokeShortcut "increase_volume"
# bindsym XF86AudioLowerVolume exec --no-startup-id qdbus org.kde.kglobalaccel /component/kmix invokeShortcut "decrease_volume"
# bindsym XF86AudioMute exec --no-startup-id qdbus org.kde.kglobalaccel /component/kmix invokeShortcut "mute"
# bindsym XF86AudioMicMute exec --no-startup-id qdbus org.kde.kglobalaccel /component/kmix invokeShortcut "mic_mute"
# class border backgr. text indicator child_border
client.focused #000000bf #000000bf #e6ebef #000000bf #000000bf
client.focused_inactive #00000080 #00000080 #e6ebef #00000080 #00000080
client.unfocused #00000040 #00000040 #e6ebef #00000040 #00000040
client.urgent #2f343a #900000 #e6ebef #900000 #2f343a
client.placeholder #000000 #0c0c0c #e6ebef #000000 #0c0c0c
focus_follows_mouse no
mouse_warping none
popup_during_fullscreen all
'';
};
home.file.".config/awesome/rc.lua".text = ''
-- If LuaRocks is installed, make sure that packages installed through it are
-- found (e.g. lgi). If LuaRocks is not installed, do nothing.
pcall(require, "luarocks.loader")
-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
require("awful.autofocus")
-- Widget and layout library
local wibox = require("wibox")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
local menubar = require("menubar")
local hotkeys_popup = require("awful.hotkeys_popup")
-- Enable hotkeys help widget for VIM and other apps
-- when client with a matching name is opened:
require("awful.hotkeys_popup.keys")
-- {{{ Error handling
-- Check if awesome encountered an error during startup and fell back to
-- another config (This code will only ever execute for the fallback config)
if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, there were errors during startup!",
text = awesome.startup_errors })
end
-- Handle runtime errors after startup
do
local in_error = false
awesome.connect_signal("debug::error", function (err)
-- Make sure we don't go into an endless error loop
if in_error then return end
in_error = true
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, an error happened!",
text = tostring(err) })
in_error = false
end)
end
-- }}}
-- {{{ Variable definitions
-- Themes define colours, icons, font and wallpapers.
beautiful.init(gears.filesystem.get_themes_dir() .. "default/theme.lua")
-- This is used later as the default terminal and editor to run.
terminal = "kitty"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. editor
-- Default modkey.
-- Usually, Mod4 is the key with a logo between Control and Alt.
-- If you do not like this or do not have such a key,
-- I suggest you to remap Mod4 to another key using xmodmap or other tools.
-- However, you can use another modifier like Mod1, but it may interact with others.
modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
awful.layout.layouts = {
awful.layout.suit.floating,
awful.layout.suit.tile,
awful.layout.suit.tile.left,
awful.layout.suit.tile.bottom,
awful.layout.suit.tile.top,
awful.layout.suit.fair,
awful.layout.suit.fair.horizontal,
awful.layout.suit.spiral,
awful.layout.suit.spiral.dwindle,
awful.layout.suit.max,
awful.layout.suit.max.fullscreen,
awful.layout.suit.magnifier,
awful.layout.suit.corner.nw,
-- awful.layout.suit.corner.ne,
-- awful.layout.suit.corner.sw,
-- awful.layout.suit.corner.se,
}
-- }}}
-- {{{ Menu
-- Create a launcher widget and a main menu
myawesomemenu = {
{ "hotkeys", function() hotkeys_popup.show_help(nil, awful.screen.focused()) end },
{ "manual", terminal .. " -e man awesome" },
{ "edit config", editor_cmd .. " " .. awesome.conffile },
{ "restart", awesome.restart },
{ "quit", function() awesome.quit() end },
}
mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
{ "open terminal", terminal }
}
})
mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
menu = mymainmenu })
-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications that require it
-- }}}
-- Keyboard map indicator and switcher
mykeyboardlayout = awful.widget.keyboardlayout()
-- {{{ Wibar
-- Create a textclock widget
mytextclock = wibox.widget.textclock()
-- Create a wibox for each screen and add it
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),
awful.button({ modkey }, 3, function(t)
if client.focus then
client.focus:toggle_tag(t)
end
end),
awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end),
awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end)
)
local tasklist_buttons = gears.table.join(
awful.button({ }, 1, function (c)
if c == client.focus then
c.minimized = true
else
c:emit_signal(
"request::activate",
"tasklist",
{raise = true}
)
end
end),
awful.button({ }, 3, function()
awful.menu.client_list({ theme = { width = 250 } })
end),
awful.button({ }, 4, function ()
awful.client.focus.byidx(1)
end),
awful.button({ }, 5, function ()
awful.client.focus.byidx(-1)
end))
local function set_wallpaper(s)
-- Wallpaper
if beautiful.wallpaper then
local wallpaper = beautiful.wallpaper
-- If wallpaper is a function, call it with the screen
if type(wallpaper) == "function" then
wallpaper = wallpaper(s)
end
gears.wallpaper.maximized(wallpaper, s, true)
end
end
-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)
screen.connect_signal("property::geometry", set_wallpaper)
awful.screen.connect_for_each_screen(function(s)
-- Wallpaper
set_wallpaper(s)
-- Each screen has its own tag table.
awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, s, awful.layout.layouts[1])
-- Create a promptbox for each screen
s.mypromptbox = awful.widget.prompt()
-- Create an imagebox widget which will contain an icon indicating which layout we're using.
-- We need one layoutbox per screen.
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),
awful.button({ }, 4, function () awful.layout.inc( 1) end),
awful.button({ }, 5, function () awful.layout.inc(-1) end)))
-- Create a taglist widget
s.mytaglist = awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all,
buttons = taglist_buttons
}
-- Create a tasklist widget
s.mytasklist = awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons
}
-- Create the wibox
s.mywibox = awful.wibar({ position = "top", screen = s })
-- Add widgets to the wibox
s.mywibox:setup {
layout = wibox.layout.align.horizontal,
{ -- Left widgets
layout = wibox.layout.fixed.horizontal,
mylauncher,
s.mytaglist,
s.mypromptbox,
},
s.mytasklist, -- Middle widget
{ -- Right widgets
layout = wibox.layout.fixed.horizontal,
mykeyboardlayout,
mytextclock,
s.mylayoutbox,
},
}
end)
-- }}}
-- {{{ Mouse bindings
root.buttons(gears.table.join(
awful.button({ }, 3, function () mymainmenu:toggle() end),
awful.button({ }, 4, awful.tag.viewnext),
awful.button({ }, 5, awful.tag.viewprev)
))
-- }}}
-- {{{ Key bindings
globalkeys = gears.table.join(
awful.key({ modkey, }, "s", hotkeys_popup.show_help,
{description="show help", group="awesome"}),
awful.key({ modkey, }, "Left", awful.tag.viewprev,
{description = "view previous", group = "tag"}),
awful.key({ modkey, }, "Right", awful.tag.viewnext,
{description = "view next", group = "tag"}),
awful.key({ modkey, }, "Escape", awful.tag.history.restore,
{description = "go back", group = "tag"}),
awful.key({ modkey, }, "j",
function ()
awful.client.focus.byidx( 1)
end,
{description = "focus next by index", group = "client"}
),
awful.key({ modkey, }, "k",
function ()
awful.client.focus.byidx(-1)
end,
{description = "focus previous by index", group = "client"}
),
awful.key({ modkey, }, "w", function () mymainmenu:show() end,
{description = "show main menu", group = "awesome"}),
-- Layout manipulation
awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end,
{description = "swap with next client by index", group = "client"}),
awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end,
{description = "swap with previous client by index", group = "client"}),
awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end,
{description = "focus the next screen", group = "screen"}),
awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end,
{description = "focus the previous screen", group = "screen"}),
awful.key({ modkey, }, "u", awful.client.urgent.jumpto,
{description = "jump to urgent client", group = "client"}),
awful.key({ modkey, }, "Tab",
function ()
awful.client.focus.history.previous()
if client.focus then
client.focus:raise()
end
end,
{description = "go back", group = "client"}),
-- Standard program
awful.key({ modkey, }, "Return", function () awful.spawn(terminal) end,
{description = "open a termial", group = "launcher"}),
awful.key({ modkey, "Control" }, "r", awesome.restart,
{description = "reload awesome", group = "awesome"}),
awful.key({ modkey, "Shift" }, "q", awesome.quit,
{description = "quit awesome", group = "awesome"}),
awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end,
{description = "increase master width factor", group = "layout"}),
awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end,
{description = "decrease master width factor", group = "layout"}),
awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1, nil, true) end,
{description = "increase the number of master clients", group = "layout"}),
awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1, nil, true) end,
{description = "decrease the number of master clients", group = "layout"}),
awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1, nil, true) end,
{description = "increase the number of columns", group = "layout"}),
awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1, nil, true) end,
{description = "decrease the number of columns", group = "layout"}),
awful.key({ modkey, }, "space", function () awful.layout.inc( 1) end,
{description = "select next", group = "layout"}),
awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(-1) end,
{description = "select previous", group = "layout"}),
awful.key({ modkey, "Control" }, "n",
function ()
local c = awful.client.restore()
-- Focus restored client
if c then
c:emit_signal(
"request::activate", "key.unminimize", {raise = true}
)
end
end,
{description = "restore minimized", group = "client"}),
-- Prompt
awful.key({ modkey }, "r", function () awful.screen.focused().mypromptbox:run() end,
{description = "run prompt", group = "launcher"}),
awful.key({ modkey }, "x",
function ()
awful.prompt.run {
prompt = "Run Lua code: ",
textbox = awful.screen.focused().mypromptbox.widget,
exe_callback = awful.util.eval,
history_path = awful.util.get_cache_dir() .. "/history_eval"
}
end,
{description = "lua execute prompt", group = "awesome"}),
-- Menubar
awful.key({ modkey }, "p", function() menubar.show() end,
{description = "show the menubar", group = "launcher"})
)
clientkeys = gears.table.join(
awful.key({ modkey, }, "f",
function (c)
c.fullscreen = not c.fullscreen
c:raise()
end,
{description = "toggle fullscreen", group = "client"}),
awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end,
{description = "close", group = "client"}),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ,
{description = "toggle floating", group = "client"}),
awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,
{description = "move to master", group = "client"}),
awful.key({ modkey, }, "o", function (c) c:move_to_screen() end,
{description = "move to screen", group = "client"}),
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end,
{description = "toggle keep on top", group = "client"}),
awful.key({ modkey, }, "n",
function (c)
-- The client currently has the input focus, so it cannot be
-- minimized, since minimized clients can't have the focus.
c.minimized = true
end ,
{description = "minimize", 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" }, "m",
function (c)
c.maximized_vertical = not c.maximized_vertical
c:raise()
end ,
{description = "(un)maximize vertically", group = "client"}),
awful.key({ modkey, "Shift" }, "m",
function (c)
c.maximized_horizontal = not c.maximized_horizontal
c:raise()
end ,
{description = "(un)maximize horizontally", group = "client"})
)
-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it work on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.
for i = 1, 9 do
globalkeys = gears.table.join(globalkeys,
-- View tag only.
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"}),
-- Toggle tag display.
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
awful.tag.viewtoggle(tag)
end
end,
{description = "toggle tag #" .. i, group = "tag"}),
-- Move client to tag.
awful.key({ modkey, "Shift" }, "#" .. 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"}),
-- Toggle tag on focused client.
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
function ()
if client.focus then
local tag = client.focus.screen.tags[i]
if tag then
client.focus:toggle_tag(tag)
end
end
end,
{description = "toggle focused client on tag #" .. i, group = "tag"})
)
end
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)
)
-- Set keys
root.keys(globalkeys)
-- }}}
-- {{{ Rules
-- Rules to apply to new clients (through the "manage" signal).
awful.rules.rules = {
-- All clients will match this rule.
{ rule = { },
properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal,
focus = awful.client.focus.filter,
raise = true,
keys = clientkeys,
buttons = clientbuttons,
screen = awful.screen.preferred,
placement = awful.placement.no_overlap+awful.placement.no_offscreen
}
},
-- Floating clients.
{ rule_any = {
instance = {
"DTA", -- Firefox addon DownThemAll.
"copyq", -- Includes session name in class.
"pinentry",
},
class = {
"Arandr",
"Blueman-manager",
"Gpick",
"Kruler",
"MessageWin", -- kalarm.
"Sxiv",
"Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size.
"Wpa_gui",
"veromix",
"xtightvncviewer"},
-- Note that the name property shown in xprop might be set slightly after creation of the client
-- and the name shown there might not match defined rules here.
name = {
"Event Tester", -- xev.
},
role = {
"AlarmWindow", -- Thunderbird's calendar.
"ConfigManager", -- Thunderbird's about:config.
"pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
}
}, properties = { floating = true }},
-- Add titlebars to normal clients and dialogs
{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = true }
},
{ rule = { class = "Xfdesktop" },
properties = { sticky = true, border_width = 0, skip_taskbar = true } },
{ rule = { class = "Xfce4-panel" },
properties = { focus = false, raise = false, border_width = 0, type = dock } },
-- Set Firefox to always map on the tag named "2" on screen 1.
-- { rule = { class = "Firefox" },
-- properties = { screen = 1, tag = "2" } },
}
-- }}}
-- {{{ Signals
-- Signal function to execute when a new client appears.
client.connect_signal("manage", function (c)
-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
-- if not awesome.startup then awful.client.setslave(c) end
if awesome.startup
and not c.size_hints.user_position
and not c.size_hints.program_position then
-- Prevent clients from being unreachable after screen count changes.
awful.placement.no_offscreen(c)
end
end)
-- Add a titlebar if titlebars_enabled is set to true in the rules.
client.connect_signal("request::titlebars", function(c)
-- buttons for the titlebar
local buttons = gears.table.join(
awful.button({ }, 1, function()
c:emit_signal("request::activate", "titlebar", {raise = true})
awful.mouse.client.move(c)
end),
awful.button({ }, 3, function()
c:emit_signal("request::activate", "titlebar", {raise = true})
awful.mouse.client.resize(c)
end)
)
awful.titlebar(c) : setup {
{ -- Left
awful.titlebar.widget.iconwidget(c),
buttons = buttons,
layout = wibox.layout.fixed.horizontal
},
{ -- Middle
{ -- Title
align = "center",
widget = awful.titlebar.widget.titlewidget(c)
},
buttons = buttons,
layout = wibox.layout.flex.horizontal
},
{ -- Right
awful.titlebar.widget.floatingbutton (c),
awful.titlebar.widget.maximizedbutton(c),
awful.titlebar.widget.stickybutton (c),
awful.titlebar.widget.ontopbutton (c),
awful.titlebar.widget.closebutton (c),
layout = wibox.layout.fixed.horizontal()
},
layout = wibox.layout.align.horizontal
}
end)
-- Enable sloppy focus, so that focus follows mouse.
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)
-- }}}
'';
services.picom = {
enable = true;
vSync = true;
opacityRules = [
"0:_NET_WM_STATE@[*]:a = '_NET_WM_STATE_HIDDEN'"
];
};
programs.git = {
userName = "patrick-scho";
userEmail = "patrick.schoenberger@posteo.de";
includes = [{ contents = {
user = {
email = "patrick.schoenberger@posteo.de";
name = "psch";
};
};}];
};
programs.bash = {
enable = true;
historySize = -1;
historyFileSize = -1;
};
programs.fzf = {
enable = true;
enableBashIntegration = true;
};
programs.readline = {
enable = true;
bindings = {
"\\e[A" = "history-search-backward";
"\\e[B" = "history-search-forward";
};
};
programs.kitty = {
enable = true;
themeFile = "Adapta_Nokto_Maia";
settings = {
# hide_window_decorations = "yes";
background_opacity = "0.98";
background_blur = "1";
confirm_os_window_close = "0";
enable_audio_bell = "no";
scrollback_pager_history_size = "1024";
};
};
programs.helix = {
enable = true;
settings = {
theme = "base16_terminal";
editor.cursor-shape = {
insert = "bar";
normal = "block";
select = "underline";
};
editor.soft-wrap = {
enable = true;
};
editor.file-picker = {
hidden = false;
};
keys.normal."space" = {
"space" = "goto_word";
};
};
languages = {
language = [{
name = "c";
auto-format = true;
formatter = { command = "clang-format"; args = ["--style=microsoft"]; };
}];
};
};
home.file.".config/zls.json".text = ''
{
"enable_build_on_save": true,
"build_on_save_step": "check"
}
'';
programs.neovim = {
enable = true;
defaultEditor = true;
plugins = with pkgs.vimPlugins; [
# fzfWrapper
# fzf-vim
formatter-nvim
goyo-vim
vim-visual-multi
nvim-lspconfig
];
extraConfig = ''
set number
set relativenumber
set tabstop=4
set shiftwidth=4
set foldmethod=marker
colorscheme habamax
nnoremap gj
nnoremap gk
vnoremap gj
vnoremap gk
inoremap gj
inoremap gk
tnoremap
'';
extraLuaConfig = ''
require('lspconfig').zls.setup{}
require('formatter').setup {
}
'';
};
home.file.".config/vis/plugins/vis-lspc" = {
source = builtins.fetchGit {
url = "https://gitlab.com/muhq/vis-lspc.git";
rev = "e184eb6c971abfcd0dc7f836f402aae6c33a8d13";
};
recursive = true;
};
home.file.".config/vis/plugins/vis-commentary" = {
source = builtins.fetchGit {
url = "https://github.com/lutobler/vis-commentary.git";
rev = "0e06ed8212c12c6651cb078b822390094b396f08";
};
recursive = true;
};
home.file.".config/vis/visrc.lua".text = ''
require('vis')
require('plugins/vis-commentary')
lspc = require('plugins/vis-lspc')
lspc.menu_cmd = 'vis-menu'
lspc.fallback_dirname_as_root = true
lspc.ls_map.zig = {name='zls',cmd='zls',roots={'build.zig'}}
vis.events.subscribe(vis.events.INIT, function()
-- Your global configuration options
end)
vis.events.subscribe(vis.events.WIN_OPEN, function(win) -- luacheck: no unused args
-- Your per window configuration options e.g.
vis:command('set number on')
vis:command('set autoindent')
vis:command('set tabwidth 4')
vis:command('set expandtab on')
end)
'';
programs.emacs = {
enable = true;
extraConfig = ''
(menu-bar-mode 0)
(tool-bar-mode 0)
(scroll-bar-mode 0)
(global-display-line-numbers-mode)
(setq-default
display-line-numbers-type 'relative
make-backup-files nil
inhibit-startup-screen t)
(load-theme 'tango-dark t)
'';
extraPackages = epkgs: [
epkgs.zig-mode
epkgs.lsp-mode
];
};
programs.tmux = {
enable = true;
escapeTime = 0;
extraConfig = ''
set-option -g default-terminal screen-256color
set -g history-limit 10000
set -g base-index 1
set-option -g renumber-windows on
bind-key -n M-n new-window -c "#{pane_current_path}"
bind-key -n M-1 select-window -t :1
bind-key -n M-2 select-window -t :2
bind-key -n M-3 select-window -t :3
bind-key -n M-4 select-window -t :4
bind-key -n M-5 select-window -t :5
bind-key -n M-6 select-window -t :6
bind-key -n M-7 select-window -t :7
bind-key -n M-8 select-window -t :8
bind-key -n M-9 select-window -t :9
bind-key -n M-0 select-window -t :0
bind-key -n M-. select-window -n
bind-key -n M-, select-window -p
bind-key -n M-S-. swap-window -t +1
bind-key -n M-S-, swap-window -t -1
bind-key -n M-X confirm-before "kill-window"
bind-key -n M-v split-window -h -c "#{pane_current_path}"
bind-key -n M-b split-window -v -c "#{pane_current_path}"
bind-key -n M-R command-prompt -I "" "rename-window '%%'"
bind-key -n M-f resize-pane -Z
bind-key -n M-h select-pane -L
bind-key -n M-l select-pane -R
bind-key -n M-k select-pane -U
bind-key -n M-j select-pane -D
bind-key -n M-Left select-pane -L
bind-key -n M-Right select-pane -R
bind-key -n M-Up select-pane -U
bind-key -n M-Down select-pane -D
bind-key -n "M-H" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -L; tmux swap-pane -t $old'
bind-key -n "M-J" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -D; tmux swap-pane -t $old'
bind-key -n "M-K" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -U; tmux swap-pane -t $old'
bind-key -n "M-L" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -R; tmux swap-pane -t $old'
bind-key -n "M-S-Left" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -L; tmux swap-pane -t $old'
bind-key -n "M-S-Down" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -D; tmux swap-pane -t $old'
bind-key -n "M-S-Up" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -U; tmux swap-pane -t $old'
bind-key -n "M-S-Right" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -R; tmux swap-pane -t $old'
bind-key -n M-x confirm-before "kill-pane"
bind-key -n M-/ copy-mode
# Linux system clipboard
bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"
bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "xclip -in -selection clipboard"
set -g mouse on
# set-option -g status-keys vi
# set-option -g set-titles on
# set-option -g set-titles-string 'tmux - #W'
# set -g bell-action any
# set-option -g visual-bell off
# set-option -g set-clipboard off
# setw -g mode-keys vi
# setw -g monitor-activity on
# set -g visual-activity on
# set -g status-style fg=colour15
# set -g status-justify centre
# set -g status-left ""
# set -g status-right ""
# set -g status-interval 1
# set -g message-style fg=colour0,bg=colour3
# setw -g window-status-bell-style fg=colour1
# setw -g window-status-current-style fg=yellow,bold
# setw -g window-status-style fg=colour250
# setw -g window-status-current-format ' #{?#{==:#W,#{b:SHELL}},#{b:pane_current_path},#W} '
# setw -g window-status-format ' #{?#{==:#W,#{b:SHELL}},#{b:pane_current_path},#W} '
# # For older tmux:
# #setw -g window-status-format ' #W '
# #setw -g window-status-current-format ' #W '
'';
};
programs.nushell = {
enable = true;
# for editing directly to config.nu
extraConfig = ''
$env.config = {
show_banner: false,
completions: {
case_sensitive: false # case-sensitive completions
quick: true # set to false to prevent auto-selecting completions
partial: true # set to false to prevent partial filling of the prompt
algorithm: "fuzzy" # prefix or fuzzy
}
hooks: {
command_not_found: { |cmd| (command-not-found $cmd | str trim) }
}
}
'';
# shellAliases = {
# vi = "hx";
# vim = "hx";
# nano = "hx";
# };
};
# programs.carapace = {
# enable = true;
# enableNushellIntegration = true;
# };
# programs.starship = {
# enable = true;
# settings = {
# add_newline = false;
# character = {
# success_symbol = "[➜](bold green)";
# error_symbol = "[➜](bold red)";
# };
# };
# };
programs.firefox = {
enable = true;
profiles = {
default = {
settings = {
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"browser.fullscreen.autohide" = false;
"browser.toolbars.bookmarks.visibility" = "never";
"browser.tabs.inTitlebar" = 0;
"browser.compactmode.show" = true;
"browser.uidensity" = 1;
};
userChrome = ''
#TabsToolbar {
visibility: collapse !important;
}
'';
};
appmode = {
id = 1;
settings = {
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
"browser.fullscreen.autohide" = false;
"browser.toolbars.bookmarks.visibility" = "never";
"browser.tabs.inTitlebar" = 0;
"browser.compactmode.show" = true;
"browser.uidensity" = 1;
};
userChrome = ''
#TabsToolbar {
visibility: collapse !important;
}
#nav-bar {
visibility: collapse !important;
}
#navigator-toolbox {
border-bottom: none !important;
}
'';
};
};
};
xdg.desktopEntries = {
whatsapp = {
name = "WhatsApp";
genericName = "Messenger";
exec = "app web.whatsapp.com";
terminal = false;
categories = [ "Application" ];
icon = pkgs.fetchurl {
url = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/2062095_application_chat_communication_logo_whatsapp_icon.svg/1024px-2062095_application_chat_communication_logo_whatsapp_icon.svg.png";
sha256 = "sha256-0eE3EEGnWFlpObfraTXMIqJz0Uya/h0hDsUA528qKCY=";
};
};
md = {
name = "Markdown";
genericName = "Documents";
exec = "md-app";
terminal = false;
categories = [ "Application" ];
icon = pkgs.fetchurl {
url = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Markdown-mark.svg/1024px-Markdown-mark.svg.png";
sha256 = "0v161jvmcfxp9lwd86y789430w1vpvxnnm5n2hzgr1kfh03psvb2";
};
};
};
gtk.enable = true;
gtk.theme = {
package = theme;
name = "Qogir-Dark";
};
# programs.gnome-shell.theme = {
# package = theme;
# name = "Qogir-Dark";
# };
# gtk.iconTheme = {
# package = pkgs.vimix-icon-theme;
# name = "vimix-doder-dark";
# };
home.pointerCursor = {
gtk.enable = true;
x11.enable = true;
name = "volantes_light_cursors";
size = 24;
package = pkgs.volantes-cursors;
};
# This value determines the Home Manager release that your configuration is
# compatible with. This helps avoid breakage when a new Home Manager release
# introduces backwards incompatible changes.
#
# You should not change this value, even if you update Home Manager. If you do
# want to update the value, then make sure to first check the Home Manager
# release notes.
home.stateVersion = "24.05"; # Please read the comment before changing.
# The home.packages option allows you to install Nix packages into your
# environment.
home.packages = with pkgs; [
nixos-icons
spotify-player
prismlauncher
pandoc
ghidra
gnome-firmware
fzf bat delta silver-searcher ripgrep perl universal-ctags
# bintools
htop
unzip
rr wrk
clang-tools bear
linuxPackages_latest.perf
texliveFull
emscripten
caddy
python3
qogir-icon-theme
volantes-cursors
xorg.xkill
lf nnn
feh
xarchiver
tig lazygit gitui
thunderbird
libreoffice
gimp
guvcview
arandr
vial
ncdu
gnumake gcc
linux-wifi-hotspot
esptool picocom
wireshark
nil
bc
ffmpeg
sc-im visidata
localsend
vis
wineWowPackages.unstableFull winetricks
# # It is sometimes useful to fine-tune packages, for example, by applying
# # overrides. You can do that directly here, just don't forget the
# # parentheses. Maybe you want to install Nerd Fonts with a limited number of
# # fonts?
# (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })
# # You can also create simple shell scripts directly inside your
# # configuration. For example, this adds a command 'my-hello' to your
# # environment:
# (pkgs.writeShellScriptBin "my-hello" ''
# echo "Hello, ${config.home.username}!"
# '')
# $@ - Liste aller Parameter
# $* - String aller Parameter
# $# - Anzahl aller Parameter
# &> - stdout und stderr pipen
# '' - Literal
# "" - Expanded
#
(pkgs.writeShellScriptBin "snrs" ''
sudo nixos-rebuild switch --flake /etc/nixos#default
'')
(pkgs.writeShellScriptBin "snrt" ''
sudo nixos-rebuild test --flake /etc/nixos#default
'')
(pkgs.writeShellScriptBin "snrb" ''
sudo nixos-rebuild boot --flake /etc/nixos#default
'')
(pkgs.writeShellScriptBin "senc" ''
sudo ${pkgs.helix}/bin/hx /etc/nixos/configuration.nix
'')
(pkgs.writeShellScriptBin "senh" ''
sudo ${pkgs.helix}/bin/hx /etc/nixos/home.nix
'')
(pkgs.writeShellScriptBin "app" ''
${pkgs.firefox}/bin/firefox -p appmode --new-window "$@"
'')
(pkgs.writeShellScriptBin "md" ''
file=$(mktemp --suffix=.html) && \
echo $file && \
${pkgs.pandoc}/bin/pandoc -o $file $1 -s -H ${markdownStyleHeader} && \
app $file && \
rm $file
'')
(pkgs.writeShellScriptBin "run" ''
(nohup "$@" &>/dev/null &); sleep 0
'')
(pkgs.writeShellScriptBin "popup" ''
${pkgs.kitty}/bin/kitty -o hide_window_decorations=yes -o background_opacity=0.5 \
--class kitty-popup -o remember_window_size=no \
-o initial_window_width=120c -o initial_window_height=40c \
"$@"
'')
(pkgs.writeShellScriptBin "fzfdir" ''
find "$1" -name "$2" | ${pkgs.fzf}/bin/fzf --layout=reverse
'')
(pkgs.writeShellScriptBin "md-app" ''
#popup bash -c 'file=$(fzfdir "md" "*.md") && run md $file'
firefox -p appmode --new-window localhost:8123/home/ps/sync/txt/hsrm
'')
(pkgs.writeShellScriptBin "run-popup" ''
popup bash -c 'file=$(compgen -c | grep -v fzf | sort -u | fzf --layout=reverse --print-query | tail -n 1) && run $file'
'')
(pkgs.writeShellScriptBin "set-wallpaper" ''
${pkgs.feh}/bin/feh --bg-fill --no-fehbg ${wallpaper}
'')
];
# Home Manager is pretty good at managing dotfiles. The primary way to manage
# plain files is through 'home.file'.
home.file = {
# # Building this configuration will create a copy of 'dotfiles/screenrc' in
# # the Nix store. Activating the configuration will then make '~/.screenrc' a
# # symlink to the Nix store copy.
# ".screenrc".source = dotfiles/screenrc;
# # You can also set the file content immediately.
# ".gradle/gradle.properties".text = ''
# org.gradle.console=verbose
# org.gradle.daemon.idletimeout=3600000
# '';
};
# Home Manager can also manage your environment variables through
# 'home.sessionVariables'. These will be explicitly sourced when using a
# shell provided by Home Manager. If you don't want to manage your shell
# through Home Manager then you have to manually source 'hm-session-vars.sh'
# located at either
#
# ~/.nix-profile/etc/profile.d/hm-session-vars.sh
#
# or
#
# ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
#
# or
#
# /etc/profiles/per-user/ps/etc/profile.d/hm-session-vars.sh
#
home.sessionVariables = {
# EDITOR = "emacs";
};
# Let Home Manager install and manage itself.
programs.home-manager.enable = true;
}