From 2b403b18e479f8fcbadaf0564081f4a0c80eda42 Mon Sep 17 00:00:00 2001 From: js0ny Date: Wed, 11 Feb 2026 23:09:17 +0000 Subject: [PATCH] sioyek: add sioyek script --- nixcfgs/hosts/zephyrus/default.nix | 2 +- nixcfgs/modules/nixos/desktop/fonts.nix | 1 + .../{sioyek.nix => sioyek/default.nix} | 38 +++++++--- .../js0ny/programs/sioyek/sioyek-copy-page.sh | 71 +++++++++++++++++++ nixcfgs/users/js0ny/zen.nix | 2 +- nixcfgs/users/js0ny/zephyrus.nix | 2 +- 6 files changed, 105 insertions(+), 11 deletions(-) rename nixcfgs/users/js0ny/programs/{sioyek.nix => sioyek/default.nix} (51%) create mode 100644 nixcfgs/users/js0ny/programs/sioyek/sioyek-copy-page.sh diff --git a/nixcfgs/hosts/zephyrus/default.nix b/nixcfgs/hosts/zephyrus/default.nix index 2e33ae3..1b95fd5 100644 --- a/nixcfgs/hosts/zephyrus/default.nix +++ b/nixcfgs/hosts/zephyrus/default.nix @@ -26,7 +26,7 @@ ../../modules/nixos/desktop/xremap.nix # desktop environment and display manager - ../../modules/nixos/desktop/dm/sddm.nix + ../../modules/nixos/desktop/dm/gdm.nix ../../modules/nixos/desktop/de/niri.nix ../../modules/nixos/desktop/de/gnome.nix diff --git a/nixcfgs/modules/nixos/desktop/fonts.nix b/nixcfgs/modules/nixos/desktop/fonts.nix index 8f9b452..87f9e5d 100644 --- a/nixcfgs/modules/nixos/desktop/fonts.nix +++ b/nixcfgs/modules/nixos/desktop/fonts.nix @@ -67,5 +67,6 @@ in { in { "/usr/share/icons" = mkRoSymBind "${aggregated}/share/icons"; "/usr/share/fonts" = mkRoSymBind "${aggregated}/share/fonts"; + "/home/js0ny/.local/share/fonts" = mkRoSymBind "${aggregated}/share/fonts"; }; } diff --git a/nixcfgs/users/js0ny/programs/sioyek.nix b/nixcfgs/users/js0ny/programs/sioyek/default.nix similarity index 51% rename from nixcfgs/users/js0ny/programs/sioyek.nix rename to nixcfgs/users/js0ny/programs/sioyek/default.nix index dc48117..699cc43 100644 --- a/nixcfgs/users/js0ny/programs/sioyek.nix +++ b/nixcfgs/users/js0ny/programs/sioyek/default.nix @@ -1,14 +1,33 @@ -{...}: { +{ + pkgs, + config, + lib, + ... +}: let + sioyekCopyScript = pkgs.writeShellApplication { + name = "sioyek-copy-page"; + runtimeInputs = with pkgs; + [poppler-utils] + ++ ( + if pkgs.stdenv.isLinux + then with pkgs; [wl-clipboard libnotify] + else [] + ); + text = builtins.readFile ./sioyek-copy-page.sh; + }; +in { + xdg.configFile."sioyek/prefs_user.config".text = '' + new_command _copy_page_to_clipboard ${lib.getExe sioyekCopyScript} %{page_number} %{file_path} + default_dark_mode 1 + font_size 14 + case_sensitive_search 0 + super_fast_search 1 + search_url_d https://duckduckgo.com/?q= + search_url_e https://ai.js0ny.net/?models=qwen%2Fqwen3-235b-a22b-2507&q=explain- + ''; programs.sioyek = { enable = true; # prefs_user.config - config = { - default_dark_mode = "1"; - font_size = "14"; - case_sensitive_search = "0"; - super_fast_search = "1"; - search_url_d = "https://duckduckgo.com/?q="; - }; bindings = { ## Movement "screen_down" = "J"; @@ -51,6 +70,9 @@ "command" = ""; "search" = ""; + + ## User Defined Commands + "_copy_page_to_clipboard" = ""; }; }; } diff --git a/nixcfgs/users/js0ny/programs/sioyek/sioyek-copy-page.sh b/nixcfgs/users/js0ny/programs/sioyek/sioyek-copy-page.sh new file mode 100644 index 0000000..ca48625 --- /dev/null +++ b/nixcfgs/users/js0ny/programs/sioyek/sioyek-copy-page.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +RAW_PAGE="$1" +RAW_PATH="$2" +FILE_PATH="$RAW_PATH" + +# FILE_PATH="${RAW_PATH#\"}" # 去除开头的 " +# FILE_PATH="${FILE_PATH%\"}" # 去除结尾的 " +# FILE_PATH="${FILE_PATH#\'}" # 去除开头的 ' +# FILE_PATH="${FILE_PATH%\'}" # 去除结尾的 ' + +PAGE_NUM="$RAW_PAGE" +DISPLAY_PAGE=$((PAGE_NUM + 1)) +DPI=300 + +notify() { + local msg="$1" + local level="${2:-normal}" # normal / critical + + if [[ "$(uname)" == "Darwin" ]]; then + osascript -e "display notification \"$msg\" with title \"Sioyek\"" + elif command -v notify-send >/dev/null 2>&1; then + notify-send -u "$level" -a "Sioyek" "Page Copy" "$msg" + fi +} + +if ! command -v pdftocairo >/dev/null 2>&1; then + notify "缺少依赖: pdftocairo (请安装 poppler_utils)" "critical" + exit 1 +fi + +if [[ ! -f "$FILE_PATH" ]]; then + notify "文件不存在: $FILE_PATH" "critical" + exit 1 +fi + +OS_TYPE=$(uname) + +if [[ "$OS_TYPE" == "Darwin" ]]; then + TMP_IMG=$(mktemp /tmp/sioyek_page.XXXXXX.png) + + # 渲染到临时文件 + pdftocairo -png -f "$PAGE_NUM" -l "$PAGE_NUM" -r "$DPI" -singlefile "$FILE_PATH" "${TMP_IMG%.png}" + + if [[ -f "$TMP_IMG" ]]; then + # 写入剪贴板 + osascript -e "set the clipboard to (read (POSIX file \"$TMP_IMG\") as JPEG picture)" + rm "$TMP_IMG" + notify "已复制第 $DISPLAY_PAGE 页" + else + notify "渲染失败" "critical" + exit 1 + fi + +elif [[ "$OS_TYPE" == "Linux" ]]; then + if ! command -v wl-copy >/dev/null 2>&1; then + notify "缺少依赖: wl-copy (请安装 wl-clipboard)" "critical" + exit 1 + fi + + # 使用管道直接传输,set -o pipefail 确保渲染失败时报错 + set -o pipefail + if pdftocairo -png -f "$PAGE_NUM" -l "$PAGE_NUM" -r "$DPI" -singlefile "$FILE_PATH" - | wl-copy --type image/png; then + sleep 0.1 + notify "已复制第 $DISPLAY_PAGE 页" + else + notify "复制失败 (pdftocairo 或 wl-copy 出错)" "critical" + exit 1 + fi +fi + diff --git a/nixcfgs/users/js0ny/zen.nix b/nixcfgs/users/js0ny/zen.nix index ee3f8a2..a02c0b6 100644 --- a/nixcfgs/users/js0ny/zen.nix +++ b/nixcfgs/users/js0ny/zen.nix @@ -31,7 +31,7 @@ ./programs/tmux.nix ./programs/kitty.nix ./programs/anki.nix - ./programs/sioyek.nix + ./programs/sioyek ./programs/telegram.nix # ./programs/retroarch.nix # Package broken on macOS ./programs/darwin/duti.nix diff --git a/nixcfgs/users/js0ny/zephyrus.nix b/nixcfgs/users/js0ny/zephyrus.nix index be7230b..5511303 100644 --- a/nixcfgs/users/js0ny/zephyrus.nix +++ b/nixcfgs/users/js0ny/zephyrus.nix @@ -72,7 +72,7 @@ in { ./programs/block-desktop-entries.nix ./programs/pwa.nix ./programs/walker.nix - ./programs/sioyek.nix + ./programs/sioyek ./programs/celluloid.nix ./programs/picard.nix ./programs/cider-2.nix