From 4093701fca4eae05a243cc2bf550394823133368 Mon Sep 17 00:00:00 2001 From: Johannes Knopp Date: Tue, 6 Jan 2026 01:45:44 +0100 Subject: [PATCH] hyprland updates; nvim updates; misc updates --- .ideavimrc | 6 ++ inventory | 2 +- roles/hyprland/files/hypr/hyprland.conf | 90 ++++++++++++------- roles/hyprland/files/hypr/hyprpaper.conf | 23 ++++- roles/hyprland/files/hypr/monitors.conf | 2 +- .../files/hypr/scripts/deezer-volume.sh | 77 ++++++++++++++++ roles/hyprland/files/hyprpanel/config.json | 45 ++++++++++ roles/hyprland/files/hyprpanel/modules.json | 1 + roles/hyprland/files/hyprpanel/modules.scss | 0 roles/hyprland/tasks/main.yml | 6 ++ roles/nvim/files/lazy-lock.json | 35 ++++---- .../lua/config/plugins/lsp/lspconfig.lua | 9 ++ roles/system/tasks/main.yml | 2 +- roles/zsh/tasks/main.yaml | 4 +- 14 files changed, 246 insertions(+), 56 deletions(-) create mode 100755 roles/hyprland/files/hypr/scripts/deezer-volume.sh create mode 100644 roles/hyprland/files/hyprpanel/config.json create mode 100644 roles/hyprland/files/hyprpanel/modules.json create mode 100644 roles/hyprland/files/hyprpanel/modules.scss diff --git a/.ideavimrc b/.ideavimrc index 07ca94a..fc56b8e 100644 --- a/.ideavimrc +++ b/.ideavimrc @@ -14,6 +14,12 @@ set incsearch set hlsearch set scrolloff=10 +let mapleader = " " +let maplocalleader = " " + " Binds nnoremap gr :action ShowUsages +inoremap i +nnoremap m :action MoveEditorToOppositeTabGroup +nnoremap m :action MoveEditorToOppositeTabGroup diff --git a/inventory b/inventory index fe31dc2..cf8dc12 100644 --- a/inventory +++ b/inventory @@ -1,2 +1,2 @@ [local] -localhost ansible_connection=local ansible_user=johannes +localhost ansible_connection=local ansible_user=johannes ansible_python_interpreter=/usr/sbin/python diff --git a/roles/hyprland/files/hypr/hyprland.conf b/roles/hyprland/files/hypr/hyprland.conf index 9b907a4..081b6ca 100644 --- a/roles/hyprland/files/hypr/hyprland.conf +++ b/roles/hyprland/files/hypr/hyprland.conf @@ -23,12 +23,13 @@ $menu = wofi --show drun # Autostart necessary processes (like notifications daemons, status bars, etc.) # Or execute your favorite apps at launch like this: -exec-once = waybar +# exec-once = waybar +exec-once = /usr/lib//hhyprpolkitagent/hyprpolkitagent exec-once = hyprpanel exec-once = dunst exec-once = firefox exec-once = hyprpaper -exec-once = [workspace 9 silent] spotify +exec-once = [workspace 9 silent] deezer-desktop # gnome keyring secret service exec-once = dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP HYPRLAND_INSTANCE_SIGNATURE @@ -136,14 +137,14 @@ decoration { } # wofi -layerrule = blur, wofi # apply compositor blur -layerrule = ignorezero, wofi # keep blur even on near-opaque colors -layerrule = dimaround, wofi # optional: dim background behind wofi -layerrule = ignorealpha 0.90, wofi # target overall opacity for the layer - -# waybar -layerrule = blur, waybar -layerrule = ignorealpha 0.15, waybar +# layerrule = blur, wofi # apply compositor blur +# layerrule = ignorezero, wofi # keep blur even on near-opaque colors +# layerrule = dimaround, wofi # optional: dim background behind wofi +# layerrule = ignorealpha 0.90, wofi # target overall opacity for the layer +# +# # waybar +# layerrule = blur, waybar +# layerrule = ignorealpha 0.15, waybar # https://wiki.hypr.land/Configuring/Variables/#animations animations { @@ -210,18 +211,18 @@ misc { # https://wiki.hypr.land/Configuring/Variables/#input input { - kb_layout = us + kb_layout = us,de kb_variant = altgr-intl kb_model = - kb_options = + # kb_options = grp:caps_toggle kb_rules = follow_mouse = 2 sensitivity = 0 # -1.0 - 1.0, 0 means no modification. - scroll_method = on_button_down - scroll_button = 274 + # scroll_method = on_button_down + # scroll_button = 274 } # Example per-device config @@ -282,12 +283,12 @@ bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+ bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- # Requires playerctl -# Spotify controls -bind = CTRL ALT, K, exec, playerctl --player=spotify play-pause -bind = CTRL ALT, Left, exec, playerctl --player=spotify previous -bind = CTRL ALT, Right, exec, playerctl --player=spotify next -bind = CTRL ALT, Up, exec, playerctl --player=spotify volume 0.05+ -bind = CTRL ALT, Down, exec, playerctl --player=spotify volume 0.05- +# Deezer controls +bind = CTRL ALT, K, exec, playerctl --player=deezer play-pause +bind = CTRL ALT, Left, exec, playerctl --player=deezer previous +bind = CTRL ALT, Right, exec, playerctl --player=deezer next +bind = CTRL ALT, Up, exec, ~/.config/hypr/scripts/deezer-volume.sh +5% +bind = CTRL ALT, Down, exec, ~/.config/hypr/scripts/deezer-volume.sh -5% bind = ,F7,pass,class:^(discord)$ bind = ,F8,pass,class:^(discord)$ @@ -305,18 +306,47 @@ bind = , Print, exec, hyprshot -zm region # See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules # Ignore maximize requests from apps. You'll probably like this. -windowrule = suppressevent maximize, class:.* +windowrule { + name = suppress-maximize-events + match:class = .* + + suppress_event = maximize +} # Fix some dragging issues with XWayland -windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 +windowrule { + name = fix-xwayland-drags + match:class = ^$ + match:title = ^$ + match:xwayland = true + match:float = true + match:fullscreen = false + match:pin = false -windowrulev2 = tag +jb, class:^jetbrains-.+$,floating:1 -windowrulev2 = stayfocused, tag:jb -windowrulev2 = noinitialfocus, tag:jb + no_focus = true +} -# 1) Do not allow these windows to inhibit Hyprland shortcuts -windowrulev2 = noshortcutsinhibit, class:^(jetbrains-.*|android-studio)$ +windowrule { + name = jetbrains-shortcuts + match:class = ^(jetbrains-.*|android-studio)$ + + no_shortcuts_inhibit = 1 +} + +windowrule { + name = jetbrains-tile + match:class = ^(jetbrains-.*|android-studio)$ + float = 0 +} + +windowrule { + name = jetbrains-tab-drag + match:class = ^(jetbrains-.*|android-studio)$ + match:title = ^(\s*)$ + + no_initial_focus = 1 + stay_focused = 1 + float = 1 + center = 1 +} -# 2) Float and center transient dialogs from these apps -windowrulev2 = float, class:^(jetbrains-.*|android-studio)$, windowtype:^(dialog|utility|popup)$ -windowrulev2 = center, class:^(jetbrains-.*|android-studio)$, windowtype:^(dialog|utility|popup)$ diff --git a/roles/hyprland/files/hypr/hyprpaper.conf b/roles/hyprland/files/hypr/hyprpaper.conf index 0e236c6..502ce1c 100644 --- a/roles/hyprland/files/hypr/hyprpaper.conf +++ b/roles/hyprland/files/hypr/hyprpaper.conf @@ -1,7 +1,24 @@ preload = /home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png -wallpaper = DP-1,/home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png -wallpaper = DP-2,/home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png -wallpaper = HDMI-A-2,/home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png +wallpaper { + monitor = DP-1 + path =/home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png + # fitmode = cover +} +wallpaper { + monitor = DP-2 + path =/home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png + # fitmode = cover +} +wallpaper { + monitor = HDMI-A-1 + path =/home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png + # fitmode = cover +} +wallpaper { + monitor = HDMI-A-2 + path =/home/johannes/Pictures/Wallpapers/wallhaven-5g22q5.png + # fitmode = cover +} splash = false diff --git a/roles/hyprland/files/hypr/monitors.conf b/roles/hyprland/files/hypr/monitors.conf index 02b2e94..eb09808 100644 --- a/roles/hyprland/files/hypr/monitors.conf +++ b/roles/hyprland/files/hypr/monitors.conf @@ -1,4 +1,4 @@ -# Generated by nwg-displays on 2025-11-09 at 17:18:32. Do not edit manually. +# Generated by nwg-displays on 2025-12-26 at 06:40:37. Do not edit manually. monitor=DP-1,2560x1440@165.0,6626x876,1.0 monitor=DP-2,2560x1440@165.0,4066x876,1.0 diff --git a/roles/hyprland/files/hypr/scripts/deezer-volume.sh b/roles/hyprland/files/hypr/scripts/deezer-volume.sh new file mode 100755 index 0000000..ae235ac --- /dev/null +++ b/roles/hyprland/files/hypr/scripts/deezer-volume.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash + +change="$1" + +if [ -z "$change" ]; then + echo "Usage: $0 [+5%|-5%|50%]" + exit 1 +fi + +echo "=== Deezer Volume Debug (FIXED) ===" + +# 1) Deezer window PID +root_pid=$(hyprctl clients -j | jq -r '.[] | select(.class == "deezer-desktop") | .pid' | head -n1) +echo "[INFO] Deezer window PID: $root_pid" + +if [ -z "$root_pid" ] || [ "$root_pid" = "null" ]; then + echo "[ERROR] Deezer window not found." + exit 1 +fi + +# 2) Gather ALL descendant PIDs +declare -a pid_array +pid_array+=("$root_pid") + +# Direct children +children=($(pgrep -P "$root_pid")) +echo "[INFO] Children: ${children[*]}" + +for c in "${children[@]}"; do + pid_array+=("$c") + gc=($(pgrep -P "$c")) + echo "[INFO] Grandchildren of $c: ${gc[*]}" + for g in "${gc[@]}"; do + pid_array+=("$g") + done +done + +echo "[INFO] All collected PIDs: ${pid_array[*]}" + +echo "----------------------------------" +echo "[INFO] Checking sink inputs..." +echo "----------------------------------" + +sink="" + +while IFS= read -r block; do + pid=$(echo "$block" | jq -r '.properties["application.process.id"] // empty') + index=$(echo "$block" | jq -r '.index') + + echo "[SINK] index=$index pid=$pid" + + [ -z "$pid" ] && { echo " -> Skipping"; continue; } + + for candidate in "${pid_array[@]}"; do + if [ "$pid" = "$candidate" ]; then + echo " -> MATCH with PID $candidate" + sink="$index" + break 2 + fi + done + + echo " -> No match" + +done < <(pactl -f json list sink-inputs | jq -c '.[]') + +echo "----------------------------------" + +if [ -z "$sink" ]; then + echo "[ERROR] No audio stream found for Deezer." + exit 1 +fi + +echo "[INFO] Deezer sink index: $sink" +echo "[INFO] Applying: $change" + +pactl set-sink-input-volume "$sink" "$change" + diff --git a/roles/hyprland/files/hyprpanel/config.json b/roles/hyprland/files/hyprpanel/config.json new file mode 100644 index 0000000..3379bbc --- /dev/null +++ b/roles/hyprland/files/hyprpanel/config.json @@ -0,0 +1,45 @@ +{ + "bar.customModules.storage.paths": [ + "/" + ], + "menus.power.showLabel": false, + "theme.font.size": "1rem", + "theme.font.weight": 500, + "scalingPriority": "gdk", + "menus.power.lowBatteryNotification": false, + "bar.customModules.worldclock.tz": [ + "Europe/Vienna" + ], + "theme.bar.buttons.modules.power.enableBorder": false, + "menus.dashboard.powermenu.avatar.image": "/home/johannes/Pictures/Wallpapers/wallhaven-852q62.png", + "menus.dashboard.shortcuts.left.shortcut1.tooltip": "Firefox", + "menus.dashboard.shortcuts.left.shortcut1.command": "firefox", + "menus.dashboard.shortcuts.left.shortcut1.icon": "", + "menus.clock.time.military": true, + "menus.clock.weather.location": "Vienna", + "menus.clock.weather.unit": "metric", + "menus.volume.raiseMaximumVolume": true, + "theme.bar.floating": true, + "bar.autoHide": "never", + "theme.bar.buttons.enableBorders": true, + "theme.bar.border.width": "0.1em", + "bar.workspaces.show_icons": false, + "bar.workspaces.show_numbered": false, + "bar.workspaces.workspaceMask": false, + "bar.workspaces.showWsIcons": true, + "bar.workspaces.showApplicationIcons": true, + "bar.workspaces.showAllActive": true, + "bar.workspaces.numbered_active_indicator": "highlight", + "theme.bar.buttons.workspaces.smartHighlight": true, + "theme.bar.buttons.windowtitle.enableBorder": false, + "bar.windowtitle.custom_title": true, + "bar.windowtitle.class_name": true, + "theme.bar.buttons.clock.enableBorder": false, + "bar.clock.format": "%a %b %d %H:%M:%S", + "theme.bar.menus.menu.battery.scaling": 100, + "theme.bar.buttons.battery.visible": false, + "bar.battery.label": false, + "bar.battery.hideLabelWhenFull": true, + "theme.bar.buttons.battery.enableBorder": false, + "theme.osd.enable": true +} \ No newline at end of file diff --git a/roles/hyprland/files/hyprpanel/modules.json b/roles/hyprland/files/hyprpanel/modules.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/roles/hyprland/files/hyprpanel/modules.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/roles/hyprland/files/hyprpanel/modules.scss b/roles/hyprland/files/hyprpanel/modules.scss new file mode 100644 index 0000000..e69de29 diff --git a/roles/hyprland/tasks/main.yml b/roles/hyprland/tasks/main.yml index 6d5d578..f5245af 100644 --- a/roles/hyprland/tasks/main.yml +++ b/roles/hyprland/tasks/main.yml @@ -27,3 +27,9 @@ state: link force: true +- name: Symlink hyprpanel + file: + src: "{{ role_path }}/files/hyprpanel" + dest: "{{ config_dir }}/hyprpanel" + state: link + force: true diff --git a/roles/nvim/files/lazy-lock.json b/roles/nvim/files/lazy-lock.json index 51ff140..34bc1d3 100644 --- a/roles/nvim/files/lazy-lock.json +++ b/roles/nvim/files/lazy-lock.json @@ -1,41 +1,40 @@ { "LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" }, "alpha-nvim": { "branch": "main", "commit": "3979b01cb05734331c7873049001d3f2bb8477f4" }, - "auto-session": { "branch": "main", "commit": "4cd20bb5c0138d1ce00ab35f8d7ac0f4fb4a403a" }, + "auto-session": { "branch": "main", "commit": "292492ab7af4bd8b9e37e28508bc8ce995722fd5" }, "bufdelete.nvim": { "branch": "master", "commit": "f6bcea78afb3060b198125256f897040538bcb81" }, "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, - "cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, "dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" }, - "flutter-tools.nvim": { "branch": "main", "commit": "69db9cdac65ce536e20a8fc9a83002f007cc049c" }, + "flutter-tools.nvim": { "branch": "main", "commit": "293dfc78162ab185bca5f81bb32155dcf45114bf" }, "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, - "lazygit.nvim": { "branch": "main", "commit": "2305deed25bc61b866d5d39189e9105a45cf1cfb" }, + "lazygit.nvim": { "branch": "main", "commit": "a04ad0dbc725134edbee3a5eea29290976695357" }, "lspkind.nvim": { "branch": "master", "commit": "3ddd1b4edefa425fda5a9f95a4f25578727c0bb3" }, - "lualine.nvim": { "branch": "master", "commit": "3946f0122255bc377d14a59b27b609fb3ab25768" }, + "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, "mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, "mason.nvim": { "branch": "main", "commit": "4da89f3ab04783da990f9bd40aaa36c22e59375b" }, - "monokai-nightasty.nvim": { "branch": "main", "commit": "91b0798334534394d77b0b6e6089fe0655b241b3" }, + "monokai-nightasty.nvim": { "branch": "main", "commit": "8be5e1c6e1d59873505e81b161e923264dfa5c1a" }, "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" }, - "none-ls-extras.nvim": { "branch": "main", "commit": "402c6b5c29f0ab57fac924b863709f37f55dc298" }, - "none-ls.nvim": { "branch": "main", "commit": "a96172f673f720cd4f3572e1fcd08400ed3eb25d" }, - "nvim-autopairs": { "branch": "master", "commit": "7a2c97cccd60abc559344042fefb1d5a85b3e33b" }, - "nvim-cmp": { "branch": "main", "commit": "a7bcf1d88069fc67c9ace8a62ba480b8fe879025" }, + "none-ls-extras.nvim": { "branch": "main", "commit": "03955d165621300965a6d685c8f399ec7efd5785" }, + "none-ls.nvim": { "branch": "main", "commit": "0b457958cb958c16850b5a1fb38bbcd982909181" }, + "nvim-autopairs": { "branch": "master", "commit": "c2a0dd0d931d0fb07665e1fedb1ea688da3b80b4" }, + "nvim-cmp": { "branch": "main", "commit": "85bbfad83f804f11688d1ab9486b459e699292d6" }, "nvim-lsp-file-operations": { "branch": "master", "commit": "9744b738183a5adca0f916527922078a965515ed" }, - "nvim-lspconfig": { "branch": "master", "commit": "87d30189b24caa496b54affd65594a309ac6d929" }, - "nvim-surround": { "branch": "main", "commit": "fcfa7e02323d57bfacc3a141f8a74498e1522064" }, - "nvim-tree.lua": { "branch": "master", "commit": "64e2192f5250796aa4a7f33c6ad888515af50640" }, + "nvim-lspconfig": { "branch": "master", "commit": "ac04ec3c2af08e9821b4eb64ede86072b9b213bf" }, + "nvim-surround": { "branch": "main", "commit": "1098d7b3c34adcfa7feb3289ee434529abd4afd1" }, + "nvim-tree.lua": { "branch": "master", "commit": "b8b44b6a2494d086a9177251a119f9daec6cace8" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" }, - "nvim-web-devicons": { "branch": "master", "commit": "8dcb311b0c92d460fac00eac706abd43d94d68af" }, + "nvim-web-devicons": { "branch": "master", "commit": "6788013bb9cb784e606ada44206b0e755e4323d7" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, - "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, - "todo-comments.nvim": { "branch": "main", "commit": "411503d3bedeff88484de572f2509c248e499b38" }, - "venv-selector.nvim": { "branch": "regexp", "commit": "d2326e7433fdeb10f7d0d1237c18b91b353f9f8b" }, - "vim-floaterm": { "branch": "master", "commit": "a720490bd9dc02c5492e800aa08d4802f22b01f8" }, + "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, + "vim-floaterm": { "branch": "master", "commit": "a11b930f55324e9b05e2ef16511fe713f1b456a7" }, "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } } diff --git a/roles/nvim/files/lua/config/plugins/lsp/lspconfig.lua b/roles/nvim/files/lua/config/plugins/lsp/lspconfig.lua index d64ca5a..f04bc14 100644 --- a/roles/nvim/files/lua/config/plugins/lsp/lspconfig.lua +++ b/roles/nvim/files/lua/config/plugins/lsp/lspconfig.lua @@ -92,6 +92,15 @@ return { } }) end, + ['hyprls'] = function () + lspconfig.hyprls.setup({ + capabilities = capabilities, + cmd = { "hyprls" }, + root_dir = function(fname) + return vim.fn.getcwd() + end, + }) + end, -- ['pyright'] = function() -- lspconfig['pyright'].setup({ -- -- cmd = { "pyright-langserver", "--stdio" }, diff --git a/roles/system/tasks/main.yml b/roles/system/tasks/main.yml index 67fc787..b09bb7e 100644 --- a/roles/system/tasks/main.yml +++ b/roles/system/tasks/main.yml @@ -2,7 +2,7 @@ - name: Update package cache (Arch-based systems) pacman: update_cache: yes - when: ansible_os_family == "Archlinux" + when: ansible_facts.os_family == "Archlinux" become: yes - name: Install system packages diff --git a/roles/zsh/tasks/main.yaml b/roles/zsh/tasks/main.yaml index 8cd5ac0..4939744 100644 --- a/roles/zsh/tasks/main.yaml +++ b/roles/zsh/tasks/main.yaml @@ -8,7 +8,7 @@ shell: | sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" --unattended args: - creates: "{{ ansible_env.HOME }}/.oh-my-zsh" + creates: "{{ ansible_facts.env.HOME }}/.oh-my-zsh" - name: Check for custom zshrc stat: @@ -18,7 +18,7 @@ - name: Symlink custom zshrc file: src: "{{ role_path }}/files/.zshrc" - dest: "{{ ansible_env.HOME }}/.zshrc" + dest: "{{ ansible_facts.env.HOME }}/.zshrc" state: link force: yes when: custom_zshrc.stat.exists