diff --git a/.github/workflows/sync-gitlab.yml b/.github/workflows/sync-gitlab.yml index 84aacf51..42465870 100644 --- a/.github/workflows/sync-gitlab.yml +++ b/.github/workflows/sync-gitlab.yml @@ -7,10 +7,11 @@ on: jobs: sync: + if: false runs-on: ubuntu-latest steps: - - uses: keninkujovic/gitlab-sync@2.0.0 - with: - gitlab_url: ${{ secrets.GITLAB_URL }} - username: ${{ secrets.USERNAME }} - gitlab_pat: ${{ secrets.GITLAB_PAT }} + - uses: keninkujovic/gitlab-sync@2.0.0 + with: + gitlab_url: ${{ secrets.GITLAB_URL }} + username: ${{ secrets.USERNAME }} + gitlab_pat: ${{ secrets.GITLAB_PAT }} diff --git a/conf/ghostty/config b/conf/ghostty/config index abbc14be..a280b46d 100644 --- a/conf/ghostty/config +++ b/conf/ghostty/config @@ -4,23 +4,27 @@ theme = dark:Kanagawa Dragon,light:Builtin Solarized Light -font-family = Berkeley Mono Nerd Font +font-family = Berkeley Mono Nerd Font +# font-family = Iosevka Nerd Font Mono font-size = 14 -font-thicken = false -shell-integration-features = no-cursor,sudo,title +font-thicken = true +font-codepoint-map = U+4E00-U+9FFF,U+3400-U+4DBF=LXGW WenKai Mono +shell-integration-features = cursor,sudo,title cursor-style = block cursor-invert-fg-bg = true macos-option-as-alt = true macos-titlebar-style = tabs -macos-window-shadow = false +macos-window-shadow = true adjust-underline-position = 45% -adjust-underline-thickness = -60% +adjust-underline-thickness = -65% mouse-hide-while-typing = true focus-follows-mouse = false unfocused-split-opacity = 1 +window-padding-balance = true +window-padding-x = 6 -background-opacity = 0.98 -background-blur-radius = 18 +background-opacity = 1 +background-blur-radius = 0 # Quick terminal @@ -48,6 +52,7 @@ keybind = super+backslash=toggle_quick_terminal # ==== keybind = super+v=paste_from_clipboard +keybind = super+c=copy_to_clipboard keybind = super+n=new_window keybind = super+t=new_tab keybind = super+w=close_surface diff --git a/conf/karabiner/karabiner.json b/conf/karabiner/karabiner.json index fe0a7e41..e2d40efe 100644 --- a/conf/karabiner/karabiner.json +++ b/conf/karabiner/karabiner.json @@ -115,15 +115,15 @@ ] }, { - "description": "Change left_command+hjkl to arrow keys", - "disable": true, + "description": "Change right_option+hjkl to arrow keys", + "disable": false, "manipulators": [ { "from": { "key_code": "h", "modifiers": { "mandatory": [ - "right_command" + "right_option" ], "optional": [ "any" @@ -142,7 +142,7 @@ "key_code": "j", "modifiers": { "mandatory": [ - "right_command" + "right_option" ], "optional": [ "any" @@ -161,7 +161,7 @@ "key_code": "k", "modifiers": { "mandatory": [ - "right_command" + "right_option" ], "optional": [ "any" @@ -180,7 +180,7 @@ "key_code": "l", "modifiers": { "mandatory": [ - "right_command" + "right_option" ], "optional": [ "any" diff --git a/conf/yabai/yabairc b/conf/yabai/yabairc index ae189e57..b7b8669d 100755 --- a/conf/yabai/yabairc +++ b/conf/yabai/yabairc @@ -1,4 +1,5 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash + # the scripting-addition must be loaded manually if # you are running yabai on macOS Big Sur. Uncomment # the following line to have the injection performed @@ -42,15 +43,11 @@ yabai -m config insert_feedback_color 0xaad75f5f yabai -m config split_ratio 0.50 yabai -m config auto_balance on yabai -m config window_opacity off -# yabai -m config window_opacity_duration 0.0 -# yabai -m config active_window_opacity 1.0 -# yabai -m config normal_window_opacity 1.0 # -- space -- - yabai -m config layout stack -# yabai -m config --space 1 layout stack -# yabai -m config --space 2 layout bsp +yabai -m config --space 1 layout stack +yabai -m config --space 2 layout bsp # yabai -m config --space 3 layout bsp yabai -m config top_padding 4 yabai -m config bottom_padding 4 @@ -65,8 +62,8 @@ yabai -m space 2 --label code #-- rules -- ## see: https://github.com/koekeishiya/yabai/issues/1929 yabai -m rule --add app=".*" sub-layer=normal -yabai -m rule --add app="^(Safari|Firefox)$" space=web role=AXWindow subrole=AXStandardWindow -yabai -m rule --add app="(System Preferences|系统偏好设置|系统设置|微信|wechat|\.dmg)$" manage=off sub-layer=normal +yabai -m rule --add app="^(Safari|Firefox|Google Chrome)$" space=web role=AXWindow subrole=AXStandardWindow +yabai -m rule --add app="^(Ghostty|Cursor)$" space=code role=AXWindow subrole=AXStandardWindow yabai -m rule --add app="(微信|钉钉|Wechat|企业微信|Telegram|Numi|MenubarX|备忘录|Notes)" manage=off sub-layer=normal yabai -m rule --add app="(腾讯会议|快速会议|会议|Capacities|数码测色计|富途牛牛)" manage=off sub-layer=normal yabai -m rule --add app="^\s*$" manage=off sub-layer=normal @@ -75,6 +72,11 @@ yabai -m rule --add app="QQ音乐" manage=off sub-layer=normal yabai -m rule --add app="(Finder|访达|DevTools|模拟器|Kap|Bartender|TradingView)" manage=off sub-layer=normal yabai -m rule --apply +yabai -m signal --add event=window_destroyed active=yes action="yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse &> /dev/null || yabai -m window --focus \$(yabai -m query --windows --space | jq .[0].id) &> /dev/null" +yabai -m signal --add event=window_minimized active=yes action="if \$(yabai -m query --windows --window \$YABAI_WINDOW_ID | jq -r '.\"is-floating\"'); then yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse &> /dev/null || yabai -m window --focus \$(yabai -m query --windows --space | jq .[0].id) &> /dev/null; fi" + + + # stackline specific tweaks # yabai -m signal --add event=window_created action="~/.config/yabai/adjust-padding-for-stacked-windows.sh" # yabai -m signal --add event=window_destroyed action="~/.config/yabai/adjust-padding-for-stacked-windows.sh" diff --git a/nix/darwin/apple.nix b/nix/darwin/apple.nix index 6a6b40d8..d6d68672 100644 --- a/nix/darwin/apple.nix +++ b/nix/darwin/apple.nix @@ -27,14 +27,14 @@ # "com.apple.keyboard.fnState" = true; }; dock = { - autohide = true; + autohide = false; magnification = true; mineffect = "scale"; # minimize-to-application = true; orientation = "bottom"; showhidden = true; show-recents = true; - tilesize = 40; + tilesize = 36; largesize = 42; }; finder = { diff --git a/nix/darwin/configuration.nix b/nix/darwin/configuration.nix index ecd74615..a39d20b9 100644 --- a/nix/darwin/configuration.nix +++ b/nix/darwin/configuration.nix @@ -9,7 +9,7 @@ ./vars.nix ./apps.nix ./yabai.nix - ./jankyborders.nix + # ./jankyborders.nix ]; users.users.${username} = { diff --git a/nix/darwin/jankyborders.nix b/nix/darwin/jankyborders.nix index d62c9e7f..8969fb70 100644 --- a/nix/darwin/jankyborders.nix +++ b/nix/darwin/jankyborders.nix @@ -7,10 +7,10 @@ let "style=round" "active_color=0xffbd93f9" "inactive_color=0xffabb2bf" - "width=7.0" + "width=4.0" "hidpi=on" "ax_focus=on" - "blacklist='Dropover,LaunchBar'" + "blacklist='LaunchBar'" ]; in { diff --git a/nix/darwin/yabai.nix b/nix/darwin/yabai.nix index 9a8f5542..6d0dd6f3 100644 --- a/nix/darwin/yabai.nix +++ b/nix/darwin/yabai.nix @@ -3,9 +3,13 @@ pkgs, ... }: { + environment.etc."sudoers.d/yabai".source = pkgs.runCommand "sudoers-yabai" {} '' + YABAI_BIN="/etc/profiles/per-user/${username}/bin/yabai" + SHASUM=$(sha256sum "$YABAI_BIN" | cut -d' ' -f1) + cat <"$out" + ${username} ALL=(root) NOPASSWD: sha256:$SHASUM $YABAI_BIN --load-sa + EOF + ''; # csrutil enable --without fs --without debug --without nvram # nvram boot-args=-arm64e_preview_abi - environment.etc."sudoers.d/yabai".text = '' - ${username} ALL = (root) NOPASSWD: ${pkgs.yabai}/bin/yabai --load-sa - ''; } diff --git a/nix/hm/skhd.nix b/nix/hm/skhd.nix index 728f10f0..aadc8597 100644 --- a/nix/hm/skhd.nix +++ b/nix/hm/skhd.nix @@ -77,7 +77,8 @@ mode_window < k : yabai -m window --focus north; ${skhd} -k "escape" mode_window < l : yabai -m window --focus east; ${skhd} -k "escape" - mode_window < tab : yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" #0x30: tab + mode_window < tab : yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + ralt - w : ${bash} ${skhdDir}/cycle-app.sh # focus next|prev window. # https://github.com/koekeishiya/yabai/issues/203#issuecomment-1289940339 @@ -93,7 +94,7 @@ # -r: restore initial position after move. # w:250 wait for 250ms after each event. # m:0,0, move to 0,0 coords. - ctrl+shift+alt - g : yabai -m space --toggle mission-control && cliclick -w 250 -r m:0,0 m:1,1 w:250 + # ctrl+shift+alt - g : yabai -m space --toggle mission-control && cliclick -w 250 -r m:0,0 m:1,1 w:250 # moving windows mode_window_move < h : yabai -m window --warp west; skhd -k "escape" @@ -103,27 +104,27 @@ # move window to space — follow focus to destination mode_window_move_space < 0x2F : yabai -m window --space recent; yabai -m space --focus recent; skhd -k "escape" - mode_window_move_space < p : yabai -m window --space prev; yabai -m space --focus prev; skhd -k "escape"; - mode_window_move_space < n : yabai -m window --space next; yabai -m space --focus next; skhd -k "escape"; - - mode_window_move_space < 1 : yabai -m window --space 1; yabai -m space --focus 1; skhd -k "escape" - mode_window_move_space < 2 : yabai -m window --space 2; yabai -m space --focus 2; skhd -k "escape" - mode_window_move_space < 3 : yabai -m window --space 3; yabai -m space --focus 3; skhd -k "escape" - mode_window_move_space < 4 : yabai -m window --space 4; yabai -m space --focus 4; skhd -k "escape" - mode_window_move_space < 5 : yabai -m window --space 5; yabai -m space --focus 5; skhd -k "escape" - mode_window_move_space < 6 : yabai -m window --space 6; yabai -m space --focus 6; skhd -k "escape" - mode_window_move_space < 7 : yabai -m window --space 7; yabai -m space --focus 7; skhd -k "escape" - mode_window_move_space < 8 : yabai -m window --space 8; yabai -m space --focus 8; skhd -k "escape" - mode_window_move_space < 9 : yabai -m window --space 9; yabai -m space --focus 9; skhd -k "escape" + mode_window_move_space < p : yabai -m window --space prev; yabai -m space --focus prev; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape"; + mode_window_move_space < n : yabai -m window --space next; yabai -m space --focus next; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape"; + + mode_window_move_space < 1 : yabai -m window --space 1; yabai -m space --focus 1; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 2 : yabai -m window --space 2; yabai -m space --focus 2; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 3 : yabai -m window --space 3; yabai -m space --focus 3; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 4 : yabai -m window --space 4; yabai -m space --focus 4; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 5 : yabai -m window --space 5; yabai -m space --focus 5; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 6 : yabai -m window --space 6; yabai -m space --focus 6; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 7 : yabai -m window --space 7; yabai -m space --focus 7; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 8 : yabai -m window --space 8; yabai -m space --focus 8; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_space < 9 : yabai -m window --space 9; yabai -m space --focus 9; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" # move window to display - mode_window_move_display < 1 : yabai -m window --display 1; yabai -m window --focus recent; skhd -k "escape" - mode_window_move_display < 2 : yabai -m window --display 2; yabai -m window --focus recent; skhd -k "escape" - mode_window_move_display < 3 : yabai -m window --display 3; yabai -m window --focus recent; skhd -k "escape" - mode_window_move_display < 4 : yabai -m window --display 4; yabai -m window --focus recent; skhd -k "escape" + mode_window_move_display < 1 : yabai -m window --display 1; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_display < 2 : yabai -m window --display 2; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_display < 3 : yabai -m window --display 3; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_display < 4 : yabai -m window --display 4; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" # move window to next display or prev display - mode_window_move_display < p : yabai -m window --display prev; skhd -k "escape" - mode_window_move_display < n : yabai -m window --display next; skhd -k "escape" + mode_window_move_display < p : yabai -m window --display prev; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" + mode_window_move_display < n : yabai -m window --display next; yabai -m window --focus recent || yabai -m window --focus stack.recent; skhd -k "escape" # stack windows mode_window_stack < h : yabai -m window --stack west; skhd -k "escape" @@ -147,8 +148,9 @@ mode_space < b : yabai -m space --balance; skhd -k "escape" # recent space. - mode_space < tab : yabai -m space --focus recent; skhd -k "escape" - # mode_space < n : yabai -m space --focus recent; skhd -k "escape" + ralt - tab : yabai -m space --focus recent + mode_space < tab : yabai -m space --focus recent + # mode_space < n : yabai -m space --focus recent # next prev space. # mode_space < l: yabai -m space --focus next; skhd -k "escape" # mode_space < h : yabai -m space --focus prev; skhd -k "escape" @@ -168,6 +170,12 @@ mode_space < 8 : yabai -m space --focus 8; skhd -k "escape" mode_space < 9 : yabai -m space --focus 9; skhd -k "escape" + # shortcuts to focus space by index + ralt - 1 : yabai -m space --focus 1 + ralt - 2 : yabai -m space --focus 2 + ralt - 3 : yabai -m space --focus 3 + ralt - 4 : yabai -m space --focus 4 + # change space layout mode_space_arrange < s : yabai -m space --layout stack; skhd -k "escape"; ${bash} ${skhdDir}/notify.sh "Space layout" "Stack" mode_space_arrange < f : yabai -m space --layout float; skhd -k "escape"; ${bash} ${skhdDir}/notify.sh "Space layout" "Float" @@ -176,7 +184,7 @@ ## ========== manage display mode_display < r : yabai --restart-service; skhd -k "escape" # recent display - mode_display < tab : yabai -m display --focus recent; skhd -k "escape" + mode_display < tab : yabai -m display --focus recent # mode_display < n : yabai -m display --focus recent; skhd -k "escape" # next prev display mode_display < n : ${bash} ${skhdDir}/display_cycle_next.sh; skhd -k "escape" @@ -189,54 +197,24 @@ mode_display < 3 : yabai -m display --focus 3; skhd -k "escape" mode_display < 4 : yabai -m display --focus 4; skhd -k "escape" # >>>>>>> end display - ctrl+shift+alt - return : ${bash} ${skhdDir}/yabai_toggle_kitty.sh - ''; - - # ========== scripts - "skhd/yabai-focus-or-launch.sh".text = '' - #!${bashbin} - - set -x - let wid=$(yabai -m query --windows | jq "[.[] | select(.app == \"$1\") | .id][0]") - echo "$wid" + ### other utils - if [[ "$wid" -eq "0" ]] && [[ "$2" != "" ]]; then - $2 - else - yabai -m window --focus "$wid" - fi + ralt - a : ${bash} ${skhdDir}/focus-app.sh "Ghostty"; + ralt - s : ${bash} ${skhdDir}/focus-app.sh "Google Chrome"; + ralt - d : ${bash} ${skhdDir}/focus-app.sh "Cursor"; ''; - "skhd/yabai_toggle_kitty.sh".text = '' - #!/usr/bin/env bash - - APP="kitty" - WINDOW_TITLE="kitty" - WINDOW_ID=$(yabai -m query --windows | jq -e "map(select(.app==\"$APP\"))[0].id") - - if [[ -z "$WINDOW_ID" ]]; then - pgrep -x kitty >/dev/null && - kitty @ new-window --title "$WINDOW_TITLE" || - open -na ${pkgs.kitty}/bin/kitty --args --title "$WINDOW_TITLE" - fi - - WINDOW_ID=$(yabai -m query --windows | jq -e "map(select(.app==\"$APP\"))[0].id") - WINDOW_QUERY=$(yabai -m query --windows --window "$WINDOW_ID") - IS_MINIMIZED=$(echo "$WINDOW_QUERY" | jq '."is-minimized"') - IS_HIDDEN=$(echo "$WINDOW_QUERY" | jq '."is-hidden"') - # if current window is not WINDOW_ID, then set IS_HIDDEN to true - CURR_WINID=$(yabai -m query --windows --window | jq '.id') - if [[ "$CURR_WINID" != "$WINDOW_ID" ]]; then - IS_HIDDEN="true" - fi - CURRENT_SPACE=$(yabai -m query --spaces --space | jq '.index') - if [[ "''${IS_HIDDEN}" == "false" ]]; then - # minimize window - skhd -k "cmd - o" + # ========== scripts + "skhd/focus-app.sh".text = '' + #!${bashbin} + APP_NAME=$1 + set -x + wid=$(yabai -m query --windows | jq "[.[] | select(.app == \"$APP_NAME\") | .id][0]") + if [[ "$wid" -eq "0" ]]; then + echo "App not found" else - yabai -m window --focus "$WINDOW_ID" - yabai -m window "$WINDOW_ID" --space "$CURRENT_SPACE" --grid "20:20:1:1:18:18" + yabai -m window --focus "$wid" fi ''; @@ -315,5 +293,33 @@ yabai -m display --focus "''${prev_display_index}" ''; + + # focus the next window with the same app on different spaces and displays + # the app is selected by the current window's .app + # if no current win, just return. + "skhd/cycle-app.sh".text = '' + #!${bashbin} + + current_app=$(yabai -m query --windows --window | jq -r '.app') + current_app_id=$(yabai -m query --windows --window | jq -r '.id') + + if [[ -z "$current_app_id" ]]; then + echo "No current window" + return + fi + + # get all windows with the same app + windows=$(yabai -m query --windows | jq -r "[.[] | select(.app == \"$current_app\") | .id]") + # get the index of the current window + current_window_index=$(echo "$windows" | jq -r "index(\"$current_window_id\")") + # get the next window id + next_window_index=$((current_window_index + 1)) + # if the next window index is greater than the number of windows, wrap around + if ((next_window_index >= $(echo "$windows" | jq length))); then + next_window_index=0 + fi + # focus the next window by id + yabai -m window --focus $(echo "$windows" | jq -r ".[$next_window_index]") + ''; }; } diff --git a/nix/hm/yabai.nix b/nix/hm/yabai.nix index 0bf621d9..95d22967 100644 --- a/nix/hm/yabai.nix +++ b/nix/hm/yabai.nix @@ -47,9 +47,6 @@ # yabai -m config focus_follows_mouse autofocus # -- off autoraise autofocus ${yabai} -m config focus_follows_mouse off - # yabai -m config mouse_modifier fn - # yabai -m config mouse_action1 resize - # yabai -m config mouse_action2 move # -- window -- ${yabai} -m config window_placement second_child @@ -82,7 +79,8 @@ #-- rules -- ## see: https://github.com/koekeishiya/yabai/issues/1929 ${yabai} -m rule --add app=".*" sub-layer=normal - ${yabai} -m rule --add app="^(Safari|Firefox)$" space=web role=AXWindow subrole=AXStandardWindow + ${yabai} -m rule --add app="^(Safari|Firefox|Google Chrome)$" space=web role=AXWindow subrole=AXStandardWindow + ${yabai} -m rule --add app="^(Ghostty|Cursor)$" space=code role=AXWindow subrole=AXStandardWindow ${yabai} -m rule --add app="(System Preferences|系统偏好设置|系统设置|微信|wechat|短信|\.dmg)$" manage=off sub-layer=normal ${yabai} -m rule --add app="(微信|钉钉|Wechat|企业微信|Telegram|Numi|MenubarX)" manage=off sub-layer=normal ${yabai} -m rule --add app="(腾讯会议|快速会议|会议|Capacities|数码测色计|富途牛牛)" manage=off sub-layer=normal @@ -92,6 +90,8 @@ ${yabai} -m rule --add app="(Finder|访达|DevTools|模拟器|Kap|Bartender|TradingView)" manage=off sub-layer=normal ${yabai} -m rule --apply + ${yabai} -m signal --add event=window_destroyed active=yes action="yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse &> /dev/null || yabai -m window --focus \$(yabai -m query --windows --space | jq .[0].id) &> /dev/null" + ${yabai} -m signal --add event=window_minimized active=yes action="if \$(yabai -m query --windows --window \$YABAI_WINDOW_ID | jq -r '.\"is-floating\"'); then yabai -m query --windows --window &> /dev/null || yabai -m window --focus mouse &> /dev/null || yabai -m window --focus \$(yabai -m query --windows --space | jq .[0].id) &> /dev/null; fi" # stackline specific tweaks # yabai -m signal --add event=window_created action="~/.config/yabai/adjust-padding-for-stacked-windows.sh" @@ -103,7 +103,6 @@ # yabai -m signal --add label="flash_window_focus" event="window_focused" action="yabai -m window \$YABAI_WINDOW_ID --opacity 0.1 && sleep $(yabai -m config window_opacity_duration) && yabai -m window \$YABAI_WINDOW_ID --opacity 0.0" echo "yabai configuration loaded.." - ''; }; }