├── .gitignore ├── 2024-04-28.code-profile ├── README.md ├── Stylus June 18.json ├── config ├── bat │ ├── config │ └── themes │ │ └── tokyonight_night.tmTheme ├── btop │ ├── btop.conf │ ├── btop.log │ └── themes │ │ ├── catppuccin_frappe.theme │ │ ├── catppuccin_latte.theme │ │ ├── catppuccin_macchiato.theme │ │ ├── catppuccin_mocha.theme │ │ └── tokyo-night.theme ├── gh │ ├── config.yml │ └── hosts.yml ├── iterm2 │ └── AppSupport ├── karabiner │ ├── automatic_backups │ │ ├── karabiner_20230106.json │ │ ├── karabiner_20230220.json │ │ ├── karabiner_20230318.json │ │ ├── karabiner_20240122.json │ │ ├── karabiner_20240127.json │ │ ├── karabiner_20240220.json │ │ ├── karabiner_20240221.json │ │ ├── karabiner_20240224.json │ │ ├── karabiner_20240226.json │ │ ├── karabiner_20240229.json │ │ ├── karabiner_20240403.json │ │ └── karabiner_20240424.json │ └── karabiner.json ├── kitty │ ├── kitty.conf │ ├── scroll_mark.py │ ├── search.py │ └── tab_bar.disabled.py ├── linearmouse │ └── linearmouse.json ├── lvim │ ├── config.lua │ └── lua │ │ ├── emmet.lua │ │ ├── keymaps.lua │ │ ├── line.lua │ │ └── plugins.lua ├── nvim │ ├── .github │ │ ├── ISSUE_TEMPLATE │ │ │ └── bug_report.md │ │ ├── pull_request_template.md │ │ └── workflows │ │ │ └── stylua.yml │ ├── .gitignore │ ├── .stylua.toml │ ├── LICENSE.md │ ├── README.md │ ├── doc │ │ └── kickstart.txt │ ├── init.lua │ └── lua │ │ ├── custom │ │ └── plugins │ │ │ └── init.lua │ │ └── kickstart │ │ ├── health.lua │ │ └── plugins │ │ ├── autopairs.lua │ │ ├── debug.lua │ │ ├── gitsigns.lua │ │ ├── indent_line.lua │ │ ├── lint.lua │ │ └── neo-tree.lua ├── sketchybar │ ├── bar.lua │ ├── colors.lua │ ├── default.lua │ ├── helpers │ │ ├── .gitignore │ │ ├── app_icons.lua │ │ ├── default_font.lua │ │ ├── event_providers │ │ │ ├── cpu_load │ │ │ │ ├── cpu.h │ │ │ │ ├── cpu_load.c │ │ │ │ └── makefile │ │ │ ├── makefile │ │ │ ├── network_load │ │ │ │ ├── makefile │ │ │ │ ├── network.h │ │ │ │ └── network_load.c │ │ │ └── sketchybar.h │ │ ├── init.lua │ │ ├── install.sh │ │ ├── makefile │ │ └── menus │ │ │ ├── makefile │ │ │ └── menus.c │ ├── icons.lua │ ├── init.lua │ ├── items │ │ ├── apple.lua │ │ ├── calendar.lua │ │ ├── init.lua │ │ ├── media.lua │ │ ├── menus.lua │ │ ├── spaces.lua │ │ └── widgets │ │ │ ├── battery.lua │ │ │ ├── cpu.lua │ │ │ ├── init.lua │ │ │ ├── volume.lua │ │ │ └── wifi.lua │ ├── settings.lua │ └── sketchybarrc ├── skhd │ └── skhdrc ├── vscode │ └── custom.css ├── yabai │ └── yabairc ├── yazi │ └── init.lua └── zed │ ├── embeddings │ ├── preview │ │ ├── embeddings_db │ │ ├── embeddings_db-shm │ │ └── embeddings_db-wal │ ├── semantic-index-db.0.mdb │ │ ├── data.mdb │ │ └── lock.mdb │ └── stable │ │ ├── embeddings_db │ │ ├── embeddings_db-shm │ │ └── embeddings_db-wal │ ├── keymap.json │ ├── prompts │ ├── index.json │ └── prompts-library-db.0.mdb │ │ ├── data.mdb │ │ └── lock.mdb │ └── settings.json └── wallpaprs ├── 5XYEZY.heic ├── 8HYNiz.heic ├── IMYnFy.heic ├── IfIq5L.heic ├── KPmPiX.heic ├── Pvbr9B.heic ├── U8lPE5.heic ├── UPJaJW.heic ├── b8iUXV.heic ├── c1hXo4.heic ├── eKclO8.heic ├── ge9s7h.heic ├── jBfX2w.heic ├── rr9JtZ.heic ├── rz3Jnd.heic └── y1MXj8.heic /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .tmp* 3 | oh-my-zsh/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dotfiles for macOS 2 | 3 | Migrated to https://github.com/tnixc/nix-config 4 | -------------------------------------------------------------------------------- /config/bat/config: -------------------------------------------------------------------------------- 1 | --theme="tokyonight_night" 2 | -------------------------------------------------------------------------------- /config/btop/btop.conf: -------------------------------------------------------------------------------- 1 | #? Config file for btop v. 1.3.2 2 | 3 | #* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. 4 | #* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" 5 | color_theme = "/opt/homebrew/Cellar/btop/1.3.2/share/btop/themes/tokyo-night.theme" 6 | 7 | #* If the theme set background should be shown, set to False if you want terminal background transparency. 8 | theme_background = False 9 | 10 | #* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. 11 | truecolor = True 12 | 13 | #* Set to true to force tty mode regardless if a real tty has been detected or not. 14 | #* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. 15 | force_tty = False 16 | 17 | #* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. 18 | #* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. 19 | #* Use whitespace " " as separator between different presets. 20 | #* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" 21 | presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" 22 | 23 | #* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. 24 | #* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. 25 | vim_keys = False 26 | 27 | #* Rounded corners on boxes, is ignored if TTY mode is ON. 28 | rounded_corners = True 29 | 30 | #* Default symbols to use for graph creation, "braille", "block" or "tty". 31 | #* "braille" offers the highest resolution but might not be included in all fonts. 32 | #* "block" has half the resolution of braille but uses more common characters. 33 | #* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. 34 | #* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. 35 | graph_symbol = "braille" 36 | 37 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 38 | graph_symbol_cpu = "default" 39 | 40 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 41 | graph_symbol_mem = "default" 42 | 43 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 44 | graph_symbol_net = "default" 45 | 46 | # Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". 47 | graph_symbol_proc = "default" 48 | 49 | #* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace. 50 | shown_boxes = "cpu mem net proc" 51 | 52 | #* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. 53 | update_ms = 100 54 | 55 | #* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", 56 | #* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. 57 | proc_sorting = "cpu direct" 58 | 59 | #* Reverse sorting order, True or False. 60 | proc_reversed = False 61 | 62 | #* Show processes as a tree. 63 | proc_tree = False 64 | 65 | #* Use the cpu graph colors in the process list. 66 | proc_colors = True 67 | 68 | #* Use a darkening gradient in the process list. 69 | proc_gradient = True 70 | 71 | #* If process cpu usage should be of the core it's running on or usage of the total available cpu power. 72 | proc_per_core = True 73 | 74 | #* Show process memory as bytes instead of percent. 75 | proc_mem_bytes = True 76 | 77 | #* Show cpu graph for each process. 78 | proc_cpu_graphs = True 79 | 80 | #* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) 81 | proc_info_smaps = False 82 | 83 | #* Show proc box on left side of screen instead of right. 84 | proc_left = False 85 | 86 | #* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). 87 | proc_filter_kernel = False 88 | 89 | #* In tree-view, always accumulate child process resources in the parent process. 90 | proc_aggregate = False 91 | 92 | #* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. 93 | #* Select from a list of detected attributes from the options menu. 94 | cpu_graph_upper = "total" 95 | 96 | #* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. 97 | #* Select from a list of detected attributes from the options menu. 98 | cpu_graph_lower = "total" 99 | 100 | #* Toggles if the lower CPU graph should be inverted. 101 | cpu_invert_lower = True 102 | 103 | #* Set to True to completely disable the lower CPU graph. 104 | cpu_single_graph = False 105 | 106 | #* Show cpu box at bottom of screen instead of top. 107 | cpu_bottom = False 108 | 109 | #* Shows the system uptime in the CPU box. 110 | show_uptime = True 111 | 112 | #* Show cpu temperature. 113 | check_temp = True 114 | 115 | #* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. 116 | cpu_sensor = "Auto" 117 | 118 | #* Show temperatures for cpu cores also if check_temp is True and sensors has been found. 119 | show_coretemp = True 120 | 121 | #* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. 122 | #* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. 123 | #* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. 124 | #* Example: "4:0 5:1 6:3" 125 | cpu_core_map = "" 126 | 127 | #* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". 128 | temp_scale = "celsius" 129 | 130 | #* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. 131 | base_10_sizes = False 132 | 133 | #* Show CPU frequency. 134 | show_cpu_freq = True 135 | 136 | #* Draw a clock at top of screen, formatting according to strftime, empty string to disable. 137 | #* Special formatting: /host = hostname | /user = username | /uptime = system uptime 138 | clock_format = "%X" 139 | 140 | #* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. 141 | background_update = True 142 | 143 | #* Custom cpu model name, empty string to disable. 144 | custom_cpu_name = "" 145 | 146 | #* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". 147 | #* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user". 148 | disks_filter = "" 149 | 150 | #* Show graphs instead of meters for memory values. 151 | mem_graphs = True 152 | 153 | #* Show mem box below net box instead of above. 154 | mem_below_net = False 155 | 156 | #* Count ZFS ARC in cached and available memory. 157 | zfs_arc_cached = True 158 | 159 | #* If swap memory should be shown in memory box. 160 | show_swap = True 161 | 162 | #* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. 163 | swap_disk = True 164 | 165 | #* If mem box should be split to also show disks info. 166 | show_disks = False 167 | 168 | #* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. 169 | only_physical = True 170 | 171 | #* Read disks list from /etc/fstab. This also disables only_physical. 172 | use_fstab = True 173 | 174 | #* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) 175 | zfs_hide_datasets = False 176 | 177 | #* Set to true to show available disk space for privileged users. 178 | disk_free_priv = False 179 | 180 | #* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. 181 | show_io_stat = True 182 | 183 | #* Toggles io mode for disks, showing big graphs for disk read/write speeds. 184 | io_mode = False 185 | 186 | #* Set to True to show combined read/write io graphs in io mode. 187 | io_graph_combined = False 188 | 189 | #* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". 190 | #* Example: "/mnt/media:100 /:20 /boot:1". 191 | io_graph_speeds = "" 192 | 193 | #* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. 194 | net_download = 100 195 | 196 | net_upload = 100 197 | 198 | #* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. 199 | net_auto = True 200 | 201 | #* Sync the auto scaling for download and upload to whichever currently has the highest scale. 202 | net_sync = True 203 | 204 | #* Starts with the Network Interface specified here. 205 | net_iface = "" 206 | 207 | #* Show battery stats in top right if battery is present. 208 | show_battery = True 209 | 210 | #* Which battery to use if multiple are present. "Auto" for auto detection. 211 | selected_battery = "Auto" 212 | 213 | #* Show power stats of battery next to charge indicator. 214 | show_battery_watts = True 215 | 216 | #* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". 217 | #* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. 218 | log_level = "ERROR" 219 | -------------------------------------------------------------------------------- /config/btop/themes/catppuccin_frappe.theme: -------------------------------------------------------------------------------- 1 | theme[main_bg]="#303446" 2 | theme[main_fg]="#C6D0F5" 3 | theme[title]="#C6D0F5" 4 | theme[hi_fg]="#8CAAEE" 5 | theme[selected_bg]="#51576D" 6 | theme[selected_fg]="#8CAAEE" 7 | theme[inactive_fg]="#838BA7" 8 | theme[graph_text]="#F2D5CF" 9 | theme[meter_bg]="#51576D" 10 | theme[proc_misc]="#F2D5CF" 11 | theme[cpu_box]="#85C1DC" 12 | theme[mem_box]="#A6D189" 13 | theme[net_box]="#CA9EE6" 14 | theme[proc_box]="#EEBEBE" 15 | theme[div_line]="#737994" 16 | theme[temp_start]="#E5C890" 17 | theme[temp_mid]="#EF9F76" 18 | theme[temp_end]="#E78284" 19 | theme[cpu_start]="#85C1DC" 20 | theme[cpu_mid]="#99D1DB" 21 | theme[cpu_end]="#81C8BE" 22 | theme[free_start]="#81C8BE" 23 | theme[free_mid]="#81C8BE" 24 | theme[free_end]="#A6D189" 25 | theme[cached_start]="#F4B8E4" 26 | theme[cached_mid]="#F4B8E4" 27 | theme[cached_end]="#CA9EE6" 28 | theme[available_start]="#F2D5CF" 29 | theme[available_mid]="#EEBEBE" 30 | theme[available_end]="#EEBEBE" 31 | theme[used_start]="#EF9F76" 32 | theme[used_mid]="#EF9F76" 33 | theme[used_end]="#E78284" 34 | theme[download_start]="#BABBF1" 35 | theme[download_mid]="#BABBF1" 36 | theme[download_end]="#CA9EE6" 37 | theme[upload_start]="#BABBF1" 38 | theme[upload_mid]="#BABBF1" 39 | theme[upload_end]="#CA9EE6" 40 | theme[process_start]="#85C1DC" 41 | theme[process_mid]="#99D1DB" 42 | theme[process_end]="#81C8BE" 43 | -------------------------------------------------------------------------------- /config/btop/themes/catppuccin_latte.theme: -------------------------------------------------------------------------------- 1 | theme[main_bg]="#EFF1F5" 2 | theme[main_fg]="#4C4F69" 3 | theme[title]="#4C4F69" 4 | theme[hi_fg]="#1E66F5" 5 | theme[selected_bg]="#BCC0CC" 6 | theme[selected_fg]="#1E66F5" 7 | theme[inactive_fg]="#8C8FA1" 8 | theme[graph_text]="#DC8A78" 9 | theme[meter_bg]="#BCC0CC" 10 | theme[proc_misc]="#DC8A78" 11 | theme[cpu_box]="#209FB5" 12 | theme[mem_box]="#40A02B" 13 | theme[net_box]="#8839EF" 14 | theme[proc_box]="#DD7878" 15 | theme[div_line]="#9CA0B0" 16 | theme[temp_start]="#DF8E1D" 17 | theme[temp_mid]="#FE640B" 18 | theme[temp_end]="#D20F39" 19 | theme[cpu_start]="#209FB5" 20 | theme[cpu_mid]="#04A5E5" 21 | theme[cpu_end]="#179299" 22 | theme[free_start]="#179299" 23 | theme[free_mid]="#179299" 24 | theme[free_end]="#40A02B" 25 | theme[cached_start]="#EA76CB" 26 | theme[cached_mid]="#EA76CB" 27 | theme[cached_end]="#8839EF" 28 | theme[available_start]="#DC8A78" 29 | theme[available_mid]="#DD7878" 30 | theme[available_end]="#DD7878" 31 | theme[used_start]="#FE640B" 32 | theme[used_mid]="#FE640B" 33 | theme[used_end]="#D20F39" 34 | theme[download_start]="#7287FD" 35 | theme[download_mid]="#7287FD" 36 | theme[download_end]="#8839EF" 37 | theme[upload_start]="#7287FD" 38 | theme[upload_mid]="#7287FD" 39 | theme[upload_end]="#8839EF" 40 | theme[process_start]="#209FB5" 41 | theme[process_mid]="#04A5E5" 42 | theme[process_end]="#179299" 43 | -------------------------------------------------------------------------------- /config/btop/themes/catppuccin_macchiato.theme: -------------------------------------------------------------------------------- 1 | theme[main_bg]="#24273A" 2 | theme[main_fg]="#CAD3F5" 3 | theme[title]="#CAD3F5" 4 | theme[hi_fg]="#8AADF4" 5 | theme[selected_bg]="#494D64" 6 | theme[selected_fg]="#8AADF4" 7 | theme[inactive_fg]="#8087A2" 8 | theme[graph_text]="#F4DBD6" 9 | theme[meter_bg]="#494D64" 10 | theme[proc_misc]="#F4DBD6" 11 | theme[cpu_box]="#7DC4E4" 12 | theme[mem_box]="#A6DA95" 13 | theme[net_box]="#C6A0F6" 14 | theme[proc_box]="#F0C6C6" 15 | theme[div_line]="#6E738D" 16 | theme[temp_start]="#EED49F" 17 | theme[temp_mid]="#F5A97F" 18 | theme[temp_end]="#ED8796" 19 | theme[cpu_start]="#7DC4E4" 20 | theme[cpu_mid]="#91D7E3" 21 | theme[cpu_end]="#8BD5CA" 22 | theme[free_start]="#8BD5CA" 23 | theme[free_mid]="#8BD5CA" 24 | theme[free_end]="#A6DA95" 25 | theme[cached_start]="#F5BDE6" 26 | theme[cached_mid]="#F5BDE6" 27 | theme[cached_end]="#C6A0F6" 28 | theme[available_start]="#F4DBD6" 29 | theme[available_mid]="#F0C6C6" 30 | theme[available_end]="#F0C6C6" 31 | theme[used_start]="#F5A97F" 32 | theme[used_mid]="#F5A97F" 33 | theme[used_end]="#ED8796" 34 | theme[download_start]="#B7BDF8" 35 | theme[download_mid]="#B7BDF8" 36 | theme[download_end]="#C6A0F6" 37 | theme[upload_start]="#B7BDF8" 38 | theme[upload_mid]="#B7BDF8" 39 | theme[upload_end]="#C6A0F6" 40 | theme[process_start]="#7DC4E4" 41 | theme[process_mid]="#91D7E3" 42 | theme[process_end]="#8BD5CA" 43 | -------------------------------------------------------------------------------- /config/btop/themes/catppuccin_mocha.theme: -------------------------------------------------------------------------------- 1 | theme[main_bg]="#1E1E2E" 2 | theme[main_fg]="#CDD6F4" 3 | theme[title]="#CDD6F4" 4 | theme[hi_fg]="#89B4FA" 5 | theme[selected_bg]="#45475A" 6 | theme[selected_fg]="#89B4FA" 7 | theme[inactive_fg]="#7F849C" 8 | theme[graph_text]="#F5E0DC" 9 | theme[meter_bg]="#45475A" 10 | theme[proc_misc]="#F5E0DC" 11 | theme[cpu_box]="#74C7EC" 12 | theme[mem_box]="#A6E3A1" 13 | theme[net_box]="#CBA6F7" 14 | theme[proc_box]="#F2CDCD" 15 | theme[div_line]="#6C7086" 16 | theme[temp_start]="#F9E2AF" 17 | theme[temp_mid]="#FAB387" 18 | theme[temp_end]="#F38BA8" 19 | theme[cpu_start]="#74C7EC" 20 | theme[cpu_mid]="#89DCEB" 21 | theme[cpu_end]="#94E2D5" 22 | theme[free_start]="#94E2D5" 23 | theme[free_mid]="#94E2D5" 24 | theme[free_end]="#A6E3A1" 25 | theme[cached_start]="#F5C2E7" 26 | theme[cached_mid]="#F5C2E7" 27 | theme[cached_end]="#CBA6F7" 28 | theme[available_start]="#F5E0DC" 29 | theme[available_mid]="#F2CDCD" 30 | theme[available_end]="#F2CDCD" 31 | theme[used_start]="#FAB387" 32 | theme[used_mid]="#FAB387" 33 | theme[used_end]="#F38BA8" 34 | theme[download_start]="#B4BEFE" 35 | theme[download_mid]="#B4BEFE" 36 | theme[download_end]="#CBA6F7" 37 | theme[upload_start]="#B4BEFE" 38 | theme[upload_mid]="#B4BEFE" 39 | theme[upload_end]="#CBA6F7" 40 | theme[process_start]="#74C7EC" 41 | theme[process_mid]="#89DCEB" 42 | theme[process_end]="#94E2D5" 43 | -------------------------------------------------------------------------------- /config/btop/themes/tokyo-night.theme: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | btop-1.2.13.tar.gz: .../tokyo-night.theme | Fossies 10 | 11 | 12 | 13 | 14 | 15 | 16 |

"Fossies" - the Fresh Open Source Software Archive

17 |

Member "btop-1.2.13/themes/tokyo-night.theme" (6 Nov 2022, 1763 Bytes) of package /linux/misc/btop-1.2.13.tar.gz:

18 |
19 |
20 | As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. 21 | Alternatively you can here view or download the uninterpreted source code file. 22 | 23 |
24 |
25 |
    1 # Theme: tokyo-night
 26 |     2 # By: Pascal Jaeger
 27 |     3 
 28 |     4 # Main bg
 29 |     5 theme[main_bg]="#1a1b26"
 30 |     6 
 31 |     7 # Main text color
 32 |     8 theme[main_fg]="#cfc9c2"
 33 |     9 
 34 |    10 # Title color for boxes
 35 |    11 theme[title]="#cfc9c2"
 36 |    12 
 37 |    13 # Higlight color for keyboard shortcuts
 38 |    14 theme[hi_fg]="#7dcfff"
 39 |    15 
 40 |    16 # Background color of selected item in processes box
 41 |    17 theme[selected_bg]="#414868"
 42 |    18 
 43 |    19 # Foreground color of selected item in processes box
 44 |    20 theme[selected_fg]="#cfc9c2"
 45 |    21 
 46 |    22 # Color of inactive/disabled text
 47 |    23 theme[inactive_fg]="#565f89"
 48 |    24 
 49 |    25 # Misc colors for processes box including mini cpu graphs, details memory graph and details status text
 50 |    26 theme[proc_misc]="#7dcfff"
 51 |    27 
 52 |    28 # Cpu box outline color
 53 |    29 theme[cpu_box]="#565f89"
 54 |    30 
 55 |    31 # Memory/disks box outline color
 56 |    32 theme[mem_box]="#565f89"
 57 |    33 
 58 |    34 # Net up/down box outline color
 59 |    35 theme[net_box]="#565f89"
 60 |    36 
 61 |    37 # Processes box outline color
 62 |    38 theme[proc_box]="#565f89"
 63 |    39 
 64 |    40 # Box divider line and small boxes line color
 65 |    41 theme[div_line]="#565f89"
 66 |    42 
 67 |    43 # Temperature graph colors
 68 |    44 theme[temp_start]="#9ece6a"
 69 |    45 theme[temp_mid]="#e0af68"
 70 |    46 theme[temp_end]="#f7768e"
 71 |    47 
 72 |    48 # CPU graph colors
 73 |    49 theme[cpu_start]="#9ece6a"
 74 |    50 theme[cpu_mid]="#e0af68"
 75 |    51 theme[cpu_end]="#f7768e"
 76 |    52 
 77 |    53 # Mem/Disk free meter
 78 |    54 theme[free_start]="#9ece6a"
 79 |    55 theme[free_mid]="#e0af68"
 80 |    56 theme[free_end]="#f7768e"
 81 |    57 
 82 |    58 # Mem/Disk cached meter
 83 |    59 theme[cached_start]="#9ece6a"
 84 |    60 theme[cached_mid]="#e0af68"
 85 |    61 theme[cached_end]="#f7768e"
 86 |    62 
 87 |    63 # Mem/Disk available meter
 88 |    64 theme[available_start]="#9ece6a"
 89 |    65 theme[available_mid]="#e0af68"
 90 |    66 theme[available_end]="#f7768e"
 91 |    67 
 92 |    68 # Mem/Disk used meter
 93 |    69 theme[used_start]="#9ece6a"
 94 |    70 theme[used_mid]="#e0af68"
 95 |    71 theme[used_end]="#f7768e"
 96 |    72 
 97 |    73 # Download graph colors
 98 |    74 theme[download_start]="#9ece6a"
 99 |    75 theme[download_mid]="#e0af68"
