{ config, pkgs, lib, ... }:
let
cfg = config.audio;
in {
options.audio.enable = lib.mkEnableOption "Enable audio with pipewire";
config = lib.mkIf cfg.enable {
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
};
};
}
{ pkgs, lib, ... }: {
imports = [
./audio.nix
./wooting.nix
];
}
{ config, lib, pkgs, ... }:
let
cfg = config.wooting;
in {
options.wooting.enable = lib.mkEnableOption "Enable Wooting udev rules";
config = lib.mkIf cfg.enable {
services.udev.extraRules = ''
# Wooting One Legacy
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="ff01", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="ff01", TAG+="uaccess"
# Wooting One update mode
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2402", TAG+="uaccess"
# Wooting Two Legacy
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="ff02", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="ff02", TAG+="uaccess"
# Wooting Two update mode
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2403", TAG+="uaccess"
# Generic Wootings
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="31e3", TAG+="uaccess"
SUBSYSTEM=="usb", ATTRS{idVendor}=="31e3", TAG+="uaccess"
'';
environment.systemPackages = with pkgs; [
wootility
];
};
}
{ pkgs, lib, ... }: {
imports = [
./git.nix
./zsh.nix
./foot.nix
./sway.nix
./tmux.nix
./emacs.nix
./waybar.nix
./spicetify.nix
./neovim/default.nix
./nextcloud.nix
];
}
{ config, lib, pkgs, ... }:
let
cfg = config.neovim;
in {
options.neovim.enable = lib.mkEnableOption "Enable and setup neovim";
config = lib.mkIf cfg.enable {
xdg.configFile."nvim/lua".source = pkgs.lib.mkForce ./lua;
programs.neovim = {
enable = true;
vimAlias = true;
extraPackages = with pkgs; [
lua-language-server
];
plugins = with pkgs.vimPlugins; [
lazy-nvim
nvim-lspconfig
friendly-snippets
telescope-nvim
(nvim-treesitter.withPlugins (plugins: with plugins; [
tree-sitter-bash
tree-sitter-c
tree-sitter-json
tree-sitter-lua
tree-sitter-python
tree-sitter-nix
tree-sitter-vim
tree-sitter-vimdoc
tree-sitter-yaml
tree-sitter-markdown
tree-sitter-markdown_inline
]))
];
extraLuaConfig = ''
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"
require('options')
require('keymaps')
require('plugins')
require('autocmds')
'';
};
home.sessionVariables = rec {
EDITOR = "nvim";
GIT_EDITOR = EDITOR;
};
};
}
vim.cmd('highlight WinSeparator guibg=None ctermbg=None')
vim.cmd('highlight VertSplit guibg=NONE ctermbg=NONE')
-- hide background lsp coloum
vim.cmd('highlight SignColumn guibg=NONE ctermbg=None')
-- transparent background
vim.cmd('highlight Normal guibg=NONE ctermbg=NONE')
vim.cmd('highlight NormalNC guibg=NONE ctermbg=NONE')
local options = {
list = false,
backup = false, -- creates a backup file
clipboard = "unnamedplus", -- allows neovim to access the system clipboard
conceallevel = 2, -- so that `` is visible in markdown files
fileencoding = "utf-8", -- the encoding written to a file
hidden = true, -- required to keep multiple buffers and open multiple buffers
hlsearch = true, -- highlight all matches on previous search pattern
ignorecase = true, -- ignore case in search patterns
mouse = "a", -- allow the mouse to be used in neovim
laststatus = 3,
showmode = false, -- we don't need to see things like -- INSERT -- anymore
smartcase = true, -- smart case
smartindent = true, -- make indenting smarter again
splitbelow = true, -- force all horizontal splits to go below current window ↕️
splitright = true, -- force all vertical splits to go to the right of current window ↔️
swapfile = false, -- creates a swapfile
termguicolors = true, -- set term gui colors (most terminals support this)
timeoutlen = 100, -- time to wait for a mapped sequence to complete (in milliseconds)
undofile = true, -- enable persistent undo
updatetime = 300, -- faster completion (4000ms default) ⚡
writebackup = false, -- if a file is being edited by another program, it is not allowed to be edited
expandtab = true, -- use tabs instead of spaces ␣
pumheight = 10,
cmdheight = 2,
shiftwidth = 2, -- the number of spaces inserted for each indentation
tabstop = 2, -- insert 2 spaces for a tab ⇥
cursorline = false, -- highlight the current line (disabled for now)
number = false, -- set numbered lines
relativenumber = false, -- set relative numbered lines
numberwidth = 4, -- set number column width to 2 (default 4)
wrap = false, -- display lines as one long lines
}
vim.opt.shortmess:append 'c'
for k, v in pairs(options) do
vim.opt[k] = v
end
vim.wo.list = false
vim.cmd 'set whichwrap+=<,>,[,],h,l'
-- lazy load
vim.loader.enable()
require("lazy").setup({
{
"ellisonleao/gruvbox.nvim",
priority = 1000,
config = function ()
require("gruvbox").setup({})
vim.cmd("colorscheme gruvbox")
end
},
{
"hrsh7th/nvim-cmp",
dependencies = {
"neovim/nvim-lspconfig",
"hrsh7th/cmp-nvim-lsp",
"hrsh7th/cmp-buffer",
"hrsh7th/cmp-path",
"hrsh7th/cmp-cmdline",
"L3MON4D3/LuaSnip",
"onsails/lspkind-nvim"
},
config = function()
local signs = {
Error = " ",
Warn = " ",
Hint = " ",
Info = " ",
}
for type, icon in pairs(signs) do
local hl = "DiagnosticSign" .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl })
end
local capabilities = require("cmp_nvim_lsp").default_capabilities()
local on_attach = function(client, bufnr)
local opts = { noremap = true, silent = true, buffer = bufnr }
vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts)
vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, opts)
vim.keymap.set("n", "<leader>wa", vim.lsp.buf.add_workspace_folder, opts)
vim.keymap.set("n", "<leader>wr", vim.lsp.buf.remove_workspace_folder, opts)
vim.keymap.set("n", "<leader>wl", function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts)
vim.keymap.set("n", "<leader>D", vim.lsp.buf.type_definition, opts)
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts)
vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, opts)
vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
vim.keymap.set("n", "<leader>q", vim.diagnostic.setloclist, opts)
end
local lspconfig = require("lspconfig")
lspconfig.lua_ls.setup({
capabilities = capabilities,
on_attach = on_attach,
settings = {
Lua = {
diagnostics = {
globals = { "vim" },
},
workspace = {
library = vim.api.nvim_get_runtime_file("", true),
},
telemetry = {
enable = false,
},
},
},
})
local cmp = require("cmp")
local luasnip = require("luasnip")
local lspkind = require("lspkind")
require("luasnip.loaders.from_vscode").lazy_load()
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
["<C-d>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<C-Space>"] = cmp.mapping.complete(),
["<C-e>"] = cmp.mapping.close(),
["<CR>"] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Replace,
select = true,
}),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { "i", "s" }),
}),
formatting = {
format = lspkind.cmp_format({
mode = "symbol_text",
maxwidth = 50,
ellipsis_char = "..."
}),
},
sources = {
{ name = "nvim_lsp" },
{ name = "luasnip" },
{ name = "buffer" },
{ name = "path" },
},
})
cmp.setup.filetype('gitcommit', {
sources = cmp.config.sources({
{ name = 'buffer' },
})
})
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = 'path' }
}, {
{ name = 'cmdline' }
})
})
end,
},
{
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
event = "BufRead",
config = function()
require("nvim-treesitter.configs").setup({
auto_install = true,
ensure_installed = { "c", "lua", "vim", "python", "java", "javascript", "typescript", "css", "html" },
highlight = { enable = true, use_languagetree = true },
indent = { enable = true },
})
end,
},
{
"nvim-tree/nvim-tree.lua",
enabled = false,
config = function()
require("nvim-tree").setup({
view = { width = 20, side = "left" },
disable_netrw = true,
hijack_cursor = true,
update_cwd = true,
hijack_directories = { auto_open = true },
renderer = {
root_folder_label = false,
indent_markers = {
enable = true,
icons = { corner = "└ ", edge = "│ ", none = " " },
},
},
})
end,
},
{
"nvim-telescope/telescope.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
keys = {
{ "<C-s>", ":silent Telescope current_buffer_fuzzy_find<CR>", desc = "Open Telescope" },
},
config = function()
require("telescope").setup({
defaults = { mapping = {} },
pickers = {},
extensions = {},
})
end,
},
{
"lewis6991/gitsigns.nvim",
config = function()
require("gitsigns").setup()
end,
},
{
"echasnovski/mini.nvim",
version = false,
dependencies = { "nvim-tree/nvim-web-devicons" },
config = function()
require("mini.starter").setup({
header = table.concat({
" /l、 ",
"(゚、 。 7 ",
" l ~ ヽ ",
" じしf_,)ノ ",
}, "\n"),
footer = "",
content_hooks = {
require("mini.starter").gen_hook.adding_bullet("» "),
require("mini.starter").gen_hook.aligning("center", "center"),
},
})
end,
},
{
"windwp/nvim-autopairs",
event = "InsertEnter",
config = function()
require("nvim-autopairs").setup {}
end,
},
{
"tamton-aquib/staline.nvim",
dependencies = { "nvim-tree/nvim-web-devicons" },
config = function()
require("staline").setup {
sections = {
left = { 'file_name', 'branch' },
mid = { 'lsp' },
right = { 'line_column' },
},
special_table = {
NvimTree = { 'NvimTree', ' ' },
packer = { 'Packer', ' ' },
starter = { '', '' },
lazy = { '', '' },
mason = { '', '' },
},
lsp_symbols = {
Error = " ",
Info = " ",
Warn = " ",
Hint = "",
},
defaults = {
true_colors = true,
line_column = ' ☰ %l/%L %c',
branch_symbol = " ",
exclude_fts = { 'NvimTree' },
},
}
vim.cmd('highlight Statusline guibg=none')
vim.cmd('highlight StatuslineNC guibg=none')
end,
},
})
{ config, lib, pkgs, ... }:
let
cfg = config.foot;
in {
options.foot.enable = lib.mkEnableOption "Enable and configure the Foot terminal emulator";
config = lib.mkIf cfg.enable {
home.packages = with pkgs; [
ibm-plex
];
programs.foot = {
enable = true;
settings = {
main = {
pad = "10x10";
font = "IBM Plex Mono:size=10";
line-height = 12;
};
colors = {
background = "000000";
foreground = "f8f8f6";
regular0 = "232a2d";
regular1 = "e57474";
regular2 = "8ccf7e";
regular3 = "e5c76b";
regular4 = "67b0e8";
regular5 = "c47fd5";
regular6 = "6cbfbf";
regular7 = "b3b9b8";
bright0 = "2d3437";
bright1 = "ef7e7e";
bright2 = "96d988";
bright3 = "f4d67a";
bright4 = "71baf2";
bright5 = "ce89df";
bright6 = "67cbe7";
bright7 = "bdc3c2";
};
};
};
};
}
{ config, lib, pkgs, ... }:
let
cfg = config.tmux;
in {
options.tmux.enable = lib.mkEnableOption "Enable and configure Tmux";
config = lib.mkIf cfg.enable {
programs.tmux = {
enable = true;
settings = {
defaultTerminal = "xterm-256color";
prefix = "C-b";
historyLimit = 10000;
};
};
};
}
{ config, lib, pkgs, ... }:
let
cfg = config.Nextcloud;
in {
options.nextcloud.enable = lib.mkEnableOption "Enable nextcloud and setup";
config = lib.mkIf cfg.enable {
home.file.".netrc".text = ''default
login exmaple
password test123
'';
home.packages = pkgs.nextcloud-client;
systemd.user = {
services.nextcloud-autosync = {
Unit = {
Description = "Auto sync Nextcloud";
After = "network-online.target";
};
Service = {
Type = "simple";
ExecStart = "${pkgs.nextcloud-client}/bin/nextcloudcmd -h -n https://cloud.schererleander.de";
TimeoutStopSec = "180";
KillMode = "process";
KillSignal = "SIGINT";
};
Install.WantedBy = ["multi-user.target"];
};
timers.nextcloud-autosync = {
Unit.Description = "Automatic sync files with Nextcloud when booted up after 5 minutes then rerun every 60 minutes";
Timer.OnBootSec = "5min";
Timer.OnUnitActiveSec = "60min";
Install.WantedBy = ["multi-user.target" "timers.target"];
};
startServices = true;
};
};
}
{ config, lib, pkgs, ... }:
let
cfg = config.sway;
in {
options.sway.enable = lib.mkEnableOption "Enable sway and setup";
config = lib.mkIf cfg.enable {
home.packages = with pkgs; [
wmenu
swaybg
wl-clipboard
playerctl
];
xdg = {
portal = {
enable = true;
extraPortals = with pkgs; [
xdg-desktop-portal-wlr
xdg-desktop-portal-gtk
];
};
};
wayland.windowManager.sway = {
enable = true;
config = {
input = {
"*" = {
xkb_layout = "de";
};
};
output = {
DP-1 = {
resolution = "1920x1080@240Hz";
bg = "/etc/nixos/jaison-lin-2WHTac8jVA8-unsplash.jpg fill";
};
};
gaps = {
inner = 15;
};
window = {
titlebar = false;
border = 0;
};
keybindings = let
mod = "Mod4";
in
lib.mkOptionDefault {
"${mod}+Return" = "exec ${pkgs.foot}/bin/foot";
"${mod}+q" = "kill";
"${mod}+d" = "exec exec ${pkgs.wmenu}/bin/wmenu-run -b -N 000000";
"${mod}+Shift+e" = "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit'";
"${mod}+Tab" = "workspace back_and_forth";
"${mod}+1" = "workspace number 1";
"${mod}+2" = "workspace number 2";
"${mod}+3" = "workspace number 3";
"${mod}+4" = "workspace number 4";
"${mod}+5" = "workspace number 5";
"${mod}+6" = "workspace number 6";
"${mod}+7" = "workspace number 7";
"${mod}+8" = "workspace number 8";
"${mod}+9" = "workspace number 9";
"${mod}+0" = "workspace number 10";
"${mod}+Shift+1" = "move container to workspace number 1";
"${mod}+Shift+2" = "move container to workspace number 2";
"${mod}+Shift+3" = "move container to workspace number 3";
"${mod}+Shift+4" = "move container to workspace number 4";
"${mod}+Shift+5" = "move container to workspace number 5";
"${mod}+Shift+6" = "move container to workspace number 6";
"${mod}+Shift+7" = "move container to workspace number 7";
"${mod}+Shift+8" = "move container to workspace number 8";
"${mod}+Shift+9" = "move container to workspace number 9";
"${mod}+Shift+0" = "move container to workspace number 10";
"${mod}+b" = "splith";
"${mod}+v" = "splitv";
"${mod}+f" = "fullscreen";
"${mod}+Shift+space" = "floating toggle";
"XF86AudioPlay" = "exec playerctl play-pause";
"XF86AudioPrev" = "exec playerctl previous";
"XF86AudioNext" = "exec playerctl next";
"XF86AudioRaiseVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_DEVICE@ +5%";
"XF86AudioLowerVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_DEVICE@ -5%";
"XF86AudioMute" = "exec wpctl set-mute @DEFAULT_AUDIO_DEVICE@ toggle";
};
defaultWorkspace = "workspace number 1";
bars = [{
"command" = "${pkgs.waybar}/bin/waybar";
}];
};
checkConfig = false;
wrapperFeatures.base = true;
wrapperFeatures.gtk = true;
};
home.sessionVariables = {
XDG_CURRENT_DESKTOP = "wayland";
};
};
}
{ config, lib, pkgs, ... }:
let
cfg = config.waybar;
in {
options.waybar.enable = lib.mkEnableOption "Enable and configure Waybar";
config = lib.mkIf cfg.enable {
programs.waybar = {
enable = true;
settings = {
mainBar = {
height = 20;
layer = "top";
position = "bottom";
tray = { spacing = 10; };
modules-center = [ "sway/window" ];
modules-left = [ "sway/workspaces" "sway/mode" ];
modules-right = [
"pulseaudio"
"clock"
"tray"
];
clock = {
format-alt = "{:%Y-%m-%d}";
tooltip-format = "{:%Y-%m-%d | %H:%M}";
};
pulseaudio = {
format = "{volume}% {icon} {format_source}";
format-bluetooth = "{volume}% {icon} {format_source}";
format-bluetooth-muted = " {icon} {format_source}";
format-icons = {
car = "";
default = [ "" "" "" ];
handsfree = "";
headphones = "";
headset = "";
phone = "";
portable = "";
};
format-muted = " {format_source}";
format-source = "{volume}% ";
format-source-muted = "";
on-click = "pavucontrol";
};
};
};
style = ''
* {
border: none;
border-radius: 0;
font-family: monospace;
font-size: 12px;
}
window#waybar {
background: #000000;
}
#workspaces button {
padding-left: 5px;
padding-right: 5px;
}
#clock, #pulseaudio, #tray {
padding-left: 5px;
padding-right: 5px;
}
'';
};
};
}
{ config, lib, pkgs, inputs, ... }:
let
cfg = config.spicetify;
spicePkgs = inputs.spicetify-nix.packages.${pkgs.system}.default;
in {
options.spicetify.enable = lib.mkEnableOption "Enable and configure Spicetify";
config = lib.mkIf cfg.enable {
programs.spicetify = {
enable = true;
enabledSnippets = with spicePkgs.snippets; [
pointer
sonicDancing
modernScrollbar
nyanCatProgressBar
declutterNowPlayingBar
];
theme = spicePkgs.themes.sleek;
colorScheme = "coral";
};
};
}
{ config, lib, pkgs, ... }:
let
cfg = config.zsh;
in {
options.zsh.enable = lib.mkEnableOption "Enable zsh and configure";
config = lib.mkIf cfg.enable {
programs.zsh = {
enable = true;
autosuggestion.enable = true;
historySubstringSearch.enable = true;
plugins = [
{
name = "pure";
src = "${pkgs.pure-prompt}/share/zsh/site-functions";
}
{
name = "zsh-completions";
src = "${pkgs.zsh-completions}/share/zsh/site-functions";
}
{
name = "fast-syntax-highlighting";
src = "${pkgs.zsh-fast-syntax-highlighting}/share/zsh/site-functions";
}
];
};
};
}
{ config, lib, pkgs, ... }:
let
cfg = config.git;
in {
options.git.enable = lib.mkEnableOption "Enable and configure Git";
config = lib.mkIf cfg.enable {
programs.git = {
enable = true;
userName = "Your Name";
userEmail = "youremail@example.com";
extraConfig = ''
[alias]
co = checkout
br = branch
st = status
'';
};
};
}
{ config, lib, pkgs, inputs, ... }:
let
cfg = config.nixcord;
in {
options.nixcord.enable = lib.mkEnableOption "Enable nixord and setup";
config = lib.mkIf cfg.enable {
programs.nixcord = {
enable = true;
config = {
themeLinks = [
"https://github.com/TheCommieAxolotl/BetterDiscord-Stuff/blob/main/Ultra/Ultra.theme.css"
];
frameless = true;
plugins = {
alwaysAnimate.enable = true;
clearURLs.enable = true;
};
};
};
};
}
{ config, lib, pkgs, ... }:
let
cfg = config.emacs;
in {
options.emacs.enable = lib.mkEnableOption "Enable emacs and setup";
config = lib.mkIf cfg.enable {
programs.emacs = {
enable = true;
package = pkgs.emacs;
};
};
}
|