diff options
Diffstat (limited to 'hm/env')
| -rw-r--r-- | hm/env/env.nix | 2 | ||||
| -rw-r--r-- | hm/env/fsel.nix | 16 | ||||
| -rw-r--r-- | hm/env/niri/binds.nix | 10 | ||||
| -rw-r--r-- | hm/env/niri/niri.nix | 15 | ||||
| -rw-r--r-- | hm/env/otter.nix | 191 |
5 files changed, 234 insertions, 0 deletions
diff --git a/hm/env/env.nix b/hm/env/env.nix index a5caec2..6222ffb 100644 --- a/hm/env/env.nix +++ b/hm/env/env.nix @@ -4,6 +4,7 @@ ./niri/niri.nix ./awww.nix + ./otter.nix ./cursor.nix ./fuzzel.nix ./screenshot.nix @@ -12,5 +13,6 @@ ./theme.nix ./waybar.nix ./mako.nix + ./fsel.nix ]; } diff --git a/hm/env/fsel.nix b/hm/env/fsel.nix new file mode 100644 index 0000000..faa7f24 --- /dev/null +++ b/hm/env/fsel.nix @@ -0,0 +1,16 @@ +{ + inputs, + config, + lib, + pkgs, + ... +}: +let + cfg = config.hm.env.fsel; +in +{ + options.hm.env.fsel.enable = lib.mkEnableOption "enables fsel"; + config = lib.mkIf cfg.enable { + home.packages = [ inputs.fsel.packages.${pkgs.stdenv.hostPlatform.system}.default ]; + }; +} diff --git a/hm/env/niri/binds.nix b/hm/env/niri/binds.nix index 27eb583..c5c1f56 100644 --- a/hm/env/niri/binds.nix +++ b/hm/env/niri/binds.nix @@ -11,6 +11,15 @@ let ssPath = "${toString config.hm.conf.xdg-dirs.storagePath}/pics/ss/$(date +%Y-%m-%d_%H-%M-%S)"; obsEnabled = config.hm.soft.obs.enable or false; obsPass = if obsEnabled then osConfig.sops.secrets."obs/websocket_password".path else ""; + otter-menu = pkgs.writeShellScriptBin "otter-menu" '' + ${pkgs.foot}/bin/footclient -a otter-launcher otter-launcher & + ${pkgs.niri}/bin/niri msg event-stream | while read -r line; do + if echo "$line" | ${pkgs.ripgrep-all}/bin/rga -aq "Window focus changed"; then + ${pkgs.procps}/bin/pkill -f "otter-launcher" + exit 0 + fi + done + ''; in { # --- System & Media --- @@ -46,6 +55,7 @@ in "Super+B".action = spawn "librewolf"; "Super+S".action = spawn "spotify"; "Super+E".action = spawn "thunar"; + "Super+Space".action = spawn "${otter-menu}/bin/otter-menu"; # --- Navigation: Columns & Workspaces --- "Mod+H".action = focus-column-or-monitor-left; diff --git a/hm/env/niri/niri.nix b/hm/env/niri/niri.nix index 2274259..8850396 100644 --- a/hm/env/niri/niri.nix +++ b/hm/env/niri/niri.nix @@ -82,6 +82,21 @@ in }; window-rules = [ { + matches = [ { app-id = "^otter-launcher$"; } ]; + open-floating = true; + + default-column-width.fixed = 700; + default-window-height.fixed = 450; + + default-floating-position = { + relative-to = "top"; + x = 0; + y = 100; + }; + + focus-ring.active.color = "#fab387"; + } + { matches = [ { app-id = "^Bitwarden$"; } { app-id = "^org\\.keepassxc\\.KeePassXC$"; } diff --git a/hm/env/otter.nix b/hm/env/otter.nix new file mode 100644 index 0000000..b7324e0 --- /dev/null +++ b/hm/env/otter.nix @@ -0,0 +1,191 @@ +{ + inputs, + config, + lib, + ... +}: +let + cfg = config.hm.env.otter; +in +{ + imports = [ inputs.otter-launcher.homeModules.otter-launcher ]; + + options.hm.env.otter.enable = lib.mkEnableOption "enables otter launcher"; + config = lib.mkIf cfg.enable { + programs.otter-launcher = { + enable = true; + # settings = { + # interface = { + # suggestion_mode = "list"; + # }; + # }; + settingsExtra = '' + [general] + default_module = "gg" # module to run when no prefix is matched + empty_module = "app" # run with an empty prompt + exec_cmd = "sh -c" # exec command of your shell + # for example: "bach -c" for bash; "zsh -c" for zsh; also accept wm commands like "hyprctl dispatch exec" + vi_mode = false # set true to use vi keybinds, false emacs keybinds + esc_to_abort = true # useful for vi users + cheatsheet_entry = "?" # when prompted, will show a list of configured modules + cheatsheet_viewer = "less -R; clear" # command to show cheatsheet; through piping stdout + clear_screen_after_execution = false + loop_mode = false # don't quit after executing a module, useful with scratchpads; stderr is hidden in loop mode + external_editor = "vi" # if set, press ctrl+x ctrl+ee (or v in vi normal mode) to edit prompt in the specified program + delay_startup = 0 # sometimes the otter runs too fast even before the terminal window is ready; this slows it down by milliseconds; useful when chafa image is skewed + #callback = "" # if set, will run after module execution; for example, calling swaymsg to adjust window size + + + # ANSI color codes are allowed. However, \x1b should be replaced with \u001B, because the rust toml crate cannot read \x as an escaped character + [interface] + # use three quotes to write longer codes + header = """ + \u001B[34;1m$USER@$(printf $HOSTNAME)\u001B[0m \u001B[31m\u001B[0m $(mpstat | awk 'FNR ==4 {print $4}') + """ + header_cmd = "" # run a command and print stdout above the header + header_cmd_trimmed_lines = 0 # remove trailing lines from header_cmd output, in case of some programs appending excessive empty lines + place_holder = "otterly awesome" # at the input field + suggestion_mode = "list" # available options: list, hint + separator = " \u001B[90mmodules ────────────────" # add a line between intput field and suggestion list; only effective in list mode + footer = "" # add a line after suggestion list + suggestion_lines = 3 # 0 to disable suggestions and tab completion + list_prefix = " " + selection_prefix = "\u001B[31;1m▌ " + prefix_padding = 3 # format prefixes to have a uniformed width + default_module_message = " \u001B[33msearch\u001B[0m the internet" # shown when the default module is in use + empty_module_message = "" # shown when the empty module is in use + customized_list_order = false # false to list modules alphabetically; true to list as per the configured order in the below [[modules]] section + indicator_with_arg_module = "" # the sign showing whether a module should run with an argument + indicator_no_arg_module = "" + # below color options affect all modules; per-module coloring can be configured using ansi codes individually + prefix_color = "\u001B[33m" + description_color = "\u001B[39m" + place_holder_color = "\u001B[30m" + hint_color = "\u001B[30m" # suggestion color in hint mode + # move the interface rightward or downward + move_interface_right = 16 + move_interface_down = 1 + + + # overlay is a floating layer that can be printed with stdout and moved around; useful for integrating chafa images + [overlay] + overlay_cmd = """ + """ + overlay_height = 0 + + + # modules are defined as followed + [[modules]] + description = "google search" + prefix = "gg" + cmd = "xdg-open https://www.google.com/search?q='{}'" + with_argument = true # if true, {} in cmd will be replaced with user input. if not explicitly set, taken as false. + url_encode = true # should be true when calling webpages; this ensures special characters in url being readable to browsers; taken as false if not explicitly set + unbind_proc = true # run cmd in a forked shell as opposed to as a child process (simply by prepending setsid -f to the configured cmd); useful for launching gui programs; taken as false if not explicitly set; try wm's exec command for unbinding if this option goes wrong (like swaymsg exec) + + # fzf is needed to run below functions + [[modules]] + description = "desktop programs" + prefix = "app" + cmd = """ + desktop_file() { + find /usr/share/applications -name "*.desktop" 2>/dev/null + find /usr/local/share/applications -name "*.desktop" 2>/dev/null + find "$HOME/.local/share/applications" -name "*.desktop" 2>/dev/null + find /var/lib/flatpak/exports/share/applications -name "*.desktop" 2>/dev/null + find "$HOME/.local/share/flatpak/exports/share/applications" -name "*.desktop" 2>/dev/null + } + selected="$(desktop_file | awk -F/ '{name=$NF; sub(/\\.desktop$/, "", name); print name}' | sort -k1,1 | cut -f2- | fzf --reverse --padding 1,3 --info-command 'echo -e " desktop apps ($FZF_POS/$FZF_TOTAL_COUNT)"' --cycle --gutter " " --pointer " ▌" --color "bg+:-1,pointer:1,info:8,separator:8,scrollbar:0" --prompt ' ' -m -d / --with-nth -1 )" + [ -z "$selected" ] && exit + echo "$selected" | while read -r line ; do setsid -f gtk-launch "$(basename $line)"; done + """ + + [[modules]] + description = "power menu (fzf)" + prefix = "po" + cmd = """ + function power { + if [[ -n $1 ]]; then + case $1 in + "logout") session=`loginctl session-status | head -n 1 | awk '{print $1}'`; loginctl terminate-session $session ;; + "suspend") systemctl suspend ;; + "hibernate") systemctl hibernate ;; + "reboot") systemctl reboot ;; + "shutdown") systemctl poweroff ;; + esac fi } + power $(echo -e 'reboot\nshutdown\nlogout\nsuspend\nhibernate' | fzf --reverse --padding 1,2 --info-command 'printf " power menu ($FZF_POS/$FZF_TOTAL_COUNT)"' --cycle --gutter " " --pointer " ▌" --color "bg+:-1,pointer:1,info:8,separator:8,scrollbar:0" --prompt ' ' | tail -1) + """ + + [[modules]] + description = "run commands" + prefix = "sh" + cmd = """ + $(printf $TERM | sed 's/xterm-//g') -e sh -c "{}" + """ + with_argument = true + unbind_proc = true + + [[modules]] + description = "search archwiki" + prefix = "aw" + cmd = "xdg-open https://wiki.archlinux.org/index.php?search='{}'" + with_argument = true + url_encode = true + unbind_proc = true + + [[modules]] + description = "search packages" + prefix = "pac" + cmd = "xdg-open https://archlinux.org/packages/?q='{}'" + with_argument = true + url_encode = true + unbind_proc = true + + [[modules]] + description = "search the AUR" + prefix = "aur" + cmd = "xdg-open https://aur.archlinux.org/packages?K='{}'" + with_argument = true + url_encode = true + unbind_proc = true + + [[modules]] + description = "cambridge dict" + prefix = "dc" + cmd = "xdg-open 'https://dictionary.cambridge.org/dictionary/english/{}'" + with_argument = true + url_encode = true + unbind_proc = true + + [[modules]] + description = "open files (fzf)" + prefix = "fo" + cmd = """ + find $HOME -type f -not -path '*/.cache/*' 2>/dev/null | fzf --reverse --padding 1,3 --info-command 'printf " files ($FZF_POS/$FZF_TOTAL_COUNT)"' --cycle --gutter ' ' --pointer ' ▌' --color 'bg+:-1,pointer:1,info:8,separator:8,scrollbar:0' --prompt ' ' | setsid -f xargs -r -I [] xdg-open '[]' + """ + + [[modules]] + description = "open dirs (yazi)" + prefix = "yz" + cmd = """ + find $HOME -type d -not -path '*/.cache/*' 2>/dev/null | fzf --reverse --padding 1,3 --info-command 'printf " directories ($FZF_POS/$FZF_TOTAL_COUNT)"' --cycle --gutter ' ' --pointer ' ▌' --color 'bg+:-1,pointer:1,info:8,separator:8,scrollbar:0' --prompt ' ' | xargs -r -I [] setsid -f "$(echo $TERM | sed 's/xterm-//g')" -e yazi '[]' + """ + + [[modules]] + description = "ChatGPT prompt" + prefix = "gpt" + with_argument = true + unbind_proc = true + cmd = """ + function chat { + encoded="$(jq -sRr @uri)" + exec xdg-open "https://chat.openai.com/?prompt=$encoded" + } + chat <<'EOF' + {} + EOF + """ + ''; + }; + }; +} |
