Add clipbook

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2025-02-13 13:41:03 +00:00
parent 97a042adcd
commit c907cdeca6
11 changed files with 203 additions and 31 deletions

View File

@@ -0,0 +1,23 @@
list() {
echo -en "\0keep-selection\x1ftrue\n"
jq -r 'keys[]' "$BOOKMARKS"
}
handle() {
key="$1"
data=$(jq -r --arg key "$key" '.[$key]' "$BOOKMARKS")
type=$(echo "$data" | jq -r '.type')
content=$(echo "$data" | jq -r '.content')
if [[ "$type" == "file" ]]; then
wl-copy < "$content"
elif [[ "$type" == "text" ]]; then
echo -n "$content" | wl-copy
fi
}
case ${ROFI_RETV} in
0) list ;;
1) handle "$@" ;;
esac

View File

@@ -0,0 +1,28 @@
{
user ? throw "user argument is required",
home ? throw "home argument is required",
}:
{
config,
lib,
pkgs,
...
}:
let
hmConfig = config.home-manager.users.${user};
in
{
home-manager.users.${user} = {
imports = [ ./options.nix ];
programs.clipbook.enable = true;
wayland.windowManager.hyprland.settings.bind =
let
clipbook-rofi = lib.meta.getExe hmConfig.programs.clipbook.finalPackage;
in
[
"$mod, c, exec, ${clipbook-rofi}"
];
};
}

View File

@@ -0,0 +1,69 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.programs.clipbook;
in
{
options.programs.clipbook =
with lib;
with types;
{
enable = mkEnableOption "Clipbook";
bookmarks =
let
bookmarksOptions =
{ config, ... }:
{
options = {
source = mkOption {
type = nullOr str;
description = "Path to the file to copy.";
default = null;
};
text = mkOption {
type = nullOr str;
description = "Text to copy.";
default = null;
};
};
};
in
mkOption {
type = attrsOf (submodule bookmarksOptions);
description = "Clipboard Bookmarks.";
default = { };
};
finalPackage = mkOption {
type = package;
description = "The clipbook rofi package.";
default = pkgs.callPackage ./rofi.nix {
rofi = config.programs.rofi.finalPackage;
bookmarks = builtins.mapAttrs (_: bookmark: {
type = if bookmark.source != null then "file" else "text";
content = if bookmark.source != null then bookmark.source else bookmark.text;
}) cfg.bookmarks;
};
readOnly = true;
};
};
config = {
assertions = [
{
assertion = builtins.all (
bookmark:
(bookmark.source == null || bookmark.text == null)
&& (bookmark.source != null || bookmark.text != null)
) (builtins.attrValues cfg.bookmarks);
message = "Each bookmark must have one of 'source' or 'text' set.";
}
];
};
}

View File

@@ -0,0 +1,25 @@
{
rofi ? throw "rofi package is required",
bookmarks ? throw "bookmarks argument is required",
lib,
pkgs,
...
}:
let
copy = lib.meta.getExe (
pkgs.writeShellApplication {
name = "copy";
runtimeInputs = with pkgs; [
jq
wl-clipboard
];
runtimeEnv.BOOKMARKS = (pkgs.formats.json { }).generate "bookmarks.json" bookmarks;
text = builtins.readFile ./copy.sh;
}
);
in
pkgs.writeShellApplication {
name = "clipbook-rofi";
runtimeInputs = [ rofi ];
text = "rofi -modi \"copy:${copy}\" -show copy";
}

View File

@@ -15,10 +15,7 @@ in
environment.persistence."/cache"."${home}/.cache/cliphist" = { };
home-manager.users.${user} = {
home.packages = with pkgs; [
wl-clipboard
cliphist
];
home.packages = with pkgs; [ cliphist ];
systemd.user.services = {
cliphist = {

View File

@@ -496,18 +496,21 @@ in
{
assertion = builtins.all (
vault:
builtins.all (snippet: snippet.source == null || snippet.text == null) vault.settings.cssSnippets
builtins.all (
snippet:
(snippet.source == null || snippet.text == null) && (snippet.source != null || snippet.text != null)
) vault.settings.cssSnippets
) (builtins.attrValues cfg.vaults);
message = "Only one of `source` and `text` must be set";
message = "Each CSS snippet must have one of 'source' or 'text' set";
}
{
assertion = builtins.all (
vault:
builtins.all (file: file.source == null || file.text == null) (
builtins.attrValues vault.settings.extraFiles
)
builtins.all (
file: (file.source == null || file.text == null) && (file.source != null || file.text != null)
) (builtins.attrValues vault.settings.extraFiles)
) (builtins.attrValues cfg.vaults);
message = "Only one of `source` and `text` must be set";
message = "Each extra file must have one of 'source' or 'text' set";
}
];
};

View File

@@ -113,6 +113,6 @@ in
password-store = "basic";
};
wayland.windowManager.hyprland.settings.bind = [ "$mod, c, exec, ${lib.meta.getExe pkgs.vscode}" ];
wayland.windowManager.hyprland.settings.bind = [ "$mod, e, exec, ${lib.meta.getExe pkgs.vscode}" ];
};
}