100 |    76 theme[download_end]="#f7768e"
101 |    77 
102 |    78 # Upload graph colors
103 |    79 theme[upload_start]="#9ece6a"
104 |    80 theme[upload_mid]="#e0af68"
105 |    81 theme[upload_end]="#f7768e"
106 | 
107 | -------------------------------------------------------------------------------- /config/gh/config.yml: -------------------------------------------------------------------------------- 1 | # What protocol to use when performing git operations. Supported values: ssh, https 2 | git_protocol: https 3 | # What editor gh should run when creating issues, pull requests, etc. If blank, will refer to environment. 4 | editor: 5 | # When to interactively prompt. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled 6 | prompt: enabled 7 | # A pager program to send command output to, e.g. "less". Set the value to "cat" to disable the pager. 8 | pager: 9 | # Aliases allow you to create nicknames for gh commands 10 | aliases: 11 | co: pr checkout 12 | # The path to a unix socket through which send HTTP connections. If blank, HTTP traffic will be handled by net/http.DefaultTransport. 13 | http_unix_socket: 14 | # What web browser gh should use when opening URLs. If blank, will refer to environment. 15 | browser: 16 | version: "1" 17 | -------------------------------------------------------------------------------- /config/gh/hosts.yml: -------------------------------------------------------------------------------- 1 | github.com: 2 | user: Tnixc 3 | git_protocol: https 4 | users: 5 | Tnixc: 6 | git_protocol: https 7 | -------------------------------------------------------------------------------- /config/iterm2/AppSupport: -------------------------------------------------------------------------------- 1 | /Users/tnixc/Library/Application Support/iTerm2 -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20230106.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "check_for_updates_on_startup": true, 4 | "show_in_menu_bar": true, 5 | "show_profile_name_in_menu_bar": false, 6 | "unsafe_ui": false 7 | }, 8 | "profiles": [ 9 | { 10 | "complex_modifications": { 11 | "parameters": { 12 | "basic.simultaneous_threshold_milliseconds": 50, 13 | "basic.to_delayed_action_delay_milliseconds": 500, 14 | "basic.to_if_alone_timeout_milliseconds": 1000, 15 | "basic.to_if_held_down_threshold_milliseconds": 500, 16 | "mouse_motion_to_scroll.speed": 100 17 | }, 18 | "rules": [] 19 | }, 20 | "devices": [], 21 | "fn_function_keys": [ 22 | { 23 | "from": { 24 | "key_code": "f1" 25 | }, 26 | "to": [ 27 | { 28 | "consumer_key_code": "display_brightness_decrement" 29 | } 30 | ] 31 | }, 32 | { 33 | "from": { 34 | "key_code": "f2" 35 | }, 36 | "to": [ 37 | { 38 | "consumer_key_code": "display_brightness_increment" 39 | } 40 | ] 41 | }, 42 | { 43 | "from": { 44 | "key_code": "f3" 45 | }, 46 | "to": [ 47 | { 48 | "apple_vendor_keyboard_key_code": "mission_control" 49 | } 50 | ] 51 | }, 52 | { 53 | "from": { 54 | "key_code": "f4" 55 | }, 56 | "to": [ 57 | { 58 | "apple_vendor_keyboard_key_code": "spotlight" 59 | } 60 | ] 61 | }, 62 | { 63 | "from": { 64 | "key_code": "f5" 65 | }, 66 | "to": [ 67 | { 68 | "consumer_key_code": "dictation" 69 | } 70 | ] 71 | }, 72 | { 73 | "from": { 74 | "key_code": "f6" 75 | }, 76 | "to": [ 77 | { 78 | "key_code": "f6" 79 | } 80 | ] 81 | }, 82 | { 83 | "from": { 84 | "key_code": "f7" 85 | }, 86 | "to": [ 87 | { 88 | "consumer_key_code": "rewind" 89 | } 90 | ] 91 | }, 92 | { 93 | "from": { 94 | "key_code": "f8" 95 | }, 96 | "to": [ 97 | { 98 | "consumer_key_code": "play_or_pause" 99 | } 100 | ] 101 | }, 102 | { 103 | "from": { 104 | "key_code": "f9" 105 | }, 106 | "to": [ 107 | { 108 | "consumer_key_code": "fast_forward" 109 | } 110 | ] 111 | }, 112 | { 113 | "from": { 114 | "key_code": "f10" 115 | }, 116 | "to": [ 117 | { 118 | "consumer_key_code": "mute" 119 | } 120 | ] 121 | }, 122 | { 123 | "from": { 124 | "key_code": "f11" 125 | }, 126 | "to": [ 127 | { 128 | "consumer_key_code": "volume_decrement" 129 | } 130 | ] 131 | }, 132 | { 133 | "from": { 134 | "key_code": "f12" 135 | }, 136 | "to": [ 137 | { 138 | "consumer_key_code": "volume_increment" 139 | } 140 | ] 141 | } 142 | ], 143 | "name": "Default profile", 144 | "parameters": { 145 | "delay_milliseconds_before_open_device": 1000 146 | }, 147 | "selected": true, 148 | "simple_modifications": [], 149 | "virtual_hid_keyboard": { 150 | "country_code": 0, 151 | "indicate_sticky_modifier_keys_state": true, 152 | "mouse_key_xy_scale": 100 153 | } 154 | } 155 | ] 156 | } -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20230220.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "check_for_updates_on_startup": true, 4 | "show_in_menu_bar": true, 5 | "show_profile_name_in_menu_bar": false, 6 | "unsafe_ui": false 7 | }, 8 | "profiles": [ 9 | { 10 | "complex_modifications": { 11 | "parameters": { 12 | "basic.simultaneous_threshold_milliseconds": 50, 13 | "basic.to_delayed_action_delay_milliseconds": 500, 14 | "basic.to_if_alone_timeout_milliseconds": 1000, 15 | "basic.to_if_held_down_threshold_milliseconds": 500, 16 | "mouse_motion_to_scroll.speed": 100 17 | }, 18 | "rules": [] 19 | }, 20 | "devices": [], 21 | "fn_function_keys": [ 22 | { 23 | "from": { 24 | "key_code": "f1" 25 | }, 26 | "to": [ 27 | { 28 | "consumer_key_code": "display_brightness_decrement" 29 | } 30 | ] 31 | }, 32 | { 33 | "from": { 34 | "key_code": "f2" 35 | }, 36 | "to": [ 37 | { 38 | "consumer_key_code": "display_brightness_increment" 39 | } 40 | ] 41 | }, 42 | { 43 | "from": { 44 | "key_code": "f3" 45 | }, 46 | "to": [ 47 | { 48 | "apple_vendor_keyboard_key_code": "mission_control" 49 | } 50 | ] 51 | }, 52 | { 53 | "from": { 54 | "key_code": "f4" 55 | }, 56 | "to": [ 57 | { 58 | "apple_vendor_keyboard_key_code": "spotlight" 59 | } 60 | ] 61 | }, 62 | { 63 | "from": { 64 | "key_code": "f5" 65 | }, 66 | "to": [ 67 | { 68 | "consumer_key_code": "dictation" 69 | } 70 | ] 71 | }, 72 | { 73 | "from": { 74 | "key_code": "f6" 75 | }, 76 | "to": [ 77 | { 78 | "key_code": "f6" 79 | } 80 | ] 81 | }, 82 | { 83 | "from": { 84 | "key_code": "f7" 85 | }, 86 | "to": [ 87 | { 88 | "consumer_key_code": "rewind" 89 | } 90 | ] 91 | }, 92 | { 93 | "from": { 94 | "key_code": "f8" 95 | }, 96 | "to": [ 97 | { 98 | "consumer_key_code": "play_or_pause" 99 | } 100 | ] 101 | }, 102 | { 103 | "from": { 104 | "key_code": "f9" 105 | }, 106 | "to": [ 107 | { 108 | "consumer_key_code": "fast_forward" 109 | } 110 | ] 111 | }, 112 | { 113 | "from": { 114 | "key_code": "f10" 115 | }, 116 | "to": [ 117 | { 118 | "consumer_key_code": "mute" 119 | } 120 | ] 121 | }, 122 | { 123 | "from": { 124 | "key_code": "f11" 125 | }, 126 | "to": [ 127 | { 128 | "consumer_key_code": "volume_decrement" 129 | } 130 | ] 131 | }, 132 | { 133 | "from": { 134 | "key_code": "f12" 135 | }, 136 | "to": [ 137 | { 138 | "consumer_key_code": "volume_increment" 139 | } 140 | ] 141 | } 142 | ], 143 | "name": "Default profile", 144 | "parameters": { 145 | "delay_milliseconds_before_open_device": 1000 146 | }, 147 | "selected": true, 148 | "simple_modifications": [ 149 | { 150 | "from": { 151 | "key_code": "keypad_6" 152 | }, 153 | "to": [ 154 | { 155 | "key_code": "a" 156 | } 157 | ] 158 | } 159 | ], 160 | "virtual_hid_keyboard": { 161 | "country_code": 0, 162 | "indicate_sticky_modifier_keys_state": true, 163 | "mouse_key_xy_scale": 100 164 | } 165 | } 166 | ] 167 | } -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20230318.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "check_for_updates_on_startup": true, 4 | "show_in_menu_bar": true, 5 | "show_profile_name_in_menu_bar": false, 6 | "unsafe_ui": false 7 | }, 8 | "profiles": [ 9 | { 10 | "complex_modifications": { 11 | "parameters": { 12 | "basic.simultaneous_threshold_milliseconds": 50, 13 | "basic.to_delayed_action_delay_milliseconds": 500, 14 | "basic.to_if_alone_timeout_milliseconds": 1000, 15 | "basic.to_if_held_down_threshold_milliseconds": 500, 16 | "mouse_motion_to_scroll.speed": 100 17 | }, 18 | "rules": [] 19 | }, 20 | "devices": [], 21 | "fn_function_keys": [ 22 | { 23 | "from": { 24 | "key_code": "f1" 25 | }, 26 | "to": [ 27 | { 28 | "consumer_key_code": "display_brightness_decrement" 29 | } 30 | ] 31 | }, 32 | { 33 | "from": { 34 | "key_code": "f2" 35 | }, 36 | "to": [ 37 | { 38 | "consumer_key_code": "display_brightness_increment" 39 | } 40 | ] 41 | }, 42 | { 43 | "from": { 44 | "key_code": "f3" 45 | }, 46 | "to": [ 47 | { 48 | "apple_vendor_keyboard_key_code": "mission_control" 49 | } 50 | ] 51 | }, 52 | { 53 | "from": { 54 | "key_code": "f4" 55 | }, 56 | "to": [ 57 | { 58 | "apple_vendor_keyboard_key_code": "spotlight" 59 | } 60 | ] 61 | }, 62 | { 63 | "from": { 64 | "key_code": "f5" 65 | }, 66 | "to": [ 67 | { 68 | "consumer_key_code": "dictation" 69 | } 70 | ] 71 | }, 72 | { 73 | "from": { 74 | "key_code": "f6" 75 | }, 76 | "to": [ 77 | { 78 | "key_code": "f6" 79 | } 80 | ] 81 | }, 82 | { 83 | "from": { 84 | "key_code": "f7" 85 | }, 86 | "to": [ 87 | { 88 | "consumer_key_code": "rewind" 89 | } 90 | ] 91 | }, 92 | { 93 | "from": { 94 | "key_code": "f8" 95 | }, 96 | "to": [ 97 | { 98 | "consumer_key_code": "play_or_pause" 99 | } 100 | ] 101 | }, 102 | { 103 | "from": { 104 | "key_code": "f9" 105 | }, 106 | "to": [ 107 | { 108 | "consumer_key_code": "fast_forward" 109 | } 110 | ] 111 | }, 112 | { 113 | "from": { 114 | "key_code": "f10" 115 | }, 116 | "to": [ 117 | { 118 | "consumer_key_code": "mute" 119 | } 120 | ] 121 | }, 122 | { 123 | "from": { 124 | "key_code": "f11" 125 | }, 126 | "to": [ 127 | { 128 | "consumer_key_code": "volume_decrement" 129 | } 130 | ] 131 | }, 132 | { 133 | "from": { 134 | "key_code": "f12" 135 | }, 136 | "to": [ 137 | { 138 | "consumer_key_code": "volume_increment" 139 | } 140 | ] 141 | } 142 | ], 143 | "name": "Default profile", 144 | "parameters": { 145 | "delay_milliseconds_before_open_device": 1000 146 | }, 147 | "selected": true, 148 | "simple_modifications": [], 149 | "virtual_hid_keyboard": { 150 | "country_code": 0, 151 | "indicate_sticky_modifier_keys_state": true, 152 | "mouse_key_xy_scale": 100 153 | } 154 | } 155 | ] 156 | } -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20240122.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "check_for_updates_on_startup": true, 4 | "show_in_menu_bar": true, 5 | "show_profile_name_in_menu_bar": false, 6 | "unsafe_ui": false 7 | }, 8 | "profiles": [ 9 | { 10 | "complex_modifications": { 11 | "parameters": { 12 | "basic.simultaneous_threshold_milliseconds": 50, 13 | "basic.to_delayed_action_delay_milliseconds": 500, 14 | "basic.to_if_alone_timeout_milliseconds": 1000, 15 | "basic.to_if_held_down_threshold_milliseconds": 500, 16 | "mouse_motion_to_scroll.speed": 100 17 | }, 18 | "rules": [] 19 | }, 20 | "devices": [], 21 | "fn_function_keys": [ 22 | { 23 | "from": { 24 | "key_code": "f1" 25 | }, 26 | "to": [ 27 | { 28 | "consumer_key_code": "display_brightness_decrement" 29 | } 30 | ] 31 | }, 32 | { 33 | "from": { 34 | "key_code": "f2" 35 | }, 36 | "to": [ 37 | { 38 | "consumer_key_code": "display_brightness_increment" 39 | } 40 | ] 41 | }, 42 | { 43 | "from": { 44 | "key_code": "f3" 45 | }, 46 | "to": [ 47 | { 48 | "apple_vendor_keyboard_key_code": "mission_control" 49 | } 50 | ] 51 | }, 52 | { 53 | "from": { 54 | "key_code": "f4" 55 | }, 56 | "to": [ 57 | { 58 | "apple_vendor_keyboard_key_code": "spotlight" 59 | } 60 | ] 61 | }, 62 | { 63 | "from": { 64 | "key_code": "f5" 65 | }, 66 | "to": [ 67 | { 68 | "consumer_key_code": "dictation" 69 | } 70 | ] 71 | }, 72 | { 73 | "from": { 74 | "key_code": "f6" 75 | }, 76 | "to": [ 77 | { 78 | "key_code": "f6" 79 | } 80 | ] 81 | }, 82 | { 83 | "from": { 84 | "key_code": "f7" 85 | }, 86 | "to": [ 87 | { 88 | "consumer_key_code": "rewind" 89 | } 90 | ] 91 | }, 92 | { 93 | "from": { 94 | "key_code": "f8" 95 | }, 96 | "to": [ 97 | { 98 | "consumer_key_code": "play_or_pause" 99 | } 100 | ] 101 | }, 102 | { 103 | "from": { 104 | "key_code": "f9" 105 | }, 106 | "to": [ 107 | { 108 | "consumer_key_code": "fast_forward" 109 | } 110 | ] 111 | }, 112 | { 113 | "from": { 114 | "key_code": "f10" 115 | }, 116 | "to": [ 117 | { 118 | "consumer_key_code": "mute" 119 | } 120 | ] 121 | }, 122 | { 123 | "from": { 124 | "key_code": "f11" 125 | }, 126 | "to": [ 127 | { 128 | "consumer_key_code": "volume_decrement" 129 | } 130 | ] 131 | }, 132 | { 133 | "from": { 134 | "key_code": "f12" 135 | }, 136 | "to": [ 137 | { 138 | "consumer_key_code": "volume_increment" 139 | } 140 | ] 141 | } 142 | ], 143 | "name": "Default profile", 144 | "parameters": { 145 | "delay_milliseconds_before_open_device": 1000 146 | }, 147 | "selected": true, 148 | "simple_modifications": [ 149 | { 150 | "from": { 151 | "key_code": "f12" 152 | }, 153 | "to": [ 154 | { 155 | "consumer_key_code": "fast_forward" 156 | } 157 | ] 158 | } 159 | ], 160 | "virtual_hid_keyboard": { 161 | "country_code": 0, 162 | "indicate_sticky_modifier_keys_state": true, 163 | "mouse_key_xy_scale": 100 164 | } 165 | } 166 | ] 167 | } -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20240127.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "ask_for_confirmation_before_quitting": true, 4 | "check_for_updates_on_startup": true, 5 | "show_in_menu_bar": true, 6 | "show_profile_name_in_menu_bar": false, 7 | "unsafe_ui": false 8 | }, 9 | "profiles": [ 10 | { 11 | "complex_modifications": { 12 | "parameters": { 13 | "basic.simultaneous_threshold_milliseconds": 50, 14 | "basic.to_delayed_action_delay_milliseconds": 500, 15 | "basic.to_if_alone_timeout_milliseconds": 1000, 16 | "basic.to_if_held_down_threshold_milliseconds": 500, 17 | "mouse_motion_to_scroll.speed": 100 18 | }, 19 | "rules": [ 20 | { 21 | "description": "Change left_control+hjkl to arrow keys", 22 | "manipulators": [ 23 | { 24 | "from": { 25 | "key_code": "h", 26 | "modifiers": { 27 | "mandatory": [ 28 | "left_control" 29 | ], 30 | "optional": [ 31 | "any" 32 | ] 33 | } 34 | }, 35 | "to": [ 36 | { 37 | "key_code": "left_arrow" 38 | } 39 | ], 40 | "type": "basic" 41 | }, 42 | { 43 | "from": { 44 | "key_code": "j", 45 | "modifiers": { 46 | "mandatory": [ 47 | "left_control" 48 | ], 49 | "optional": [ 50 | "any" 51 | ] 52 | } 53 | }, 54 | "to": [ 55 | { 56 | "key_code": "down_arrow" 57 | } 58 | ], 59 | "type": "basic" 60 | }, 61 | { 62 | "from": { 63 | "key_code": "k", 64 | "modifiers": { 65 | "mandatory": [ 66 | "left_control" 67 | ], 68 | "optional": [ 69 | "any" 70 | ] 71 | } 72 | }, 73 | "to": [ 74 | { 75 | "key_code": "up_arrow" 76 | } 77 | ], 78 | "type": "basic" 79 | }, 80 | { 81 | "from": { 82 | "key_code": "l", 83 | "modifiers": { 84 | "mandatory": [ 85 | "left_control" 86 | ], 87 | "optional": [ 88 | "any" 89 | ] 90 | } 91 | }, 92 | "to": [ 93 | { 94 | "key_code": "right_arrow" 95 | } 96 | ], 97 | "type": "basic" 98 | } 99 | ] 100 | } 101 | ] 102 | }, 103 | "devices": [ 104 | { 105 | "disable_built_in_keyboard_if_exists": false, 106 | "fn_function_keys": [], 107 | "game_pad_swap_sticks": false, 108 | "identifiers": { 109 | "is_game_pad": false, 110 | "is_keyboard": true, 111 | "is_pointing_device": false, 112 | "product_id": 641, 113 | "vendor_id": 1452 114 | }, 115 | "ignore": false, 116 | "manipulate_caps_lock_led": true, 117 | "mouse_flip_horizontal_wheel": false, 118 | "mouse_flip_vertical_wheel": false, 119 | "mouse_flip_x": false, 120 | "mouse_flip_y": false, 121 | "mouse_swap_wheels": false, 122 | "mouse_swap_xy": false, 123 | "simple_modifications": [], 124 | "treat_as_built_in_keyboard": false 125 | }, 126 | { 127 | "disable_built_in_keyboard_if_exists": false, 128 | "fn_function_keys": [], 129 | "game_pad_swap_sticks": false, 130 | "identifiers": { 131 | "is_game_pad": false, 132 | "is_keyboard": false, 133 | "is_pointing_device": true, 134 | "product_id": 641, 135 | "vendor_id": 1452 136 | }, 137 | "ignore": true, 138 | "manipulate_caps_lock_led": false, 139 | "mouse_flip_horizontal_wheel": false, 140 | "mouse_flip_vertical_wheel": false, 141 | "mouse_flip_x": false, 142 | "mouse_flip_y": false, 143 | "mouse_swap_wheels": false, 144 | "mouse_swap_xy": false, 145 | "simple_modifications": [], 146 | "treat_as_built_in_keyboard": false 147 | } 148 | ], 149 | "fn_function_keys": [ 150 | { 151 | "from": { 152 | "key_code": "f1" 153 | }, 154 | "to": [ 155 | { 156 | "consumer_key_code": "display_brightness_decrement" 157 | } 158 | ] 159 | }, 160 | { 161 | "from": { 162 | "key_code": "f2" 163 | }, 164 | "to": [ 165 | { 166 | "consumer_key_code": "display_brightness_increment" 167 | } 168 | ] 169 | }, 170 | { 171 | "from": { 172 | "key_code": "f3" 173 | }, 174 | "to": [ 175 | { 176 | "apple_vendor_keyboard_key_code": "mission_control" 177 | } 178 | ] 179 | }, 180 | { 181 | "from": { 182 | "key_code": "f4" 183 | }, 184 | "to": [ 185 | { 186 | "apple_vendor_keyboard_key_code": "spotlight" 187 | } 188 | ] 189 | }, 190 | { 191 | "from": { 192 | "key_code": "f5" 193 | }, 194 | "to": [ 195 | { 196 | "consumer_key_code": "dictation" 197 | } 198 | ] 199 | }, 200 | { 201 | "from": { 202 | "key_code": "f6" 203 | }, 204 | "to": [ 205 | { 206 | "key_code": "f6" 207 | } 208 | ] 209 | }, 210 | { 211 | "from": { 212 | "key_code": "f7" 213 | }, 214 | "to": [ 215 | { 216 | "consumer_key_code": "rewind" 217 | } 218 | ] 219 | }, 220 | { 221 | "from": { 222 | "key_code": "f8" 223 | }, 224 | "to": [ 225 | { 226 | "consumer_key_code": "play_or_pause" 227 | } 228 | ] 229 | }, 230 | { 231 | "from": { 232 | "key_code": "f9" 233 | }, 234 | "to": [ 235 | { 236 | "consumer_key_code": "fast_forward" 237 | } 238 | ] 239 | }, 240 | { 241 | "from": { 242 | "key_code": "f10" 243 | }, 244 | "to": [ 245 | { 246 | "consumer_key_code": "mute" 247 | } 248 | ] 249 | }, 250 | { 251 | "from": { 252 | "key_code": "f11" 253 | }, 254 | "to": [ 255 | { 256 | "consumer_key_code": "volume_decrement" 257 | } 258 | ] 259 | }, 260 | { 261 | "from": { 262 | "key_code": "f12" 263 | }, 264 | "to": [ 265 | { 266 | "consumer_key_code": "volume_increment" 267 | } 268 | ] 269 | } 270 | ], 271 | "name": "Default profile", 272 | "parameters": { 273 | "delay_milliseconds_before_open_device": 1000 274 | }, 275 | "selected": true, 276 | "simple_modifications": [], 277 | "virtual_hid_keyboard": { 278 | "country_code": 0, 279 | "indicate_sticky_modifier_keys_state": true, 280 | "mouse_key_xy_scale": 100 281 | } 282 | } 283 | ] 284 | } -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20240220.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "ask_for_confirmation_before_quitting": true, 4 | "check_for_updates_on_startup": true, 5 | "show_in_menu_bar": true, 6 | "show_profile_name_in_menu_bar": false, 7 | "unsafe_ui": false 8 | }, 9 | "profiles": [ 10 | { 11 | "complex_modifications": { 12 | "parameters": { 13 | "basic.simultaneous_threshold_milliseconds": 50, 14 | "basic.to_delayed_action_delay_milliseconds": 500, 15 | "basic.to_if_alone_timeout_milliseconds": 1000, 16 | "basic.to_if_held_down_threshold_milliseconds": 500, 17 | "mouse_motion_to_scroll.speed": 100 18 | }, 19 | "rules": [ 20 | { 21 | "description": "Change left_control+hjkl to arrow keys", 22 | "manipulators": [ 23 | { 24 | "from": { 25 | "key_code": "h", 26 | "modifiers": { 27 | "mandatory": [ 28 | "left_control" 29 | ], 30 | "optional": [ 31 | "any" 32 | ] 33 | } 34 | }, 35 | "to": [ 36 | { 37 | "key_code": "left_arrow" 38 | } 39 | ], 40 | "type": "basic" 41 | }, 42 | { 43 | "from": { 44 | "key_code": "j", 45 | "modifiers": { 46 | "mandatory": [ 47 | "left_control" 48 | ], 49 | "optional": [ 50 | "any" 51 | ] 52 | } 53 | }, 54 | "to": [ 55 | { 56 | "key_code": "down_arrow" 57 | } 58 | ], 59 | "type": "basic" 60 | }, 61 | { 62 | "from": { 63 | "key_code": "k", 64 | "modifiers": { 65 | "mandatory": [ 66 | "left_control" 67 | ], 68 | "optional": [ 69 | "any" 70 | ] 71 | } 72 | }, 73 | "to": [ 74 | { 75 | "key_code": "up_arrow" 76 | } 77 | ], 78 | "type": "basic" 79 | }, 80 | { 81 | "from": { 82 | "key_code": "l", 83 | "modifiers": { 84 | "mandatory": [ 85 | "left_control" 86 | ], 87 | "optional": [ 88 | "any" 89 | ] 90 | } 91 | }, 92 | "to": [ 93 | { 94 | "key_code": "right_arrow" 95 | } 96 | ], 97 | "type": "basic" 98 | } 99 | ] 100 | } 101 | ] 102 | }, 103 | "devices": [ 104 | { 105 | "disable_built_in_keyboard_if_exists": false, 106 | "fn_function_keys": [], 107 | "game_pad_swap_sticks": false, 108 | "identifiers": { 109 | "is_game_pad": false, 110 | "is_keyboard": true, 111 | "is_pointing_device": false, 112 | "product_id": 641, 113 | "vendor_id": 1452 114 | }, 115 | "ignore": false, 116 | "manipulate_caps_lock_led": true, 117 | "mouse_flip_horizontal_wheel": false, 118 | "mouse_flip_vertical_wheel": false, 119 | "mouse_flip_x": false, 120 | "mouse_flip_y": false, 121 | "mouse_swap_wheels": false, 122 | "mouse_swap_xy": false, 123 | "simple_modifications": [], 124 | "treat_as_built_in_keyboard": false 125 | }, 126 | { 127 | "disable_built_in_keyboard_if_exists": false, 128 | "fn_function_keys": [], 129 | "game_pad_swap_sticks": false, 130 | "identifiers": { 131 | "is_game_pad": false, 132 | "is_keyboard": false, 133 | "is_pointing_device": true, 134 | "product_id": 641, 135 | "vendor_id": 1452 136 | }, 137 | "ignore": true, 138 | "manipulate_caps_lock_led": false, 139 | "mouse_flip_horizontal_wheel": false, 140 | "mouse_flip_vertical_wheel": false, 141 | "mouse_flip_x": false, 142 | "mouse_flip_y": false, 143 | "mouse_swap_wheels": false, 144 | "mouse_swap_xy": false, 145 | "simple_modifications": [], 146 | "treat_as_built_in_keyboard": false 147 | } 148 | ], 149 | "fn_function_keys": [ 150 | { 151 | "from": { 152 | "key_code": "f1" 153 | }, 154 | "to": [ 155 | { 156 | "consumer_key_code": "display_brightness_decrement" 157 | } 158 | ] 159 | }, 160 | { 161 | "from": { 162 | "key_code": "f2" 163 | }, 164 | "to": [ 165 | { 166 | "consumer_key_code": "display_brightness_increment" 167 | } 168 | ] 169 | }, 170 | { 171 | "from": { 172 | "key_code": "f3" 173 | }, 174 | "to": [ 175 | { 176 | "apple_vendor_keyboard_key_code": "mission_control" 177 | } 178 | ] 179 | }, 180 | { 181 | "from": { 182 | "key_code": "f4" 183 | }, 184 | "to": [ 185 | { 186 | "apple_vendor_keyboard_key_code": "spotlight" 187 | } 188 | ] 189 | }, 190 | { 191 | "from": { 192 | "key_code": "f5" 193 | }, 194 | "to": [ 195 | { 196 | "consumer_key_code": "dictation" 197 | } 198 | ] 199 | }, 200 | { 201 | "from": { 202 | "key_code": "f6" 203 | }, 204 | "to": [ 205 | { 206 | "key_code": "f6" 207 | } 208 | ] 209 | }, 210 | { 211 | "from": { 212 | "key_code": "f7" 213 | }, 214 | "to": [ 215 | { 216 | "consumer_key_code": "rewind" 217 | } 218 | ] 219 | }, 220 | { 221 | "from": { 222 | "key_code": "f8" 223 | }, 224 | "to": [ 225 | { 226 | "consumer_key_code": "play_or_pause" 227 | } 228 | ] 229 | }, 230 | { 231 | "from": { 232 | "key_code": "f9" 233 | }, 234 | "to": [ 235 | { 236 | "consumer_key_code": "fast_forward" 237 | } 238 | ] 239 | }, 240 | { 241 | "from": { 242 | "key_code": "f10" 243 | }, 244 | "to": [ 245 | { 246 | "consumer_key_code": "mute" 247 | } 248 | ] 249 | }, 250 | { 251 | "from": { 252 | "key_code": "f11" 253 | }, 254 | "to": [ 255 | { 256 | "consumer_key_code": "volume_decrement" 257 | } 258 | ] 259 | }, 260 | { 261 | "from": { 262 | "key_code": "f12" 263 | }, 264 | "to": [ 265 | { 266 | "consumer_key_code": "volume_increment" 267 | } 268 | ] 269 | } 270 | ], 271 | "name": "Default profile", 272 | "parameters": { 273 | "delay_milliseconds_before_open_device": 1000 274 | }, 275 | "selected": true, 276 | "simple_modifications": [], 277 | "virtual_hid_keyboard": { 278 | "country_code": 0, 279 | "indicate_sticky_modifier_keys_state": true, 280 | "mouse_key_xy_scale": 100 281 | } 282 | } 283 | ] 284 | } -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20240221.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "ask_for_confirmation_before_quitting": true, 4 | "check_for_updates_on_startup": true, 5 | "show_in_menu_bar": true, 6 | "show_profile_name_in_menu_bar": false, 7 | "unsafe_ui": false 8 | }, 9 | "profiles": [ 10 | { 11 | "complex_modifications": { 12 | "parameters": { 13 | "basic.simultaneous_threshold_milliseconds": 50, 14 | "basic.to_delayed_action_delay_milliseconds": 500, 15 | "basic.to_if_alone_timeout_milliseconds": 1000, 16 | "basic.to_if_held_down_threshold_milliseconds": 500, 17 | "mouse_motion_to_scroll.speed": 100 18 | }, 19 | "rules": [] 20 | }, 21 | "devices": [ 22 | { 23 | "disable_built_in_keyboard_if_exists": false, 24 | "fn_function_keys": [], 25 | "game_pad_swap_sticks": false, 26 | "identifiers": { 27 | "is_game_pad": false, 28 | "is_keyboard": true, 29 | "is_pointing_device": false, 30 | "product_id": 641, 31 | "vendor_id": 1452 32 | }, 33 | "ignore": false, 34 | "manipulate_caps_lock_led": true, 35 | "mouse_flip_horizontal_wheel": false, 36 | "mouse_flip_vertical_wheel": false, 37 | "mouse_flip_x": false, 38 | "mouse_flip_y": false, 39 | "mouse_swap_wheels": false, 40 | "mouse_swap_xy": false, 41 | "simple_modifications": [], 42 | "treat_as_built_in_keyboard": false 43 | }, 44 | { 45 | "disable_built_in_keyboard_if_exists": false, 46 | "fn_function_keys": [], 47 | "game_pad_swap_sticks": false, 48 | "identifiers": { 49 | "is_game_pad": false, 50 | "is_keyboard": false, 51 | "is_pointing_device": true, 52 | "product_id": 641, 53 | "vendor_id": 1452 54 | }, 55 | "ignore": true, 56 | "manipulate_caps_lock_led": false, 57 | "mouse_flip_horizontal_wheel": false, 58 | "mouse_flip_vertical_wheel": false, 59 | "mouse_flip_x": false, 60 | "mouse_flip_y": false, 61 | "mouse_swap_wheels": false, 62 | "mouse_swap_xy": false, 63 | "simple_modifications": [], 64 | "treat_as_built_in_keyboard": false 65 | } 66 | ], 67 | "fn_function_keys": [ 68 | { 69 | "from": { 70 | "key_code": "f1" 71 | }, 72 | "to": [ 73 | { 74 | "consumer_key_code": "display_brightness_decrement" 75 | } 76 | ] 77 | }, 78 | { 79 | "from": { 80 | "key_code": "f2" 81 | }, 82 | "to": [ 83 | { 84 | "consumer_key_code": "display_brightness_increment" 85 | } 86 | ] 87 | }, 88 | { 89 | "from": { 90 | "key_code": "f3" 91 | }, 92 | "to": [ 93 | { 94 | "apple_vendor_keyboard_key_code": "mission_control" 95 | } 96 | ] 97 | }, 98 | { 99 | "from": { 100 | "key_code": "f4" 101 | }, 102 | "to": [ 103 | { 104 | "apple_vendor_keyboard_key_code": "spotlight" 105 | } 106 | ] 107 | }, 108 | { 109 | "from": { 110 | "key_code": "f5" 111 | }, 112 | "to": [ 113 | { 114 | "consumer_key_code": "dictation" 115 | } 116 | ] 117 | }, 118 | { 119 | "from": { 120 | "key_code": "f6" 121 | }, 122 | "to": [ 123 | { 124 | "key_code": "f6" 125 | } 126 | ] 127 | }, 128 | { 129 | "from": { 130 | "key_code": "f7" 131 | }, 132 | "to": [ 133 | { 134 | "consumer_key_code": "rewind" 135 | } 136 | ] 137 | }, 138 | { 139 | "from": { 140 | "key_code": "f8" 141 | }, 142 | "to": [ 143 | { 144 | "consumer_key_code": "play_or_pause" 145 | } 146 | ] 147 | }, 148 | { 149 | "from": { 150 | "key_code": "f9" 151 | }, 152 | "to": [ 153 | { 154 | "consumer_key_code": "fast_forward" 155 | } 156 | ] 157 | }, 158 | { 159 | "from": { 160 | "key_code": "f10" 161 | }, 162 | "to": [ 163 | { 164 | "consumer_key_code": "mute" 165 | } 166 | ] 167 | }, 168 | { 169 | "from": { 170 | "key_code": "f11" 171 | }, 172 | "to": [ 173 | { 174 | "consumer_key_code": "volume_decrement" 175 | } 176 | ] 177 | }, 178 | { 179 | "from": { 180 | "key_code": "f12" 181 | }, 182 | "to": [ 183 | { 184 | "consumer_key_code": "volume_increment" 185 | } 186 | ] 187 | } 188 | ], 189 | "name": "Default profile", 190 | "parameters": { 191 | "delay_milliseconds_before_open_device": 1000 192 | }, 193 | "selected": true, 194 | "simple_modifications": [], 195 | "virtual_hid_keyboard": { 196 | "country_code": 0, 197 | "indicate_sticky_modifier_keys_state": true, 198 | "mouse_key_xy_scale": 100 199 | } 200 | } 201 | ] 202 | } -------------------------------------------------------------------------------- /config/karabiner/automatic_backups/karabiner_20240224.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "ask_for_confirmation_before_quitting": true, 4 | "check_for_updates_on_startup": true, 5 | "show_in_menu_bar": true, 6 | "show_profile_name_in_menu_bar": false, 7 | "unsafe_ui": false 8 | }, 9 | "profiles": [ 10 | { 11 | "complex_modifications": { 12 | "parameters": { 13 | "basic.simultaneous_threshold_milliseconds": 50, 14 | "basic.to_delayed_action_delay_milliseconds": 500, 15 | "basic.to_if_alone_timeout_milliseconds": 1000, 16 | "basic.to_if_held_down_threshold_milliseconds": 500, 17 | "mouse_motion_to_scroll.speed": 100 18 | }, 19 | "rules": [ 20 | { 21 | "description": "Change left_control+hjkl to arrow keys", 22 | "manipulators": [ 23 | { 24 | "from": { 25 | "key_code": "h", 26 | "modifiers": { 27 | "mandatory": [ 28 | "left_control" 29 | ], 30 | "optional": [ 31 | "any" 32 | ] 33 | } 34 | }, 35 | "to": [ 36 | { 37 | "key_code": "left_arrow" 38 | } 39 | ], 40 | "type": "basic" 41 | }, 42 | { 43 | "from": { 44 | "key_code": "j", 45 | "modifiers": { 46 | "mandatory": [ 47 | "left_control" 48 | ], 49 | "optional": [ 50 | "any" 51 | ] 52 | } 53 | }, 54 | "to": [ 55 | { 56 | "key_code": "down_arrow" 57 | } 58 | ], 59 | "type": "basic" 60 | }, 61 | { 62 | "from": { 63 | "key_code": "k", 64 | "modifiers": { 65 | "mandatory": [ 66 | "left_control" 67 | ], 68 | "optional": [ 69 | "any" 70 | ] 71 | } 72 | }, 73 | "to": [ 74 | { 75 | "key_code": "up_arrow" 76 | } 77 | ], 78 | "type": "basic" 79 | }, 80 | { 81 | "from": { 82 | "key_code": "l", 83 | "modifiers": { 84 | "mandatory": [ 85 | "left_control" 86 | ], 87 | "optional": [ 88 | "any" 89 | ] 90 | } 91 | }, 92 | "to": [ 93 | { 94 | "key_code": "right_arrow" 95 | } 96 | ], 97 | "type": "basic" 98 | } 99 | ] 100 | } 101 | ] 102 | }, 103 | "devices": [ 104 | { 105 | "disable_built_in_keyboard_if_exists": false, 106 | "fn_function_keys": [], 107 | "game_pad_swap_sticks": false, 108 | "identifiers": { 109 | "is_game_pad": false, 110 | "is_keyboard": true, 111 | "is_pointing_device": false, 112 | "product_id": 641, 113 | "vendor_id": 1452 114 | }, 115 | "ignore": false, 116 | "manipulate_caps_lock_led": true, 117 | "mouse_flip_horizontal_wheel": false, 118 | "mouse_flip_vertical_wheel": false, 119 | "mouse_flip_x": false, 120 | "mouse_flip_y": false, 121 | "mouse_swap_wheels": false, 122 | "mouse_swap_xy": false, 123 | "simple_modifications": [], 124 | "treat_as_built_in_keyboard": false 125 | }, 126 | { 127 | "disable_built_in_keyboard_if_exists": false, 128 | "fn_function_keys": [], 129 | "game_pad_swap_sticks": false, 130 | "identifiers": { 131 | "is_game_pad": false, 132 | "is_keyboard": false, 133 | "is_pointing_device": true, 134 | "product_id": 641, 135 | "vendor_id": 1452 136 | }, 137 | "ignore": true, 138 | "manipulate_caps_lock_led": false, 139 | "mouse_flip_horizontal_wheel": false, 140 | "mouse_flip_vertical_wheel": false, 141 | "mouse_flip_x": false, 142 | "mouse_flip_y": false, 143 | "mouse_swap_wheels": false, 144 | "mouse_swap_xy": false, 145 | "simple_modifications": [], 146 | "treat_as_built_in_keyboard": false 147 | } 148 | ], 149 | "fn_function_keys": [ 150 | { 151 | "from": { 152 | "key_code": "f1" 153 | }, 154 | "to": [ 155 | { 156 | "consumer_key_code": "display_brightness_decrement" 157 | } 158 | ] 159 | }, 160 | { 161 | "from": { 162 | "key_code": "f2" 163 | }, 164 | "to": [ 165 | { 166 | "consumer_key_code": "display_brightness_increment" 167 | } 168 | ] 169 | }, 170 | { 171 | "from": { 172 | "key_code": "f3" 173 | }, 174 | "to": [ 175 | { 176 | "apple_vendor_keyboard_key_code": "mission_control" 177 | } 178 | ] 179 | }, 180 | { 181 | "from": { 182 | "key_code": "f4" 183 | }, 184 | "to": [ 185 | { 186 | "apple_vendor_keyboard_key_code": "spotlight" 187 | } 188 | ] 189 | }, 190 | { 191 | "from": { 192 | "key_code": "f5" 193 | }, 194 | "to": [ 195 | { 196 | "consumer_key_code": "dictation" 197 | } 198 | ] 199 | }, 200 | { 201 | "from": { 202 | "key_code": "f6" 203 | }, 204 | "to": [ 205 | { 206 | "key_code": "f6" 207 | } 208 | ] 209 | }, 210 | { 211 | "from": { 212 | "key_code": "f7" 213 | }, 214 | "to": [ 215 | { 216 | "consumer_key_code": "rewind" 217 | } 218 | ] 219 | }, 220 | { 221 | "from": { 222 | "key_code": "f8" 223 | }, 224 | "to": [ 225 | { 226 | "consumer_key_code": "play_or_pause" 227 | } 228 | ] 229 | }, 230 | { 231 | "from": { 232 | "key_code": "f9" 233 | }, 234 | "to": [ 235 | { 236 | "consumer_key_code": "fast_forward" 237 | } 238 | ] 239 | }, 240 | { 241 | "from": { 242 | "key_code": "f10" 243 | }, 244 | "to": [ 245 | { 246 | "consumer_key_code": "mute" 247 | } 248 | ] 249 | }, 250 | { 251 | "from": { 252 | "key_code": "f11" 253 | }, 254 | "to": [ 255 | { 256 | "consumer_key_code": "volume_decrement" 257 | } 258 | ] 259 | }, 260 | { 261 | "from": { 262 | "key_code": "f12" 263 | }, 264 | "to": [ 265 | { 266 | "consumer_key_code": "volume_increment" 267 | } 268 | ] 269 | } 270 | ], 271 | "name": "Default profile", 272 | "parameters": { 273 | "delay_milliseconds_before_open_device": 1000 274 | }, 275 | "selected": true, 276 | "simple_modifications": [], 277 | "virtual_hid_keyboard": { 278 | "country_code": 0, 279 | "indicate_sticky_modifier_keys_state": true, 280 | "mouse_key_xy_scale": 100 281 | } 282 | } 283 | ] 284 | } -------------------------------------------------------------------------------- /config/kitty/kitty.conf: -------------------------------------------------------------------------------- 1 | url_style straight 2 | 3 | selection_foreground none 4 | 5 | inactive_tab_font_style normal 6 | active_tab_font_style bold 7 | 8 | tab_bar_edge bottom 9 | tab_bar_align left 10 | tab_bar_style powerline 11 | tab_powerline_style slanted 12 | tab_bar_min_tabs 2 13 | tab_activity_symbol none 14 | tab_separator "/" 15 | bell_on_tab no 16 | active_tab_font_style bold 17 | 18 | tab_title_max_length 40 19 | 20 | window_padding_width 12 21 | window_padding_height 2 22 | 23 | 24 | hide_window_decorations titlebar-only 25 | 26 | font_size 14.0 27 | font_family BerkeleyMono Nerd Font 28 | modify_font underline_thickness 100% 29 | modify_font underline_position 3 30 | modify_font baseline 0.5 31 | modify_font cell_height 130% 32 | 33 | cursor_shape underline 34 | 35 | editor /run/current-system/sw/bin/nvim 36 | shell /bin/zsh 37 | 38 | macos_option_as_alt yes 39 | macos_colorspace displayp3 40 | 41 | mouse_map cmd+click open_url 42 | 43 | # Map tab keys 1-9 44 | map cmd+1 goto_tab 1 45 | map cmd+2 goto_tab 2 46 | map cmd+3 goto_tab 3 47 | map cmd+4 goto_tab 4 48 | map cmd+5 goto_tab 5 49 | map cmd+6 goto_tab 6 50 | map cmd+7 goto_tab 7 51 | map cmd+8 goto_tab 8 52 | map cmd+9 goto_tab 9 53 | 54 | map cmd+f launch --location=hsplit --allow-remote-control kitty +kitten search.py @active-kitty-window-id 55 | 56 | # The basic colors 57 | foreground #BECAF9 58 | background #24273A 59 | background_opacity 0.9 60 | background_blur 16 61 | selection_foreground #24273A 62 | selection_background #FFBE91 63 | 64 | # Cursor colors 65 | cursor #FFBE91 66 | cursor_text_color #24273A 67 | 68 | # URL underline color when hovering with mouse 69 | url_color #FFBE91 70 | 71 | # Kitty window border colors 72 | active_border_color #98A4F5 73 | inactive_border_color #6E738D 74 | bell_border_color #E9AD5B 75 | 76 | # OS Window titlebar colors 77 | wayland_titlebar_color #24273A 78 | macos_titlebar_color #24273A 79 | 80 | # Tab bar colors 81 | active_tab_foreground #181926 82 | active_tab_background #6EA3FE 83 | inactive_tab_foreground #BECAF9 84 | inactive_tab_background #1e2030 85 | tab_bar_background #181926 86 | 87 | # Colors for marks (marked text in the terminal) 88 | mark1_foreground #24273A 89 | mark1_background #98A4F5 90 | mark2_foreground #24273A 91 | mark2_background #C198FD 92 | mark3_foreground #24273A 93 | mark3_background #5ED2FF 94 | 95 | # The 16 terminal colors 96 | 97 | # black 98 | color0 #494D64 99 | color8 #5B6078 100 | 101 | # red 102 | color1 #FF6C8D 103 | color9 #FF6C8D 104 | 105 | # green 106 | color2 #90D05A 107 | color10 #90D05A 108 | 109 | # yellow 110 | color3 #E9AD5B 111 | color11 #E9AD5B 112 | 113 | # blue 114 | color4 #6EA3FE 115 | color12 #6EA3FE 116 | 117 | # magenta 118 | color5 #F0AADD 119 | color13 #F0AADD 120 | 121 | # cyan 122 | color6 #41DDCA 123 | color14 #41DDCA 124 | 125 | # white 126 | color7 #B5C9FF 127 | color15 #AABBE3 128 | -------------------------------------------------------------------------------- /config/kitty/scroll_mark.py: -------------------------------------------------------------------------------- 1 | from kittens.tui.handler import result_handler 2 | from kitty.boss import Boss 3 | 4 | 5 | def main(args: list[str]) -> None: 6 | pass 7 | 8 | 9 | @result_handler(no_ui=True) 10 | def handle_result( 11 | args: list[str], answer: str, target_window_id: int, boss: Boss 12 | ) -> None: 13 | w = boss.window_id_map.get(target_window_id) 14 | if w is not None: 15 | if len(args) > 1 and args[1] != "prev": 16 | w.scroll_to_mark(prev=False) 17 | else: 18 | w.scroll_to_mark() 19 | -------------------------------------------------------------------------------- /config/kitty/tab_bar.disabled.py: -------------------------------------------------------------------------------- 1 | # pyright: reportMissingImports=false 2 | from datetime import datetime 3 | from pathlib import Path 4 | from kitty.boss import get_boss 5 | from kitty.fast_data_types import Screen, add_timer, get_options 6 | from kitty.utils import color_as_int 7 | from kitty.tab_bar import ( 8 | DrawData, 9 | ExtraData, 10 | Formatter, 11 | TabBarData, 12 | as_rgb, 13 | draw_attributed_string, draw_title, 14 | ) 15 | 16 | opts = get_options() # --------------------------------------------⮯ 17 | # --------------------------------------------------------------\ 18 | # black | red green blue magenta cyan white | color 19 | # color0 | color1 color2 color4 color5 color6 color7 | normal 20 | # color8 | color9 color10 color12 color13 color14 color15 | bright 21 | # --------------------------------------------------------------/ 22 | FG = as_rgb(color_as_int(opts.background)) 23 | BG = as_rgb(color_as_int(opts.color4)) 24 | BAR_BG = as_rgb(color_as_int(opts.tab_bar_background)) 25 | ACTIVE_BG = as_rgb(color_as_int(opts.active_tab_background)) 26 | SEPARATOR_SYMBOL, SOFT_SEPARATOR_SYMBOL = ("", "") 27 | SEPARATOR_SYMBOL_RIGHT = "" 28 | TRUNCATION_SYMBOL = "/⟜⊸/" 29 | ICON, ICON_CAL, ICON_TIME, ICON_DIR = (" 􀆔 ", " 􀉉 ", " 􀐫 ", " 􀈖 ") 30 | RIGHT_MARGIN = -3 31 | REFRESH_TIME = 1 32 | right_status_length = -1 33 | 34 | 35 | def _draw_icon(screen: Screen, index: int) -> int: 36 | if index != 1: 37 | return 0 38 | fg, bg = screen.cursor.fg, screen.cursor.bg 39 | screen.cursor.fg, screen.cursor.bg = FG, BG 40 | screen.draw(ICON) 41 | screen.cursor.fg, screen.cursor.bg = BG, bg 42 | screen.draw(SEPARATOR_SYMBOL) 43 | screen.cursor.fg, screen.cursor.bg = fg, bg 44 | screen.cursor.x = len(ICON) 45 | return screen.cursor.x 46 | 47 | def _draw_left_status( 48 | draw_data: DrawData, 49 | screen: Screen, 50 | tab: TabBarData, 51 | index: int, 52 | extra_data: ExtraData, 53 | ) -> int: 54 | if screen.cursor.x >= screen.columns - right_status_length: 55 | return screen.cursor.x 56 | tab_bg, tab_fg = screen.cursor.bg, screen.cursor.fg 57 | if index == 1: 58 | screen.cursor.fg, screen.cursor.bg = tab_bg, BAR_BG 59 | screen.draw(SEPARATOR_SYMBOL_RIGHT) 60 | screen.cursor.bg = tab_bg 61 | default_bg = as_rgb(int(draw_data.default_bg)) 62 | if extra_data.next_tab: 63 | next_tab_bg = as_rgb(draw_data.tab_bg(extra_data.next_tab)) 64 | needs_soft_separator = next_tab_bg == tab_bg 65 | else: 66 | next_tab_bg = default_bg 67 | needs_soft_separator = False 68 | if screen.cursor.x <= len(ICON): 69 | screen.cursor.x = len(ICON) 70 | screen.draw(" ") 71 | screen.cursor.bg = tab_bg 72 | draw_title(draw_data, screen, tab, index) 73 | if not needs_soft_separator: 74 | screen.draw(" ") 75 | screen.cursor.fg = tab_bg 76 | screen.cursor.bg = next_tab_bg 77 | screen.draw(SEPARATOR_SYMBOL) 78 | else: 79 | prev_fg = screen.cursor.fg 80 | if tab_bg == tab_fg: 81 | screen.cursor.fg = default_bg 82 | elif tab_bg != default_bg: 83 | c1 = draw_data.inactive_bg.contrast(draw_data.default_bg) 84 | c2 = draw_data.inactive_bg.contrast(draw_data.inactive_fg) 85 | if c1 < c2: 86 | screen.cursor.fg = default_bg 87 | screen.draw(" " + SOFT_SEPARATOR_SYMBOL) 88 | screen.cursor.fg = prev_fg 89 | end = screen.cursor.x 90 | return end 91 | 92 | 93 | def _draw_right_status(screen: Screen, is_last: bool, cells: list) -> int: 94 | if not is_last: 95 | screen.cursor.bg = FG 96 | return 0 97 | draw_attributed_string(Formatter.reset, screen) 98 | screen.cursor.x = screen.columns - right_status_length 99 | screen.cursor.fg = 0 100 | screen.cursor.bg = 0 101 | for color_fg, color_bg, status in cells: 102 | screen.cursor.fg = color_fg 103 | screen.cursor.bg = color_bg 104 | screen.draw(status) 105 | return screen.cursor.x 106 | 107 | 108 | def _redraw_tab_bar(_): 109 | tab_manager = get_boss().active_tab_manager 110 | if tab_manager is not None: 111 | tab_manager.mark_tab_bar_dirty() 112 | 113 | 114 | def draw_tab( 115 | draw_data: DrawData, 116 | screen: Screen, 117 | tab: TabBarData, 118 | before: int, # Not accessed, but things break without it? 119 | max_title_length: int, # Not accessed, but things break without it? 120 | index: int, 121 | is_last: bool, 122 | extra_data: ExtraData, 123 | ) -> int: 124 | global right_status_length 125 | add_timer(_redraw_tab_bar, REFRESH_TIME, True) 126 | # app = ICON_USER + getlogin() + " " + SEPARATOR_SYMBOL_RIGHT 127 | now = datetime.now() 128 | date = now.strftime(" %d/%m/%Y ") 129 | time = now.strftime(" %H:%M ") 130 | app = ICON_CAL + date 131 | host = ICON_TIME + time 132 | cells = [] 133 | cells.append((ACTIVE_BG, BAR_BG, SEPARATOR_SYMBOL_RIGHT)) 134 | cells.append((BG, ACTIVE_BG, app)) 135 | cells.append((FG, BG, host)) 136 | right_status_length = RIGHT_MARGIN 137 | for cell in cells: 138 | right_status_length += len(str(cell[1])) 139 | 140 | _draw_icon(screen, index) 141 | # _draw_cwd(screen, index) 142 | _draw_left_status( 143 | draw_data, 144 | screen, 145 | tab, 146 | index, 147 | extra_data, 148 | ) 149 | _draw_right_status( 150 | screen, 151 | is_last, 152 | cells, 153 | ) 154 | return screen.cursor.x 155 | -------------------------------------------------------------------------------- /config/linearmouse/linearmouse.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema" : "https:\/\/schema.linearmouse.app\/0.9.5", 3 | "schemes" : [ 4 | { 5 | "pointer" : { 6 | "acceleration" : 0, 7 | "speed" : 0.126, 8 | "disableAcceleration" : false 9 | }, 10 | "scrolling" : { 11 | "reverse" : { 12 | "vertical" : false 13 | }, 14 | "distance" : { 15 | "vertical" : "auto" 16 | }, 17 | "acceleration" : { 18 | "vertical" : 1.99 19 | }, 20 | "speed" : { 21 | "vertical" : 23.76 22 | } 23 | }, 24 | "if" : { 25 | "device" : { 26 | "productID" : "0x2022", 27 | "vendorID" : "0x258a", 28 | "serialNumber" : "000000000000", 29 | "category" : "mouse", 30 | "productName" : "Model O Wireless" 31 | } 32 | } 33 | }, 34 | { 35 | "pointer" : { 36 | "speed" : 0.3508, 37 | "disableAcceleration" : false 38 | }, 39 | "if" : { 40 | "device" : { 41 | "vendorID" : "0x1532", 42 | "productID" : "0x8a", 43 | "productName" : "Razer Viper Mini", 44 | "category" : "mouse" 45 | } 46 | } 47 | }, 48 | { 49 | "pointer" : { 50 | "acceleration" : 0, 51 | "speed" : 0.0742 52 | }, 53 | "scrolling" : { 54 | "reverse" : { 55 | "vertical" : true 56 | } 57 | }, 58 | "if" : { 59 | "device" : { 60 | "productName" : "Keychron Link ", 61 | "category" : "mouse", 62 | "productID" : "0xd031", 63 | "vendorID" : "0x3434" 64 | } 65 | } 66 | }, 67 | { 68 | "if" : { 69 | "device" : { 70 | "vendorID" : "0x258a", 71 | "category" : "mouse", 72 | "productName" : "Wired Gaming Mouse", 73 | "productID" : "0x36" 74 | } 75 | }, 76 | "pointer" : { 77 | "speed" : 0.2195, 78 | "acceleration" : 0 79 | } 80 | }, 81 | { 82 | "buttons" : { 83 | "universalBackForward" : true 84 | }, 85 | "if" : { 86 | "device" : { 87 | "productID" : "0xd036", 88 | "productName" : "keychron M3 mini", 89 | "serialNumber" : "SN1234567890", 90 | "category" : "mouse", 91 | "vendorID" : "0x3434" 92 | } 93 | }, 94 | "scrolling" : { 95 | "acceleration" : { 96 | "vertical" : 2.04 97 | }, 98 | "distance" : { 99 | "vertical" : "auto" 100 | }, 101 | "speed" : { 102 | "vertical" : 0 103 | }, 104 | "reverse" : { 105 | "vertical" : true 106 | } 107 | }, 108 | "pointer" : { 109 | "speed" : 0.5156, 110 | "disableAcceleration" : true, 111 | "acceleration" : 1.2385 112 | } 113 | } 114 | ] 115 | } -------------------------------------------------------------------------------- /config/lvim/config.lua: -------------------------------------------------------------------------------- 1 | require("plugins") 2 | require("line") 3 | require("keymaps") 4 | require("emmet") 5 | 6 | vim.api.nvim_command("set termguicolors") 7 | vim.api.nvim_command("set t_Co=256") 8 | 9 | -- Folding options 10 | lvim.builtin.which_key.setup.plugins.presets.z = true 11 | vim.wo.foldmethod = "expr" 12 | vim.wo.foldexpr = "nvim_treesitter#foldexpr()" 13 | vim.wo.foldenable = false 14 | vim.wo.foldnestmax = 2 15 | vim.wo.foldminlines = 2 16 | vim.wo.foldlevel = 99 17 | vim.wo.foldtext = 18 | [[' 󰁃...'. (v:foldend - v:foldstart + 1) . ' lines ' . substitute(getline(v:foldstart),'\\t',repeat('\ ',&tabstop),'g')."...".trim(getline(v:foldend)) | ]] 19 | 20 | 21 | lvim.builtin.terminal.open_mapping = "" 22 | lvim.builtin.terminal.execs = {} 23 | 24 | lvim.builtin.nvimtree.setup.git.enable = true 25 | lvim.builtin.nvimtree.setup.renderer = { 26 | highlight_git = true, 27 | icons = { 28 | show = { 29 | git = true, 30 | }, 31 | } 32 | } 33 | 34 | lvim.builtin.telescope.defaults = { 35 | initial_mode = "insert", 36 | layout_config = { 37 | preview_cutoff = 120, 38 | prompt_position = "bottom", 39 | width = 0.75, 40 | height = 0.75, 41 | }, 42 | layout_strategy = "horizontal", 43 | } 44 | require("lvim.lsp.manager").setup("cssls", { 45 | settings = { 46 | css = { 47 | validate = true, 48 | lint = { 49 | unknownAtRules = "ignore" 50 | } 51 | }, 52 | scss = { 53 | validate = true, 54 | lint = { 55 | unknownAtRules = "ignore" 56 | } 57 | }, 58 | less = { 59 | validate = true, 60 | lint = { 61 | unknownAtRules = "ignore" 62 | } 63 | }, 64 | }, 65 | }) 66 | local orig_util_open_floating_preview = vim.lsp.util.open_floating_preview 67 | function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...) 68 | opts = opts or {} 69 | opts.border = opts.border or 'single' 70 | opts.max_width = opts.max_width or 80 71 | return orig_util_open_floating_preview(contents, syntax, opts, ...) 72 | end 73 | -------------------------------------------------------------------------------- /config/lvim/lua/emmet.lua: -------------------------------------------------------------------------------- 1 | vim.api.nvim_create_autocmd({ "FileType" }, { 2 | pattern = "css,eruby,html,htmldjango,javascriptreact,less,pug,sass,scss,typescriptreact,vue", 3 | callback = function() 4 | vim.lsp.start({ 5 | cmd = { "emmet-language-server", "--stdio" }, 6 | root_dir = vim.fs.dirname(vim.fs.find({ ".git" }, { upward = true })[1]), 7 | -- Read more about this options in the [vscode docs](https://code.visualstudio.com/docs/editor/emmet#_emmet-configuration). 8 | init_options = { 9 | ---@type table 10 | includeLanguages = {}, 11 | --- @type string[] 12 | excludeLanguages = {}, 13 | --- @type string[] 14 | extensionsPath = {}, 15 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/preferences/) 16 | preferences = {}, 17 | --- @type boolean Defaults to `true` 18 | showAbbreviationSuggestions = true, 19 | --- @type "always" | "never" Defaults to `"always"` 20 | showExpandedAbbreviation = "always", 21 | --- @type boolean Defaults to `false` 22 | showSuggestionsAsSnippets = false, 23 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/syntax-profiles/) 24 | syntaxProfiles = {}, 25 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/snippets/#variables) 26 | variables = {}, 27 | }, 28 | }) 29 | end, 30 | }) 31 | -------------------------------------------------------------------------------- /config/lvim/lua/keymaps.lua: -------------------------------------------------------------------------------- 1 | local opts = { noremap = true } 2 | 3 | -- Buffer management 4 | vim.keymap.set('n', '', ':BufferKill', opts) 5 | vim.keymap.set('n', '', ':BufferLineCycleNext', opts) 6 | 7 | -- Quickly switch to buffer number 8 | for i = 1, 9 do 9 | vim.keymap.set('n', '', ':BufferLineGoToBuffer ' .. i .. ' ', opts) 10 | end 11 | -------------------------------------------------------------------------------- /config/lvim/lua/line.lua: -------------------------------------------------------------------------------- 1 | local clients_lsp = function() 2 | -- local bufnr = vim.api.nvim_get_current_buf() 3 | local clients = vim.lsp.get_active_clients() 4 | if next(clients) == nil then 5 | return '' 6 | end 7 | local c = {} 8 | for _, client in pairs(clients) do 9 | table.insert(c, client.name) 10 | end 11 | return '󰌨 ' .. table.concat(c, '|') 12 | end 13 | 14 | local c = require("lvim.core.lualine.colors") 15 | 16 | lvim.builtin.lualine.options.theme = "auto" 17 | lvim.builtin.lualine.options.component_separators = { left = "", right = "/" } 18 | lvim.builtin.lualine.options.section_separators = { left = "", right = "" } 19 | lvim.builtin.lualine.sections.lualine_a = { "mode" } 20 | lvim.builtin.lualine.sections.lualine_b = { "branch" } 21 | lvim.builtin.lualine.sections.lualine_c = { 22 | { "diff", diff_color = { added = { fg = c.green }, modified = { fg = c.yellow }, removed = { fg = c.red } } }, 23 | "diagnostics", 24 | "filename", 25 | } 26 | lvim.builtin.lualine.sections.lualine_x = { clients_lsp, "filetype" } 27 | lvim.builtin.lualine.sections.lualine_y = { "searchcount", "progress" } 28 | lvim.builtin.lualine.sections.lualine_z = { "location" } 29 | vim.o.cmdheight=0 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /config/lvim/lua/plugins.lua: -------------------------------------------------------------------------------- 1 | lvim.plugins = { 2 | { "ThePrimeagen/vim-be-good" }, 3 | { "pocco81/auto-save.nvim" }, 4 | { "kdheepak/lazygit.nvim" }, 5 | { 6 | "NStefan002/visual-surround.nvim", 7 | config = function() 8 | require("visual-surround").setup({}) 9 | end, 10 | }, 11 | { "mg979/vim-visual-multi" }, 12 | { 13 | 'stevearc/oil.nvim', 14 | opts = {}, 15 | dependencies = { "nvim-tree/nvim-web-devicons" }, 16 | }, 17 | { 18 | 'petertriho/nvim-scrollbar', 19 | config = function() 20 | require('scrollbar').setup() 21 | end 22 | }, 23 | { 24 | "zbirenbaum/copilot.lua", 25 | cmd = "Copilot", 26 | event = "InsertEnter", 27 | config = function() 28 | require("copilot").setup({ 29 | panel = { 30 | enabled = true, 31 | auto_refresh = true, 32 | keymap = { 33 | jump_prev = "[[", 34 | jump_next = "]]", 35 | accept = "", 36 | refresh = "gr", 37 | open = "" 38 | }, 39 | layout = { 40 | position = "right", -- | top | left | right 41 | ratio = 0.4 42 | }, 43 | }, 44 | suggestion = { 45 | enabled = true, 46 | auto_trigger = true, 47 | debounce = 75, 48 | keymap = { 49 | accept = "", 50 | accept_word = false, 51 | accept_line = false, 52 | next = "", 53 | prev = "", 54 | dismiss = "", 55 | }, 56 | }, 57 | 58 | }) 59 | end, 60 | }, 61 | { "AndreM222/copilot-lualine" }, 62 | { 63 | "CopilotC-Nvim/CopilotChat.nvim", 64 | branch = "canary", 65 | dependencies = { 66 | { "zbirenbaum/copilot.lua" }, -- or github/copilot.vim 67 | { "nvim-lua/plenary.nvim" }, -- for curl, log wrapper 68 | }, 69 | opts = { 70 | debug = false, 71 | }, 72 | }, 73 | { 74 | "nvim-pack/nvim-spectre", 75 | event = "BufRead", 76 | config = function() 77 | require("spectre").setup() 78 | end, 79 | }, 80 | { 81 | "HiPhish/rainbow-delimiters.nvim", 82 | config = function() 83 | require("rainbow-delimiters.setup").setup({ 84 | highlight = { 85 | "PackerString", 86 | "PackerHash", 87 | "PackerSuccess", 88 | "Debug" 89 | } 90 | }) 91 | end, 92 | }, 93 | { 94 | "brenoprata10/nvim-highlight-colors", 95 | config = function() 96 | require('nvim-highlight-colors').setup({ 97 | render = 'background', -- or 'foreground' 98 | enable_named_colors = false, 99 | enable_tailwind = false, 100 | }) 101 | end 102 | }, 103 | { 104 | "luckasRanarison/tailwind-tools.nvim", 105 | opts = { 106 | document_color = { 107 | kind = "background" 108 | } 109 | } -- your configuration 110 | }, 111 | { 'wakatime/vim-wakatime', lazy = false }, 112 | { "olrtg/nvim-emmet", }, 113 | { "LhKipp/nvim-nu" }, 114 | { "ray-x/go.nvim" }, 115 | } 116 | -------------------------------------------------------------------------------- /config/nvim/.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 12 | ## Describe the bug 13 | 14 | 15 | ## To Reproduce 16 | 17 | 1. ... 18 | 19 | ## Desktop 20 | 21 | - OS: 22 | - Terminal: 23 | 24 | ## Neovim Version 25 | 26 | 27 | ``` 28 | ``` 29 | -------------------------------------------------------------------------------- /config/nvim/.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | *************************************************************************** 2 | **NOTE** 3 | Please verify that the `base repository` above has the intended destination! 4 | Github by default opens Pull Requests against the parent of a forked repository. 5 | If this is your personal fork and you didn't intend to open a PR for contribution 6 | to the original project then adjust the `base repository` accordingly. 7 | ************************************************************************** 8 | 9 | -------------------------------------------------------------------------------- /config/nvim/.github/workflows/stylua.yml: -------------------------------------------------------------------------------- 1 | # Check Lua Formatting 2 | name: Check Lua Formatting 3 | on: pull_request_target 4 | 5 | jobs: 6 | stylua-check: 7 | if: github.repository == 'nvim-lua/kickstart.nvim' 8 | name: Stylua Check 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout Code 12 | uses: actions/checkout@v2 13 | with: 14 | ref: ${{ github.event.pull_request.head.sha }} 15 | - name: Stylua Check 16 | uses: JohnnyMorganz/stylua-action@v3 17 | with: 18 | token: ${{ secrets.GITHUB_TOKEN }} 19 | version: latest 20 | args: --check . 21 | 22 | -------------------------------------------------------------------------------- /config/nvim/.gitignore: -------------------------------------------------------------------------------- 1 | tags 2 | test.sh 3 | .luarc.json 4 | nvim 5 | 6 | spell/ 7 | lazy-lock.json 8 | -------------------------------------------------------------------------------- /config/nvim/.stylua.toml: -------------------------------------------------------------------------------- 1 | column_width = 160 2 | line_endings = "Unix" 3 | indent_type = "Spaces" 4 | indent_width = 2 5 | quote_style = "AutoPreferSingle" 6 | call_parentheses = "None" 7 | -------------------------------------------------------------------------------- /config/nvim/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /config/nvim/README.md: -------------------------------------------------------------------------------- 1 | # kickstart.nvim 2 | 3 | ## Introduction 4 | 5 | A starting point for Neovim that is: 6 | 7 | * Small 8 | * Single-file 9 | * Completely Documented 10 | 11 | **NOT** a Neovim distribution, but instead a starting point for your configuration. 12 | 13 | ## Installation 14 | 15 | ### Install Neovim 16 | 17 | Kickstart.nvim targets *only* the latest 18 | ['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest 19 | ['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim. 20 | If you are experiencing issues, please make sure you have the latest versions. 21 | 22 | ### Install External Dependencies 23 | 24 | External Requirements: 25 | - Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`) 26 | - [ripgrep](https://github.com/BurntSushi/ripgrep#installation) 27 | - Clipboard tool (xclip/xsel/win32yank or other depending on platform) 28 | - A [Nerd Font](https://www.nerdfonts.com/): optional, provides various icons 29 | - if you have it set `vim.g.have_nerd_font` in `init.lua` to true 30 | - Language Setup: 31 | - If want to write Typescript, you need `npm` 32 | - If want to write Golang, you will need `go` 33 | - etc. 34 | 35 | > **NOTE** 36 | > See [Install Recipes](#Install-Recipes) for additional Windows and Linux specific notes 37 | > and quick install snippets 38 | 39 | ### Install Kickstart 40 | 41 | > **NOTE** 42 | > [Backup](#FAQ) your previous configuration (if any exists) 43 | 44 | Neovim's configurations are located under the following paths, depending on your OS: 45 | 46 | | OS | PATH | 47 | | :- | :--- | 48 | | Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` | 49 | | Windows (cmd)| `%userprofile%\AppData\Local\nvim\` | 50 | | Windows (powershell)| `$env:USERPROFILE\AppData\Local\nvim\` | 51 | 52 | #### Recommended Step 53 | 54 | [Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo 55 | so that you have your own copy that you can modify, then install by cloning the 56 | fork to your machine using one of the commands below, depending on your OS. 57 | 58 | > **NOTE** 59 | > Your fork's url will be something like this: 60 | > `https://github.com//kickstart.nvim.git` 61 | 62 | #### Clone kickstart.nvim 63 | > **NOTE** 64 | > If following the recommended step above (i.e., forking the repo), replace 65 | > `nvim-lua` with `` in the commands below 66 | 67 |
Linux and Mac 68 | 69 | ```sh 70 | git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim 71 | ``` 72 | 73 |
74 | 75 |
Windows 76 | 77 | If you're using `cmd.exe`: 78 | 79 | ``` 80 | git clone https://github.com/nvim-lua/kickstart.nvim.git %userprofile%\AppData\Local\nvim\ 81 | ``` 82 | 83 | If you're using `powershell.exe` 84 | 85 | ``` 86 | git clone https://github.com/nvim-lua/kickstart.nvim.git $env:USERPROFILE\AppData\Local\nvim\ 87 | ``` 88 | 89 |
90 | 91 | ### Post Installation 92 | 93 | Start Neovim 94 | 95 | ```sh 96 | nvim 97 | ``` 98 | 99 | That's it! Lazy will install all the plugins you have. Use `:Lazy` to view 100 | current plugin status. Hit `q` to close the window. 101 | 102 | Read through the `init.lua` file in your configuration folder for more 103 | information about extending and exploring Neovim. That also includes 104 | examples of adding popularly requested plugins. 105 | 106 | 107 | ### Getting Started 108 | 109 | [The Only Video You Need to Get Started with Neovim](https://youtu.be/m8C0Cq9Uv9o) 110 | 111 | ### FAQ 112 | 113 | * What should I do if I already have a pre-existing neovim configuration? 114 | * You should back it up and then delete all associated files. 115 | * This includes your existing init.lua and the neovim files in `~/.local` 116 | which can be deleted with `rm -rf ~/.local/share/nvim/` 117 | * Can I keep my existing configuration in parallel to kickstart? 118 | * Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME` 119 | to maintain multiple configurations. For example, you can install the kickstart 120 | configuration in `~/.config/nvim-kickstart` and create an alias: 121 | ``` 122 | alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim' 123 | ``` 124 | When you run Neovim using `nvim-kickstart` alias it will use the alternative 125 | config directory and the matching local directory 126 | `~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim 127 | distribution that you would like to try out. 128 | * What if I want to "uninstall" this configuration: 129 | * See [lazy.nvim uninstall](https://github.com/folke/lazy.nvim#-uninstalling) information 130 | * Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files? 131 | * The main purpose of kickstart is to serve as a teaching tool and a reference 132 | configuration that someone can easily use to `git clone` as a basis for their own. 133 | As you progress in learning Neovim and Lua, you might consider splitting `init.lua` 134 | into smaller parts. A fork of kickstart that does this while maintaining the 135 | same functionality is available here: 136 | * [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim) 137 | * Discussions on this topic can be found here: 138 | * [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218) 139 | * [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473) 140 | 141 | ### Install Recipes 142 | 143 | Below you can find OS specific install instructions for Neovim and dependencies. 144 | 145 | After installing all the dependencies continue with the [Install Kickstart](#Install-Kickstart) step. 146 | 147 | #### Windows Installation 148 | 149 |
Windows with Microsoft C++ Build Tools and CMake 150 | Installation may require installing build tools and updating the run command for `telescope-fzf-native` 151 | 152 | See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation) 153 | 154 | This requires: 155 | 156 | - Install CMake and the Microsoft C++ Build Tools on Windows 157 | 158 | ```lua 159 | {'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' } 160 | ``` 161 |
162 |
Windows with gcc/make using chocolatey 163 | Alternatively, one can install gcc and make which don't require changing the config, 164 | the easiest way is to use choco: 165 | 166 | 1. install [chocolatey](https://chocolatey.org/install) 167 | either follow the instructions on the page or use winget, 168 | run in cmd as **admin**: 169 | ``` 170 | winget install --accept-source-agreements chocolatey.chocolatey 171 | ``` 172 | 173 | 2. install all requirements using choco, exit previous cmd and 174 | open a new one so that choco path is set, and run in cmd as **admin**: 175 | ``` 176 | choco install -y neovim git ripgrep wget fd unzip gzip mingw make 177 | ``` 178 |
179 |
WSL (Windows Subsystem for Linux) 180 | 181 | ``` 182 | wsl --install 183 | wsl 184 | sudo add-apt-repository ppa:neovim-ppa/unstable -y 185 | sudo apt update 186 | sudo apt install make gcc ripgrep unzip git xclip neovim 187 | ``` 188 |
189 | 190 | #### Linux Install 191 |
Ubuntu Install Steps 192 | 193 | ``` 194 | sudo add-apt-repository ppa:neovim-ppa/unstable -y 195 | sudo apt update 196 | sudo apt install make gcc ripgrep unzip git xclip neovim 197 | ``` 198 |
199 |
Debian Install Steps 200 | 201 | ``` 202 | sudo apt update 203 | sudo apt install make gcc ripgrep unzip git xclip curl 204 | 205 | # Now we install nvim 206 | curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz 207 | sudo rm -rf /opt/nvim-linux64 208 | sudo mkdir -p /opt/nvim-linux64 209 | sudo chmod a+rX /opt/nvim-linux64 210 | sudo tar -C /opt -xzf nvim-linux64.tar.gz 211 | 212 | # make it available in /usr/local/bin, distro installs to /usr/bin 213 | sudo ln -sf /opt/nvim-linux64/bin/nvim /usr/local/bin/ 214 | ``` 215 |
216 |
Fedora Install Steps 217 | 218 | ``` 219 | sudo dnf install -y gcc make git ripgrep fd-find unzip neovim 220 | ``` 221 |
222 | 223 |
Arch Install Steps 224 | 225 | ``` 226 | sudo pacman -S --noconfirm --needed gcc make git ripgrep fd unzip neovim 227 | ``` 228 |
229 | 230 | -------------------------------------------------------------------------------- /config/nvim/doc/kickstart.txt: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | INTRODUCTION *kickstart.nvim* 3 | 4 | Kickstart.nvim is a project to help you get started on your neovim journey. 5 | 6 | *kickstart-is-not* 7 | It is not: 8 | - Complete framework for every plugin under the sun 9 | - Place to add every plugin that could ever be useful 10 | 11 | *kickstart-is* 12 | It is: 13 | - Somewhere that has a good start for the most common "IDE" type features: 14 | - autocompletion 15 | - goto-definition 16 | - find references 17 | - fuzzy finding 18 | - and hinting at what more can be done :) 19 | - A place to _kickstart_ your journey. 20 | - You should fork this project and use/modify it so that it matches your 21 | style and preferences. If you don't want to do that, there are probably 22 | other projects that would fit much better for you (and that's great!)! 23 | 24 | vim:tw=78:ts=8:ft=help:norl: 25 | -------------------------------------------------------------------------------- /config/nvim/lua/custom/plugins/init.lua: -------------------------------------------------------------------------------- 1 | -- You can add your own plugins here or in other files in this directory! 2 | -- I promise not to create any merge conflicts in this directory :) 3 | -- 4 | -- See the kickstart.nvim README for more information 5 | return {} 6 | -------------------------------------------------------------------------------- /config/nvim/lua/kickstart/health.lua: -------------------------------------------------------------------------------- 1 | --[[ 2 | -- 3 | -- This file is not required for your own configuration, 4 | -- but helps people determine if their system is setup correctly. 5 | -- 6 | --]] 7 | 8 | local check_version = function() 9 | local verstr = string.format('%s.%s.%s', vim.version().major, vim.version().minor, vim.version().patch) 10 | if not vim.version.cmp then 11 | vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) 12 | return 13 | end 14 | 15 | if vim.version.cmp(vim.version(), { 0, 9, 4 }) >= 0 then 16 | vim.health.ok(string.format("Neovim version is: '%s'", verstr)) 17 | else 18 | vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) 19 | end 20 | end 21 | 22 | local check_external_reqs = function() 23 | -- Basic utils: `git`, `make`, `unzip` 24 | for _, exe in ipairs { 'git', 'make', 'unzip', 'rg' } do 25 | local is_executable = vim.fn.executable(exe) == 1 26 | if is_executable then 27 | vim.health.ok(string.format("Found executable: '%s'", exe)) 28 | else 29 | vim.health.warn(string.format("Could not find executable: '%s'", exe)) 30 | end 31 | end 32 | 33 | return true 34 | end 35 | 36 | return { 37 | check = function() 38 | vim.health.start 'kickstart.nvim' 39 | 40 | vim.health.info [[NOTE: Not every warning is a 'must-fix' in `:checkhealth` 41 | 42 | Fix only warnings for plugins and languages you intend to use. 43 | Mason will give warnings for languages that are not installed. 44 | You do not need to install, unless you want to use those languages!]] 45 | 46 | local uv = vim.uv or vim.loop 47 | vim.health.info('System Information: ' .. vim.inspect(uv.os_uname())) 48 | 49 | check_version() 50 | check_external_reqs() 51 | end, 52 | } 53 | -------------------------------------------------------------------------------- /config/nvim/lua/kickstart/plugins/autopairs.lua: -------------------------------------------------------------------------------- 1 | -- autopairs 2 | -- https://github.com/windwp/nvim-autopairs 3 | 4 | return { 5 | 'windwp/nvim-autopairs', 6 | event = 'InsertEnter', 7 | -- Optional dependency 8 | dependencies = { 'hrsh7th/nvim-cmp' }, 9 | config = function() 10 | require('nvim-autopairs').setup {} 11 | -- If you want to automatically add `(` after selecting a function or method 12 | local cmp_autopairs = require 'nvim-autopairs.completion.cmp' 13 | local cmp = require 'cmp' 14 | cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done()) 15 | end, 16 | } 17 | -------------------------------------------------------------------------------- /config/nvim/lua/kickstart/plugins/debug.lua: -------------------------------------------------------------------------------- 1 | -- debug.lua 2 | -- 3 | -- Shows how to use the DAP plugin to debug your code. 4 | -- 5 | -- Primarily focused on configuring the debugger for Go, but can 6 | -- be extended to other languages as well. That's why it's called 7 | -- kickstart.nvim and not kitchen-sink.nvim ;) 8 | 9 | return { 10 | -- NOTE: Yes, you can install new plugins here! 11 | 'mfussenegger/nvim-dap', 12 | -- NOTE: And you can specify dependencies as well 13 | dependencies = { 14 | -- Creates a beautiful debugger UI 15 | 'rcarriga/nvim-dap-ui', 16 | 17 | -- Required dependency for nvim-dap-ui 18 | 'nvim-neotest/nvim-nio', 19 | 20 | -- Installs the debug adapters for you 21 | 'williamboman/mason.nvim', 22 | 'jay-babu/mason-nvim-dap.nvim', 23 | 24 | -- Add your own debuggers here 25 | 'leoluz/nvim-dap-go', 26 | }, 27 | config = function() 28 | local dap = require 'dap' 29 | local dapui = require 'dapui' 30 | 31 | require('mason-nvim-dap').setup { 32 | -- Makes a best effort to setup the various debuggers with 33 | -- reasonable debug configurations 34 | automatic_installation = true, 35 | 36 | -- You can provide additional configuration to the handlers, 37 | -- see mason-nvim-dap README for more information 38 | handlers = {}, 39 | 40 | -- You'll need to check that you have the required things installed 41 | -- online, please don't ask me how to install them :) 42 | ensure_installed = { 43 | -- Update this to ensure that you have the debuggers for the langs you want 44 | 'delve', 45 | }, 46 | } 47 | 48 | -- Basic debugging keymaps, feel free to change to your liking! 49 | vim.keymap.set('n', '', dap.continue, { desc = 'Debug: Start/Continue' }) 50 | vim.keymap.set('n', '', dap.step_into, { desc = 'Debug: Step Into' }) 51 | vim.keymap.set('n', '', dap.step_over, { desc = 'Debug: Step Over' }) 52 | vim.keymap.set('n', '', dap.step_out, { desc = 'Debug: Step Out' }) 53 | vim.keymap.set('n', 'b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' }) 54 | vim.keymap.set('n', 'B', function() 55 | dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ') 56 | end, { desc = 'Debug: Set Breakpoint' }) 57 | 58 | -- Dap UI setup 59 | -- For more information, see |:help nvim-dap-ui| 60 | dapui.setup { 61 | -- Set icons to characters that are more likely to work in every terminal. 62 | -- Feel free to remove or use ones that you like more! :) 63 | -- Don't feel like these are good choices. 64 | icons = { expanded = '▾', collapsed = '▸', current_frame = '*' }, 65 | controls = { 66 | icons = { 67 | pause = '⏸', 68 | play = '▶', 69 | step_into = '⏎', 70 | step_over = '⏭', 71 | step_out = '⏮', 72 | step_back = 'b', 73 | run_last = '▶▶', 74 | terminate = '⏹', 75 | disconnect = '⏏', 76 | }, 77 | }, 78 | } 79 | 80 | -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception. 81 | vim.keymap.set('n', '', dapui.toggle, { desc = 'Debug: See last session result.' }) 82 | 83 | dap.listeners.after.event_initialized['dapui_config'] = dapui.open 84 | dap.listeners.before.event_terminated['dapui_config'] = dapui.close 85 | dap.listeners.before.event_exited['dapui_config'] = dapui.close 86 | 87 | -- Install golang specific config 88 | require('dap-go').setup { 89 | delve = { 90 | -- On Windows delve must be run attached or it crashes. 91 | -- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring 92 | detached = vim.fn.has 'win32' == 0, 93 | }, 94 | } 95 | end, 96 | } 97 | -------------------------------------------------------------------------------- /config/nvim/lua/kickstart/plugins/gitsigns.lua: -------------------------------------------------------------------------------- 1 | -- Adds git related signs to the gutter, as well as utilities for managing changes 2 | -- NOTE: gitsigns is already included in init.lua but contains only the base 3 | -- config. This will add also the recommended keymaps. 4 | 5 | return { 6 | { 7 | 'lewis6991/gitsigns.nvim', 8 | opts = { 9 | on_attach = function(bufnr) 10 | local gitsigns = require 'gitsigns' 11 | 12 | local function map(mode, l, r, opts) 13 | opts = opts or {} 14 | opts.buffer = bufnr 15 | vim.keymap.set(mode, l, r, opts) 16 | end 17 | 18 | -- Navigation 19 | map('n', ']c', function() 20 | if vim.wo.diff then 21 | vim.cmd.normal { ']c', bang = true } 22 | else 23 | gitsigns.nav_hunk 'next' 24 | end 25 | end, { desc = 'Jump to next git [c]hange' }) 26 | 27 | map('n', '[c', function() 28 | if vim.wo.diff then 29 | vim.cmd.normal { '[c', bang = true } 30 | else 31 | gitsigns.nav_hunk 'prev' 32 | end 33 | end, { desc = 'Jump to previous git [c]hange' }) 34 | 35 | -- Actions 36 | -- visual mode 37 | map('v', 'hs', function() 38 | gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } 39 | end, { desc = 'stage git hunk' }) 40 | map('v', 'hr', function() 41 | gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } 42 | end, { desc = 'reset git hunk' }) 43 | -- normal mode 44 | map('n', 'hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' }) 45 | map('n', 'hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' }) 46 | map('n', 'hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' }) 47 | map('n', 'hu', gitsigns.undo_stage_hunk, { desc = 'git [u]ndo stage hunk' }) 48 | map('n', 'hR', gitsigns.reset_buffer, { desc = 'git [R]eset buffer' }) 49 | map('n', 'hp', gitsigns.preview_hunk, { desc = 'git [p]review hunk' }) 50 | map('n', 'hb', gitsigns.blame_line, { desc = 'git [b]lame line' }) 51 | map('n', 'hd', gitsigns.diffthis, { desc = 'git [d]iff against index' }) 52 | map('n', 'hD', function() 53 | gitsigns.diffthis '@' 54 | end, { desc = 'git [D]iff against last commit' }) 55 | -- Toggles 56 | map('n', 'tb', gitsigns.toggle_current_line_blame, { desc = '[T]oggle git show [b]lame line' }) 57 | map('n', 'tD', gitsigns.toggle_deleted, { desc = '[T]oggle git show [D]eleted' }) 58 | end, 59 | }, 60 | }, 61 | } 62 | -------------------------------------------------------------------------------- /config/nvim/lua/kickstart/plugins/indent_line.lua: -------------------------------------------------------------------------------- 1 | return { 2 | { -- Add indentation guides even on blank lines 3 | 'lukas-reineke/indent-blankline.nvim', 4 | -- Enable `lukas-reineke/indent-blankline.nvim` 5 | -- See `:help ibl` 6 | main = 'ibl', 7 | opts = {}, 8 | }, 9 | } 10 | -------------------------------------------------------------------------------- /config/nvim/lua/kickstart/plugins/lint.lua: -------------------------------------------------------------------------------- 1 | return { 2 | 3 | { -- Linting 4 | 'mfussenegger/nvim-lint', 5 | event = { 'BufReadPre', 'BufNewFile' }, 6 | config = function() 7 | local lint = require 'lint' 8 | lint.linters_by_ft = { 9 | markdown = { 'markdownlint' }, 10 | } 11 | 12 | -- To allow other plugins to add linters to require('lint').linters_by_ft, 13 | -- instead set linters_by_ft like this: 14 | -- lint.linters_by_ft = lint.linters_by_ft or {} 15 | -- lint.linters_by_ft['markdown'] = { 'markdownlint' } 16 | -- 17 | -- However, note that this will enable a set of default linters, 18 | -- which will cause errors unless these tools are available: 19 | -- { 20 | -- clojure = { "clj-kondo" }, 21 | -- dockerfile = { "hadolint" }, 22 | -- inko = { "inko" }, 23 | -- janet = { "janet" }, 24 | -- json = { "jsonlint" }, 25 | -- markdown = { "vale" }, 26 | -- rst = { "vale" }, 27 | -- ruby = { "ruby" }, 28 | -- terraform = { "tflint" }, 29 | -- text = { "vale" } 30 | -- } 31 | -- 32 | -- You can disable the default linters by setting their filetypes to nil: 33 | -- lint.linters_by_ft['clojure'] = nil 34 | -- lint.linters_by_ft['dockerfile'] = nil 35 | -- lint.linters_by_ft['inko'] = nil 36 | -- lint.linters_by_ft['janet'] = nil 37 | -- lint.linters_by_ft['json'] = nil 38 | -- lint.linters_by_ft['markdown'] = nil 39 | -- lint.linters_by_ft['rst'] = nil 40 | -- lint.linters_by_ft['ruby'] = nil 41 | -- lint.linters_by_ft['terraform'] = nil 42 | -- lint.linters_by_ft['text'] = nil 43 | 44 | -- Create autocommand which carries out the actual linting 45 | -- on the specified events. 46 | local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true }) 47 | vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, { 48 | group = lint_augroup, 49 | callback = function() 50 | require('lint').try_lint() 51 | end, 52 | }) 53 | end, 54 | }, 55 | } 56 | -------------------------------------------------------------------------------- /config/nvim/lua/kickstart/plugins/neo-tree.lua: -------------------------------------------------------------------------------- 1 | -- Neo-tree is a Neovim plugin to browse the file system 2 | -- https://github.com/nvim-neo-tree/neo-tree.nvim 3 | 4 | return { 5 | 'nvim-neo-tree/neo-tree.nvim', 6 | version = '*', 7 | dependencies = { 8 | 'nvim-lua/plenary.nvim', 9 | 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended 10 | 'MunifTanjim/nui.nvim', 11 | }, 12 | cmd = 'Neotree', 13 | keys = { 14 | { '\\', ':Neotree reveal', { desc = 'NeoTree reveal' } }, 15 | }, 16 | opts = { 17 | filesystem = { 18 | window = { 19 | mappings = { 20 | ['\\'] = 'close_window', 21 | }, 22 | }, 23 | }, 24 | }, 25 | } 26 | -------------------------------------------------------------------------------- /config/sketchybar/bar.lua: -------------------------------------------------------------------------------- 1 | local colors = require("colors") 2 | 3 | -- Equivalent to the --bar domain 4 | sbar.bar({ 5 | topmost = "window", 6 | height = 50, 7 | color = colors.bar.bg, 8 | padding_right = 3, 9 | padding_left = 3, 10 | }) 11 | -------------------------------------------------------------------------------- /config/sketchybar/colors.lua: -------------------------------------------------------------------------------- 1 | return { 2 | black = 0xff25273A, 3 | white = 0xffb5c9ff, 4 | red = 0xffFF6C8D, 5 | green = 0xff90D05A, 6 | blue = 0xff6EA3FE, 7 | yellow = 0xffE9AD5B, 8 | orange = 0xffFF9856, 9 | magenta = 0xffC198FD, 10 | grey = 0xff9AA9D9, 11 | transparent = 0x00000000, 12 | 13 | bar = { 14 | bg = 0x00ffffff, 15 | border = 0x00ffffff, 16 | }, 17 | popup = { 18 | bg = 0xee25273A, 19 | border = 0xff1E2030, 20 | }, 21 | bg1 = 0xff25273A, 22 | bg2 = 0xff1E2030, 23 | 24 | with_alpha = function(color, alpha) 25 | if alpha > 1.0 or alpha < 0.0 then return color end 26 | return (color & 0x00ffffff) | (math.floor(alpha * 255.0) << 24) 27 | end, 28 | } 29 | -------------------------------------------------------------------------------- /config/sketchybar/default.lua: -------------------------------------------------------------------------------- 1 | local settings = require("settings") 2 | local colors = require("colors") 3 | 4 | -- Equivalent to the --default domain 5 | sbar.default({ 6 | updates = "when_shown", 7 | icon = { 8 | font = { 9 | family = settings.font.text, 10 | style = settings.font.style_map["Bold"], 11 | size = 14.0 12 | }, 13 | color = colors.white, 14 | padding_left = settings.paddings, 15 | padding_right = settings.paddings, 16 | background = { image = { corner_radius = 9 } }, 17 | }, 18 | label = { 19 | font = { 20 | family = settings.font.text, 21 | style = settings.font.style_map["Semibold"], 22 | size = 13.0 23 | }, 24 | color = colors.white, 25 | padding_left = settings.paddings, 26 | padding_right = settings.paddings, 27 | }, 28 | background = { 29 | height = 34, 30 | corner_radius = 12, 31 | border_width = 0, 32 | border_color = colors.bg2, 33 | image = { 34 | corner_radius = 9, 35 | border_color = colors.grey, 36 | border_width = 0 37 | } 38 | }, 39 | popup = { 40 | background = { 41 | border_width = 0, 42 | corner_radius = 9, 43 | border_color = colors.popup.border, 44 | color = colors.popup.bg, 45 | shadow = { drawing = true }, 46 | }, 47 | blur_radius = 50, 48 | }, 49 | padding_left = 5, 50 | padding_right = 5, 51 | scroll_texts = true, 52 | }) 53 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/app_icons.lua: -------------------------------------------------------------------------------- 1 | return { 2 | ["Typora"] = ":text:", 3 | ["Orion"] = ":orion:", 4 | ["Orion RC"] = ":orion:", 5 | ["Grammarly Editor"] = ":grammarly:", 6 | ["kitty"] = ":kitty:", 7 | ["ClickUp"] = ":click_up:", 8 | ["Iris"] = ":iris:", 9 | ["PomoDone App"] = ":pomodone:", 10 | ["qutebrowser"] = ":qute_browser:", 11 | ["Raindrop.io"] = ":raindrop_io:", 12 | ["Airmail"] = ":airmail:", 13 | ["Affinity Publisher 2"] = ":affinity_publisher_2:", 14 | ["Calendar"] = ":calendar:", 15 | ["日历"] = ":calendar:", 16 | ["Fantastical"] = ":calendar:", 17 | ["Cron"] = ":calendar:", 18 | ["Amie"] = ":calendar:", 19 | ["Figma"] = ":figma:", 20 | ["Element"] = ":element:", 21 | ["Signal"] = ":signal:", 22 | ["Mattermost"] = ":mattermost:", 23 | ["Caprine"] = ":caprine:", 24 | ["Microsoft To Do"] = ":things:", 25 | ["Things"] = ":things:", 26 | ["Godot"] = ":godot:", 27 | ["Android Messages"] = ":android_messages:", 28 | ["Zed"] = ":zed:", 29 | ["Anytype"] = ":anytype:", 30 | ["TeamSpeak 3"] = ":team_speak:", 31 | ["LibreWolf"] = ":libre_wolf:", 32 | ["Neovide"] = ":neovide:", 33 | ["neovide"] = ":neovide:", 34 | ["Spotlight"] = ":spotlight:", 35 | ["微信"] = ":wechat:", 36 | ["Dropbox"] = ":dropbox:", 37 | ["Transmit"] = ":transmit:", 38 | ["TickTick"] = ":tick_tick:", 39 | ["Parallels Desktop"] = ":parallels:", 40 | ["Audacity"] = ":audacity:", 41 | ["Rider"] = ":rider:", 42 | ["JetBrains Rider"] = ":rider:", 43 | ["DEVONthink 3"] = ":devonthink3:", 44 | ["Docker"] = ":docker:", 45 | ["Docker Desktop"] = ":docker:", 46 | ["Matlab"] = ":matlab:", 47 | ["VLC"] = ":vlc:", 48 | ["Alacritty"] = ":alacritty:", 49 | ["Pages"] = ":pages:", 50 | ["Pages 文稿"] = ":pages:", 51 | ["Bear"] = ":bear:", 52 | ["Pine"] = ":pine:", 53 | ["Affinity Designer 2"] = ":affinity_designer_2:", 54 | ["Keyboard Maestro"] = ":keyboard_maestro:", 55 | ["Joplin"] = ":joplin:", 56 | ["mpv"] = ":mpv:", 57 | ["zoom.us"] = ":zoom:", 58 | ["Affinity Photo 2"] = ":affinity_photo_2:", 59 | ["Music"] = ":music:", 60 | ["音乐"] = ":music:", 61 | ["League of Legends"] = ":league_of_legends:", 62 | ["Tor Browser"] = ":tor_browser:", 63 | ["Hyper"] = ":hyper:", 64 | ["‎WhatsApp"] = ":whats_app:", 65 | ["카카오톡"] = ":kakaotalk:", 66 | ["Discord"] = ":discord:", 67 | ["Discord Canary"] = ":discord:", 68 | ["Discord PTB"] = ":discord:", 69 | ["Neovide"] = ":vim:", 70 | ["MacVim"] = ":vim:", 71 | ["Vim"] = ":vim:", 72 | ["VimR"] = ":vim:", 73 | ["Keynote"] = ":keynote:", 74 | ["Keynote 讲演"] = ":keynote:", 75 | ["iTerm"] = ":iterm:", 76 | ["IntelliJ IDEA"] = ":idea:", 77 | ["Finder"] = ":finder:", 78 | ["访达"] = ":finder:", 79 | ["Xcode"] = ":xcode:", 80 | ["GoLand"] = ":goland:", 81 | ["Android Studio"] = ":android_studio:", 82 | ["MoneyMoney"] = ":bank:", 83 | ["Spotify"] = ":spotify:", 84 | ["KeePassXC"] = ":kee_pass_x_c:", 85 | ["Alfred"] = ":alfred:", 86 | ["Color Picker"] = ":color_picker:", 87 | ["数码测色计"] = ":color_picker:", 88 | ["Microsoft Word"] = ":microsoft_word:", 89 | ["Microsoft PowerPoint"] = ":microsoft_power_point:", 90 | ["Notes"] = ":notes:", 91 | ["备忘录"] = ":notes:", 92 | ["Microsoft Edge"] = ":microsoft_edge:", 93 | ["Sublime Text"] = ":sublime_text:", 94 | ["Sequel Ace"] = ":sequel_ace:", 95 | ["Folx"] = ":folx:", 96 | ["DingTalk"] = ":dingtalk:", 97 | ["钉钉"] = ":dingtalk:", 98 | ["阿里钉"] = ":dingtalk:", 99 | ["WebStorm"] = ":web_storm:", 100 | ["Sequel Pro"] = ":sequel_pro:", 101 | ["Skype"] = ":skype:", 102 | ["网易云音乐"] = ":netease_music:", 103 | ["PyCharm"] = ":pycharm:", 104 | ["Canary Mail"] = ":mail:", 105 | ["HEY"] = ":mail:", 106 | ["Mail"] = ":mail:", 107 | ["Mailspring"] = ":mail:", 108 | ["MailMate"] = ":mail:", 109 | ["邮件"] = ":mail:", 110 | ["Default"] = ":default:", 111 | ["App Store"] = ":app_store:", 112 | ["Calibre"] = ":book:", 113 | ["Todoist"] = ":todoist:", 114 | ["Emacs"] = ":emacs:", 115 | ["Messenger"] = ":messenger:", 116 | ["Tower"] = ":tower:", 117 | ["VSCodium"] = ":vscodium:", 118 | ["Drafts"] = ":drafts:", 119 | ["Cypress"] = ":cypress:", 120 | ["GitHub Desktop"] = ":git_hub:", 121 | ["Telegram"] = ":telegram:", 122 | ["Firefox Developer Edition"] = ":firefox_developer_edition:", 123 | ["Firefox Nightly"] = ":firefox_developer_edition:", 124 | ["Min"] = ":min_browser:", 125 | ["Sketch"] = ":sketch:", 126 | ["Affinity Photo"] = ":affinity_photo:", 127 | ["MAMP"] = ":mamp:", 128 | ["MAMP PRO"] = ":mamp:", 129 | ["Insomnia"] = ":insomnia:", 130 | ["Bitwarden"] = ":bit_warden:", 131 | ["Warp"] = ":warp:", 132 | ["System Preferences"] = ":gear:", 133 | ["System Settings"] = ":gear:", 134 | ["系统设置"] = ":gear:", 135 | ["Affinity Designer"] = ":affinity_designer:", 136 | ["Live"] = ":ableton:", 137 | ["Arc"] = ":arc:", 138 | ["Chromium"] = ":google_chrome:", 139 | ["Google Chrome"] = ":google_chrome:", 140 | ["Google Chrome Canary"] = ":google_chrome:", 141 | ["Jellyfin Media Player"] = ":jellyfin:", 142 | ["Zulip"] = ":zulip:", 143 | ["1Password"] = ":one_password:", 144 | ["FaceTime"] = ":face_time:", 145 | ["FaceTime 通话"] = ":face_time:", 146 | ["Citrix Workspace"] = ":citrix:", 147 | ["Citrix Viewer"] = ":citrix:", 148 | ["Logseq"] = ":logseq:", 149 | ["Reeder"] = ":reeder5:", 150 | ["Code"] = ":code:", 151 | ["Code - Insiders"] = ":code:", 152 | ["Notion"] = ":notion:", 153 | ["Final Cut Pro"] = ":final_cut_pro:", 154 | ["Zotero"] = ":zotero:", 155 | ["Safari"] = ":safari:", 156 | ["Safari浏览器"] = ":safari:", 157 | ["Safari Technology Preview"] = ":safari:", 158 | ["Blender"] = ":blender:", 159 | ["Affinity Publisher"] = ":affinity_publisher:", 160 | ["Spark Desktop"] = ":spark:", 161 | ["Zeplin"] = ":zeplin:", 162 | ["Replit"] = ":replit:", 163 | ["Podcasts"] = ":podcasts:", 164 | ["播客"] = ":podcasts:", 165 | ["NordVPN"] = ":nord_vpn:", 166 | ["Notability"] = ":notability:", 167 | ["Numbers"] = ":numbers:", 168 | ["Numbers 表格"] = ":numbers:", 169 | ["Nova"] = ":nova:", 170 | ["Microsoft Excel"] = ":microsoft_excel:", 171 | ["Trello"] = ":trello:", 172 | ["Pi-hole Remote"] = ":pihole:", 173 | ["Linear"] = ":linear:", 174 | ["CleanMyMac X"] = ":desktop:", 175 | ["GrandTotal"] = ":dollar:", 176 | ["Receipts"] = ":dollar:", 177 | ["Evernote Legacy"] = ":evernote_legacy:", 178 | ["OmniFocus"] = ":omni_focus:", 179 | ["Terminal"] = ":terminal:", 180 | ["终端"] = ":terminal:", 181 | ["Atom"] = ":atom:", 182 | ["Kakoune"] = ":kakoune:", 183 | ["Reminders"] = ":reminders:", 184 | ["提醒事项"] = ":reminders:", 185 | ["Tana"] = ":tana:", 186 | ["OBS"] = ":obsstudio:", 187 | ["VMware Fusion"] = ":vmware_fusion:", 188 | ["Tweetbot"] = ":twitter:", 189 | ["Twitter"] = ":twitter:", 190 | ["Microsoft Teams"] = ":microsoft_teams:", 191 | ["Yuque"] = ":yuque:", 192 | ["语雀"] = ":yuque:", 193 | ["Slack"] = ":slack:", 194 | ["Vivaldi"] = ":vivaldi:", 195 | ["Setapp"] = ":setapp:", 196 | ["TIDAL"] = ":tidal:", 197 | ["Miro"] = ":miro:", 198 | ["Messages"] = ":messages:", 199 | ["信息"] = ":messages:", 200 | ["Nachrichten"] = ":messages:", 201 | ["Brave Browser"] = ":brave_browser:", 202 | ["Preview"] = ":pdf:", 203 | ["预览"] = ":pdf:", 204 | ["Skim"] = ":pdf:", 205 | ["zathura"] = ":pdf:", 206 | ["Obsidian"] = ":obsidian:", 207 | ["Thunderbird"] = ":thunderbird:", 208 | ["Firefox"] = ":firefox:", 209 | ["WezTerm"] = ":wezterm:", 210 | ["default"] = ":default:", 211 | } 212 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/default_font.lua: -------------------------------------------------------------------------------- 1 | return { 2 | text = "SF Pro", -- Used for text 3 | numbers = "SF Pro", -- Used for numbers 4 | mono = "BerkeleyMono Nerd Font", 5 | 6 | -- Unified font style map 7 | style_map = { 8 | ["Regular"] = "Regular", 9 | ["Semibold"] = "Semibold", 10 | ["Bold"] = "Bold", 11 | ["Heavy"] = "Heavy", 12 | ["Black"] = "Black", 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/cpu_load/cpu.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | struct cpu { 7 | host_t host; 8 | mach_msg_type_number_t count; 9 | host_cpu_load_info_data_t load; 10 | host_cpu_load_info_data_t prev_load; 11 | bool has_prev_load; 12 | 13 | int user_load; 14 | int sys_load; 15 | int total_load; 16 | }; 17 | 18 | static inline void cpu_init(struct cpu* cpu) { 19 | cpu->host = mach_host_self(); 20 | cpu->count = HOST_CPU_LOAD_INFO_COUNT; 21 | cpu->has_prev_load = false; 22 | } 23 | 24 | static inline void cpu_update(struct cpu* cpu) { 25 | kern_return_t error = host_statistics(cpu->host, 26 | HOST_CPU_LOAD_INFO, 27 | (host_info_t)&cpu->load, 28 | &cpu->count ); 29 | 30 | if (error != KERN_SUCCESS) { 31 | printf("Error: Could not read cpu host statistics.\n"); 32 | return; 33 | } 34 | 35 | if (cpu->has_prev_load) { 36 | uint32_t delta_user = cpu->load.cpu_ticks[CPU_STATE_USER] 37 | - cpu->prev_load.cpu_ticks[CPU_STATE_USER]; 38 | 39 | uint32_t delta_system = cpu->load.cpu_ticks[CPU_STATE_SYSTEM] 40 | - cpu->prev_load.cpu_ticks[CPU_STATE_SYSTEM]; 41 | 42 | uint32_t delta_idle = cpu->load.cpu_ticks[CPU_STATE_IDLE] 43 | - cpu->prev_load.cpu_ticks[CPU_STATE_IDLE]; 44 | 45 | cpu->user_load = (double)delta_user / (double)(delta_system 46 | + delta_user 47 | + delta_idle) * 100.0; 48 | 49 | cpu->sys_load = (double)delta_system / (double)(delta_system 50 | + delta_user 51 | + delta_idle) * 100.0; 52 | 53 | cpu->total_load = cpu->user_load + cpu->sys_load; 54 | } 55 | 56 | cpu->prev_load = cpu->load; 57 | cpu->has_prev_load = true; 58 | } 59 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/cpu_load/cpu_load.c: -------------------------------------------------------------------------------- 1 | #include "cpu.h" 2 | #include "../sketchybar.h" 3 | 4 | int main (int argc, char** argv) { 5 | float update_freq; 6 | if (argc < 3 || (sscanf(argv[2], "%f", &update_freq) != 1)) { 7 | printf("Usage: %s \"\" \"\"\n", argv[0]); 8 | exit(1); 9 | } 10 | 11 | alarm(0); 12 | struct cpu cpu; 13 | cpu_init(&cpu); 14 | 15 | // Setup the event in sketchybar 16 | char event_message[512]; 17 | snprintf(event_message, 512, "--add event '%s'", argv[1]); 18 | sketchybar(event_message); 19 | 20 | char trigger_message[512]; 21 | for (;;) { 22 | // Acquire new info 23 | cpu_update(&cpu); 24 | 25 | // Prepare the event message 26 | snprintf(trigger_message, 27 | 512, 28 | "--trigger '%s' user_load='%d' sys_load='%02d' total_load='%02d'", 29 | argv[1], 30 | cpu.user_load, 31 | cpu.sys_load, 32 | cpu.total_load ); 33 | 34 | // Trigger the event 35 | sketchybar(trigger_message); 36 | 37 | // Wait 38 | usleep(update_freq * 1000000); 39 | } 40 | return 0; 41 | } 42 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/cpu_load/makefile: -------------------------------------------------------------------------------- 1 | bin/cpu_load: cpu_load.c cpu.h ../sketchybar.h | bin 2 | clang -std=c99 -O3 $< -o $@ 3 | 4 | bin: 5 | mkdir bin 6 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | (cd cpu_load && $(MAKE)) 3 | (cd network_load && $(MAKE)) 4 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/network_load/makefile: -------------------------------------------------------------------------------- 1 | bin/network_load: network_load.c network.h ../sketchybar.h | bin 2 | clang -std=c99 -O3 $< -o $@ 3 | 4 | bin: 5 | mkdir bin 6 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/network_load/network.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | static char unit_str[3][6] = { { " Bps" }, { "KBps" }, { "MBps" }, }; 10 | 11 | enum unit { 12 | UNIT_BPS, 13 | UNIT_KBPS, 14 | UNIT_MBPS 15 | }; 16 | struct network { 17 | uint32_t row; 18 | struct ifmibdata data; 19 | struct timeval tv_nm1, tv_n, tv_delta; 20 | 21 | int up; 22 | int down; 23 | enum unit up_unit, down_unit; 24 | }; 25 | 26 | static inline void ifdata(uint32_t net_row, struct ifmibdata* data) { 27 | static size_t size = sizeof(struct ifmibdata); 28 | static int32_t data_option[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL }; 29 | data_option[4] = net_row; 30 | sysctl(data_option, 6, data, &size, NULL, 0); 31 | } 32 | 33 | static inline void network_init(struct network* net, char* ifname) { 34 | memset(net, 0, sizeof(struct network)); 35 | 36 | static int count_option[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT }; 37 | uint32_t interface_count = 0; 38 | size_t size = sizeof(uint32_t); 39 | sysctl(count_option, 5, &interface_count, &size, NULL, 0); 40 | 41 | for (int i = 0; i < interface_count; i++) { 42 | ifdata(i, &net->data); 43 | if (strcmp(net->data.ifmd_name, ifname) == 0) { 44 | net->row = i; 45 | break; 46 | } 47 | } 48 | } 49 | 50 | static inline void network_update(struct network* net) { 51 | gettimeofday(&net->tv_n, NULL); 52 | timersub(&net->tv_n, &net->tv_nm1, &net->tv_delta); 53 | net->tv_nm1 = net->tv_n; 54 | 55 | uint64_t ibytes_nm1 = net->data.ifmd_data.ifi_ibytes; 56 | uint64_t obytes_nm1 = net->data.ifmd_data.ifi_obytes; 57 | ifdata(net->row, &net->data); 58 | 59 | double time_scale = (net->tv_delta.tv_sec + 1e-6*net->tv_delta.tv_usec); 60 | if (time_scale < 1e-6 || time_scale > 1e2) return; 61 | double delta_ibytes = (double)(net->data.ifmd_data.ifi_ibytes - ibytes_nm1) 62 | / time_scale; 63 | double delta_obytes = (double)(net->data.ifmd_data.ifi_obytes - obytes_nm1) 64 | / time_scale; 65 | 66 | double exponent_ibytes = log10(delta_ibytes); 67 | double exponent_obytes = log10(delta_obytes); 68 | 69 | if (exponent_ibytes < 3) { 70 | net->down_unit = UNIT_BPS; 71 | net->down = delta_ibytes; 72 | } else if (exponent_ibytes < 6) { 73 | net->down_unit = UNIT_KBPS; 74 | net->down = delta_ibytes / 1000.0; 75 | } else if (exponent_ibytes < 9) { 76 | net->down_unit = UNIT_MBPS; 77 | net->down = delta_ibytes / 1000000.0; 78 | } 79 | 80 | if (exponent_obytes < 3) { 81 | net->up_unit = UNIT_BPS; 82 | net->up = delta_obytes; 83 | } else if (exponent_obytes < 6) { 84 | net->up_unit = UNIT_KBPS; 85 | net->up = delta_obytes / 1000.0; 86 | } else if (exponent_obytes < 9) { 87 | net->up_unit = UNIT_MBPS; 88 | net->up = delta_obytes / 1000000.0; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/network_load/network_load.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "network.h" 3 | #include "../sketchybar.h" 4 | 5 | int main (int argc, char** argv) { 6 | float update_freq; 7 | if (argc < 4 || (sscanf(argv[3], "%f", &update_freq) != 1)) { 8 | printf("Usage: %s \"\" \"\" \"\"\n", argv[0]); 9 | exit(1); 10 | } 11 | 12 | alarm(0); 13 | // Setup the event in sketchybar 14 | char event_message[512]; 15 | snprintf(event_message, 512, "--add event '%s'", argv[2]); 16 | sketchybar(event_message); 17 | 18 | struct network network; 19 | network_init(&network, argv[1]); 20 | char trigger_message[512]; 21 | for (;;) { 22 | // Acquire new info 23 | network_update(&network); 24 | 25 | // Prepare the event message 26 | snprintf(trigger_message, 27 | 512, 28 | "--trigger '%s' upload='%03d%s' download='%03d%s'", 29 | argv[2], 30 | network.up, 31 | unit_str[network.up_unit], 32 | network.down, 33 | unit_str[network.down_unit]); 34 | 35 | // Trigger the event 36 | sketchybar(trigger_message); 37 | 38 | // Wait 39 | usleep(update_freq * 1000000); 40 | } 41 | return 0; 42 | } 43 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/event_providers/sketchybar.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | typedef char* env; 13 | 14 | #define MACH_HANDLER(name) void name(env env) 15 | typedef MACH_HANDLER(mach_handler); 16 | 17 | struct mach_message { 18 | mach_msg_header_t header; 19 | mach_msg_size_t msgh_descriptor_count; 20 | mach_msg_ool_descriptor_t descriptor; 21 | }; 22 | 23 | struct mach_buffer { 24 | struct mach_message message; 25 | mach_msg_trailer_t trailer; 26 | }; 27 | 28 | static mach_port_t g_mach_port = 0; 29 | 30 | static inline mach_port_t mach_get_bs_port() { 31 | mach_port_name_t task = mach_task_self(); 32 | 33 | mach_port_t bs_port; 34 | if (task_get_special_port(task, 35 | TASK_BOOTSTRAP_PORT, 36 | &bs_port ) != KERN_SUCCESS) { 37 | return 0; 38 | } 39 | 40 | char* name = getenv("BAR_NAME"); 41 | if (!name) name = "sketchybar"; 42 | uint32_t lookup_len = 16 + strlen(name); 43 | 44 | char buffer[lookup_len]; 45 | snprintf(buffer, lookup_len, "git.felix.%s", name); 46 | 47 | mach_port_t port; 48 | if (bootstrap_look_up(bs_port, buffer, &port) != KERN_SUCCESS) return 0; 49 | return port; 50 | } 51 | 52 | static inline bool mach_send_message(mach_port_t port, char* message, uint32_t len) { 53 | if (!message || !port) { 54 | return false; 55 | } 56 | 57 | struct mach_message msg = { 0 }; 58 | msg.header.msgh_remote_port = port; 59 | msg.header.msgh_local_port = 0; 60 | msg.header.msgh_id = 0; 61 | msg.header.msgh_bits = MACH_MSGH_BITS_SET(MACH_MSG_TYPE_COPY_SEND, 62 | MACH_MSG_TYPE_MAKE_SEND, 63 | 0, 64 | MACH_MSGH_BITS_COMPLEX ); 65 | 66 | msg.header.msgh_size = sizeof(struct mach_message); 67 | msg.msgh_descriptor_count = 1; 68 | msg.descriptor.address = message; 69 | msg.descriptor.size = len * sizeof(char); 70 | msg.descriptor.copy = MACH_MSG_VIRTUAL_COPY; 71 | msg.descriptor.deallocate = false; 72 | msg.descriptor.type = MACH_MSG_OOL_DESCRIPTOR; 73 | 74 | kern_return_t err = mach_msg(&msg.header, 75 | MACH_SEND_MSG, 76 | sizeof(struct mach_message), 77 | 0, 78 | MACH_PORT_NULL, 79 | MACH_MSG_TIMEOUT_NONE, 80 | MACH_PORT_NULL ); 81 | 82 | return err == KERN_SUCCESS; 83 | } 84 | 85 | static inline uint32_t format_message(char* message, char* formatted_message) { 86 | // This is not actually robust, switch to stack based messaging. 87 | char outer_quote = 0; 88 | uint32_t caret = 0; 89 | uint32_t message_length = strlen(message) + 1; 90 | for (int i = 0; i < message_length; ++i) { 91 | if (message[i] == '"' || message[i] == '\'') { 92 | if (outer_quote && outer_quote == message[i]) outer_quote = 0; 93 | else if (!outer_quote) outer_quote = message[i]; 94 | continue; 95 | } 96 | formatted_message[caret] = message[i]; 97 | if (message[i] == ' ' && !outer_quote) formatted_message[caret] = '\0'; 98 | caret++; 99 | } 100 | 101 | if (caret > 0 && formatted_message[caret] == '\0' 102 | && formatted_message[caret - 1] == '\0') { 103 | caret--; 104 | } 105 | formatted_message[caret] = '\0'; 106 | return caret + 1; 107 | } 108 | 109 | static inline void sketchybar(char* message) { 110 | char formatted_message[strlen(message) + 2]; 111 | uint32_t length = format_message(message, formatted_message); 112 | if (!length) return; 113 | 114 | if (!g_mach_port) g_mach_port = mach_get_bs_port(); 115 | if (!mach_send_message(g_mach_port, formatted_message, length)) { 116 | g_mach_port = mach_get_bs_port(); 117 | if (!mach_send_message(g_mach_port, formatted_message, length)) { 118 | // No sketchybar instance running, exit. 119 | exit(0); 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/init.lua: -------------------------------------------------------------------------------- 1 | -- Add the sketchybar module to the package cpath 2 | package.cpath = package.cpath .. ";/Users/" .. os.getenv("USER") .. "/.local/share/sketchybar_lua/?.so" 3 | 4 | os.execute("(cd helpers && make)") 5 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/install.sh: -------------------------------------------------------------------------------- 1 | # Packages 2 | brew install lua 3 | brew install switchaudio-osx 4 | brew install nowplaying-cli 5 | 6 | brew tap FelixKratz/formulae 7 | brew install sketchybar 8 | 9 | # Fonts 10 | brew install --cask sf-symbols 11 | brew install --cask homebrew/cask-fonts/font-sf-mono 12 | brew install --cask homebrew/cask-fonts/font-sf-pro 13 | 14 | curl -L https://github.com/kvndrsslr/sketchybar-app-font/releases/download/v2.0.5/sketchybar-app-font.ttf -o $HOME/Library/Fonts/sketchybar-app-font.ttf 15 | 16 | # SbarLua 17 | (git clone https://github.com/FelixKratz/SbarLua.git /tmp/SbarLua && cd /tmp/SbarLua/ && make install && rm -rf /tmp/SbarLua/) 18 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/makefile: -------------------------------------------------------------------------------- 1 | all: 2 | (cd event_providers && $(MAKE)) >/dev/null 3 | (cd menus && $(MAKE)) >/dev/null 4 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/menus/makefile: -------------------------------------------------------------------------------- 1 | bin/menus: menus.c | bin 2 | clang -std=c99 -O3 -F/System/Library/PrivateFrameworks/ -framework Carbon -framework SkyLight $< -o $@ 3 | 4 | bin: 5 | mkdir bin 6 | -------------------------------------------------------------------------------- /config/sketchybar/helpers/menus/menus.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void ax_init() { 4 | const void *keys[] = { kAXTrustedCheckOptionPrompt }; 5 | const void *values[] = { kCFBooleanTrue }; 6 | 7 | CFDictionaryRef options; 8 | options = CFDictionaryCreate(kCFAllocatorDefault, 9 | keys, 10 | values, 11 | sizeof(keys) / sizeof(*keys), 12 | &kCFCopyStringDictionaryKeyCallBacks, 13 | &kCFTypeDictionaryValueCallBacks ); 14 | 15 | bool trusted = AXIsProcessTrustedWithOptions(options); 16 | CFRelease(options); 17 | if (!trusted) exit(1); 18 | } 19 | 20 | void ax_perform_click(AXUIElementRef element) { 21 | if (!element) return; 22 | AXUIElementPerformAction(element, kAXCancelAction); 23 | usleep(150000); 24 | AXUIElementPerformAction(element, kAXPressAction); 25 | } 26 | 27 | CFStringRef ax_get_title(AXUIElementRef element) { 28 | CFTypeRef title = NULL; 29 | AXError error = AXUIElementCopyAttributeValue(element, 30 | kAXTitleAttribute, 31 | &title ); 32 | 33 | if (error != kAXErrorSuccess) return NULL; 34 | return title; 35 | } 36 | 37 | void ax_select_menu_option(AXUIElementRef app, int id) { 38 | AXUIElementRef menubars_ref = NULL; 39 | CFArrayRef children_ref = NULL; 40 | 41 | AXError error = AXUIElementCopyAttributeValue(app, 42 | kAXMenuBarAttribute, 43 | (CFTypeRef*)&menubars_ref); 44 | if (error == kAXErrorSuccess) { 45 | error = AXUIElementCopyAttributeValue(menubars_ref, 46 | kAXVisibleChildrenAttribute, 47 | (CFTypeRef*)&children_ref ); 48 | 49 | if (error == kAXErrorSuccess) { 50 | uint32_t count = CFArrayGetCount(children_ref); 51 | if (id < count) { 52 | AXUIElementRef item = CFArrayGetValueAtIndex(children_ref, id); 53 | ax_perform_click(item); 54 | } 55 | if (children_ref) CFRelease(children_ref); 56 | } 57 | if (menubars_ref) CFRelease(menubars_ref); 58 | } 59 | } 60 | 61 | void ax_print_menu_options(AXUIElementRef app) { 62 | AXUIElementRef menubars_ref = NULL; 63 | CFTypeRef menubar = NULL; 64 | CFArrayRef children_ref = NULL; 65 | 66 | AXError error = AXUIElementCopyAttributeValue(app, 67 | kAXMenuBarAttribute, 68 | (CFTypeRef*)&menubars_ref); 69 | if (error == kAXErrorSuccess) { 70 | error = AXUIElementCopyAttributeValue(menubars_ref, 71 | kAXVisibleChildrenAttribute, 72 | (CFTypeRef*)&children_ref ); 73 | 74 | if (error == kAXErrorSuccess) { 75 | uint32_t count = CFArrayGetCount(children_ref); 76 | 77 | for (int i = 1; i < count; i++) { 78 | AXUIElementRef item = CFArrayGetValueAtIndex(children_ref, i); 79 | CFTypeRef title = ax_get_title(item); 80 | 81 | if (title) { 82 | uint32_t buffer_len = 2*CFStringGetLength(title); 83 | char buffer[2*CFStringGetLength(title)]; 84 | CFStringGetCString(title, buffer, buffer_len, kCFStringEncodingUTF8); 85 | printf("%s\n", buffer); 86 | CFRelease(title); 87 | } 88 | } 89 | } 90 | if (menubars_ref) CFRelease(menubars_ref); 91 | if (children_ref) CFRelease(children_ref); 92 | } 93 | } 94 | 95 | AXUIElementRef ax_get_extra_menu_item(char* alias) { 96 | pid_t pid = 0; 97 | CGRect bounds = CGRectNull; 98 | CFArrayRef window_list = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, 99 | kCGNullWindowID ); 100 | char owner_buffer[256]; 101 | char name_buffer[256]; 102 | char buffer[512]; 103 | int window_count = CFArrayGetCount(window_list); 104 | for (int i = 0; i < window_count; ++i) { 105 | CFDictionaryRef dictionary = CFArrayGetValueAtIndex(window_list, i); 106 | if (!dictionary) continue; 107 | 108 | CFStringRef owner_ref = CFDictionaryGetValue(dictionary, 109 | kCGWindowOwnerName); 110 | 111 | CFNumberRef owner_pid_ref = CFDictionaryGetValue(dictionary, 112 | kCGWindowOwnerPID); 113 | 114 | CFStringRef name_ref = CFDictionaryGetValue(dictionary, kCGWindowName); 115 | CFNumberRef layer_ref = CFDictionaryGetValue(dictionary, kCGWindowLayer); 116 | CFDictionaryRef bounds_ref = CFDictionaryGetValue(dictionary, 117 | kCGWindowBounds); 118 | 119 | if (!name_ref || !owner_ref || !owner_pid_ref || !layer_ref || !bounds_ref) 120 | continue; 121 | 122 | long long int layer = 0; 123 | CFNumberGetValue(layer_ref, CFNumberGetType(layer_ref), &layer); 124 | uint64_t owner_pid = 0; 125 | CFNumberGetValue(owner_pid_ref, 126 | CFNumberGetType(owner_pid_ref), 127 | &owner_pid ); 128 | 129 | if (layer != 0x19) continue; 130 | bounds = CGRectNull; 131 | if (!CGRectMakeWithDictionaryRepresentation(bounds_ref, &bounds)) continue; 132 | CFStringGetCString(owner_ref, 133 | owner_buffer, 134 | sizeof(owner_buffer), 135 | kCFStringEncodingUTF8); 136 | 137 | CFStringGetCString(name_ref, 138 | name_buffer, 139 | sizeof(name_buffer), 140 | kCFStringEncodingUTF8); 141 | snprintf(buffer, sizeof(buffer), "%s,%s", owner_buffer, name_buffer); 142 | 143 | if (strcmp(buffer, alias) == 0) { 144 | pid = owner_pid; 145 | break; 146 | } 147 | } 148 | CFRelease(window_list); 149 | if (!pid) return NULL; 150 | 151 | AXUIElementRef app = AXUIElementCreateApplication(pid); 152 | if (!app) return NULL; 153 | AXUIElementRef result = NULL; 154 | CFTypeRef extras = NULL; 155 | CFArrayRef children_ref = NULL; 156 | AXError error = AXUIElementCopyAttributeValue(app, 157 | kAXExtrasMenuBarAttribute, 158 | &extras ); 159 | if (error == kAXErrorSuccess) { 160 | error = AXUIElementCopyAttributeValue(extras, 161 | kAXVisibleChildrenAttribute, 162 | (CFTypeRef*)&children_ref ); 163 | 164 | if (error == kAXErrorSuccess) { 165 | uint32_t count = CFArrayGetCount(children_ref); 166 | for (uint32_t i = 0; i < count; i++) { 167 | AXUIElementRef item = CFArrayGetValueAtIndex(children_ref, i); 168 | CFTypeRef position_ref = NULL; 169 | CFTypeRef size_ref = NULL; 170 | AXUIElementCopyAttributeValue(item, kAXPositionAttribute, 171 | &position_ref ); 172 | AXUIElementCopyAttributeValue(item, kAXSizeAttribute, 173 | &size_ref ); 174 | if (!position_ref || !size_ref) continue; 175 | 176 | CGPoint position = CGPointZero; 177 | AXValueGetValue(position_ref, kAXValueCGPointType, &position); 178 | CGSize size = CGSizeZero; 179 | AXValueGetValue(size_ref, kAXValueCGSizeType, &size); 180 | CFRelease(position_ref); 181 | CFRelease(size_ref); 182 | // The offset is exactly 8 on macOS Sonoma... 183 | // printf("%f %f\n", position.x, bounds.origin.x); 184 | if (error == kAXErrorSuccess 185 | && fabs(position.x - bounds.origin.x) <= 10) { 186 | result = item; 187 | break; 188 | } 189 | } 190 | } 191 | } 192 | 193 | CFRelease(app); 194 | return result; 195 | } 196 | 197 | extern int SLSMainConnectionID(); 198 | extern void SLSSetMenuBarVisibilityOverrideOnDisplay(int cid, int did, bool enabled); 199 | extern void SLSSetMenuBarVisibilityOverrideOnDisplay(int cid, int did, bool enabled); 200 | extern void SLSSetMenuBarInsetAndAlpha(int cid, double u1, double u2, float alpha); 201 | void ax_select_menu_extra(char* alias) { 202 | AXUIElementRef item = ax_get_extra_menu_item(alias); 203 | if (!item) return; 204 | SLSSetMenuBarInsetAndAlpha(SLSMainConnectionID(), 0, 1, 0.0); 205 | SLSSetMenuBarVisibilityOverrideOnDisplay(SLSMainConnectionID(), 0, true); 206 | SLSSetMenuBarInsetAndAlpha(SLSMainConnectionID(), 0, 1, 0.0); 207 | ax_perform_click(item); 208 | SLSSetMenuBarVisibilityOverrideOnDisplay(SLSMainConnectionID(), 0, false); 209 | SLSSetMenuBarInsetAndAlpha(SLSMainConnectionID(), 0, 1, 1.0); 210 | CFRelease(item); 211 | } 212 | 213 | extern void _SLPSGetFrontProcess(ProcessSerialNumber* psn); 214 | extern void SLSGetConnectionIDForPSN(int cid, ProcessSerialNumber* psn, int* cid_out); 215 | extern void SLSConnectionGetPID(int cid, pid_t* pid_out); 216 | AXUIElementRef ax_get_front_app() { 217 | ProcessSerialNumber psn; 218 | _SLPSGetFrontProcess(&psn); 219 | int target_cid; 220 | SLSGetConnectionIDForPSN(SLSMainConnectionID(), &psn, &target_cid); 221 | 222 | pid_t pid; 223 | SLSConnectionGetPID(target_cid, &pid); 224 | return AXUIElementCreateApplication(pid); 225 | } 226 | 227 | int main (int argc, char **argv) { 228 | if (argc == 1) { 229 | printf("Usage: %s [-l | -s id/alias ]\n", argv[0]); 230 | exit(0); 231 | } 232 | ax_init(); 233 | if (strcmp(argv[1], "-l") == 0) { 234 | AXUIElementRef app = ax_get_front_app(); 235 | if (!app) return 1; 236 | ax_print_menu_options(app); 237 | CFRelease(app); 238 | } else if (argc == 3 && strcmp(argv[1], "-s") == 0) { 239 | int id = 0; 240 | if (sscanf(argv[2], "%d", &id) == 1) { 241 | AXUIElementRef app = ax_get_front_app(); 242 | if (!app) return 1; 243 | ax_select_menu_option(app, id); 244 | CFRelease(app); 245 | } else ax_select_menu_extra(argv[2]); 246 | } 247 | return 0; 248 | } 249 | -------------------------------------------------------------------------------- /config/sketchybar/icons.lua: -------------------------------------------------------------------------------- 1 | local settings = require("settings") 2 | 3 | local icons = { 4 | sf_symbols = { 5 | plus = "􀅼", 6 | loading = "􀖇", 7 | apple = "􀣺", 8 | gear = "􀍟", 9 | cpu = "􀫥", 10 | clipboard = "􀉄", 11 | 12 | switch = { 13 | on = "􁏮", 14 | off = "􁏯", 15 | }, 16 | volume = { 17 | _100="􀊩", 18 | _66="􀊧", 19 | _33="􀊥", 20 | _10="􀊡", 21 | _0="􀊣", 22 | }, 23 | battery = { 24 | _100 = "■■■■■■", 25 | _80 = "■■■■□", 26 | _60 = "■■■□□", 27 | _40 = "■■□□□", 28 | _20 = "■□□□□", 29 | _0 = "◧□□□□", 30 | charging = "charging" 31 | }, 32 | wifi = { 33 | upload = "􀄨", 34 | download = "􀄩", 35 | connected = "􀙇", 36 | disconnected = "􀙈", 37 | router = "􁓤", 38 | }, 39 | media = { 40 | back = "􀊊", 41 | forward = "􀊌", 42 | play_pause = "􀊈", 43 | }, 44 | }, 45 | 46 | -- Alternative NerdFont icons 47 | nerdfont = { 48 | plus = "", 49 | loading = "", 50 | apple = "", 51 | gear = "", 52 | cpu = "", 53 | clipboard = "Missing Icon", 54 | 55 | switch = { 56 | on = "󱨥", 57 | off = "󱨦", 58 | }, 59 | volume = { 60 | _100="", 61 | _66="", 62 | _33="", 63 | _10="", 64 | _0="", 65 | }, 66 | battery = { 67 | _100 = "", 68 | _75 = "", 69 | _50 = "", 70 | _25 = "", 71 | _0 = "", 72 | charging = "" 73 | }, 74 | wifi = { 75 | upload = "", 76 | download = "", 77 | connected = "󰖩", 78 | disconnected = "󰖪", 79 | router = "Missing Icon" 80 | }, 81 | media = { 82 | back = "", 83 | forward = "", 84 | play_pause = "", 85 | }, 86 | }, 87 | } 88 | 89 | if not (settings.icons == "NerdFont") then 90 | return icons.sf_symbols 91 | else 92 | return icons.nerdfont 93 | end 94 | -------------------------------------------------------------------------------- /config/sketchybar/init.lua: -------------------------------------------------------------------------------- 1 | -- Require the sketchybar module 2 | sbar = require("sketchybar") 3 | 4 | -- Set the bar name, if you are using another bar instance than sketchybar 5 | -- sbar.set_bar_name("bottom_bar") 6 | 7 | -- Bundle the entire initial configuration into a single message to sketchybar 8 | sbar.begin_config() 9 | require("bar") 10 | require("default") 11 | require("items") 12 | sbar.end_config() 13 | 14 | -- Run the event loop of the sketchybar module (without this there will be no 15 | -- callback functions executed in the lua module) 16 | sbar.event_loop() 17 | -------------------------------------------------------------------------------- /config/sketchybar/items/apple.lua: -------------------------------------------------------------------------------- 1 | local colors = require("colors") 2 | local icons = require("icons") 3 | local settings = require("settings") 4 | 5 | -- Padding item required because of bracket 6 | sbar.add("item", { width = 5 }) 7 | 8 | local apple = sbar.add("item", { 9 | icon = { 10 | font = { size = 16.0 }, 11 | string = icons.apple, 12 | padding_right = 12, 13 | padding_left = 10, 14 | }, 15 | label = { drawing = false }, 16 | background = { 17 | color = colors.bg2, 18 | border_color = colors.black, 19 | border_width = 3 20 | }, 21 | padding_left = 1, 22 | padding_right = 1, 23 | click_script = "$CONFIG_DIR/helpers/menus/bin/menus -s 0" 24 | }) 25 | 26 | -- Padding item required because of bracket 27 | sbar.add("item", { width = 7 }) 28 | -------------------------------------------------------------------------------- /config/sketchybar/items/calendar.lua: -------------------------------------------------------------------------------- 1 | local settings = require("settings") 2 | local colors = require("colors") 3 | 4 | -- Padding item required because of bracket 5 | sbar.add("item", { position = "right", width = settings.group_paddings }) 6 | 7 | local cal = sbar.add("item", { 8 | icon = { 9 | color = colors.white, 10 | padding_left = 12, 11 | font = { 12 | style = settings.font.style_map["Bold"], 13 | size = 14.0, 14 | }, 15 | }, 16 | label = { 17 | color = colors.white, 18 | padding_right = 16, 19 | width = 70, 20 | align = "right", 21 | font = { family = settings.font.numbers }, 22 | }, 23 | position = "right", 24 | update_freq = 30, 25 | padding_left = 1, 26 | padding_right = 1, 27 | background = { 28 | color = colors.bg2, 29 | border_color = colors.black, 30 | border_width = 3 31 | }, 32 | }) 33 | 34 | -- Double border for calendar using a single item bracket 35 | sbar.add("bracket", { cal.name }, { 36 | background = { 37 | color = colors.transparent, 38 | border_color = colors.grey, 39 | } 40 | }) 41 | 42 | -- Padding item required because of bracket 43 | sbar.add("item", { position = "right", width = settings.group_paddings }) 44 | 45 | cal:subscribe({ "forced", "routine", "system_woke" }, function(env) 46 | cal:set({ icon = os.date("􀉉 %A %d %B"), label = os.date(" 􀐫 %H:%M") }) 47 | end) 48 | -------------------------------------------------------------------------------- /config/sketchybar/items/init.lua: -------------------------------------------------------------------------------- 1 | require("items.apple") 2 | require("items.menus") 3 | require("items.spaces") 4 | -- require("items.space_mode") 5 | require("items.calendar") 6 | require("items.widgets") 7 | require("items.media") 8 | -------------------------------------------------------------------------------- /config/sketchybar/items/media.lua: -------------------------------------------------------------------------------- 1 | local icons = require("icons") 2 | local colors = require("colors") 3 | 4 | local whitelist = { ["Spotify"] = true, 5 | ["Music"] = true }; 6 | 7 | local media_cover = sbar.add("item", { 8 | position = "right", 9 | background = { 10 | image = { 11 | string = "media.artwork", 12 | scale = 0.85, 13 | }, 14 | color = colors.transparent, 15 | }, 16 | label = { drawing = false }, 17 | icon = { drawing = false }, 18 | drawing = false, 19 | updates = true, 20 | popup = { 21 | align = "center", 22 | horizontal = true, 23 | } 24 | }) 25 | 26 | local media_artist = sbar.add("item", { 27 | position = "right", 28 | drawing = false, 29 | padding_left = 3, 30 | padding_right = 0, 31 | width = 0, 32 | icon = { drawing = false }, 33 | label = { 34 | width = 0, 35 | font = { size = 9 }, 36 | color = colors.with_alpha(colors.white, 0.6), 37 | max_chars = 18, 38 | y_offset = 6, 39 | }, 40 | }) 41 | 42 | local media_title = sbar.add("item", { 43 | position = "right", 44 | drawing = false, 45 | padding_left = 3, 46 | padding_right = 0, 47 | icon = { drawing = false }, 48 | label = { 49 | font = { size = 11 }, 50 | width = 0, 51 | max_chars = 16, 52 | y_offset = -5, 53 | }, 54 | }) 55 | 56 | sbar.add("item", { 57 | position = "popup." .. media_cover.name, 58 | icon = { string = icons.media.back }, 59 | label = { drawing = false }, 60 | click_script = "nowplaying-cli previous", 61 | }) 62 | sbar.add("item", { 63 | position = "popup." .. media_cover.name, 64 | icon = { string = icons.media.play_pause }, 65 | label = { drawing = false }, 66 | click_script = "nowplaying-cli togglePlayPause", 67 | }) 68 | sbar.add("item", { 69 | position = "popup." .. media_cover.name, 70 | icon = { string = icons.media.forward }, 71 | label = { drawing = false }, 72 | click_script = "nowplaying-cli next", 73 | }) 74 | 75 | local interrupt = 0 76 | local function animate_detail(detail) 77 | if (not detail) then interrupt = interrupt - 1 end 78 | if interrupt > 0 and (not detail) then return end 79 | 80 | sbar.animate("tanh", 30, function() 81 | media_artist:set({ label = { width = detail and "dynamic" or 0 } }) 82 | media_title:set({ label = { width = detail and "dynamic" or 0 } }) 83 | end) 84 | end 85 | 86 | media_cover:subscribe("media_change", function(env) 87 | if whitelist[env.INFO.app] then 88 | local drawing = (env.INFO.state == "playing") 89 | media_artist:set({ drawing = drawing, label = env.INFO.artist, }) 90 | media_title:set({ drawing = drawing, label = env.INFO.title, }) 91 | media_cover:set({ drawing = drawing }) 92 | 93 | if drawing then 94 | animate_detail(true) 95 | interrupt = interrupt + 1 96 | sbar.delay(5, animate_detail) 97 | else 98 | media_cover:set({ popup = { drawing = false } }) 99 | end 100 | end 101 | end) 102 | 103 | media_cover:subscribe("mouse.entered", function(env) 104 | interrupt = interrupt + 1 105 | animate_detail(true) 106 | end) 107 | 108 | media_cover:subscribe("mouse.exited", function(env) 109 | animate_detail(false) 110 | end) 111 | 112 | media_cover:subscribe("mouse.clicked", function(env) 113 | media_cover:set({ popup = { drawing = "toggle" }}) 114 | end) 115 | 116 | media_title:subscribe("mouse.exited.global", function(env) 117 | media_cover:set({ popup = { drawing = false }}) 118 | end) 119 | -------------------------------------------------------------------------------- /config/sketchybar/items/menus.lua: -------------------------------------------------------------------------------- 1 | local colors = require("colors") 2 | local icons = require("icons") 3 | local settings = require("settings") 4 | 5 | local menu_watcher = sbar.add("item", { 6 | drawing = false, 7 | updates = false, 8 | }) 9 | local space_menu_swap = sbar.add("item", { 10 | drawing = false, 11 | updates = true, 12 | }) 13 | sbar.add("event", "swap_menus_and_spaces") 14 | 15 | local max_items = 15 16 | local menu_items = {} 17 | for i = 1, max_items, 1 do 18 | local menu = sbar.add("item", "menu." .. i, { 19 | padding_left = settings.paddings, 20 | padding_right = settings.paddings, 21 | drawing = false, 22 | icon = { drawing = false }, 23 | label = { 24 | font = { 25 | style = settings.font.style_map[i == 1 and "Heavy" or "Semibold"] 26 | }, 27 | padding_left = 6, 28 | padding_right = 6, 29 | }, 30 | click_script = "$CONFIG_DIR/helpers/menus/bin/menus -s " .. i, 31 | }) 32 | 33 | menu_items[i] = menu 34 | end 35 | 36 | sbar.add("bracket", { '/menu\\..*/' }, { 37 | background = { color = colors.bg1 } 38 | }) 39 | 40 | local menu_padding = sbar.add("item", "menu.padding", { 41 | drawing = false, 42 | width = 5 43 | }) 44 | 45 | local function update_menus(env) 46 | sbar.exec("$CONFIG_DIR/helpers/menus/bin/menus -l", function(menus) 47 | sbar.set('/menu\\..*/', { drawing = false }) 48 | menu_padding:set({ drawing = true }) 49 | id = 1 50 | for menu in string.gmatch(menus, '[^\r\n]+') do 51 | if id < max_items then 52 | menu_items[id]:set( { label = menu, drawing = true } ) 53 | else break end 54 | id = id + 1 55 | end 56 | end) 57 | end 58 | 59 | -- menu_watcher:subscribe("front_app_switched", update_menus) 60 | 61 | -- space_menu_swap:subscribe("swap_menus_and_spaces", function(env) 62 | -- local drawing = menu_items[1]:query().geometry.drawing == "on" 63 | -- if drawing then 64 | -- menu_watcher:set( { updates = false }) 65 | -- sbar.set("/menu\\..*/", { drawing = false }) 66 | -- sbar.set("/space\\..*/", { drawing = true }) 67 | -- sbar.set("front_app", { drawing = true }) 68 | -- else 69 | -- menu_watcher:set( { updates = true }) 70 | -- sbar.set("/space\\..*/", { drawing = false }) 71 | -- sbar.set("front_app", { drawing = false }) 72 | -- update_menus() 73 | -- end 74 | -- end) 75 | 76 | return menu_watcher 77 | -------------------------------------------------------------------------------- /config/sketchybar/items/spaces.lua: -------------------------------------------------------------------------------- 1 | local colors = require("colors") 2 | local icons = require("icons") 3 | local settings = require("settings") 4 | local app_icons = require("helpers.app_icons") 5 | 6 | local spaces = {} 7 | 8 | for i = 1, 10, 1 do 9 | local space = sbar.add("space", "space." .. i, { 10 | space = i, 11 | icon = { 12 | font = { family = settings.font.numbers }, 13 | string = i, 14 | padding_left = 15, 15 | padding_right = 8, 16 | color = colors.white, 17 | highlight_color = colors.red, 18 | }, 19 | label = { 20 | padding_right = 20, 21 | color = colors.grey, 22 | highlight_color = colors.white, 23 | font = "sketchybar-app-font:Regular:16.0", 24 | y_offset = -1, 25 | }, 26 | padding_right = 1, 27 | padding_left = 1, 28 | background = { 29 | color = colors.bg1, 30 | border_width = 3, 31 | border_color = colors.transparent, 32 | }, 33 | popup = { background = { border_width = 5, border_color = colors.black } } 34 | }) 35 | 36 | spaces[i] = space 37 | 38 | -- Padding space 39 | sbar.add("space", "space.padding." .. i, { 40 | space = i, 41 | script = "", 42 | width = settings.group_paddings, 43 | }) 44 | 45 | local space_popup = sbar.add("item", { 46 | position = "popup." .. space.name, 47 | padding_left= 5, 48 | padding_right= 0, 49 | background = { 50 | drawing = true, 51 | image = { 52 | corner_radius = 9, 53 | scale = 0.2 54 | } 55 | } 56 | }) 57 | 58 | space:subscribe("space_change", function(env) 59 | local selected = env.SELECTED == "true" 60 | local color = selected and colors.red or colors.bg2 61 | space:set({ 62 | icon = { highlight = selected, }, 63 | label = { highlight = selected }, 64 | background = { border_color = selected and colors.black or colors.bg2 } 65 | }) 66 | space_bracket:set({ 67 | background = { border_color = selected and colors.black or colors.bg2 } 68 | }) 69 | end) 70 | 71 | space:subscribe("mouse.clicked", function(env) 72 | if env.BUTTON == "other" then 73 | space_popup:set({ background = { image = "space." .. env.SID } }) 74 | space:set({ popup = { drawing = "toggle" } }) 75 | else 76 | local op = (env.BUTTON == "right") and "--destroy" or "--focus" 77 | sbar.exec("yabai -m space " .. op .. " " .. env.SID) 78 | end 79 | end) 80 | 81 | space:subscribe("mouse.exited", function(_) 82 | space:set({ popup = { drawing = false } }) 83 | end) 84 | end 85 | 86 | local space_window_observer = sbar.add("item", { 87 | drawing = false, 88 | updates = true, 89 | }) 90 | 91 | 92 | space_window_observer:subscribe("space_windows_change", function(env) 93 | local icon_line = "" 94 | local no_app = true 95 | for app, count in pairs(env.INFO.apps) do 96 | no_app = false 97 | local lookup = app_icons[app] 98 | local icon = ((lookup == nil) and app_icons["default"] or lookup) 99 | icon_line = icon_line .. " " .. icon 100 | end 101 | 102 | if (no_app) then 103 | icon_line = " —" 104 | end 105 | sbar.animate("tanh", 10, function() 106 | spaces[env.INFO.space]:set({ label = icon_line }) 107 | end) 108 | end) 109 | 110 | -- spaces_indicator:subscribe("swap_menus_and_spaces", function(env) 111 | -- local currently_on = spaces_indicator:query().icon.value == icons.switch.on 112 | -- spaces_indicator:set({ 113 | -- icon = currently_on and icons.switch.off or icons.switch.on 114 | -- }) 115 | -- end) 116 | 117 | -- spaces_indicator:subscribe("mouse.entered", function(env) 118 | -- sbar.animate("tanh", 30, function() 119 | -- spaces_indicator:set({ 120 | -- background = { 121 | -- color = { alpha = 1.0 }, 122 | -- border_color = { alpha = 1.0 }, 123 | -- }, 124 | -- icon = { color = colors.bg1 }, 125 | -- label = { width = "dynamic" } 126 | -- }) 127 | -- end) 128 | -- end) 129 | 130 | -- spaces_indicator:subscribe("mouse.exited", function(env) 131 | -- sbar.animate("tanh", 30, function() 132 | -- spaces_indicator:set({ 133 | -- background = { 134 | -- color = { alpha = 0.0 }, 135 | -- border_color = { alpha = 0.0 }, 136 | -- }, 137 | -- icon = { color = colors.grey }, 138 | -- label = { width = 0, } 139 | -- }) 140 | -- end) 141 | -- end) 142 | 143 | -- spaces_indicator:subscribe("mouse.clicked", function(env) 144 | -- sbar.trigger("swap_menus_and_spaces") 145 | -- end) 146 | -------------------------------------------------------------------------------- /config/sketchybar/items/widgets/battery.lua: -------------------------------------------------------------------------------- 1 | local icons = require("icons") 2 | local colors = require("colors") 3 | local settings = require("settings") 4 | 5 | local battery = sbar.add("item", "widgets.battery", { 6 | position = "right", 7 | icon = { 8 | font = { 9 | style = settings.font.style_map["Regular"], 10 | size = 12.0, 11 | } 12 | }, 13 | label = { font = { family = settings.font.numbers } }, 14 | update_freq = 180, 15 | popup = { align = "center" } 16 | }) 17 | 18 | local remaining_time = sbar.add("item", { 19 | position = "popup." .. battery.name, 20 | icon = { 21 | string = "Time remaining:", 22 | width = 100, 23 | align = "left" 24 | }, 25 | label = { 26 | string = "??:??h", 27 | width = 100, 28 | align = "right" 29 | }, 30 | }) 31 | 32 | 33 | battery:subscribe({"routine", "power_source_change", "system_woke"}, function() 34 | sbar.exec("pmset -g batt", function(batt_info) 35 | local icon = "!" 36 | local label = "?" 37 | 38 | local found, _, charge = batt_info:find("(%d+)%%") 39 | if found then 40 | charge = tonumber(charge) 41 | label = charge .. "%" 42 | end 43 | 44 | local color = colors.green 45 | local charging, _, _ = batt_info:find("AC Power") 46 | 47 | if charging then 48 | icon = icons.battery.charging 49 | else 50 | if found and charge == 0 then 51 | icon = icons.battery._0 52 | color = colors.red 53 | elseif found and charge <= 20 then 54 | icon = icons.battery._20 55 | color = colors.orange 56 | elseif found and charge <= 40 then 57 | icon = icons.battery._40 58 | elseif found and charge <= 60 then 59 | icon = icons.battery._60 60 | elseif found and charge <= 80 then 61 | icon = icons.battery._80 62 | elseif found and charge <= 100 then 63 | icon = icons.battery._100 64 | else 65 | icon = icons.battery._0 66 | color = colors.red 67 | end 68 | end 69 | 70 | local lead = "" 71 | if found and charge < 10 then 72 | lead = "0" 73 | end 74 | 75 | battery:set({ 76 | icon = { 77 | string = icon, 78 | color = color 79 | }, 80 | label = { string = lead .. label }, 81 | }) 82 | end) 83 | end) 84 | 85 | battery:subscribe("mouse.clicked", function(env) 86 | local drawing = battery:query().popup.drawing 87 | battery:set( { popup = { drawing = "toggle" } }) 88 | 89 | if drawing == "off" then 90 | sbar.exec("pmset -g batt", function(batt_info) 91 | local found, _, remaining = batt_info:find(" (%d+:%d+) remaining") 92 | local label = found and remaining .. "h" or "No estimate" 93 | remaining_time:set( { label = label }) 94 | end) 95 | end 96 | end) 97 | 98 | sbar.add("bracket", "widgets.battery.bracket", { battery.name }, { 99 | background = { color = colors.bg1 } 100 | }) 101 | 102 | sbar.add("item", "widgets.battery.padding", { 103 | position = "right", 104 | width = settings.group_paddings 105 | }) 106 | -------------------------------------------------------------------------------- /config/sketchybar/items/widgets/cpu.lua: -------------------------------------------------------------------------------- 1 | local icons = require("icons") 2 | local colors = require("colors") 3 | local settings = require("settings") 4 | 5 | -- Execute the event provider binary which provides the event "cpu_update" for 6 | -- the cpu load data, which is fired every 2.0 seconds. 7 | sbar.exec("killall cpu_load >/dev/null; $CONFIG_DIR/helpers/event_providers/cpu_load/bin/cpu_load cpu_update 2.0") 8 | 9 | local cpu = sbar.add("graph", "widgets.cpu" , 62, { 10 | position = "right", 11 | graph = { color = colors.blue }, 12 | background = { 13 | height = 22, 14 | color = { alpha = 0 }, 15 | border_color = { alpha = 0 }, 16 | drawing = true, 17 | }, 18 | icon = { string = icons.cpu }, 19 | label = { 20 | string = "cpu ??%", 21 | font = { 22 | family = settings.font.numbers, 23 | style = settings.font.style_map["Bold"], 24 | size = 9.0, 25 | }, 26 | align = "right", 27 | padding_right = 0, 28 | width = 0, 29 | y_offset = 4 30 | }, 31 | padding_right = settings.paddings + 6 32 | }) 33 | 34 | cpu:subscribe("cpu_update", function(env) 35 | -- Also available: env.user_load, env.sys_load 36 | local load = tonumber(env.total_load) 37 | cpu:push({ load / 100. }) 38 | 39 | local color = colors.blue 40 | if load > 30 then 41 | if load < 60 then 42 | color = colors.yellow 43 | elseif load < 80 then 44 | color = colors.orange 45 | else 46 | color = colors.red 47 | end 48 | end 49 | 50 | cpu:set({ 51 | graph = { color = color }, 52 | label = "cpu " .. env.total_load .. "%", 53 | }) 54 | end) 55 | 56 | cpu:subscribe("mouse.clicked", function(env) 57 | sbar.exec("open -a 'Activity Monitor'") 58 | end) 59 | 60 | -- Background around the cpu item 61 | sbar.add("bracket", "widgets.cpu.bracket", { cpu.name }, { 62 | background = { color = colors.bg1 } 63 | }) 64 | 65 | -- Background around the cpu item 66 | sbar.add("item", "widgets.cpu.padding", { 67 | position = "right", 68 | width = settings.group_paddings 69 | }) 70 | -------------------------------------------------------------------------------- /config/sketchybar/items/widgets/init.lua: -------------------------------------------------------------------------------- 1 | require("items.widgets.battery") 2 | require("items.widgets.volume") 3 | require("items.widgets.wifi") 4 | require("items.widgets.cpu") 5 | -------------------------------------------------------------------------------- /config/sketchybar/items/widgets/volume.lua: -------------------------------------------------------------------------------- 1 | local colors = require("colors") 2 | local icons = require("icons") 3 | local settings = require("settings") 4 | 5 | local popup_width = 250 6 | 7 | local volume_percent = sbar.add("item", "widgets.volume1", { 8 | position = "right", 9 | icon = { drawing = false }, 10 | label = { 11 | string = "??%", 12 | padding_left = -1, 13 | font = { family = settings.font.numbers } 14 | }, 15 | }) 16 | 17 | local volume_icon = sbar.add("item", "widgets.volume2", { 18 | position = "right", 19 | padding_right = -1, 20 | icon = { 21 | string = icons.volume._100, 22 | width = 0, 23 | align = "left", 24 | color = colors.grey, 25 | font = { 26 | style = settings.font.style_map["Regular"], 27 | size = 14.0, 28 | }, 29 | }, 30 | label = { 31 | width = 25, 32 | align = "left", 33 | font = { 34 | style = settings.font.style_map["Regular"], 35 | size = 14.0, 36 | }, 37 | }, 38 | }) 39 | 40 | local volume_bracket = sbar.add("bracket", "widgets.volume.bracket", { 41 | volume_icon.name, 42 | volume_percent.name 43 | }, { 44 | background = { color = colors.bg1 }, 45 | popup = { align = "center" } 46 | }) 47 | 48 | sbar.add("item", "widgets.volume.padding", { 49 | position = "right", 50 | width = settings.group_paddings 51 | }) 52 | 53 | local volume_slider = sbar.add("slider", popup_width, { 54 | position = "popup." .. volume_bracket.name, 55 | slider = { 56 | highlight_color = colors.blue, 57 | background = { 58 | height = 6, 59 | corner_radius = 3, 60 | color = colors.bg2, 61 | }, 62 | knob= { 63 | string = "􀀁", 64 | drawing = true, 65 | }, 66 | }, 67 | background = { color = colors.bg1, height = 2, y_offset = -20 }, 68 | click_script = 'osascript -e "set volume output volume $PERCENTAGE"' 69 | }) 70 | 71 | volume_percent:subscribe("volume_change", function(env) 72 | local volume = tonumber(env.INFO) 73 | local icon = icons.volume._0 74 | if volume > 60 then 75 | icon = icons.volume._100 76 | elseif volume > 30 then 77 | icon = icons.volume._66 78 | elseif volume > 10 then 79 | icon = icons.volume._33 80 | elseif volume > 0 then 81 | icon = icons.volume._10 82 | end 83 | 84 | local lead = "" 85 | if volume < 10 then 86 | lead = "0" 87 | end 88 | 89 | volume_icon:set({ label = icon }) 90 | volume_percent:set({ label = lead .. volume .. "%" }) 91 | volume_slider:set({ slider = { percentage = volume } }) 92 | end) 93 | 94 | local function volume_collapse_details() 95 | local drawing = volume_bracket:query().popup.drawing == "on" 96 | if not drawing then return end 97 | volume_bracket:set({ popup = { drawing = false } }) 98 | sbar.remove('/volume.device\\.*/') 99 | end 100 | 101 | local current_audio_device = "None" 102 | local function volume_toggle_details(env) 103 | if env.BUTTON == "right" then 104 | sbar.exec("open /System/Library/PreferencePanes/Sound.prefpane") 105 | return 106 | end 107 | 108 | local should_draw = volume_bracket:query().popup.drawing == "off" 109 | if should_draw then 110 | volume_bracket:set({ popup = { drawing = true } }) 111 | sbar.exec("SwitchAudioSource -t output -c", function(result) 112 | current_audio_device = result:sub(1, -2) 113 | sbar.exec("SwitchAudioSource -a -t output", function(available) 114 | current = current_audio_device 115 | local color = colors.grey 116 | local counter = 0 117 | 118 | for device in string.gmatch(available, '[^\r\n]+') do 119 | local color = colors.grey 120 | if current == device then 121 | color = colors.white 122 | end 123 | sbar.add("item", "volume.device." .. counter, { 124 | position = "popup." .. volume_bracket.name, 125 | width = popup_width, 126 | align = "center", 127 | label = { string = device, color = color }, 128 | click_script = 'SwitchAudioSource -s "' .. device .. '" && sketchybar --set /volume.device\\.*/ label.color=' .. colors.grey .. ' --set $NAME label.color=' .. colors.white 129 | 130 | }) 131 | counter = counter + 1 132 | end 133 | end) 134 | end) 135 | else 136 | volume_collapse_details() 137 | end 138 | end 139 | 140 | local function volume_scroll(env) 141 | local delta = env.SCROLL_DELTA 142 | sbar.exec('osascript -e "set volume output volume (output volume of (get volume settings) + ' .. delta .. ')"') 143 | end 144 | 145 | -- volume_icon:subscribe("mouse.clicked", volume_toggle_details) 146 | -- volume_icon:subscribe("mouse.scrolled", volume_scroll) 147 | -- volume_percent:subscribe("mouse.clicked", volume_toggle_details) 148 | -- volume_percent:subscribe("mouse.exited.global", volume_collapse_details) 149 | -- volume_percent:subscribe("mouse.scrolled", volume_scroll) 150 | 151 | -------------------------------------------------------------------------------- /config/sketchybar/items/widgets/wifi.lua: -------------------------------------------------------------------------------- 1 | local icons = require("icons") 2 | local colors = require("colors") 3 | local settings = require("settings") 4 | 5 | -- Execute the event provider binary which provides the event "network_update" 6 | -- for the network interface "en0", which is fired every 2.0 seconds. 7 | sbar.exec("killall network_load >/dev/null; $CONFIG_DIR/helpers/event_providers/network_load/bin/network_load en0 network_update 2.0") 8 | 9 | local popup_width = 250 10 | 11 | local wifi_up = sbar.add("item", "widgets.wifi1", { 12 | position = "right", 13 | padding_left = -5, 14 | width = 0, 15 | icon = { 16 | padding_right = 0, 17 | font = { 18 | style = settings.font.style_map["Bold"], 19 | size = 9.0, 20 | }, 21 | string = icons.wifi.upload, 22 | }, 23 | label = { 24 | font = { 25 | family = settings.font.mono, 26 | style = settings.font.style_map["Bold"], 27 | size = 9.0, 28 | }, 29 | color = colors.red, 30 | string = "??? Bps", 31 | }, 32 | y_offset = 4, 33 | }) 34 | 35 | local wifi_down = sbar.add("item", "widgets.wifi2", { 36 | position = "right", 37 | padding_left = -5, 38 | icon = { 39 | padding_right = 0, 40 | font = { 41 | style = settings.font.style_map["Bold"], 42 | size = 9.0, 43 | }, 44 | string = icons.wifi.download, 45 | }, 46 | label = { 47 | font = { 48 | family = settings.font.mono, 49 | style = settings.font.style_map["Bold"], 50 | size = 9.0, 51 | }, 52 | color = colors.blue, 53 | string = "??? Bps", 54 | }, 55 | y_offset = -4, 56 | }) 57 | 58 | local wifi = sbar.add("item", "widgets.wifi.padding", { 59 | position = "right", 60 | label = { drawing = true, string = [[HERE]] }, 61 | }) 62 | 63 | -- Background around the item 64 | local wifi_bracket = sbar.add("bracket", "widgets.wifi.bracket", { 65 | wifi.name, 66 | wifi_up.name, 67 | wifi_down.name 68 | }, { 69 | background = { color = colors.bg1 }, 70 | popup = { align = "center", height = 30 } 71 | }) 72 | 73 | local ssid = sbar.add("item", { 74 | position = "popup." .. wifi_bracket.name, 75 | icon = { 76 | font = { 77 | style = settings.font.style_map["Bold"] 78 | }, 79 | string = icons.wifi.router, 80 | }, 81 | width = popup_width, 82 | align = "center", 83 | label = { 84 | font = { 85 | size = 15, 86 | style = settings.font.style_map["Bold"] 87 | }, 88 | max_chars = 18, 89 | string = "????????????", 90 | }, 91 | background = { 92 | height = 2, 93 | color = colors.grey, 94 | y_offset = -15 95 | } 96 | }) 97 | 98 | local hostname = sbar.add("item", { 99 | position = "popup." .. wifi_bracket.name, 100 | icon = { 101 | align = "left", 102 | string = "Hostname:", 103 | width = popup_width / 2, 104 | }, 105 | label = { 106 | max_chars = 20, 107 | string = "????????????", 108 | width = popup_width / 2, 109 | align = "right", 110 | } 111 | }) 112 | 113 | local ip = sbar.add("item", { 114 | position = "popup." .. wifi_bracket.name, 115 | icon = { 116 | align = "left", 117 | string = "IP:", 118 | width = popup_width / 2, 119 | }, 120 | label = { 121 | string = "???.???.???.???", 122 | width = popup_width / 2, 123 | align = "right", 124 | } 125 | }) 126 | 127 | local mask = sbar.add("item", { 128 | position = "popup." .. wifi_bracket.name, 129 | icon = { 130 | align = "left", 131 | string = "Subnet mask:", 132 | width = popup_width / 2, 133 | }, 134 | label = { 135 | string = "???.???.???.???", 136 | width = popup_width / 2, 137 | align = "right", 138 | } 139 | }) 140 | 141 | local router = sbar.add("item", { 142 | position = "popup." .. wifi_bracket.name, 143 | icon = { 144 | align = "left", 145 | string = "Router:", 146 | width = popup_width / 2, 147 | }, 148 | label = { 149 | string = "???.???.???.???", 150 | width = popup_width / 2, 151 | align = "right", 152 | }, 153 | }) 154 | 155 | sbar.add("item", { position = "right", width = settings.group_paddings }) 156 | 157 | wifi_up:subscribe("network_update", function(env) 158 | local up_color = (env.upload == "000 Bps") and colors.grey or colors.red 159 | local down_color = (env.download == "000 Bps") and colors.grey or colors.blue 160 | wifi_up:set({ 161 | icon = { color = up_color }, 162 | label = { 163 | string = env.upload, 164 | color = up_color 165 | } 166 | }) 167 | wifi_down:set({ 168 | icon = { color = down_color }, 169 | label = { 170 | string = env.download, 171 | color = down_color 172 | } 173 | }) 174 | end) 175 | 176 | wifi:subscribe({"wifi_change", "system_woke"}, function(env) 177 | sbar.exec("ipconfig getifaddr en0", function(ip) 178 | local connected = not (ip == "") 179 | wifi:set({ 180 | icon = { 181 | string = connected and icons.wifi.connected or icons.wifi.disconnected, 182 | color = connected and colors.white or colors.red, 183 | }, 184 | }) 185 | if connected then 186 | sbar.exec("ipconfig getsummary en0 | awk -F ' SSID : ' '/ SSID : / {print $2}'", function(ssid_result) 187 | wifi:set({ 188 | label = { string = ssid_result } 189 | }) 190 | end) 191 | else 192 | wifi:set({ 193 | label = { string = "Disconnected" } 194 | }) 195 | end 196 | end) 197 | end) 198 | 199 | local function hide_details() 200 | wifi_bracket:set({ popup = { drawing = false } }) 201 | end 202 | 203 | local function toggle_details() 204 | local should_draw = wifi_bracket:query().popup.drawing == "off" 205 | if should_draw then 206 | wifi_bracket:set({ popup = { drawing = true }}) 207 | sbar.exec("networksetup -getcomputername", function(result) 208 | hostname:set({ label = result }) 209 | end) 210 | sbar.exec("ipconfig getifaddr en0", function(result) 211 | ip:set({ label = result }) 212 | end) 213 | sbar.exec("ipconfig getsummary en0 | awk -F ' SSID : ' '/ SSID : / {print $2}'", function(result) 214 | ssid:set({ label = result }) 215 | end) 216 | sbar.exec("networksetup -getinfo Wi-Fi | awk -F 'Subnet mask: ' '/^Subnet mask: / {print $2}'", function(result) 217 | mask:set({ label = result }) 218 | end) 219 | sbar.exec("networksetup -getinfo Wi-Fi | awk -F 'Router: ' '/^Router: / {print $2}'", function(result) 220 | router:set({ label = result }) 221 | end) 222 | else 223 | hide_details() 224 | end 225 | end 226 | 227 | wifi_up:subscribe("mouse.clicked", toggle_details) 228 | wifi_down:subscribe("mouse.clicked", toggle_details) 229 | wifi:subscribe("mouse.clicked", toggle_details) 230 | wifi:subscribe("mouse.exited.global", hide_details) 231 | 232 | local function copy_label_to_clipboard(env) 233 | local label = sbar.query(env.NAME).label.value 234 | sbar.exec("echo \"" .. label .. "\" | pbcopy") 235 | sbar.set(env.NAME, { label = { string = icons.clipboard, align="center" } }) 236 | sbar.delay(1, function() 237 | sbar.set(env.NAME, { label = { string = label, align = "right" } }) 238 | end) 239 | end 240 | 241 | ssid:subscribe("mouse.clicked", copy_label_to_clipboard) 242 | hostname:subscribe("mouse.clicked", copy_label_to_clipboard) 243 | ip:subscribe("mouse.clicked", copy_label_to_clipboard) 244 | mask:subscribe("mouse.clicked", copy_label_to_clipboard) 245 | router:subscribe("mouse.clicked", copy_label_to_clipboard) -------------------------------------------------------------------------------- /config/sketchybar/settings.lua: -------------------------------------------------------------------------------- 1 | return { 2 | paddings = 3, 3 | group_paddings = 5, 4 | 5 | icons = "sf-symbols", -- alternatively available: NerdFont 6 | 7 | -- This is a font configuration for SF Pro and SF Mono (installed manually) 8 | font = require("helpers.default_font"), 9 | 10 | -- Alternatively, this is a font config for JetBrainsMono Nerd Font 11 | -- font = { 12 | -- text = "JetBrainsMono Nerd Font", -- Used for text 13 | -- numbers = "JetBrainsMono Nerd Font", -- Used for numbers 14 | -- style_map = { 15 | -- ["Regular"] = "Regular", 16 | -- ["Semibold"] = "Medium", 17 | -- ["Bold"] = "SemiBold", 18 | -- ["Heavy"] = "Bold", 19 | -- ["Black"] = "ExtraBold", 20 | -- }, 21 | -- }, 22 | } 23 | -------------------------------------------------------------------------------- /config/sketchybar/sketchybarrc: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env lua 2 | 3 | -- Load the sketchybar-package and prepare the helper binaries 4 | require("helpers") 5 | require("init") 6 | -------------------------------------------------------------------------------- /config/skhd/skhdrc: -------------------------------------------------------------------------------- 1 | # change layout 2 | alt - e : yabai -m space --layout bsp 3 | alt - s : yabai -m space --layout float 4 | 5 | # floating windows 6 | alt + shift - space : yabai -m window --toggle float 7 | cmd + alt + ctrl + shift - n : yabai -m window --toggle float&&yabai -m window --grid 12:12:1:1:10:10 8 | 9 | # enter fullscreen mode for the focused container 10 | cmd + alt + ctrl + shift - f : yabai -m window --toggle zoom-fullscreen 11 | ####### Shortcut Hotkeys ############# 12 | # cmd + alt + ctrl + shift = caps lock 13 | 14 | # Launch terminal 15 | cmd + alt + ctrl + shift - 0x24 : kitty --single-instance -d ~ 16 | 17 | # restart Yabi, SpaceBar, and SKHD 18 | alt + shift - r : killall yabai&&yabai --start-service&&skhd --reload 19 | 20 | # Rotate workspace clockwise 21 | cmd + alt + ctrl + shift - 0x32 : yabai -m space --rotate 90 22 | 23 | # focus windows 24 | cmd + alt + ctrl + shift - q : yabai -m window --focus next || yabai -m window --focus first 25 | cmd + alt + ctrl + shift - e : yabai -m window --focus prev || yabai -m window --focus last 26 | 27 | # window resizing 28 | cmd + alt + ctrl + shift - w : yabai -m window --resize top:0:-20 || yabai -m window --resize bottom:0:-20 29 | cmd + alt + ctrl + shift - s : yabai -m window --resize top:0:20 || yabai -m window --resize bottom:0:20 30 | cmd + alt + ctrl + shift - a : yabai -m window --resize left:-20:0 || yabai -m window --resize right:-20:0 31 | cmd + alt + ctrl + shift - d : yabai -m window --resize left:20:0 || yabai -m window --resize right:20:0 32 | 33 | cmd + alt + ctrl + shift - h : yabai -m window --focus west 34 | cmd + alt + ctrl + shift - j: yabai -m window --focus south 35 | cmd + alt + ctrl + shift - k: yabai -m window --focus north 36 | cmd + alt + ctrl + shift - l: yabai -m window --focus east 37 | 38 | 39 | # Switch spaces and move windows 40 | ctrl - 1: yabai -m space --focus 1 41 | ctrl - 2: yabai -m space --focus 2 42 | ctrl - 3: yabai -m space --focus 3 43 | ctrl - 4: yabai -m space --focus 4 44 | ctrl - 5: yabai -m space --focus 5 45 | ctrl - 6: yabai -m space --focus 6 46 | ctrl - 7: yabai -m space --focus 7 47 | ctrl - 8: yabai -m space --focus 8 48 | ctrl - 9: yabai -m space --focus 9 49 | ctrl - 0: yabai -m space --focus 10 50 | 51 | ctrl + shift - 1: yabai -m window --space 1 && yabai -m space --focus 1 52 | ctrl + shift - 2: yabai -m window --space 2 && yabai -m space --focus 2 53 | ctrl + shift - 3: yabai -m window --space 3 && yabai -m space --focus 3 54 | ctrl + shift - 4: yabai -m window --space 4 && yabai -m space --focus 4 55 | ctrl + shift - 5: yabai -m window --space 5 && yabai -m space --focus 5 56 | ctrl + shift - 6: yabai -m window --space 6 && yabai -m space --focus 6 57 | ctrl + shift - 7: yabai -m window --space 7 && yabai -m space --focus 7 58 | ctrl + shift - 8: yabai -m window --space 8 && yabai -m space --focus 8 59 | ctrl + shift - 9: yabai -m window --space 9 && yabai -m space --focus 9 60 | ctrl + shift - 0: yabai -m window --space 10 && yabai -m space --focus 10 61 | -------------------------------------------------------------------------------- /config/vscode/custom.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --font-size: 12px; 3 | --font-family: "Inter"; 4 | } 5 | 6 | .monaco-workbench .part>.content, 7 | .monaco-workbench .part.editor>.content .editor-group-container>.title .tabs-container>.tab .tab-label a, 8 | .monaco-workbench .part.editor>.content .editor-group-container>.title .title-label a, 9 | .monaco-breadcrumbs, 10 | .monaco-workbench .part.statusbar { 11 | font-size: var(--font-size) !important; 12 | } 13 | 14 | *, 15 | *::after, 16 | *::before { 17 | box-sizing: border-box !important; 18 | } 19 | 20 | .pane-body .monaco-icon-label { 21 | margin-left: 8px; 22 | } 23 | 24 | .monaco-action-bar a { 25 | display: flex !important; 26 | align-items: center !important; 27 | justify-content: center !important; 28 | border-radius: 3px !important; 29 | } 30 | 31 | .monaco-tl-indent { 32 | transform: translateX(-5px) !important; 33 | } 34 | 35 | .monaco-workbench { 36 | --vscode-icon-foreground: #cdd6f4 !important; 37 | } 38 | 39 | .windows { 40 | font-family: var(--font-family) !important; 41 | } 42 | 43 | .monaco-workbench .part>.content, 44 | .monaco-workbench .part.editor>.content .editor-group-container>.title .tabs-container>.tab .tab-label a, 45 | .monaco-workbench .part.editor>.content .editor-group-container>.title .title-label a, 46 | .monaco-breadcrumbs, 47 | .monaco-workbench .part.statusbar { 48 | font-size: var(--font-size) !important; 49 | } 50 | 51 | .window-appicon { 52 | display: none; 53 | } 54 | 55 | .monaco-workbench .part.titlebar .window-controls-container>.window-icon:hover { 56 | background-color: transparent !important; 57 | } 58 | 59 | span.codicon.codicon-error { 60 | color: #f38ba8 !important; 61 | } 62 | 63 | span.codicon.codicon-warning { 64 | color: #f9e2af !important; 65 | } 66 | 67 | span.codicon.codicon-git-branch { 68 | color: #a6e3a1 !important; 69 | } 70 | 71 | span.codicon.codicon-info { 72 | color: #94e2d5 !important; 73 | } 74 | 75 | .codicon-close:before { 76 | color: #f38ba8 !important;} 77 | 78 | span.codicon.codicon-remote { 79 | color: #181825 !important; 80 | } 81 | 82 | span.codicon.codicon-search.search-icon { 83 | color: #89b4fa !important; 84 | } 85 | 86 | .monaco-workbench .part.editor>.content .editor-group-container.active>.title .tabs-container>.tab.dirty>.tab-actions .action-label:not(:hover):before, 87 | .monaco-workbench .part.editor>.content .editor-group-container>.title .tabs-container>.tab.dirty>.tab-actions .action-label:not(:hover):before { 88 | color: #cdd6f4 !important; 89 | } 90 | 91 | div#status\.host { 92 | background-color: transparent !important; 93 | border-radius: 0px 100px 100px 0px !important; 94 | } 95 | 96 | div#status\.host * { 97 | color: #89b4fa !important; 98 | transform: translateY(0.5px) !important; 99 | } 100 | 101 | .monaco-editor .scroll-decoration, 102 | .monaco-editor .minimap-shadow-visible { 103 | box-shadow: none !important; 104 | } 105 | 106 | footer#workbench\.parts\.statusbar { 107 | --status-border-top-color: none !important; 108 | border-top: 1px solid #313244 !important; 109 | } 110 | 111 | .monaco-workbench .part.editor>.content .editor-group-container>.title>.tabs-and-actions-container { 112 | background-color: #181926 !important; 113 | padding-block: 0px; 114 | padding-left: 1.5px; 115 | } 116 | 117 | .monaco-workbench .part.editor>.content:not(.dragged-over) .editor-group-container.active>.title .tabs-container>.tab.sizing-shrink:not(.dragged):not(.sticky-compact)>.tab-label>.monaco-icon-label-container::after, 118 | .monaco-workbench .part.editor>.content:not(.dragged-over) .editor-group-container.active>.title .tabs-container>.tab.sizing-fixed:not(.dragged):not(.sticky-compact)>.tab-label>.monaco-icon-label-container::after { 119 | background: none !important; 120 | } 121 | 122 | .monaco-workbench .part.editor>.content .editor-group-container>.title .tabs-container>.tab.active.tab-border-bottom>.tab-border-bottom-container { 123 | display: none !important; 124 | } 125 | 126 | .command-center { 127 | margin-top: 1px !important; 128 | border-radius: 8px !important; 129 | } 130 | 131 | .tab { 132 | margin-inline: 2px !important; 133 | padding-left: 5px !important; 134 | } 135 | 136 | .tab * { 137 | font-family: "FiraCode Nerd Font" !important; 138 | } 139 | 140 | .monaco-workbench .part.editor>.content .editor-group-container>.title>.tabs-and-actions-container>*>* { 141 | overflow-x: hidden !important; 142 | overflow-y: hidden !important; 143 | } 144 | 145 | .tab[aria-selected="false"] { 146 | box-shadow: inset 0 0 0 1px #313244 !important; 147 | border-radius: 8px !important; 148 | } 149 | 150 | .tab[aria-selected="true"] { 151 | box-shadow: inset 0 0 0 1px #89b4fa,0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; 152 | border-radius: 8px !important; 153 | } 154 | .tab-border-top-container{ 155 | display: none !important; 156 | } 157 | 158 | .monaco-icon-label-container { 159 | padding-inline: 6px !important; 160 | } 161 | 162 | .monaco-workbench .part.editor>.content .editor-group-container>.title .tabs-container>.tab.sizing-shrink>.tab-label>.monaco-icon-label-container:after { 163 | content: none !important; 164 | } 165 | 166 | .monaco-workbench .part.editor>.content .editor-group-container>.title .tabs-container>.tab.sizing-shrink { 167 | min-width: 0px !important; 168 | } 169 | 170 | .monaco-workbench .part.titlebar>.titlebar-container>.titlebar-center>.window-title>.command-center .action-item.command-center .search-icon { 171 | opacity: 1 !important; 172 | font-size: 16px !important; 173 | } 174 | 175 | .monaco-workbench .part.titlebar>.titlebar-container>.titlebar-center>.window-title>.command-center .action-item.command-center .search-label { 176 | padding: 1px !important; 177 | } 178 | 179 | .menubar.compact .toolbar-toggle-more:before, 180 | .menubar:not(.compact) .menubar-menu-button:first-child .toolbar-toggle-more:before { 181 | color: #89b4fa !important; 182 | } 183 | 184 | #workbench\.parts\.editor>div.content>div>div>div>div>div.monaco-scrollable-element.mac>div.split-view-container>div>div>div.title.tabs.show-file-icons>div.breadcrumbs-below-tabs { 185 | border: 1px solid #313244 !important; 186 | } 187 | 188 | #workbench\.parts\.editor>div.content>div>div>div>div>div.monaco-scrollable-element.mac>div.split-view-container>div>div>div.title.tabs.show-file-icons>div.breadcrumbs-below-tabs * { 189 | font-family: "FiraCode Nerd Font" !important; 190 | } 191 | 192 | .monaco-dialog-box { 193 | border-radius: 8px !important; 194 | border: 1px solid !important; 195 | } 196 | .monaco-workbench .part.editor>.content .editor-group-container>.title>.tabs-and-actions-container>* { 197 | padding-block: 4px; 198 | top: 0px !important; 199 | } 200 | .editor-actions{ 201 | margin-top: 4px; 202 | box-shadow: inset 0 0 0 1px #313244,0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; 203 | padding: 0px !important; 204 | padding-inline: 8px !important; 205 | } 206 | .statusbar-item-label{ 207 | padding: 0px !important; 208 | padding-inline: 5px !important; 209 | margin-inline: 0px !important; 210 | } 211 | .first-visible-item{ 212 | margin-left: 5px !important 213 | } 214 | .last-visible-item{ 215 | margin-right: 0px !important 216 | } 217 | -------------------------------------------------------------------------------- /config/yabai/yabairc: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | yabai -m signal --add event=dock_did_restart action="sudo yabai --load-sa" 3 | sudo yabai --load-sa 4 | # the scripting-addition must be loaded manually if 5 | # you are running yabai on macOS Big Sur. Uncomment 6 | # the following line to have the injection performed 7 | # when the config is executed during startup. 8 | # 9 | # for this to work you must configure sudo such that 10 | # it will be able to run the command without password 11 | # 12 | # see this wiki page for information: 13 | # - https://github.com/koekeishiya/yabai/wiki/Installing-yabai-(latest-release) 14 | # global settings 15 | yabai -m config mouse_follows_focus off 16 | yabai -m config focus_follows_mouse off 17 | yabai -m config window_origin_display default 18 | yabai -m config window_placement second_child 19 | yabai -m config split_ratio 0.50 20 | yabai -m config auto_balance off 21 | yabai -m config mouse_modifier ctrl 22 | yabai -m config mouse_action1 move 23 | yabai -m config mouse_action2 resize 24 | yabai -m config mouse_drop_action swap 25 | yabai -m config window_shadow float 26 | yabai -m config window_opacity off 27 | yabai -m config active_window_opacity 1.0 28 | yabai -m config normal_window_opacity 0.9 29 | 30 | # general space settings 31 | yabai -m config layout bsp 32 | yabai -m config top_padding 12 33 | yabai -m config bottom_padding 12 34 | yabai -m config left_padding 12 35 | yabai -m config right_padding 12 36 | yabai -m config window_gap 12 37 | 38 | yabai -m rule --add label="Finder" app="^Finder$" title="(Co(py|nnect)|Move|Info|Pref)" manage=off 39 | yabai -m rule --add label="Safari" app="^Safari$" title="^(General|(Tab|Password|Website|Extension)s|AutoFill|Se(arch|curity)|Privacy|Advance)$" manage=off 40 | yabai -m rule --add label="Settings" app="^Settings$" title=".*" manage=off 41 | yabai -m rule --add label="App Store" app="^App Store$" manage=off 42 | yabai -m rule --add label="Activity Monitor" app="^Activity Monitor$" manage=off 43 | yabai -m rule --add label="Calculator" app="^Calculator$" manage=off 44 | yabai -m rule --add label="Dictionary" app="^Dictionary$" manage=off 45 | yabai -m rule --add label="mpv" app="^mpv$" manage=off 46 | yabai -m rule --add label="Software Update" title="Software Update" manage=off 47 | yabai -m rule --add label="About This Mac" app="System Information" title="About This Mac" manage=off 48 | yabai -m rule --add label="System Information" app="System Information" title="System Information" manage=off 49 | yabai -m rule --add label="Raycast" app="Raycast" manage=off 50 | yabai -m rule --add label="Kap" app="^Kap$" manage=off 51 | 52 | borders active_color=0xffCAD3F5 inactive_color=0xbb282E44 hidpi=on width=5.0 2>/dev/null 1>&2 & 53 | 54 | echo "yabai configuration loaded.." 55 | -------------------------------------------------------------------------------- /config/yazi/init.lua: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/yazi/init.lua -------------------------------------------------------------------------------- /config/zed/embeddings/preview/embeddings_db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/preview/embeddings_db -------------------------------------------------------------------------------- /config/zed/embeddings/preview/embeddings_db-shm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/preview/embeddings_db-shm -------------------------------------------------------------------------------- /config/zed/embeddings/preview/embeddings_db-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/preview/embeddings_db-wal -------------------------------------------------------------------------------- /config/zed/embeddings/semantic-index-db.0.mdb/data.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/semantic-index-db.0.mdb/data.mdb -------------------------------------------------------------------------------- /config/zed/embeddings/semantic-index-db.0.mdb/lock.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/semantic-index-db.0.mdb/lock.mdb -------------------------------------------------------------------------------- /config/zed/embeddings/stable/embeddings_db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/stable/embeddings_db -------------------------------------------------------------------------------- /config/zed/embeddings/stable/embeddings_db-shm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/stable/embeddings_db-shm -------------------------------------------------------------------------------- /config/zed/embeddings/stable/embeddings_db-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/embeddings/stable/embeddings_db-wal -------------------------------------------------------------------------------- /config/zed/prompts/index.json: -------------------------------------------------------------------------------- 1 | {"default_prompt":[],"prompts":{},"dirty_prompts":[],"version":0} -------------------------------------------------------------------------------- /config/zed/prompts/prompts-library-db.0.mdb/data.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/prompts/prompts-library-db.0.mdb/data.mdb -------------------------------------------------------------------------------- /config/zed/prompts/prompts-library-db.0.mdb/lock.mdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/config/zed/prompts/prompts-library-db.0.mdb/lock.mdb -------------------------------------------------------------------------------- /wallpaprs/5XYEZY.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/5XYEZY.heic -------------------------------------------------------------------------------- /wallpaprs/8HYNiz.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/8HYNiz.heic -------------------------------------------------------------------------------- /wallpaprs/IMYnFy.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/IMYnFy.heic -------------------------------------------------------------------------------- /wallpaprs/IfIq5L.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/IfIq5L.heic -------------------------------------------------------------------------------- /wallpaprs/KPmPiX.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/KPmPiX.heic -------------------------------------------------------------------------------- /wallpaprs/Pvbr9B.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/Pvbr9B.heic -------------------------------------------------------------------------------- /wallpaprs/U8lPE5.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/U8lPE5.heic -------------------------------------------------------------------------------- /wallpaprs/UPJaJW.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/UPJaJW.heic -------------------------------------------------------------------------------- /wallpaprs/b8iUXV.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/b8iUXV.heic -------------------------------------------------------------------------------- /wallpaprs/c1hXo4.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/c1hXo4.heic -------------------------------------------------------------------------------- /wallpaprs/eKclO8.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/eKclO8.heic -------------------------------------------------------------------------------- /wallpaprs/ge9s7h.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/ge9s7h.heic -------------------------------------------------------------------------------- /wallpaprs/jBfX2w.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/jBfX2w.heic -------------------------------------------------------------------------------- /wallpaprs/rr9JtZ.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/rr9JtZ.heic -------------------------------------------------------------------------------- /wallpaprs/rz3Jnd.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/rz3Jnd.heic -------------------------------------------------------------------------------- /wallpaprs/y1MXj8.heic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tnixc/dots/52d7a84e04060562c9d11964dfbf5d407c4d599c/wallpaprs/y1MXj8.heic --------------------------------------------------------------------------------