├── .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
--------------------------------------------------------------------------------