View File

@@ -0,0 +1,8 @@
{
user ? throw "user argument is required",
home ? throw "home argument is required",
}:
{ pkgs, ... }:
{
home-manager.users.${user}.home.packages = with pkgs; [ wl-clipboard ];
}

View File

@@ -1,28 +1,27 @@
{ lib, ... }:
let
userOptions =
with lib;
with types;
{ config, ... }:
{
options = {
email = mkOption {
type = nullOr str;
description = "Email address of the user.";
};
fullName = mkOption {
type = nullOr str;
description = "Full name of the user.";
};
};
};
in
{
options =
with lib;
with types;
{
users.users = mkOption { type = attrsOf (submodule userOptions); };
users.users =
let
userOptions =
{ config, ... }:
{
options = {
email = mkOption {
type = nullOr str;
description = "Email address of the user.";
};
fullName = mkOption {
type = nullOr str;
description = "Full name of the user.";
};
};
};
in
mkOption { type = attrsOf (submodule userOptions); };
};
}

View File

@@ -4,6 +4,8 @@ let
# FIXME: https://github.com/NixOS/nixpkgs/issues/305643
user = "nick";
home = "/home/nick";
hmConfig = config.home-manager.users.${user};
in
{
imports = [
@@ -49,6 +51,7 @@ in
(import ../../../common/configs/user/gui/brightnessctl { inherit user home; })
(import ../../../common/configs/user/gui/btop { inherit user home; })
(import ../../../common/configs/user/gui/chromium { inherit user home; })
(import ../../../common/configs/user/gui/clipbook { inherit user home; })
(import ../../../common/configs/user/gui/cliphist { inherit user home; })
(import ../../../common/configs/user/gui/darktable { inherit user home; })
(import ../../../common/configs/user/gui/discord { inherit user home; })
@@ -73,6 +76,7 @@ in
(import ../../../common/configs/user/gui/transmission { inherit user home; })
(import ../../../common/configs/user/gui/vscode { inherit user home; })
(import ../../../common/configs/user/gui/wev { inherit user home; })
(import ../../../common/configs/user/gui/wl-clipboard { inherit user home; })
(import ../../../common/configs/user/gui/x11 { inherit user home; })
(import ../../../common/configs/user/gui/xdg { inherit user home; })
@@ -123,6 +127,11 @@ in
"gpg/pass".sopsFile = ../../../../secrets/personal/secrets.yaml;
};
programs.clipbook.bookmarks = {
"SSH Key Passphrase".source = hmConfig.sops.secrets."ssh/personal/pass".path;
"GPG Passphrase".source = hmConfig.sops.secrets."gpg/personal/pass".path;
};
theme.wallpaper = ../../../../static/wallpapers/clouds.png;
};
}

View File

@@ -4,6 +4,8 @@ let
# FIXME: https://github.com/NixOS/nixpkgs/issues/305643
user = "nikara";
home = "/home/nikara";
hmConfig = config.home-manager.users.${user};
in
{
imports = [
@@ -45,6 +47,7 @@ in
(import ../../../common/configs/user/gui/brightnessctl { inherit user home; })
(import ../../../common/configs/user/gui/btop { inherit user home; })
(import ../../../common/configs/user/gui/chromium { inherit user home; })
(import ../../../common/configs/user/gui/clipbook { inherit user home; })
(import ../../../common/configs/user/gui/cliphist { inherit user home; })
(import ../../../common/configs/user/gui/emoji { inherit user home; })
(import ../../../common/configs/user/gui/firefox { inherit user home; })
@@ -65,6 +68,7 @@ in
(import ../../../common/configs/user/gui/theme { inherit user home; })
(import ../../../common/configs/user/gui/vscode { inherit user home; })
(import ../../../common/configs/user/gui/wev { inherit user home; })
(import ../../../common/configs/user/gui/wl-clipboard { inherit user home; })
(import ../../../common/configs/user/gui/x11 { inherit user home; })
(import ../../../common/configs/user/gui/xdg { inherit user home; })
@@ -159,6 +163,13 @@ in
};
};
programs.clipbook.bookmarks = {
"Personal SSH Key Passphrase".source = hmConfig.sops.secrets."ssh/personal/pass".path;
"Personal GPG Passphrase".source = hmConfig.sops.secrets."gpg/personal/pass".path;
"SAS SSH Key Passphrase".source = hmConfig.sops.secrets."ssh/sas/pass".path;
"SAS GPG Passphrase".source = hmConfig.sops.secrets."gpg/sas/pass".path;
};
theme.wallpaper = ../../../../static/wallpapers/snow.jpg;
};
}