diff --git a/home-manager/dunst/default.nix b/home-manager/dunst/default.nix
new file mode 100644
index 0000000..60dd0ed
--- /dev/null
+++ b/home-manager/dunst/default.nix
@@ -0,0 +1,25 @@
+{
+ home-manager.sharedModules = [{
+ services.dunst = {
+ enable = true;
+ settings = {
+ global = {
+ geometry = "1870x5-25+45";
+ width = 350;
+ separator_height = 5;
+ padding = 24;
+ horizontal_padding = 24;
+ frame_width = 3;
+ idle_threshold = 120;
+ alignment = "center";
+ word_wrap = "yes";
+ transparency = 5;
+ format = "%s: %b";
+ markup = "full";
+ min_icon_size = 128;
+ max_icon_size = 128;
+ };
+ };
+ };
+ }];
+}
diff --git a/home-manager/editorconfig/default.nix b/home-manager/editorconfig/default.nix
new file mode 100644
index 0000000..37d29e3
--- /dev/null
+++ b/home-manager/editorconfig/default.nix
@@ -0,0 +1,30 @@
+{
+ home-manager.sharedModules = [{
+ editorconfig = {
+ enable = true;
+ settings = {
+ "*" = {
+ charset = "utf-8";
+ end_of_line = "lf";
+ insert_final_newline = true;
+ indent_size = 2;
+ indent_style = "space";
+ trim_trailing_whitespace = true;
+ };
+ "*.md" = { indent_style = "tab"; };
+ "Makefile" = {
+ indent_style = "tab";
+ indent_size = 4;
+ };
+ "*.html" = {
+ indent_style = "tab";
+ indent_size = 4;
+ };
+ "*.go" = {
+ indent_style = "tab";
+ indent_size = 4;
+ };
+ };
+ };
+ }];
+}
diff --git a/home-manager/feh/default.nix b/home-manager/feh/default.nix
new file mode 100644
index 0000000..733638e
--- /dev/null
+++ b/home-manager/feh/default.nix
@@ -0,0 +1,75 @@
+{
+ home-manager.sharedModules = [{
+ programs.feh = {
+ enable = true;
+ keybindings = {
+ toggle_actions = null;
+ toggle_aliasing = null;
+ toggle_caption = null;
+ toggle_filenames = "d";
+ toggle_exif = null;
+ save_filelist = null;
+ toggle_fixed_geometry = "g";
+ toggle_pause = "h";
+ toggle_info = null;
+ toggle_keep_vp = null;
+ toggle_menu = null;
+ next_img = [ "k" "Right" ];
+ toggle_pointer = "a";
+ prev_img = [ "j" "Left" ];
+ quit = "q";
+ reload_image = null;
+ save_image = null;
+ toggle_fullscreen = "f";
+ size_to_image = "w";
+ close = null;
+ jump_random = "z";
+ prev_dir = null;
+ next_dir = null;
+ orient_3 = null;
+ orient_1 = null;
+ flip = null;
+ mirror = null;
+ action_0 = null;
+ action_1 = null;
+ action_2 = null;
+ action_3 = null;
+ action_4 = null;
+ action_5 = null;
+ action_6 = null;
+ action_7 = null;
+ action_8 = null;
+ action_9 = null;
+ jump_first = "J";
+ jump_last = "K";
+ jump_fwd = "H";
+ jump_back = "L";
+ reload_plus = null;
+ reload_minus = null;
+ remove = null;
+ delete = null;
+ scroll_left = "b";
+ scroll_right = "n";
+ scroll_up = [ "u" "Up" ];
+ scroll_down = [ "d" "Down" ];
+ scroll_left_page = null;
+ scroll_right_page = null;
+ scroll_up_page = null;
+ scroll_down_page = null;
+ render = null;
+ zoom_in = "h";
+ zoom_out = "l";
+ zoom_default = "o";
+ zoom_fit = null;
+ zoom_fill = "p";
+ menu_close = null;
+ menu_up = null;
+ menu_down = null;
+ menu_parent = null;
+ menu_child = null;
+ menu_select = null;
+ toggle_auto_zoom = "m";
+ };
+ };
+ }];
+}
diff --git a/home-manager/git/default.nix b/home-manager/git/default.nix
new file mode 100644
index 0000000..99ca833
--- /dev/null
+++ b/home-manager/git/default.nix
@@ -0,0 +1,43 @@
+{
+ home-manager.sharedModules = [{
+ programs.git = {
+ enable = true;
+ extraConfig = {
+ include = { path = "~/.gituser"; };
+ commit = { gpgsign = true; };
+ core = {
+ editor = "nvim";
+ autocrlf = false;
+ quotePath = false;
+ };
+ web = { browser = "librewolf"; };
+ push = { default = "simple"; };
+ branch = { autosetuprebase = "always"; };
+ init = { defaultBranch = "master"; };
+ rerere = { enabled = true; };
+ color = { ui = true; };
+ alias = {
+ contrib = "shortlog -n -s";
+ remotes = "remote -v";
+ praise = "blame";
+ verify = "log --show-signature";
+ };
+ "color \"diff-highlight\"" = {
+ oldNormal = "red bold";
+ oldHighlight = "red bold";
+ newNormal = "green bold";
+ newHighlight = "green bold";
+ };
+ "color \"diff\"" = {
+ meta = "yellow";
+ frag = "magenta bold";
+ commit = "yellow bold";
+ old = "red bold";
+ new = "green bold";
+ whitespace = "red reverse";
+ };
+ };
+ diff-so-fancy = { enable = true; };
+ };
+ }];
+}
diff --git a/home-manager/gtk/default.nix b/home-manager/gtk/default.nix
new file mode 100644
index 0000000..e84772d
--- /dev/null
+++ b/home-manager/gtk/default.nix
@@ -0,0 +1,25 @@
+{ pkgs, ... }:
+
+{
+ home-manager.sharedModules = [{
+ gtk = {
+ enable = true;
+ cursorTheme = {
+ package = pkgs.phinger-cursors;
+ name = "phinger-cursors";
+ };
+ gtk3.extraConfig = {
+ gtk-decoration-layout = "menu:";
+ gtk-xft-antialias = 1;
+ gtk-xft-hinting = 1;
+ gtk-xft-hintstyle = "hintfull";
+ gtk-xft-rgba = "rgb";
+ gtk-recent-files-enabled = false;
+ };
+ iconTheme = {
+ package = pkgs.fluent-icon-theme;
+ name = "Fluent-dark";
+ };
+ };
+ }];
+}
diff --git a/home-manager/kitty/default.nix b/home-manager/kitty/default.nix
new file mode 100644
index 0000000..31cc0de
--- /dev/null
+++ b/home-manager/kitty/default.nix
@@ -0,0 +1,26 @@
+{
+ home-manager.sharedModules = [{
+ programs.kitty = {
+ enable = true;
+ settings = {
+ enable_audio_bell = false;
+ allow_remote_control = true;
+ dynamic_background_opacity = true;
+ background_opacity = "0.95";
+ close_on_child_death = true;
+ cursor_blink_interval = 0;
+ wayland_titlebar_color = "background";
+ listen_on = "unix:/tmp/kitty";
+ open_url_with = "librewolf";
+ window_padding_width = 5;
+ tab_bar_margin_width = 5;
+ };
+ };
+ xdg.configFile."kitty/diff.conf".text = ''
+ map d scroll_to next-page
+ map u scroll_to prev-page
+ map g scroll_to start
+ map G scroll_to end
+ '';
+ }];
+}
diff --git a/home-manager/mpv/default.nix b/home-manager/mpv/default.nix
new file mode 100644
index 0000000..09ef02b
--- /dev/null
+++ b/home-manager/mpv/default.nix
@@ -0,0 +1,34 @@
+{ pkgs, ... }:
+
+{
+ home-manager.sharedModules = [{
+ programs.mpv = {
+ enable = true;
+ config = {
+ screenshot-format = "png";
+ profile = "gpu-hq";
+ scale = "ewa_lanczossharp";
+ cscale = "ewa_lanczossharp";
+ video-sync = "display-resample";
+ interpolation = true;
+ tscale = "oversample";
+ sub-auto = "fuzzy";
+ sub-font = "Noto Sans CJK JP Medium";
+ sub-blur = 10;
+ sub-file-paths = "subs:subtitles:字幕";
+ fullscreen = "yes";
+ title = "\${filename} - mpv";
+ script-opts =
+ "osc-title=\${filename},osc-boxalpha=150,osc-showfullscreen=no,osc-boxvideo=yes";
+ osc = "no";
+ osd-on-seek = "no";
+ osd-bar = "no";
+ osd-bar-w = 30;
+ osd-bar-h = "0.2";
+ osd-duration = 750;
+ really-quiet = "yes";
+ };
+ scripts = [ pkgs.mpvScripts.thumbnail ];
+ };
+ }];
+}
diff --git a/home-manager/ncmpcpp/default.nix b/home-manager/ncmpcpp/default.nix
new file mode 100644
index 0000000..80ee721
--- /dev/null
+++ b/home-manager/ncmpcpp/default.nix
@@ -0,0 +1,46 @@
+{
+ home-manager.sharedModules = [{
+ programs.ncmpcpp = {
+ enable = true;
+ bindings = [
+ { key = "mouse"; command = "dummy"; }
+ { key = "h"; command = ["previous_column" "jump_to_parent_directory"]; }
+ { key = "j"; command = "scroll_down"; }
+ { key = "k"; command = "scroll_up"; }
+ { key = "l"; command = [ "next_column" "enter_directory" "play_item"]; }
+ { key = "H"; command = [ "select_item" "scroll_down"]; }
+ { key = "J"; command = ["move_sort_order_down" "move_selected_items_down"]; }
+ { key = "K"; command = ["move_sort_order_up" "move_selected_items_up"]; }
+ { key = "L"; command = [ "select_item" "scroll_up"]; }
+ { key = "'"; command = "remove_selection"; }
+ { key = "ctrl-u"; command = "page_up"; }
+ { key = "ctrl-d"; command = "page_down"; }
+ { key = "u"; command = "page_up"; }
+ { key = "d"; command = "page_down"; }
+ { key = "n"; command = "next_found_item"; }
+ { key = "N"; command = "previous_found_item"; }
+ { key = "t"; command = "next_screen"; }
+ { key = "g"; command = "move_home"; }
+ { key = "G"; command = "move_end"; }
+ { key = "w"; command = "next"; }
+ { key = "b"; command = "previous"; }
+ { key = ";"; command = "seek_forward"; }
+ { key = ","; command = "seek_backward"; }
+ { key = "f"; command = "apply_filter"; }
+ { key = "i"; command = "select_item"; }
+ { key = "x"; command = [ "delete_playlist_items" "delete_browser_items" "delete_stored_playlist" ]; }
+ { key = "U"; command = "update_database"; }
+ { key = "m"; command = "add_random_items"; }
+ ];
+ settings = {
+ ncmpcpp_directory = "~/.config/ncmpcpp";
+ user_interface = "alternative";
+ autocenter_mode = "yes";
+ allow_for_physical_item_deletion = "no";
+ mouse_support = "no";
+ execute_on_song_change = "~/.config/mpd/mpdnotify";
+ mpd_crossfade_time = 3;
+ };
+ };
+ }];
+}
diff --git a/home-manager/qutebrowser/default.nix b/home-manager/qutebrowser/default.nix
new file mode 100644
index 0000000..ad1b5bc
--- /dev/null
+++ b/home-manager/qutebrowser/default.nix
@@ -0,0 +1,168 @@
+{ pkgs, ... }:
+
+{
+ home-manager.sharedModules = [{
+ programs.qutebrowser = {
+ enable = true;
+ package = pkgs.qutebrowser-qt6;
+ extraConfig = ''
+ # Mute tabs by default
+ from qutebrowser.mainwindow import tabwidget
+ tabwidget.TabWidget.MUTE_STRING = ""
+ tabwidget.TabWidget.AUDIBLE_STRING = "[A]"
+
+ # Don't close while browsing / downloading
+ c.confirm_quit = ['multiple-tabs', 'downloads']
+
+ # Restore previous tabs
+ c.session.lazy_restore = True
+
+ # Use ranger as the file selector
+ c.fileselect.handler = 'external'
+ c.fileselect.folder.command = ['kitty', '-e', 'ranger', '--choosedir={}']
+ c.fileselect.multiple_files.command = ['kitty', '-e', 'ranger', '--choosefiles={}']
+ c.fileselect.single_file.command = ['kitty', '-e', 'ranger', '--choosefile={}']
+
+ # Better context menu colors
+ c.colors.contextmenu.disabled.fg = '#808080'
+ c.colors.contextmenu.menu.bg = '#353535'
+ c.colors.contextmenu.menu.fg = '#ffffff'
+ c.colors.contextmenu.selected.bg = '#909090'
+
+ # Use spellcheck
+ c.spellcheck.languages = ["en-US"]
+
+ # Chromium flags
+ c.qt.args = ["disable-backing-store-limit", "enable-accelerated-video-decode", "disable-gpu-driver-bug-workarounds"]
+ c.qt.chromium.low_end_device_mode = 'never'
+
+ # Make new tab position more sane
+ c.tabs.new_position.unrelated = 'next'
+
+ # Download settings
+ c.downloads.location.directory = "$HOME/Downloads"
+ c.downloads.location.prompt = False
+ c.downloads.position = "bottom"
+ c.downloads.remove_finished = 5000
+
+ # Only show tabs when multiple are open
+ c.tabs.show = "multiple"
+
+ # Don't switch tabs with mouse
+ c.tabs.mousewheel_switching = False
+
+ # Edit text with neovim
+ c.editor.command = ['kitty', '-e', 'nvim', '{}']
+
+ # Use J/K for prev/next
+ config.bind('J', 'tab-prev')
+ config.bind('K', 'tab-next')
+
+ # Use F12 for devtools
+ config.bind('', 'devtools')
+
+ # Use zb to delete bookmarks
+ config.bind('zb', 'bookmark-del')
+
+ # Increase the default scroll offset of j/k
+ # NOTE: Unfortunately this breaks websites that use their own keybinds for j/k/etc
+ # config.bind('j', 'run-with-count 5 scroll down')
+ # config.bind('k', 'run-with-count 5 scroll up')
+
+ # NOTE: Use with smooth smooth scrolling enabled to scroll smoothly
+ # config.bind('d', 'run-with-count 12 scroll down')
+ # config.bind('u', 'run-with-count 12 scroll up')
+
+ # Use d/u to scroll down/up
+ config.bind('d', 'scroll-page 0 0.5')
+ config.bind('u', 'scroll-page 0 -0.5')
+ config.bind('D', 'scroll-page 0 0.5')
+ config.bind('U', 'scroll-page 0 -0.5')
+
+ # Use alt+left/right to go back/forward
+ config.bind('', 'back')
+ config.bind('', 'forward')
+
+ # Use x to close tabs and X to undo
+ config.bind('x', 'tab-close')
+ config.bind('X', 'undo')
+
+ # Toggle tab visibility for more screen space
+ config.bind('st', 'config-cycle tabs.show multiple switching')
+
+ # Easily change the position of tabs
+ config.bind('sTh', 'set tabs.position left')
+ config.bind('sTj', 'set tabs.position bottom')
+ config.bind('sTk', 'set tabs.position top')
+ config.bind('sTl', 'set tabs.position right')
+
+ # Don't paste something by accident
+ config.unbind('pp', mode='normal')
+ config.unbind('pP', mode='normal')
+ config.unbind('Pp', mode='normal')
+ config.unbind('PP', mode='normal')
+ config.unbind('wp', mode='normal')
+ config.unbind('wP', mode='normal')
+
+ # Easily enter account information
+ # NOTE: I re-evaluated pass when I was focusing on a terminal-centric workflow.
+ config.bind('zl', 'spawn --userscript qute-pass')
+ config.bind('zpl', 'spawn --userscript qute-pass --password-only')
+ config.bind('zol', 'spawn --userscript qute-pass --otp-only')
+
+ # Support previous/next tab with traditional keybinds
+ config.bind('', 'tab-prev')
+ config.bind('', 'tab-next')
+
+ # Hide the status bar except under exceptional circumstances
+ # NOTE: This broke more things than not, which is why I ultimately decided
+ # to always use the status bar. More information can be found in the
+ # following discussion: https://github.com/qutebrowser/qutebrowser/issues/2236
+ # config.bind('o', 'set statusbar.show always;; set-cmd-text -s :open')
+ # config.bind('O', 'set statusbar.show always;; set-cmd-text -s :open -t')
+ # config.bind('T', 'set statusbar.show always;; set-cmd-text -sr :tab-focus')
+ # config.bind(':', 'set statusbar.show always;; set-cmd-text :')
+ # config.bind('/', 'set statusbar.show always;; set-cmd-text /')
+ # config.bind('', 'mode-enter normal;; set statusbar.show in-mode', mode='command')
+ # config.bind('', 'command-accept;; set statusbar.show in-mode', mode='command')
+
+ # Easily start a new temporary container
+ config.bind(';s', 'hint links spawn ~/.local/bin/tmp {hint-url}')
+
+ # Open the current tab / selected link in mpv
+ config.bind('zM', 'spawn mpv --force-window=immediate {url}')
+ config.bind('zm', 'hint links spawn mpv --force-window=immediate {hint-url}')
+
+ # Automatically mute tabs
+ c.content.mute = True
+
+ # Use proxy websites for popular services
+ config.bind('zu', 'hint links spawn -u untrack-url -O {hint-url}')
+
+ # Enable expected permissions to avoid websites asking every time
+ c.content.persistent_storage = True
+ c.content.notifications.enabled = True
+ c.content.register_protocol_handler = True
+
+ # Hide the window title bar on GNOME
+ # NOTE: This is no longer necessary since GNOME has an extension called
+ # pixel-saver that # automatically handles this for us, and without
+ # the downsides of not having a window bar.
+ # c.window.hide_decoration = True
+
+ # Close qutebrowser when there are no tabs left
+ c.tabs.last_close = "close"
+
+ # Don't automatically enter/leave insert mode
+ # NOTE: This was originally done to prevent insert mode from prematurely exiting
+ # in certain # cases (such as mouse usage), although keeping auto functionality
+ # seems to be more useful # long-term.
+ c.input.insert_mode.auto_enter = False
+ c.input.insert_mode.auto_leave = False
+
+ # Prioritize Japanese content (en-US is necessary to avoid breaking things)
+ c.content.headers.accept_language = 'ja-JP,en-US'
+ '';
+ };
+ }];
+}
diff --git a/home-manager/ranger/default.nix b/home-manager/ranger/default.nix
new file mode 100644
index 0000000..f5c9a8a
--- /dev/null
+++ b/home-manager/ranger/default.nix
@@ -0,0 +1,24 @@
+{
+ home-manager.sharedModules = [{
+ xdg.configFile."ranger/rc.conf".text = ''
+ set line_numbers absolute
+ set padding_right false
+ set vcs_aware true
+ set show_hidden true
+ set confirm_on_delete always
+ set save_console_history false
+ set mouse_enabled false
+ set tilde_in_titlebar true
+
+ alias r rename
+ alias d delete
+
+ map DD shell trash %s
+
+ set use_preview_script true
+ set preview_files true
+ set preview_images true
+ set preview_images_method kitty
+ '';
+ }];
+}
diff --git a/home-manager/swaylock/default.nix b/home-manager/swaylock/default.nix
new file mode 100644
index 0000000..6705d5c
--- /dev/null
+++ b/home-manager/swaylock/default.nix
@@ -0,0 +1,19 @@
+{
+ home-manager.sharedModules = [{
+ programs.swaylock = {
+ package = pkgs."swaylock-effects";
+ settings = {
+ show-keyboard-layout = true;
+ daemonize = true;
+ effect-blur = "5x2";
+ clock = true;
+ indicator = true;
+ font-size = 25;
+ indicator-radius = 85;
+ indicator-thickness = 16;
+ screenshots = true;
+ fade-in = 1;
+ };
+ };
+ }];
+}
diff --git a/home-manager/thunar/default.nix b/home-manager/thunar/default.nix
new file mode 100644
index 0000000..00161e0
--- /dev/null
+++ b/home-manager/thunar/default.nix
@@ -0,0 +1,8 @@
+{
+ home-manager.sharedModules = [{
+ xdg.configFile."xfce4/helpers.rc".text = ''
+ TerminalEmulator=kitty
+ TerminalEmulatorDismissed=true
+ '';
+ }];
+}
diff --git a/home-manager/tig/default.nix b/home-manager/tig/default.nix
new file mode 100644
index 0000000..cb72387
--- /dev/null
+++ b/home-manager/tig/default.nix
@@ -0,0 +1,9 @@
+{
+ home-manager.sharedModules = [{
+ xdg.configFile."tig/config".text = ''
+ color cursor black green bold
+ color title-focus black blue bold
+ color title-blur black blue bold
+ '';
+ }];
+}
diff --git a/home-manager/waybar/default.nix b/home-manager/waybar/default.nix
new file mode 100644
index 0000000..1c0c4a4
--- /dev/null
+++ b/home-manager/waybar/default.nix
@@ -0,0 +1,137 @@
+{ lib, ... }:
+
+{
+ home-manager.sharedModules = [{
+ programs.waybar = {
+ enable = true;
+ systemd.enable = true;
+ package = hyprland.packages."x86_64-linux".waybar-hyprland;
+ settings = {
+ mainBar = {
+ layer = "top";
+ position = "left";
+ width = 45;
+ spacing = 8;
+ modules-left = [ "wlr/workspaces" "custom/new-workspace" ];
+ modules-center = [ "hyprland/window" ];
+ modules-right =
+ [ "tray" "wireplumber" "backlight" "battery" "clock" ];
+ "tray" = {
+ "icon-size" = 24;
+ spacing = 8;
+ };
+ "hyprland/window" = {
+ "rotate" = 90;
+ };
+ "wlr/workspaces" = {
+ on-click = "activate";
+ sort-by-number = true;
+ format = "{icon}";
+ format-icons = {
+ "1" = "一";
+ "2" = "二";
+ "3" = "三";
+ "4" = "四";
+ "5" = "五";
+ "6" = "六";
+ "7" = "七";
+ "8" = "八";
+ "9" = "九";
+ "10" = "十";
+ };
+ };
+ wireplumber = {
+ format = "{icon}";
+ tooltip-format = "{volume}% {node_name}";
+ format-muted = "";
+ format-icons = ["" ""];
+ };
+ battery = {
+ "format" = "{icon}";
+ "tooltip-format" = "{capacity}% {timeTo}";
+ "format-icons" = ["" "" "" "" ""];
+ };
+ clock = {
+ "format" = "{:%H\n%M}";
+ "tooltip-format" = "{calendar}";
+ };
+ backlight = {
+ "format" = "{icon}";
+ "format-icons" = ["" ""];
+ };
+ "custom/new-workspace" = {
+ "format" = "+";
+ "on-click" = "hyprctl dispatch workspace empty && rofi -show drun";
+ "tooltip" = false;
+ };
+ };
+ };
+ style = lib.mkForce ''
+ @define-color base00 #272822;
+ @define-color base01 #383830;
+ @define-color base02 #49483e;
+ @define-color base03 #75715e;
+ @define-color base04 #a59f85;
+ @define-color base05 #f8f8f2;
+ @define-color base06 #f5f4f1;
+ @define-color base07 #f9f8f5;
+ @define-color base08 #f92672;
+ @define-color base09 #fd971f;
+ @define-color base0A #f4bf75;
+ @define-color base0B #a6e22e;
+ @define-color base0C #a1efe4;
+ @define-color base0D #66d9ef;
+ @define-color base0E #ae81ff;
+ @define-color base0F #cc6633;
+
+ * {
+ color: @base05;
+ font-size: 16px;
+ }
+
+ window#waybar {
+ background: alpha(@base00, 0.95);
+ border-right: 1px solid alpha(@base02, 0.67);
+ }
+
+ #workspaces button {
+ padding: 12px 0;
+ border-radius: 0;
+ }
+
+ #workspaces button.active {
+ background: alpha(@base02, 0.67);
+ }
+
+ #window {
+ padding-top: 8px;
+ padding-bottom: 12px;
+ }
+
+ tooltip, #tray menu {
+ background: @base00;
+ border: 1px solid alpha(@base09, 0.93);
+ padding: 8px;
+ }
+
+ #backlight, #battery, #wireplumber {
+ font-family: "Font Awesome 6 Free Solid";
+ font-size: 24px;
+ }
+
+ #custom-new-workspace {
+ font-family: "Font Awesome 6 Free Solid";
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: alpha(@base0A, 0.67);
+ }
+
+ #clock {
+ font-size: 18px;
+ font-weight: bold;
+ padding-bottom: 8px;
+ }
+ '';
+ };
+ }];
+}
diff --git a/home-manager/zathura/default.nix b/home-manager/zathura/default.nix
new file mode 100644
index 0000000..922242b
--- /dev/null
+++ b/home-manager/zathura/default.nix
@@ -0,0 +1,14 @@
+{
+ home-manager.sharedModules = [{
+ programs.zathura = {
+ enable = true;
+ options = {
+ guioptions = "v";
+ adjust-open = "width";
+ statusbar-basename = true;
+ render-loading = false;
+ scroll-step = 120;
+ };
+ };
+ }];
+}
diff --git a/home.nix b/home.nix
index 3fa5fe3..454f092 100644
--- a/home.nix
+++ b/home.nix
@@ -206,10 +206,6 @@
"Xft.hintstyle" = "hintfull";
"Xft.rgba" = "rgb";
};
- xdg.configFile."xfce4/helpers.rc".text = ''
- TerminalEmulator=kitty
- TerminalEmulatorDismissed=true
- '';
xdg.configFile."mozc/ibus_config.textproto".force = true;
xdg.configFile."mozc/ibus_config.textproto".text = ''
engines {
@@ -222,26 +218,6 @@
}
active_on_launch: True
'';
- xdg.configFile."ranger/rc.conf".text = ''
- set line_numbers absolute
- set padding_right false
- set vcs_aware true
- set show_hidden true
- set confirm_on_delete always
- set save_console_history false
- set mouse_enabled false
- set tilde_in_titlebar true
-
- alias r rename
- alias d delete
-
- map DD shell trash %s
-
- set use_preview_script true
- set preview_files true
- set preview_images true
- set preview_images_method kitty
- '';
xdg.configFile."fish/config.fish".text = ''
set -U fish_greeting ""
@@ -299,344 +275,13 @@
# end
# end
'';
- gtk = {
- enable = true;
- cursorTheme = {
- package = pkgs.phinger-cursors;
- name = "phinger-cursors";
- };
- gtk3.extraConfig = {
- gtk-decoration-layout = "menu:";
- gtk-xft-antialias = 1;
- gtk-xft-hinting = 1;
- gtk-xft-hintstyle = "hintfull";
- gtk-xft-rgba = "rgb";
- gtk-recent-files-enabled = false;
- };
- iconTheme = {
- package = pkgs.fluent-icon-theme;
- name = "Fluent-dark";
- };
- };
- programs.kitty = {
- enable = true;
- settings = {
- enable_audio_bell = false;
- allow_remote_control = true;
- dynamic_background_opacity = true;
- background_opacity = "0.95";
- close_on_child_death = true;
- cursor_blink_interval = 0;
- wayland_titlebar_color = "background";
- listen_on = "unix:/tmp/kitty";
- open_url_with = "librewolf";
- window_padding_width = 5;
- tab_bar_margin_width = 5;
- };
- };
- xdg.configFile."kitty/diff.conf".text = ''
- map d scroll_to next-page
- map u scroll_to prev-page
- map g scroll_to start
- map G scroll_to end
- '';
programs.bat = { enable = true; };
- programs.swaylock = {
- package = pkgs."swaylock-effects";
- settings = {
- show-keyboard-layout = true;
- daemonize = true;
- effect-blur = "5x2";
- clock = true;
- indicator = true;
- font-size = 25;
- indicator-radius = 85;
- indicator-thickness = 16;
- screenshots = true;
- fade-in = 1;
- };
- };
- services.dunst = {
- enable = true;
- settings = {
- global = {
- geometry = "1870x5-25+45";
- width = 350;
- separator_height = 5;
- padding = 24;
- horizontal_padding = 24;
- frame_width = 3;
- idle_threshold = 120;
- alignment = "center";
- word_wrap = "yes";
- transparency = 5;
- format = "%s: %b";
- markup = "full";
- min_icon_size = 128;
- max_icon_size = 128;
- };
- };
- };
- programs.waybar = {
- enable = true;
- systemd.enable = true;
- package = hyprland.packages."x86_64-linux".waybar-hyprland;
- settings = {
- mainBar = {
- layer = "top";
- position = "left";
- width = 45;
- spacing = 8;
- modules-left = [ "wlr/workspaces" "custom/new-workspace" ];
- modules-center = [ "hyprland/window" ];
- modules-right =
- [ "tray" "wireplumber" "backlight" "battery" "clock" ];
- "tray" = {
- "icon-size" = 24;
- spacing = 8;
- };
- "hyprland/window" = {
- "rotate" = 90;
- };
- "wlr/workspaces" = {
- on-click = "activate";
- sort-by-number = true;
- format = "{icon}";
- format-icons = {
- "1" = "一";
- "2" = "二";
- "3" = "三";
- "4" = "四";
- "5" = "五";
- "6" = "六";
- "7" = "七";
- "8" = "八";
- "9" = "九";
- "10" = "十";
- };
- };
- wireplumber = {
- format = "{icon}";
- tooltip-format = "{volume}% {node_name}";
- format-muted = "";
- format-icons = ["" ""];
- };
- battery = {
- "format" = "{icon}";
- "tooltip-format" = "{capacity}% {timeTo}";
- "format-icons" = ["" "" "" "" ""];
- };
- clock = {
- "format" = "{:%H\n%M}";
- "tooltip-format" = "{calendar}";
- };
- backlight = {
- "format" = "{icon}";
- "format-icons" = ["" ""];
- };
- "custom/new-workspace" = {
- "format" = "+";
- "on-click" = "hyprctl dispatch workspace empty && rofi -show drun";
- "tooltip" = false;
- };
- };
- };
- style = lib.mkForce ''
- @define-color base00 #272822;
- @define-color base01 #383830;
- @define-color base02 #49483e;
- @define-color base03 #75715e;
- @define-color base04 #a59f85;
- @define-color base05 #f8f8f2;
- @define-color base06 #f5f4f1;
- @define-color base07 #f9f8f5;
- @define-color base08 #f92672;
- @define-color base09 #fd971f;
- @define-color base0A #f4bf75;
- @define-color base0B #a6e22e;
- @define-color base0C #a1efe4;
- @define-color base0D #66d9ef;
- @define-color base0E #ae81ff;
- @define-color base0F #cc6633;
-
- * {
- color: @base05;
- font-size: 16px;
- }
-
- window#waybar {
- background: alpha(@base00, 0.95);
- border-right: 1px solid alpha(@base02, 0.67);
- }
-
- #workspaces button {
- padding: 12px 0;
- border-radius: 0;
- }
-
- #workspaces button.active {
- background: alpha(@base02, 0.67);
- }
-
- #window {
- padding-top: 8px;
- padding-bottom: 12px;
- }
-
- tooltip, #tray menu {
- background: @base00;
- border: 1px solid alpha(@base09, 0.93);
- padding: 8px;
- }
-
- #backlight, #battery, #wireplumber {
- font-family: "Font Awesome 6 Free Solid";
- font-size: 24px;
- }
-
- #custom-new-workspace {
- font-family: "Font Awesome 6 Free Solid";
- padding-top: 8px;
- padding-bottom: 8px;
- color: alpha(@base0A, 0.67);
- }
-
- #clock {
- font-size: 18px;
- font-weight: bold;
- padding-bottom: 8px;
- }
- '';
- };
- programs.zathura = {
- enable = true;
- options = {
- guioptions = "v";
- adjust-open = "width";
- statusbar-basename = true;
- render-loading = false;
- scroll-step = 120;
- };
- };
- programs.feh = {
- enable = true;
- keybindings = {
- toggle_actions = null;
- toggle_aliasing = null;
- toggle_caption = null;
- toggle_filenames = "d";
- toggle_exif = null;
- save_filelist = null;
- toggle_fixed_geometry = "g";
- toggle_pause = "h";
- toggle_info = null;
- toggle_keep_vp = null;
- toggle_menu = null;
- next_img = [ "k" "Right" ];
- toggle_pointer = "a";
- prev_img = [ "j" "Left" ];
- quit = "q";
- reload_image = null;
- save_image = null;
- toggle_fullscreen = "f";
- size_to_image = "w";
- close = null;
- jump_random = "z";
- prev_dir = null;
- next_dir = null;
- orient_3 = null;
- orient_1 = null;
- flip = null;
- mirror = null;
- action_0 = null;
- action_1 = null;
- action_2 = null;
- action_3 = null;
- action_4 = null;
- action_5 = null;
- action_6 = null;
- action_7 = null;
- action_8 = null;
- action_9 = null;
- jump_first = "J";
- jump_last = "K";
- jump_fwd = "H";
- jump_back = "L";
- reload_plus = null;
- reload_minus = null;
- remove = null;
- delete = null;
- scroll_left = "b";
- scroll_right = "n";
- scroll_up = [ "u" "Up" ];
- scroll_down = [ "d" "Down" ];
- scroll_left_page = null;
- scroll_right_page = null;
- scroll_up_page = null;
- scroll_down_page = null;
- render = null;
- zoom_in = "h";
- zoom_out = "l";
- zoom_default = "o";
- zoom_fit = null;
- zoom_fill = "p";
- menu_close = null;
- menu_up = null;
- menu_down = null;
- menu_parent = null;
- menu_child = null;
- menu_select = null;
- toggle_auto_zoom = "m";
- };
- };
services.mpd = {
enable = true;
extraConfig = ''
auto_update "yes"
'';
};
- programs.ncmpcpp = {
- enable = true;
- bindings = [
- { key = "mouse"; command = "dummy"; }
- { key = "h"; command = ["previous_column" "jump_to_parent_directory"]; }
- { key = "j"; command = "scroll_down"; }
- { key = "k"; command = "scroll_up"; }
- { key = "l"; command = [ "next_column" "enter_directory" "play_item"]; }
- { key = "H"; command = [ "select_item" "scroll_down"]; }
- { key = "J"; command = ["move_sort_order_down" "move_selected_items_down"]; }
- { key = "K"; command = ["move_sort_order_up" "move_selected_items_up"]; }
- { key = "L"; command = [ "select_item" "scroll_up"]; }
- { key = "'"; command = "remove_selection"; }
- { key = "ctrl-u"; command = "page_up"; }
- { key = "ctrl-d"; command = "page_down"; }
- { key = "u"; command = "page_up"; }
- { key = "d"; command = "page_down"; }
- { key = "n"; command = "next_found_item"; }
- { key = "N"; command = "previous_found_item"; }
- { key = "t"; command = "next_screen"; }
- { key = "g"; command = "move_home"; }
- { key = "G"; command = "move_end"; }
- { key = "w"; command = "next"; }
- { key = "b"; command = "previous"; }
- { key = ";"; command = "seek_forward"; }
- { key = ","; command = "seek_backward"; }
- { key = "f"; command = "apply_filter"; }
- { key = "i"; command = "select_item"; }
- { key = "x"; command = [ "delete_playlist_items" "delete_browser_items" "delete_stored_playlist" ]; }
- { key = "U"; command = "update_database"; }
- { key = "m"; command = "add_random_items"; }
- ];
- settings = {
- ncmpcpp_directory = "~/.config/ncmpcpp";
- user_interface = "alternative";
- autocenter_mode = "yes";
- allow_for_physical_item_deletion = "no";
- mouse_support = "no";
- execute_on_song_change = "~/.config/mpd/mpdnotify";
- mpd_crossfade_time = 3;
- };
- };
services.gpg-agent = {
enable = true;
pinentryFlavor = "curses";
@@ -800,267 +445,7 @@
rust-vim
];
};
- editorconfig = {
- enable = true;
- settings = {
- "*" = {
- charset = "utf-8";
- end_of_line = "lf";
- insert_final_newline = true;
- indent_size = 2;
- indent_style = "space";
- trim_trailing_whitespace = true;
- };
- "*.md" = { indent_style = "tab"; };
- "Makefile" = {
- indent_style = "tab";
- indent_size = 4;
- };
- "*.html" = {
- indent_style = "tab";
- indent_size = 4;
- };
- "*.go" = {
- indent_style = "tab";
- indent_size = 4;
- };
- };
- };
- xdg.configFile."tig/config".text = ''
- color cursor black green bold
- color title-focus black blue bold
- color title-blur black blue bold
- '';
- programs.mpv = {
- enable = true;
- config = {
- screenshot-format = "png";
- profile = "gpu-hq";
- scale = "ewa_lanczossharp";
- cscale = "ewa_lanczossharp";
- video-sync = "display-resample";
- interpolation = true;
- tscale = "oversample";
- sub-auto = "fuzzy";
- sub-font = "Noto Sans CJK JP Medium";
- sub-blur = 10;
- sub-file-paths = "subs:subtitles:字幕";
- fullscreen = "yes";
- title = "\${filename} - mpv";
- script-opts =
- "osc-title=\${filename},osc-boxalpha=150,osc-showfullscreen=no,osc-boxvideo=yes";
- osc = "no";
- osd-on-seek = "no";
- osd-bar = "no";
- osd-bar-w = 30;
- osd-bar-h = "0.2";
- osd-duration = 750;
- really-quiet = "yes";
- };
- scripts = [ pkgs.mpvScripts.thumbnail ];
- };
- programs.git = {
- enable = true;
- extraConfig = {
- include = { path = "~/.gituser"; };
- commit = { gpgsign = true; };
- core = {
- editor = "nvim";
- autocrlf = false;
- quotePath = false;
- };
- web = { browser = "librewolf"; };
- push = { default = "simple"; };
- branch = { autosetuprebase = "always"; };
- init = { defaultBranch = "master"; };
- rerere = { enabled = true; };
- color = { ui = true; };
- alias = {
- contrib = "shortlog -n -s";
- remotes = "remote -v";
- praise = "blame";
- verify = "log --show-signature";
- };
- "color \"diff-highlight\"" = {
- oldNormal = "red bold";
- oldHighlight = "red bold";
- newNormal = "green bold";
- newHighlight = "green bold";
- };
- "color \"diff\"" = {
- meta = "yellow";
- frag = "magenta bold";
- commit = "yellow bold";
- old = "red bold";
- new = "green bold";
- whitespace = "red reverse";
- };
- };
- diff-so-fancy = { enable = true; };
- };
services.udiskie.enable = true;
- programs.qutebrowser = {
- enable = true;
- package = pkgs.qutebrowser-qt6;
- extraConfig = ''
- # Mute tabs by default
- from qutebrowser.mainwindow import tabwidget
- tabwidget.TabWidget.MUTE_STRING = ""
- tabwidget.TabWidget.AUDIBLE_STRING = "[A]"
-
- # Don't close while browsing / downloading
- c.confirm_quit = ['multiple-tabs', 'downloads']
-
- # Restore previous tabs
- c.session.lazy_restore = True
-
- # Use ranger as the file selector
- c.fileselect.handler = 'external'
- c.fileselect.folder.command = ['kitty', '-e', 'ranger', '--choosedir={}']
- c.fileselect.multiple_files.command = ['kitty', '-e', 'ranger', '--choosefiles={}']
- c.fileselect.single_file.command = ['kitty', '-e', 'ranger', '--choosefile={}']
-
- # Better context menu colors
- c.colors.contextmenu.disabled.fg = '#808080'
- c.colors.contextmenu.menu.bg = '#353535'
- c.colors.contextmenu.menu.fg = '#ffffff'
- c.colors.contextmenu.selected.bg = '#909090'
-
- # Use spellcheck
- c.spellcheck.languages = ["en-US"]
-
- # Chromium flags
- c.qt.args = ["disable-backing-store-limit", "enable-accelerated-video-decode", "disable-gpu-driver-bug-workarounds"]
- c.qt.chromium.low_end_device_mode = 'never'
-
- # Make new tab position more sane
- c.tabs.new_position.unrelated = 'next'
-
- # Download settings
- c.downloads.location.directory = "$HOME/Downloads"
- c.downloads.location.prompt = False
- c.downloads.position = "bottom"
- c.downloads.remove_finished = 5000
-
- # Only show tabs when multiple are open
- c.tabs.show = "multiple"
-
- # Don't switch tabs with mouse
- c.tabs.mousewheel_switching = False
-
- # Edit text with neovim
- c.editor.command = ['kitty', '-e', 'nvim', '{}']
-
- # Use J/K for prev/next
- config.bind('J', 'tab-prev')
- config.bind('K', 'tab-next')
-
- # Use F12 for devtools
- config.bind('', 'devtools')
-
- # Use zb to delete bookmarks
- config.bind('zb', 'bookmark-del')
-
- # Increase the default scroll offset of j/k
- # NOTE: Unfortunately this breaks websites that use their own keybinds for j/k/etc
- # config.bind('j', 'run-with-count 5 scroll down')
- # config.bind('k', 'run-with-count 5 scroll up')
-
- # NOTE: Use with smooth smooth scrolling enabled to scroll smoothly
- # config.bind('d', 'run-with-count 12 scroll down')
- # config.bind('u', 'run-with-count 12 scroll up')
-
- # Use d/u to scroll down/up
- config.bind('d', 'scroll-page 0 0.5')
- config.bind('u', 'scroll-page 0 -0.5')
- config.bind('D', 'scroll-page 0 0.5')
- config.bind('U', 'scroll-page 0 -0.5')
-
- # Use alt+left/right to go back/forward
- config.bind('', 'back')
- config.bind('', 'forward')
-
- # Use x to close tabs and X to undo
- config.bind('x', 'tab-close')
- config.bind('X', 'undo')
-
- # Toggle tab visibility for more screen space
- config.bind('st', 'config-cycle tabs.show multiple switching')
-
- # Easily change the position of tabs
- config.bind('sTh', 'set tabs.position left')
- config.bind('sTj', 'set tabs.position bottom')
- config.bind('sTk', 'set tabs.position top')
- config.bind('sTl', 'set tabs.position right')
-
- # Don't paste something by accident
- config.unbind('pp', mode='normal')
- config.unbind('pP', mode='normal')
- config.unbind('Pp', mode='normal')
- config.unbind('PP', mode='normal')
- config.unbind('wp', mode='normal')
- config.unbind('wP', mode='normal')
-
- # Easily enter account information
- # NOTE: I re-evaluated pass when I was focusing on a terminal-centric workflow.
- config.bind('zl', 'spawn --userscript qute-pass')
- config.bind('zpl', 'spawn --userscript qute-pass --password-only')
- config.bind('zol', 'spawn --userscript qute-pass --otp-only')
-
- # Support previous/next tab with traditional keybinds
- config.bind('', 'tab-prev')
- config.bind('', 'tab-next')
-
- # Hide the status bar except under exceptional circumstances
- # NOTE: This broke more things than not, which is why I ultimately decided
- # to always use the status bar. More information can be found in the
- # following discussion: https://github.com/qutebrowser/qutebrowser/issues/2236
- # config.bind('o', 'set statusbar.show always;; set-cmd-text -s :open')
- # config.bind('O', 'set statusbar.show always;; set-cmd-text -s :open -t')
- # config.bind('T', 'set statusbar.show always;; set-cmd-text -sr :tab-focus')
- # config.bind(':', 'set statusbar.show always;; set-cmd-text :')
- # config.bind('/', 'set statusbar.show always;; set-cmd-text /')
- # config.bind('', 'mode-enter normal;; set statusbar.show in-mode', mode='command')
- # config.bind('', 'command-accept;; set statusbar.show in-mode', mode='command')
-
- # Easily start a new temporary container
- config.bind(';s', 'hint links spawn ~/.local/bin/tmp {hint-url}')
-
- # Open the current tab / selected link in mpv
- config.bind('zM', 'spawn mpv --force-window=immediate {url}')
- config.bind('zm', 'hint links spawn mpv --force-window=immediate {hint-url}')
-
- # Automatically mute tabs
- c.content.mute = True
-
- # Use proxy websites for popular services
- config.bind('zu', 'hint links spawn -u untrack-url -O {hint-url}')
-
- # Enable expected permissions to avoid websites asking every time
- c.content.persistent_storage = True
- c.content.notifications.enabled = True
- c.content.register_protocol_handler = True
-
- # Hide the window title bar on GNOME
- # NOTE: This is no longer necessary since GNOME has an extension called
- # pixel-saver that # automatically handles this for us, and without
- # the downsides of not having a window bar.
- # c.window.hide_decoration = True
-
- # Close qutebrowser when there are no tabs left
- c.tabs.last_close = "close"
-
- # Don't automatically enter/leave insert mode
- # NOTE: This was originally done to prevent insert mode from prematurely exiting
- # in certain # cases (such as mouse usage), although keeping auto functionality
- # seems to be more useful # long-term.
- c.input.insert_mode.auto_enter = False
- c.input.insert_mode.auto_leave = False
-
- # Prioritize Japanese content (en-US is necessary to avoid breaking things)
- c.content.headers.accept_language = 'ja-JP,en-US'
- '';
- };
xdg.configFile."hypr/swapmaster.sh".source = ./swapmaster.sh;
xdg.configFile."hypr/tags.sh".source = ./tags.sh;
xdg = { userDirs = { enable = true; }; };