581 Commits

Author SHA1 Message Date
David Tomaschik
1d0a09c442 Bump Brewfile 2026-04-07 16:32:02 -07:00
David Tomaschik
37c765ae29 Update for bundles 2026-04-07 16:02:49 -07:00
David Tomaschik
41f8a49381 Remove missing brew entry 2026-04-07 14:53:41 -07:00
David Tomaschik
3f9c41d266 Merge branch 'main' of https://github.com/Matir/skel 2026-04-06 18:34:17 -07:00
David Tomaschik
69e4b83652 Fix brew manager 2026-04-06 18:34:06 -07:00
David Tomaschik
74c2472dd2 Fix zsh completion 2026-04-06 15:30:14 -07:00
David Tomaschik
ecc39344ca Improve gemini context 2026-04-02 16:37:51 -07:00
David Tomaschik
49a314e388 Merge branch 'main' of github.com:Matir/skel 2026-04-01 23:02:57 -07:00
David Tomaschik
41293eb788 Add more vscode extensions 2026-04-01 23:02:55 -07:00
David Tomaschik
05798dcb67 Update AGENTS.md 2026-04-01 18:24:15 -07:00
David Tomaschik
4e1b263170 Remove weechat 2026-04-01 14:23:54 -07:00
David Tomaschik
46c00c61be Update dotfiles 2026-04-01 14:02:33 -07:00
David Tomaschik
ce973d5bbf Update shenv SSH_AUTH_SOCK code 2026-03-31 14:06:57 -07:00
David Tomaschik
f326992306 Merge branch 'main' of https://github.com/Matir/skel 2026-03-31 13:41:38 -07:00
David Tomaschik
7f76b24cb9 Update SSH_AUTH_SOCK logic 2026-03-31 13:41:36 -07:00
David Tomaschik
a5b08680c5 Fix brew install issues 2026-03-31 13:25:52 -07:00
David Tomaschik
2510f1ad87 Skel updates 2026-03-26 16:21:32 -07:00
David Tomaschik
b6af18017b Updates 2026-03-25 08:25:03 -07:00
David Tomaschik
829f7ae1de Remove unneeded keep files 2026-03-24 19:26:53 +00:00
David Tomaschik
6fd9769ccc Merge branch 'main' of github.com:Matir/skel 2026-03-21 16:23:43 -07:00
David Tomaschik
758c59bc8e Updates 2026-03-21 16:23:32 -07:00
David Tomaschik
39e003f666 Stop tracking fish_variables 2026-03-19 13:47:18 -07:00
David Tomaschik
5b1bb1c233 Handle /etc/profile overriding PATH 2026-03-16 13:55:14 -04:00
David Tomaschik
2e0ebb4d6f Update mise 2026-03-11 12:51:54 -04:00
David Tomaschik
31aeca1b73 Fix shenv 2026-02-27 17:22:35 -08:00
David Tomaschik
7006974bb3 Fix shell startup. 2026-02-27 16:12:42 -08:00
David Tomaschik
92fb8cb47d Fix ycm 2026-02-25 20:31:28 -08:00
David Tomaschik
a46ee1f24c Update global gitignore 2026-02-25 16:56:18 -08:00
David Tomaschik
c1b565f2c5 Remove zshrc.d/rvm.zsh 2026-02-23 18:45:45 -08:00
David Tomaschik
0ded57fa46 Mise/code updates 2026-02-23 18:45:24 -08:00
David Tomaschik
f1495add30 Fix paths 2026-02-22 10:08:10 -08:00
David Tomaschik
a6146c2763 Brain fart 2026-02-21 11:55:42 -08:00
David Tomaschik
60f68f11a2 Fiz 2026-02-21 11:52:50 -08:00
David Tomaschik
a1262e9fba ZSH updates 2026-02-21 11:37:04 -08:00
David Tomaschik
d5a3ed41c6 Add dotfiles repo 2026-02-21 10:58:05 -08:00
David Tomaschik
295ef071ee Update config and add zazu sk pubkey. 2026-02-20 19:14:36 -08:00
David Tomaschik
313c16bdc9 Fix mise/fish 2026-02-20 17:42:19 -08:00
David Tomaschik
fad65e2aaa Update tmux config 2026-02-20 17:36:41 -08:00
David Tomaschik
00696b23fa Updates 2026-02-20 17:15:39 -08:00
David Tomaschik
1c0c5dd32b Update zshrc order 2026-02-20 16:19:09 -08:00
David Tomaschik
8cac819127 Update gitconfig 2026-02-20 15:56:04 -08:00
David Tomaschik
0ebc32e30a Cleanup aliases 2026-02-20 15:18:10 -08:00
David Tomaschik
a0378fb583 Update gemini settings.json 2026-02-20 14:43:22 -08:00
David Tomaschik
3cad40f858 Add githooks.sh 2026-02-19 15:55:10 -08:00
David Tomaschik
6bda0bb639 Fix perms 2026-02-19 13:29:55 -08:00
David Tomaschik
c1d0045f44 Remove outdated key 2026-02-19 13:25:22 -08:00
David Tomaschik
f50edc1fa6 Work 2026-02-19 13:20:21 -08:00
David Tomaschik
9ab1f9c298 Misc updates 2026-02-18 16:10:06 -08:00
David Tomaschik
cdbc40d1e8 Update zi 2026-02-17 13:42:53 -08:00
David Tomaschik
487dbe3751 Add support for zi 2026-02-17 12:46:51 -08:00
David Tomaschik
aea7b0927e Fish updates 2026-02-17 12:31:12 -08:00
David Tomaschik
645b631afc Restic 2026-02-15 16:45:06 -08:00
David Tomaschik
b631471b0c Add fish symbol 2026-02-12 16:56:27 -08:00
David Tomaschik
fb7636f5f1 Update starship 2026-02-12 16:53:53 -08:00
David Tomaschik
20a5885031 Cleanup 2026-02-12 16:13:01 -08:00
David Tomaschik
21b24b2c2f Start on "cloudy" 2026-02-12 15:52:10 -08:00
David Tomaschik
122dc2075b Updates 2026-02-11 15:45:49 -08:00
David Tomaschik
c0fd99afd6 Conditional ycm 2026-02-10 16:33:10 -08:00
David Tomaschik
0ebb331cb3 Fix ipython prompt 2026-02-10 15:48:04 -08:00
David Tomaschik
bddd4ed107 Update plugs 2026-02-10 15:40:46 -08:00
David Tomaschik
a92b05a51c Cleanup 2026-02-10 13:47:36 -08:00
David Tomaschik
5a49dd95b2 Refactor 2026-02-10 13:00:03 -08:00
David Tomaschik
d9223c92dc feat: Migrate Vim and Tmux plugins to dedicated managers
Migrated Vim plugins from Git submodules to vim-plug, and Tmux plugins
to TPM (Tmux Plugin Manager).

This change:
- Updates `install.sh` to automatically install vim-plug and TPM.
- Modifies `dotfiles/vimrc` to configure plugins via vim-plug.
- Modifies `dotfiles/tmux.conf` to configure plugins via TPM.
- Removes all Vim and Tmux submodule entries from `.gitmodules`.
- Deletes the old submodule directories from the repository.

This streamlines plugin management, making updates easier and reducing
the complexity of the main `install.sh` script.
2026-02-10 19:17:00 +00:00
David Tomaschik
4c9038c33d Refactor 2026-02-10 10:50:54 -08:00
David Tomaschik
9a04b847ec Trailing whitespace fixes 2026-02-10 08:29:41 -08:00
David Tomaschik
c1ef9f5e7a Suppress ipython banner 2026-02-10 07:51:28 -08:00
David Tomaschik
5a4d04ea43 Update 2026-02-09 23:19:56 -08:00
David Tomaschik
f4e3447eb7 Cleanup skel 2026-02-09 23:11:54 -08:00
David Tomaschik
ff0a7d150d Load mise in zshrc. 2026-02-05 17:50:18 -08:00
David Tomaschik
657d30c381 Allow manual terminal title. 2026-02-04 11:38:54 -08:00
David Tomaschik
5cc08e472e Add toclip alias 2026-02-04 11:00:52 -08:00
David Tomaschik
89ae97145e Remove identity file entries 2026-01-27 14:40:36 -08:00
David Tomaschik
d50faa1ec6 Update identity file ordering 2026-01-27 13:33:44 -08:00
David Tomaschik
243da55c86 Update sshrc 2026-01-13 09:25:15 -08:00
David Tomaschik
0e491395da Update starship 2025-12-10 18:34:04 -08:00
David Tomaschik
b7cbf90ac7 Update gemini settings 2025-11-21 16:30:55 -08:00
David Tomaschik
9e1ad38f94 Bump skel 2025-11-20 13:01:17 -08:00
David Tomaschik
821c2f8b80 Get rid of private_dotfiles. 2025-11-13 14:16:49 -08:00
David Tomaschik
4e3b466044 Update vscode extension list 2025-11-13 13:48:15 -08:00
David Tomaschik
fe5b74511f Update install.sh 2025-11-05 17:00:13 -08:00
David Tomaschik
f80b029ae3 Remove cruft 2025-11-05 16:55:25 -08:00
David Tomaschik
d4a4d8ee19 Add scroll-reverser 2025-10-28 08:26:41 -07:00
David Tomaschik
375ff434f2 Update darwin variables 2025-09-25 05:11:22 -07:00
David Tomaschik
e270bac5f2 Setup XDG_ on Darwin 2025-09-25 02:53:39 -07:00
David Tomaschik
2b31d4d5d2 Merge branch 'main' of https://github.com/Matir/skel 2025-09-23 00:18:38 -07:00
David Tomaschik
91920fef0e Cleanups 2025-09-23 00:18:27 -07:00
David Tomaschik
f2faccd93f More updates 2025-09-09 10:25:59 -07:00
David Tomaschik
dea3f289c2 Fix quoting issues in bin/ 2025-09-03 14:52:33 -07:00
David Tomaschik
61d00103bf Play with AGENTS.md 2025-09-03 11:39:45 -07:00
David Tomaschik
2122c88e03 Last batch for now 2025-09-03 11:13:58 -07:00
David Tomaschik
7064a5d5a1 More install_tool updates 2025-09-03 11:08:39 -07:00
David Tomaschik
ae344d6dba Update install_tool 2025-09-03 11:01:18 -07:00
David Tomaschik
d7b6095c47 Cleanup install.sh 2025-09-02 10:54:38 -07:00
David Tomaschik
c7777ede0b Update Brewfile 2025-09-02 10:35:29 -07:00
David Tomaschik
6c2c12faeb Add add_hosts_entry script 2025-08-06 11:14:14 -07:00
David Tomaschik
7e9a87afdd Commit README 2025-08-01 10:10:38 -07:00
David Tomaschik
d6cd16e9f0 Fix gitignore 2025-07-28 22:40:07 +00:00
David Tomaschik
3548113a7d install_tool: select starship architecture 2025-07-20 11:01:43 -07:00
David Tomaschik
f3e82690f8 Update docker completion 2025-06-12 17:23:35 -07:00
David Tomaschik
d596d10678 Remove processmonitor 2025-06-12 16:33:28 -07:00
David Tomaschik
0406395ea0 Bump 2025-06-12 08:38:14 -07:00
David Tomaschik
c9ed72a5a6 Fix ackrc 2025-06-11 15:36:29 -07:00
David Tomaschik
5e65608c39 Merge branch 'main' of https://github.com/Matir/skel 2025-06-11 15:14:38 -07:00
David Tomaschik
acb13c6908 Use match for bazel directories in ackrc. 2025-06-11 15:14:18 -07:00
David Tomaschik
9b9330db45 Bump Brewfile 2025-06-11 13:28:29 -07:00
David Tomaschik
4743b635aa Update zshrc.d 2025-06-10 09:07:56 -07:00
David Tomaschik
bbeb451251 More completions 2025-06-10 08:57:25 -07:00
David Tomaschik
5057ab890b Async completion support 2025-06-09 13:21:50 -07:00
David Tomaschik
ee7f78e99c starship: add shell indicator 2025-06-05 18:23:49 -07:00
David Tomaschik
0b5ca1cefc Potentially source iterm2 integration 2025-06-05 16:36:48 -07:00
David Tomaschik
ab2f62345f Update fish 2025-06-05 15:43:14 -07:00
David Tomaschik
05df603332 Add config.fish 2025-06-05 15:29:21 -07:00
David Tomaschik
ca71dea284 Make prune-broken-symlinks more portable 2025-06-05 13:59:56 -07:00
David Tomaschik
00bbe65691 Update installer to deal with overlays 2025-06-05 12:56:46 -07:00
David Tomaschik
de8d2cf608 Update 2025-06-04 13:47:00 -07:00
David Tomaschik
a81e6e9e8d Update gitignore 2025-06-04 13:10:44 -07:00
David Tomaschik
52d05c400d Fix path ordering 2025-06-02 10:53:49 -07:00
David Tomaschik
83b7adf1ca Update submodules; aliases 2025-05-30 13:42:14 -07:00
David Tomaschik
f6d7f22a77 Disable gpg-agent ssh support by default 2025-05-23 19:17:45 -07:00
David Tomaschik
746653d28d Shallow clones 2025-05-23 16:17:03 -07:00
David Tomaschik
695cef6cb3 Cleanup gitconfig 2025-05-23 12:08:05 -07:00
David Tomaschik
e0eebe2641 Update install.sh 2025-05-23 12:06:33 -07:00
David Tomaschik
d5024a536d Add secret generator 2025-05-22 16:56:03 -07:00
David Tomaschik
d10f82d088 Crowdstrike doesn't like paths with msfvenom in the name. 2025-05-20 16:51:48 -07:00
David Tomaschik
6ffae42e33 Homebrew path update 2025-05-12 16:05:03 -07:00
David Tomaschik
5658c61627 Update titles 2025-05-07 14:25:03 -07:00
David Tomaschik
e227b65d6d Cleanup zshrc 2025-05-07 10:28:52 -07:00
David Tomaschik
569199a280 Ripgrep config 2025-05-01 14:05:16 -07:00
David Tomaschik
61e81f33c8 Restructure packages 2025-04-30 14:16:43 -07:00
David Tomaschik
422c56139f Update aliases 2025-04-30 13:32:07 -07:00
David Tomaschik
15c118583a Bump packages.cli 2025-04-30 13:30:52 -07:00
David Tomaschik
31c2783286 Merge branch 'main' of https://github.com/Matir/skel 2025-04-30 13:27:20 -07:00
David Tomaschik
1131b46e44 Update package tools 2025-04-30 13:27:02 -07:00
David Tomaschik
fecdf1f67e Update Brewfile 2025-04-27 12:12:01 -07:00
David Tomaschik
38c21397cf Add android sdk zsh initialization 2025-04-06 12:59:00 +02:00
David Tomaschik
b2eff8284c Add Brewfile 2025-03-25 21:27:50 -07:00
David Tomaschik
ef902daa1c Add baymax key 2025-03-17 19:35:51 -07:00
David Tomaschik
42361045bc Add direnv 2025-03-16 12:36:36 -07:00
David Tomaschik
a45afefca4 Fix paths 2025-03-15 16:06:31 -07:00
David Tomaschik
d40eb6b0a7 Bump zshrc 2025-03-15 13:55:51 -07:00
David Tomaschik
2c26051817 Add homebrew gcloud paths 2025-03-15 13:28:36 -07:00
David Tomaschik
b7b16e20a6 Homebrew support 2025-03-10 17:26:43 -07:00
David Tomaschik
f6573e30b2 Add bin/restic-backup.sh 2024-10-29 16:45:28 -07:00
David Tomaschik
43e8661036 Merge branch 'main' of https://github.com/Matir/skel 2024-10-29 16:45:16 -07:00
David Tomaschik
55823417eb Bump dotfiles 2024-10-29 16:45:11 -07:00
David Tomaschik
eab08b1c95 Fix install_tool 2024-10-29 16:44:46 -07:00
David Tomaschik
560f803455 Add rtmux function 2024-10-25 22:26:49 -07:00
David Tomaschik
c6fe0ff1c8 Fix spicerandr 2024-09-14 22:03:13 -07:00
David Tomaschik
05c910e675 add spicerandr 2024-08-15 13:15:01 -07:00
David Tomaschik
efe093471c update aliases 2024-08-04 15:36:39 -07:00
David Tomaschik
e99d20e47e Include vscode 2024-06-12 15:29:28 -07:00
David Tomaschik
a3fb4c5e66 Bump submodules 2024-06-12 13:04:29 -07:00
David Tomaschik
f9a48c70c4 Use starship if available 2024-06-06 12:40:03 -07:00
David Tomaschik
d072e3a5dd Update gitconfig 2024-05-14 17:00:49 -04:00
David Tomaschik
ce13fbc610 Update 2024-05-09 13:19:17 -07:00
David Tomaschik
45be3e45f1 pm3 iceman 2024-05-05 20:51:01 -07:00
David Tomaschik
442127f7c1 saleae rules update 2024-05-05 20:03:53 -07:00
David Tomaschik
87797ca803 Fix starship init 2023-12-29 21:07:25 -08:00
David Tomaschik
7c1c5cfbd7 Update aliases 2023-11-13 20:53:36 -08:00
David Tomaschik
6a9358cd21 Merge branch 'main' of github.com:Matir/skel 2023-10-05 11:48:26 -07:00
David Tomaschik
a195f0310d Bump 2023-10-05 11:48:21 -07:00
David Tomaschik
11ecbdaf04 Add hashall function 2023-08-20 13:56:49 -07:00
David Tomaschik
bc9150b592 shellcheck fixes 2023-08-14 21:41:12 -07:00
David Tomaschik
f81410cfc0 ensure $USER is set 2023-08-14 21:20:31 -07:00
David Tomaschik
87239b2034 fix up change 2023-08-14 20:57:47 -07:00
David Tomaschik
50011b1675 update keepalives for ssh 2023-08-09 10:24:48 -07:00
David Tomaschik
eb3392966a belloff 2023-08-08 01:45:37 -07:00
David Tomaschik
3188effbd3 update installer 2023-08-05 00:25:37 -07:00
David Tomaschik
80b119f6ad Add hak5 ssh config 2023-07-31 22:37:14 -07:00
David Tomaschik
e87b4cb3d4 add C.utf8 to shenv 2023-07-21 10:39:43 -07:00
David Tomaschik
0c08d4ebe7 xfce4 2023-06-19 17:26:27 -07:00
David Tomaschik
a7d59e971f bump 2023-06-19 17:23:49 -07:00
David Tomaschik
233b3e7a7b Update 2023-06-03 20:45:02 -07:00
David Tomaschik
691f64a477 Don't pass -C to ls in alias. 2023-05-26 10:18:42 -07:00
David Tomaschik
670875f227 Bump bsidessf 2023-05-23 18:05:54 -07:00
David Tomaschik
e90c014d88 Bump, add pipx 2023-05-16 19:55:40 -07:00
David Tomaschik
d76a278a95 Merge branch 'main' of github.com:Matir/skel 2023-04-28 21:12:51 -07:00
David Tomaschik
8eff002d55 Update skel 2023-04-28 21:12:42 -07:00
David Tomaschik
3015e7a1c0 Default disable SSH forwarding in earthly 2023-03-20 11:11:42 -07:00
David Tomaschik
a286795570 Merge branch 'main' of github.com:Matir/skel 2023-03-05 19:54:16 -08:00
David Tomaschik
99e8ff6f2b Add some packages 2023-02-14 11:22:28 -08:00
David Tomaschik
4a77c0e900 add refresh alias 2023-02-06 20:23:20 -08:00
David Tomaschik
35f494c3d4 Add unblob 2023-02-01 20:43:21 -08:00
David Tomaschik
f650d12efb Merge branch 'main' of github.com:Matir/skel 2023-01-31 14:14:10 -08:00
David Tomaschik
2c67b58ba6 Add history aliases 2023-01-31 14:13:59 -08:00
David Tomaschik
ba9534577a Add igrep, rustup to install_tool 2023-01-13 11:05:25 -08:00
David Tomaschik
193b22e0d1 Bump skel 2022-12-29 20:37:22 -08:00
David Tomaschik
b7353bd34e Setup rust paths for ycm 2022-12-02 17:23:36 -08:00
David Tomaschik
12b2ed211b deb_only marking 2022-11-26 15:30:18 -08:00
David Tomaschik
ee5a78b578 Merge branch 'main' of github.com:Matir/skel 2022-11-26 13:06:33 -08:00
David Tomaschik
25a9194480 Replace go get with go install 2022-11-26 13:06:16 -08:00
David Tomaschik
f4ea05681c Bump 2022-11-23 12:11:20 -08:00
David Tomaschik
eb193fe1de Remove unused keys 2022-10-22 13:59:56 -07:00
David Tomaschik
e02dc0be80 Update nerdfonts 2022-10-21 19:58:12 -07:00
David Tomaschik
6c3dea3721 Rename .env to .shenv.
Requires updating symlinks.

Fixes #13.
2022-10-20 11:04:27 -07:00
David Tomaschik
cb3ba03c49 Load profile in sh emulation mode. 2022-10-20 11:04:27 -07:00
David Tomaschik
d7cc6fd508 Add wfh chromebox key 2022-10-20 11:04:27 -07:00
David Tomaschik
b628453b10 Rename .env to .shenv.
Requires updating symlinks.

Fixes #13.
2022-10-19 10:08:21 -07:00
David Tomaschik
157e6ee20e Load profile in sh emulation mode. 2022-10-19 10:08:21 -07:00
David Tomaschik
e375d7f472 Merge branch 'main' of github.com:Matir/skel 2022-10-16 20:47:13 -07:00
David Tomaschik
373189f440 Add ffuf aliases 2022-10-16 20:47:00 -07:00
David Tomaschik
a719ca9972 Merge branch 'main' of https://github.com/Matir/skel 2022-10-16 11:55:35 -07:00
David Tomaschik
4937a98ccc Suppress LVM warnings 2022-10-16 11:55:27 -07:00
David Tomaschik
81093ab3d6 Add nerdfonts install script 2022-10-08 22:20:21 -07:00
David Tomaschik
ab85cb5ecf Merge branch 'main' of github.com:Matir/skel 2022-10-04 21:24:04 -07:00
David Tomaschik
cbb580fcdf Fix xfwm4.xml 2022-10-04 21:23:51 -07:00
David Tomaschik
aea9e50141 Bump skel 2022-10-03 19:48:28 -07:00
David Tomaschik
10ce6ff7f6 Rotate glaptop keys 2022-09-15 11:26:39 -07:00
David Tomaschik
cd9bb5d6cc Update cyberchef install_tool 2022-09-15 11:25:34 -07:00
David Tomaschik
5cfbc4e88a add pm3iceman 2022-09-03 18:42:17 -07:00
David Tomaschik
44d981e3c3 Add doctl to install_tool 2022-09-03 15:46:53 -07:00
David Tomaschik
3f509e17c1 Update trusted ssh keys 2022-08-26 22:09:03 -07:00
David Tomaschik
af3365ad8e Merge branch 'main' of https://github.com/Matir/skel 2022-08-26 16:54:46 -07:00
David Tomaschik
6888e8503f xfwm4 2022-08-26 16:54:27 -07:00
David Tomaschik
e52af2d21a Merge branch 'main' of github.com:Matir/skel 2022-08-25 22:29:39 -07:00
David Tomaschik
a5a5c7d5df Add ghidra to install_tool 2022-08-25 22:29:28 -07:00
David Tomaschik
aca274d7df Add rvm.zsh 2022-08-20 12:37:38 -07:00
David Tomaschik
70cdfcdc07 Update FTDI rules 2022-06-11 20:05:04 -07:00
David Tomaschik
9a38b456d7 install_tool: arduino-cli 2022-06-11 19:35:38 -07:00
David Tomaschik
a4196d7bc1 Don't depend on RUBY_VERSION in starship 2022-06-11 11:19:04 -07:00
David Tomaschik
cbcc6e6fb6 zshrc fix 2022-06-11 11:06:56 -07:00
David Tomaschik
f2ca693f7b Starship change glyph for status 2022-06-09 21:43:56 +00:00
David Tomaschik
da43e7533d Allow defaulting to starship 2022-06-09 20:14:51 +00:00
David Tomaschik
9c9c56b030 Add zazu key 2022-05-28 20:30:52 -07:00
David Tomaschik
747bc7becd Updates on arch 2022-05-23 21:56:45 -07:00
David Tomaschik
c3c9714b8d Add kubectx to install_tool. 2022-05-14 09:28:36 -07:00
David Tomaschik
5865f5130f Update starship config. 2022-05-14 00:38:16 -07:00
David Tomaschik
6803ac2ce2 Bump gcloud version 2022-05-14 00:38:01 -07:00
David Tomaschik
c512401acd Add starship.toml 2022-05-13 22:04:27 -07:00
David Tomaschik
dae254e240 Updates 2022-05-13 22:03:06 -07:00
David Tomaschik
2ab9bd3452 Update bsidessf config 2022-05-08 17:23:21 -07:00
David Tomaschik
b68c1e2c65 Update gitignore 2022-05-08 17:23:12 -07:00
David Tomaschik
3c8d8ca5e1 Starship support. 2022-05-08 16:01:23 -07:00
David Tomaschik
f6e6c42b26 kubeconform install_tool 2022-05-05 21:14:35 -07:00
David Tomaschik
7165e7c93f Revert "Add kubeval to install_tool."
This reverts commit dea863ee35.
2022-05-05 21:11:29 -07:00
David Tomaschik
63f401c84b Fix gitconfig 2022-05-05 21:11:09 -07:00
David Tomaschik
dea863ee35 Add kubeval to install_tool. 2022-05-05 18:38:28 -07:00
David Tomaschik
d01a320de7 ropper recipe 2022-05-01 16:40:44 -07:00
David Tomaschik
0564dbbb3d Bump config_bsidessf 2022-04-30 11:33:50 -07:00
David Tomaschik
1efa61a9f4 Add duf to packages.cli 2022-03-19 16:33:27 -07:00
David Tomaschik
77a01d2fda Enable delta line-numbers 2022-03-19 15:55:36 -07:00
David Tomaschik
71711a5cc0 Use delta when available 2022-03-19 15:53:34 -07:00
David Tomaschik
a49474fe60 Add more tools 2022-03-19 15:23:50 -07:00
David Tomaschik
2217cfb47b batcat -> bat alias 2022-03-19 14:21:00 -07:00
David Tomaschik
75b0c5db9e Update tools 2022-03-17 18:23:27 -07:00
David Tomaschik
50174a4f72 Add misc functions 2022-03-11 12:36:02 -08:00
David Tomaschik
04470627c6 Add more to rsync_ignore 2022-03-11 12:31:33 -08:00
David Tomaschik
e6318c4cc1 Packages bump for jc 2022-02-27 12:32:41 -08:00
David Tomaschik
15b575c34d install_tool: tldr 2022-02-06 12:44:07 -08:00
David Tomaschik
2db123c772 HashKnownHosts no 2022-02-05 15:38:04 -08:00
David Tomaschik
2de511f5f3 Add docker-compose to install_tool 2022-02-01 21:10:26 -08:00
David Tomaschik
890a24ec07 Remove rvm 2022-01-18 19:44:25 -08:00
David Tomaschik
a3aaed6c0c Add nvim to package list 2022-01-14 22:22:44 -08:00
David Tomaschik
9f4fbfb06a split package names 2022-01-14 20:57:33 -08:00
David Tomaschik
273d6b495f Ctrl-H is backspace 2022-01-06 22:02:59 -08:00
David Tomaschik
d41703820d nvim compatibility 2022-01-06 21:59:34 -08:00
David Tomaschik
5748d014f1 Add arch path for zsh-syntax-highlighting. 2021-11-19 22:33:14 -08:00
David Tomaschik
2779322b24 Fix ls colors 2021-11-15 10:36:20 -08:00
David Tomaschik
50948acee4 Fix profile syntax errors 2021-11-15 10:24:45 -08:00
David Tomaschik
670cf5c8dc Add LIBVIRT_DEFAULT_URI to profile. 2021-11-14 15:22:40 -08:00
David Tomaschik
d213b3b234 Fix find command 2021-11-07 20:57:19 -08:00
David Tomaschik
37d606cc49 Move setup scripts 2021-11-07 18:48:32 -08:00
David Tomaschik
8f57fad78c Shellcheck cleanups in install.sh 2021-11-07 16:41:41 -08:00
David Tomaschik
f8ddb56b02 Switch out which for command -v in install.sh 2021-11-07 15:49:09 -08:00
David Tomaschik
1f59627da9 Remove ctrlp 2021-11-01 19:12:31 -07:00
David Tomaschik
2c88a59188 Move syntastic/vim-go to matir-extra 2021-10-31 10:30:24 -07:00
David Tomaschik
9ec67f4c1c XFCE4 configs 2021-10-22 14:48:54 -07:00
David Tomaschik
db3193e0bc Update telemetry 2021-10-21 14:08:20 -07:00
David Tomaschik
9c83b8fc40 Bump fugitive version 2021-10-14 19:38:34 -07:00
David Tomaschik
3da887ffad Add fish vars 2021-10-14 12:07:18 -07:00
David Tomaschik
f56b7d0b7b Merge branch 'main' of https://github.com./Matir/skel 2021-10-14 12:07:10 -07:00
David Tomaschik
e18e66391b Update age path. 2021-10-14 12:07:04 -07:00
David Tomaschik
8b66586fe8 install_tool: include list of tools in usage 2021-10-06 11:31:53 -07:00
David Tomaschik
ac4109cee6 Merge branch 'main' of https://github.com./Matir/skel 2021-09-16 11:08:10 -07:00
David Tomaschik
99af2287c5 Add bracketed paste mode to vimrc. 2021-09-16 11:07:56 -07:00
David Tomaschik
6adaaffabd Disable syntastic active mode in readonly mode. 2021-08-20 18:39:18 -07:00
David Tomaschik
c6f217d47c Merge branch 'main' of https://github.com./Matir/skel 2021-08-20 15:13:49 -07:00
David Tomaschik
733093ee7a Add SJCA pem 2021-08-20 15:13:23 -07:00
David Tomaschik
441a533e2a Update install_tool 2021-08-17 16:39:43 -07:00
David Tomaschik
8d30879224 Update install_tool 2021-08-15 21:49:25 -07:00
David Tomaschik
f94a4dc67c Fix gf patterns in install_tool. 2021-08-14 12:38:34 -07:00
David Tomaschik
0bb950b053 Remove deleted key. 2021-07-12 20:18:09 -07:00
David Tomaschik
4ec8f22ab8 Don't load YCM in a virtualenv. 2021-07-04 21:39:25 -07:00
David Tomaschik
ba0c734b06 Merge branch 'main' of https://github.com./Matir/skel 2021-06-27 18:50:21 -07:00
David Tomaschik
f24e3ebb24 Bump tools zip 2021-06-27 18:50:10 -07:00
David Tomaschik
4af40de24b Add age to install_tool 2021-06-08 11:23:14 -07:00
David Tomaschik
351b136cbc Support disabling gpg-agent. 2021-06-06 22:08:45 -07:00
David Tomaschik
a5b0677903 Updates 2021-05-27 19:44:42 -07:00
David Tomaschik
ebf5c1cd22 Update ssh keys 2021-05-25 20:53:51 -07:00
David Tomaschik
94abfa2fe2 Add gh/config.yml 2021-05-13 14:32:05 -07:00
David Tomaschik
15f5f91e2a Change default pager to less. 2021-05-13 12:53:34 -07:00
David Tomaschik
2b6229acc3 Improve prune-broken-symlinks 2021-05-12 11:46:29 -07:00
David Tomaschik
e05a6aa473 Correctly pick first browser choice. 2021-05-11 15:06:10 -07:00
David Tomaschik
673fca3c05 Scratchpad keybinds 2021-04-20 21:18:48 -07:00
David Tomaschik
f6a7b372b7 Install tool: cht.sh 2021-04-19 12:10:48 -07:00
David Tomaschik
685fb22dd3 Merge branch 'main' of https://github.com./Matir/skel 2021-04-17 13:50:47 -07:00
David Tomaschik
e788dedf69 Support pip path 2021-04-16 20:23:48 -07:00
David Tomaschik
a482092fdb More install_tool 2021-04-10 21:01:59 -07:00
David Tomaschik
b3eb8a8e44 Dmesg wrapper function 2021-03-24 13:28:45 -07:00
David Tomaschik
3afee0505b vimrc shift-tab notes 2021-03-19 10:52:03 -07:00
David Tomaschik
50b74fc06e Merge branch 'master' of https://github.com./Matir/skel 2021-03-19 10:29:20 -07:00
David Tomaschik
74bf253950 Disable completion based prediction 2021-03-18 23:40:47 -07:00
David Tomaschik
434120cc90 Support aliases.local 2021-03-11 16:40:28 -08:00
David Tomaschik
97e23b3669 Update config_bsidessf 2021-03-04 19:06:35 -08:00
David Tomaschik
f9f3dd05c8 Merge branch 'master' of https://github.com./Matir/skel 2021-03-01 23:09:58 -08:00
David Tomaschik
6e095d9fbc Update strategy 2021-03-01 23:09:40 -08:00
David Tomaschik
c25540a398 Add httpie 2021-02-20 20:35:05 -08:00
David Tomaschik
fae178e8ac Merge branch 'master' of https://github.com./Matir/skel 2021-02-19 20:27:27 -08:00
David Tomaschik
15ea12d54b Change autosuggest colors 2021-02-19 20:27:14 -08:00
David Tomaschik
291de7b2c1 Merge branch 'master' of https://github.com./Matir/skel 2021-02-17 23:52:54 -08:00
David Tomaschik
bbba28e166 Update config_bsidessf 2021-02-17 23:52:15 -08:00
David Tomaschik
27dc8fb22c Merge branch 'master' of https://github.com./Matir/skel 2021-02-17 23:47:39 -08:00
David Tomaschik
a5f55034fa Update htoprc 2021-02-17 23:47:11 -08:00
David Tomaschik
062da36145 Add zsh-autosuggestions 2021-02-17 23:46:25 -08:00
David Tomaschik
9e3b929a4b Default branch to main. 2021-02-06 16:12:05 -08:00
David Tomaschik
3170a41c4b Update rsync ignore 2021-02-05 15:55:59 -08:00
David Tomaschik
b37f95383c Wrap vmstat 2021-02-05 15:55:50 -08:00
David Tomaschik
e6e66b0d05 Handle Xauth in ssh/rc. 2021-01-21 22:37:36 -08:00
David Tomaschik
6e6b63cb28 Update package list 2021-01-17 17:49:32 -08:00
David Tomaschik
20bb942ac6 Update install script. 2020-11-28 14:49:14 -08:00
David Tomaschik
d256cdf12b add amass 2020-11-22 21:32:32 -08:00
David Tomaschik
c20739472f Add meld merge tool 2020-11-19 16:02:28 -08:00
David Tomaschik
66e6833623 Support OS X spelling of en_US.UTF-8 2020-11-10 20:56:36 -08:00
David Tomaschik
bc5f9a2741 Add vim-youcompleteme to packages. 2020-11-07 14:50:17 -08:00
David Tomaschik
04d4ab4d25 Improve remote SSH agent 2020-11-06 09:35:45 -08:00
David Tomaschik
ce1d4780b6 Update install_tool 2020-10-29 14:04:01 -07:00
David Tomaschik
8e79910857 dfh alias 2020-10-28 16:53:57 -07:00
David Tomaschik
999ef09790 Remove old unused keys. 2020-10-27 10:00:32 -07:00
David Tomaschik
2f9841e2ac Fix up tools 2020-10-25 20:13:50 -07:00
David Tomaschik
2879f63aff ffuf 2020-10-25 20:02:01 -07:00
David Tomaschik
79a3e1f46c Bump submodules. 2020-10-25 15:02:07 -07:00
David Tomaschik
62392e3712 Bump vim-go 2020-10-24 13:20:11 -07:00
David Tomaschik
9717fef420 Add gf support 2020-10-23 09:40:57 -07:00
David Tomaschik
3c83cb1761 Add multiple tool screenshotting capabilities. 2020-10-19 17:59:46 -07:00
David Tomaschik
2a71557663 Update backup.sh 2020-10-16 21:41:36 -07:00
David Tomaschik
b6a2b65704 Remove hashed SSH hosts from completion. 2020-10-13 14:40:17 -07:00
David Tomaschik
398e39b9eb Improve ipython loader 2020-10-11 10:49:15 -07:00
David Tomaschik
f6b5cd90fc Update packages 2020-10-11 08:49:01 -07:00
David Tomaschik
1d14f294eb Add powerline fonts 2020-10-11 06:42:43 -07:00
David Tomaschik
f3cb3607db Support agnoster prompt 2020-10-11 06:42:29 -07:00
David Tomaschik
d117ee6b2e Don't jump to a position within git commits in vim. 2020-10-09 16:34:59 -07:00
David Tomaschik
7e249843a6 Fix ls output redirection 2020-10-03 15:22:05 -07:00
David Tomaschik
465bfd37f1 Use only posix find in prune-broken-symlinks 2020-10-03 15:18:57 -07:00
David Tomaschik
5ad1ad4616 Fix shell grouping. 2020-10-03 15:17:59 -07:00
David Tomaschik
e82cad68e1 Update chrome path. 2020-09-20 19:43:54 -07:00
David Tomaschik
5e372e2b35 Update scripts and backups. 2020-09-19 19:16:57 -07:00
David Tomaschik
9e392af7d1 Add tmpmail script. 2020-09-16 13:16:59 -07:00
David Tomaschik
68bcf536cb Add command-not-found support 2020-09-07 21:51:47 -07:00
David Tomaschik
698f2defa9 Add htoprc 2020-09-05 14:03:45 -07:00
David Tomaschik
a42128f5c9 Add bc alias 2020-08-27 15:09:09 -07:00
David Tomaschik
6559acbf90 Merge branch 'master' of https://github.com./Matir/skel into master 2020-08-23 19:50:14 -07:00
David Tomaschik
a654a7747c Fix duf 2020-08-23 19:49:25 -07:00
David Tomaschik
d158a0a373 Usage util duf. 2020-08-23 19:46:13 -07:00
David Tomaschik
229d5353e3 Merge branch 'master' of https://github.com./Matir/skel 2020-08-11 17:07:54 -07:00
David Tomaschik
20389cba90 Setup gitconfig.local during install. 2020-08-11 17:07:44 -07:00
David Tomaschik
aaf56b794d Add AWS CLI to install_tool 2020-08-07 11:50:21 -07:00
David Tomaschik
827665279a Add qdisc_span script. 2020-08-02 21:55:19 -07:00
David Tomaschik
8467bfce20 Add solaar for mouse stuff 2020-07-27 12:54:46 -07:00
David Tomaschik
116ae13896 Add logid.conf 2020-07-24 16:36:42 -07:00
David Tomaschik
0f08f9710a Add logiops to install_tool 2020-07-22 13:07:54 -07:00
David Tomaschik
9c147af8c1 Allow configuring locktime by environment variable. 2020-07-18 15:53:03 -07:00
David Tomaschik
5e498f9bcd Change test 2020-07-13 16:26:21 -07:00
David Tomaschik
1cab41bfd5 Avoid error working in .git directory 2020-07-12 18:05:30 -07:00
David Tomaschik
3e225ae2ab Fix env for GOPATH 2020-07-12 18:05:09 -07:00
David Tomaschik
cc15b17e28 Tool to hold nvidia packages. 2020-07-12 18:04:46 -07:00
David Tomaschik
7aa9e57a59 Update sourcing for gcloud completions. 2020-07-08 15:00:07 -07:00
David Tomaschik
530b205b3d More history functions. 2020-07-08 14:57:47 -07:00
David Tomaschik
0bed0a80a3 Add firacode to package list. 2020-07-07 14:30:52 -07:00
David Tomaschik
244c5da0e7 Update clone script. 2020-07-05 12:37:38 -07:00
David Tomaschik
e885afbff9 Local t box 2020-06-29 21:34:07 -07:00
David Tomaschik
8a0e4cd774 Enable trim on via USB-SATA via udev. 2020-06-29 21:34:07 -07:00
David Tomaschik
5cf313140c Add nmap-parse-output to install_tool. 2020-06-29 12:53:18 -07:00
David Tomaschik
f0c3ab8753 Add i3 sleep keybind. 2020-06-24 08:00:20 -07:00
David Tomaschik
8cd3682a23 Also bind F13 to Mic Mute 2020-06-13 18:22:14 -07:00
David Tomaschik
ee83a40686 Update how we set SSH_AUTH_SOCK. 2020-06-13 18:22:14 -07:00
David Tomaschik
7f9a3774ae Change where path is set. 2020-06-07 11:33:06 -07:00
David Tomaschik
8d7c76b227 Support cargo/rust. 2020-05-23 17:57:14 -07:00
David Tomaschik
0a92dd0ed7 Add rr to install_tool. 2020-05-13 12:36:51 -07:00
David Tomaschik
eae69fe414 Fix Cura install 2020-05-04 12:05:36 -07:00
David Tomaschik
dcef7445b2 Use pactl_helper for i3 keybindings. 2020-04-21 09:02:29 -07:00
David Tomaschik
11d1086a68 Stop adjusting extension in wget. 2020-04-20 14:53:04 -07:00
David Tomaschik
a88d120b3c Add a pulseaudio helper. 2020-04-20 14:53:04 -07:00
David Tomaschik
15479f3829 Add ipy alias. 2020-04-18 20:07:29 -07:00
David Tomaschik
9178794de5 python2->python3 fixes in install_tool 2020-04-16 20:48:03 -07:00
David Tomaschik
fc120b66fe Add cura to install_tool. 2020-04-16 20:48:03 -07:00
David Tomaschik
57b181bd74 Bindkey fix for delete key. 2020-04-13 11:51:10 -07:00
David Tomaschik
aa6a2e806d Add ssh alias for non-checking ssh. 2020-04-05 23:17:48 -07:00
David Tomaschik
eec3c9ba7a Improve google-chrome-burp script. 2020-04-05 23:17:48 -07:00
David Tomaschik
d67b18f2ea Disable xmllint checkers. 2020-04-01 12:48:59 -07:00
David Tomaschik
72b82ff2e3 Setup searchsploit_rc. 2020-03-31 10:20:50 -07:00
David Tomaschik
6492beb726 Add exploitdb to install_tool. 2020-03-31 10:06:06 -07:00
David Tomaschik
08142409f8 Set git pull to merge, not rebase. 2020-03-31 09:58:45 -07:00
David Tomaschik
8225785dcc Only FF when running pull from install script. 2020-03-30 15:49:03 -07:00
David Tomaschik
c7c97b84c5 Enhanced zshrc logging. 2020-03-27 20:54:17 -07:00
David Tomaschik
f9ce8b3df8 Use "bundle exec" to wrap jekyll commands. 2020-03-21 20:21:53 -07:00
David Tomaschik
69c1184b58 Add userns.conf. 2020-03-12 23:09:15 -07:00
David Tomaschik
7e432287ac llvm too. 2020-03-12 20:36:00 -07:00
David Tomaschik
50cb109c99 Add clang dependencies for afl++. 2020-03-12 20:26:18 -07:00
David Tomaschik
c915b20450 Merge branch 'master' of https://github.com./Matir/skel 2020-03-11 14:55:17 -07:00
David Tomaschik
f3ea935dd5 AFLplusplus in tools. 2020-03-11 14:55:04 -07:00
David Tomaschik
a6414425b7 Add srcless alias. 2020-03-07 18:48:29 -08:00
David Tomaschik
ad73f12103 Fix gitroot alias. 2020-02-21 18:29:06 -08:00
David Tomaschik
7d35ace5bb Vimrc: remember position and return to it. 2020-02-21 17:18:08 -08:00
David Tomaschik
e4f2cc94b5 Disable ControlMaster for cloud shell. 2020-02-02 13:36:19 -08:00
David Tomaschik
fcbe2e781b Add 1 git-crypt collaborator
New collaborators:

	5DEA789B David Tomaschik <david@systemoverlord.com>
2020-01-26 18:23:28 -08:00
David Tomaschik
7a5abd73cb Fix symlinks for submodules.
This fixes the creation of symlinks for submodules when
run from outside the repo.

Fixes #7.
2020-01-26 17:57:15 -08:00
David Tomaschik
07926d6673 Fix virtualenv formatting of prompt.
Fixes #11.
2020-01-26 16:10:27 -08:00
David Tomaschik
24690e8399 Bump gcloud sdk to 277. 2020-01-25 16:39:36 -08:00
David Tomaschik
2232dce811 Add a gitconfig.local file. 2020-01-19 19:18:41 -08:00
David Tomaschik
f6de62700a Add a gitroot alias. 2020-01-19 19:14:40 -08:00
David Tomaschik
01272f4474 Configure XDG user dirs. 2020-01-19 18:58:08 -08:00
David Tomaschik
e176b0c136 Add gcloud configurations. 2020-01-19 18:52:55 -08:00
David Tomaschik
67fad831e5 Update luksFormat alias. 2019-12-18 19:16:50 -08:00
David Tomaschik
048d7fb1ba Lazy load of kubectl. 2019-12-07 22:46:31 -08:00
David Tomaschik
24c1c8edfb Update pubkey. 2019-11-23 22:42:26 -08:00
David Tomaschik
614adeed08 Deprecate grc. 2019-11-16 12:11:23 -08:00
David Tomaschik
12a92703f0 Re-fix grc ls options. 2019-11-14 22:23:00 -08:00
David Tomaschik
288a9c3a7e Cleanup command substitution styles. 2019-11-12 17:19:10 -08:00
David Tomaschik
2419693164 Simplify preference variables. 2019-11-12 16:54:12 -08:00
David Tomaschik
b8607f4bdc No need to pass -C to ls. 2019-11-01 18:11:38 -07:00
David Tomaschik
5c2289e283 Basic script to clone and install. 2019-10-29 17:45:50 -07:00
David Tomaschik
deb8b62c12 Make install git pull before installing. 2019-10-29 17:39:13 -07:00
David Tomaschik
8e984d3c3b Add grc conf.mount 2019-10-19 12:52:36 -07:00
David Tomaschik
eb0206575a Add skelify function. 2019-10-19 12:47:14 -07:00
David Tomaschik
44d273dd7c Add werdlists to install_tool. 2019-10-11 10:57:29 -07:00
David Tomaschik
8029afc15a Update coloring. 2019-10-10 22:38:48 -07:00
David Tomaschik
f5766e7661 Customize df output with grc. 2019-10-10 20:51:04 -07:00
David Tomaschik
88c096cd95 Clean up shellcheck warnings in install_tool. 2019-10-10 13:25:49 -07:00
David Tomaschik
3005abff34 Update git aliases. 2019-10-08 16:29:06 -07:00
David Tomaschik
8b9c9581e4 Merge pull request #10 from Matir/doc
Cleanup README.
2019-10-02 21:58:54 -07:00
David Tomaschik
9d85ae77fa Cleanup README. 2019-10-02 21:58:29 -07:00
David Tomaschik
693b349024 Merge pull request #9 from Matir/jekyll_esc
Fix escaping of Jekyll titles.
2019-10-02 21:43:41 -07:00
David Tomaschik
a82e0cdb37 Fix escaping of Jekyll titles. 2019-10-02 21:43:01 -07:00
David Tomaschik
80d0b2844e Merge pull request #8 from Matir/zshopt
Reformat zsh options as upper case.
2019-10-02 21:14:52 -07:00
David Tomaschik
7f40245bb0 Reformat zsh options as upper case. 2019-10-02 21:13:03 -07:00
David Tomaschik
157fa34915 Fix up keymap display on line init. 2019-09-30 22:04:24 -07:00
David Tomaschik
2a359f1a02 ACPI Temperature alias. 2019-09-29 19:18:17 -07:00
David Tomaschik
c3f41435da Quieter gpg-agent. 2019-09-27 19:24:44 -07:00
David Tomaschik
aa3a1e0237 Remove prezto entirely. 2019-09-27 16:51:26 -07:00
David Tomaschik
68e53c426b More cleanup. 2019-09-27 16:42:58 -07:00
David Tomaschik
fcb04c0ae7 More cleanup. 2019-09-27 15:56:36 -07:00
David Tomaschik
b096fd2a24 Drop more prezto deps. 2019-09-27 13:16:39 -07:00
David Tomaschik
cc94650bad Even fewer deps. 2019-09-27 00:03:56 -07:00
David Tomaschik
1b2f75ca47 Reduce prezto deps. 2019-09-26 23:43:31 -07:00
David Tomaschik
55064a548d Really fix package installation. 2019-09-26 22:49:54 -07:00
David Tomaschik
cb051b8686 Fix testing for packages. 2019-09-26 22:30:58 -07:00
David Tomaschik
fae0e69619 Bump submodules. 2019-09-26 22:06:34 -07:00
David Tomaschik
d21e21ebf6 Merge branch 'master' of https://github.com./Matir/skel 2019-09-26 22:03:50 -07:00
David Tomaschik
ff14dcaf56 Prune package list better. 2019-09-26 22:03:39 -07:00
David Tomaschik
83645e39ee Bump submodules. 2019-09-26 10:44:18 -07:00
David Tomaschik
73f4cdfb20 Bump submodules. 2019-09-26 00:00:54 -07:00
David Tomaschik
ec06c2fcb2 Merge branch 'master' of https://github.com./Matir/skel 2019-09-25 23:59:18 -07:00
David Tomaschik
6c49de9512 Remove shallow clones, they cause trouble. 2019-09-25 23:59:08 -07:00
David Tomaschik
ef16b33fd8 Improve gef support. 2019-09-23 13:31:03 -07:00
David Tomaschik
ba56fb89b3 Merge branch 'master' of https://github.com./Matir/skel 2019-09-23 10:09:49 -07:00
David Tomaschik
395297e08b Update benchmark for variable size. 2019-09-22 19:34:05 -07:00
David Tomaschik
a20636347c Switch to trap for benchmark cleanup. 2019-09-22 19:24:29 -07:00
David Tomaschik
170c3f0e9f Add disk benchmark script. 2019-09-22 19:22:49 -07:00
David Tomaschik
b45f977de9 Use vimdiff. 2019-09-22 19:22:34 -07:00
David Tomaschik
df4e87fdf2 Update submodules. 2019-09-17 15:10:51 -07:00
David Tomaschik
40fa505146 Update metasploit.sh 2019-09-10 21:46:36 -07:00
David Tomaschik
9076b9f07e Bump submodules. 2019-09-10 21:00:01 -07:00
David Tomaschik
ac2b8650b8 Add support for gef. 2019-09-02 21:30:11 -07:00
David Tomaschik
5353336b9d Bump submodules. 2019-09-02 21:30:01 -07:00
David Tomaschik
78a9dc5835 Bump submodules. 2019-08-30 20:08:15 -07:00
David Tomaschik
57fff46dd8 Merge branch 'master' of https://github.com./Matir/skel 2019-08-30 20:07:39 -07:00
David Tomaschik
59cc1e6ed9 Update tmux styles for 2.9. 2019-08-30 20:05:04 -07:00
David Tomaschik
748b113fe9 Fixup locale. 2019-08-25 22:24:15 -07:00
David Tomaschik
b920e94cc5 Bump solarized8. 2019-08-23 20:13:46 -07:00
David Tomaschik
ea63773f4f Add rvmrc. 2019-08-23 10:53:17 -07:00
David Tomaschik
4bea5020b1 Merge branch 'master' of https://github.com./Matir/skel 2019-08-19 19:19:56 -07:00
David Tomaschik
0c5a5e6fc9 Bump zprezto. 2019-08-19 19:06:44 -07:00
David Tomaschik
6b659ac9a9 Bump vim plugins. 2019-08-19 19:05:24 -07:00
David Tomaschik
b30b40f259 Bump fugitive. 2019-08-19 19:04:34 -07:00
David Tomaschik
43680df2e2 Merge branch 'master' of https://github.com./Matir/skel 2019-08-19 14:54:09 -07:00
David Tomaschik
dc621af59d Avoid error if nothing exists in zshrc.d. 2019-08-19 14:53:40 -07:00
David Tomaschik
5ea16b8ace Update john.conf. 2019-08-13 14:35:23 -07:00
David Tomaschik
b800b624ae Suspend after 10 mins. 2019-07-30 13:53:57 -07:00
David Tomaschik
9364e70986 Add word splitting for xss-lock. 2019-07-30 13:53:12 -07:00
David Tomaschik
4b03c7d9e0 Fix ls alias with grc. 2019-07-29 13:27:27 -07:00
David Tomaschik
937328a833 Disable unused git aliases. 2019-07-25 10:48:55 -07:00
David Tomaschik
699fc2ac66 Add grc 2019-07-25 10:43:24 -07:00
David Tomaschik
803712f0db Merge branch 'master' of https://github.com./Matir/skel 2019-07-24 13:06:29 -07:00
David Tomaschik
2dbc8f33ea Comment things that should not be used anymore. 2019-07-24 13:06:11 -07:00
David Tomaschik
e2361baa37 Merge branch 'master' of https://github.com./Matir/skel 2019-07-13 11:46:12 -07:00
David Tomaschik
1ec5aa8056 Add fonts packages. 2019-07-13 11:45:46 -07:00
David Tomaschik
863e985bc6 Merge branch 'master' of https://github.com./Matir/skel 2019-07-13 11:15:19 -07:00
David Tomaschik
b40cbc1811 Add scar key. 2019-07-12 18:51:42 -07:00
David Tomaschik
5913bbb4c7 Add some package renames. 2019-07-10 19:46:42 -07:00
David Tomaschik
fc621bb31a Changes to Keyserver configuration.
See https://gist.github.com/rjhansen/67ab921ffb4084c865b3618d6955275f
for rationale.
2019-06-29 10:20:53 -07:00
David Tomaschik
d620566562 Add libnotify-bin to i3 install. 2019-06-23 13:22:09 -07:00
David Tomaschik
4d2d8c89f6 i3status: Use default route for ethernet address first. 2019-06-07 16:15:46 -07:00
David Tomaschik
e325cc3b93 Merge branch 'master' of https://github.com./Matir/skel 2019-06-07 14:04:23 -07:00
David Tomaschik
a5dc656656 Add a symlink for SSH_AUTH_SOCK remotely. 2019-06-07 10:42:10 -07:00
David Tomaschik
b1799197fe Set nomodeline. 2019-06-05 10:32:14 -07:00
David Tomaschik
4b37169735 Fix git submodule call to use BASEDIR. 2019-06-04 08:32:15 -07:00
David Tomaschik
2531595828 Add ipython_config. 2019-05-27 14:59:13 -07:00
David Tomaschik
9394758ff9 vimrc updates. 2019-05-25 12:03:01 -07:00
David Tomaschik
713e59fb32 Fix s/set/let/. 2019-05-22 17:10:23 -07:00
David Tomaschik
f0641f4113 Close preview window on exiting insert mode. 2019-05-22 17:08:47 -07:00
David Tomaschik
7739339515 Bump vim-go. 2019-05-22 17:08:03 -07:00
David Tomaschik
af556f0a75 Bump vim-go. 2019-05-21 07:11:49 -07:00
David Tomaschik
90a87e0e93 Merge branch 'master' of github.com:Matir/skel 2019-05-16 21:15:53 -07:00
David Tomaschik
ccb6bcb616 Support the vim-youcompleteme package on Debian. 2019-05-16 21:15:40 -07:00
David Tomaschik
460163089b Merge branch 'master' of https://github.com./Matir/skel 2019-05-04 13:05:11 -07:00
David Tomaschik
448b7a6c4d Disable tracker-store service. 2019-05-04 13:03:32 -07:00
David Tomaschik
24c7171a73 Rearrange vimrc. 2019-04-30 16:36:08 -07:00
David Tomaschik
379ab1c375 Fix install on bash. 2019-04-29 18:27:19 -07:00
David Tomaschik
968c9529c8 Merge branch 'master' of github.com:Matir/skel 2019-04-29 18:06:35 -07:00
David Tomaschik
f96ad7773f Fix xiwibg. 2019-04-29 18:06:14 -07:00
David Tomaschik
03a12e509e Add a bash/zsh compatibility option. 2019-04-29 16:33:17 -07:00
David Tomaschik
19d78117cb Symlink submodules as a whole instead of each file. Fixes #6. 2019-04-29 15:59:58 -07:00
David Tomaschik
1a592beaea Merge branch 'master' of https://github.com./Matir/skel 2019-04-29 15:19:43 -07:00
David Tomaschik
05c2ef7848 Fix double equals in posix shell comparison. 2019-04-29 13:09:39 -07:00
David Tomaschik
17c2767de5 Add syntastic for vim. 2019-04-29 12:58:44 -07:00
David Tomaschik
006188e07d Add xiwibg function. 2019-04-28 18:54:07 -07:00
David Tomaschik
322358b0f0 Add env var to disable zprezto. 2019-04-27 20:28:28 -07:00
David Tomaschik
3db0742889 Add sqliterc. 2019-04-27 20:17:04 -07:00
David Tomaschik
d2849bfe9e Fix comparison operator. 2019-04-27 13:16:44 -07:00
David Tomaschik
ac8fae69c6 Add google public key. 2019-04-26 11:20:28 -07:00
David Tomaschik
1881916c8e Fix darwin LSCOLORS. 2019-04-26 11:07:07 -07:00
David Tomaschik
08952e7f22 LSCOLORS on Darwin. 2019-04-26 11:03:45 -07:00
David Tomaschik
eb0d0ebfc1 Only use dircolors when available. 2019-04-26 10:55:25 -07:00
David Tomaschik
33d9e53327 Add tmux-logging. 2019-04-24 21:49:28 -07:00
David Tomaschik
53fa86ba4a Always recurse modules. 2019-04-24 12:55:13 -07:00
David Tomaschik
b135ee423b Bump vim-go to v1.20 2019-04-23 20:02:41 -07:00
David Tomaschik
25fb3cc6a0 Add hterm prefs. 2019-04-21 13:20:05 -07:00
David Tomaschik
b073e7d61c Not so shallow checkouts. 2019-04-18 19:28:02 -07:00
David Tomaschik
781142e8f2 Only run git if we have it. 2019-04-17 12:00:41 -07:00
David Tomaschik
3e87044901 Do shallow copies. 2019-04-17 10:28:31 -07:00
David Tomaschik
cb01867ba6 Use submodule for zprezto. 2019-04-16 23:36:57 -07:00
David Tomaschik
1fcdb910a2 Improvements. 2019-04-16 23:07:57 -07:00
David Tomaschik
cb5df8e7e6 Merge branch 'master' of github.com:Matir/skel 2019-04-16 23:01:46 -07:00
David Tomaschik
815cf0a6e4 Move pwndbg to tools from dotfile status. 2019-04-16 23:01:40 -07:00
David Tomaschik
72914aa6e1 Remove vundle as I no longer use it. 2019-04-16 22:45:31 -07:00
David Tomaschik
404c9592ec Add histmode on/off commands. 2019-04-15 15:04:30 +02:00
David Tomaschik
c2371d29a6 Bump font sizes. 2019-04-11 16:01:03 +02:00
David Tomaschik
25c03b677a Use solarized palette for LS_COLORS. 2019-04-11 15:56:55 +02:00
David Tomaschik
b9c2e6afb9 Fix solarized foreground from base00 to base0. 2019-04-11 15:34:38 +02:00
David Tomaschik
3f29a03ba4 Support both urlLauncher and url-launcher for URxvt. 2019-04-11 14:57:44 +02:00
David Tomaschik
b4db394761 Export BROWSER as well. 2019-04-11 14:54:47 +02:00
David Tomaschik
a85a9c52be Update some urxvt resources. 2019-04-09 18:18:42 +02:00
David Tomaschik
6be3fde55c Update some urxvt resources. 2019-04-09 18:10:02 +02:00
David Tomaschik
161028537c Fix hinting in xft.
This fixes the weird font issues I had with i3 that I "fixed" by
starting cinnamon-settings-daemon.
2019-04-09 15:53:33 +02:00
David Tomaschik
426fdbd7ee Fixup some startup scripts. 2019-04-09 15:33:53 +02:00
David Tomaschik
90060a290e Use Monospace as backup for Inconsolata. 2019-04-09 13:50:37 +02:00
David Tomaschik
b4c462a66c Set colors properly on urxvt. 2019-04-09 10:53:26 +02:00
David Tomaschik
18d5697827 Add a comment about xterm-256color. 2019-04-08 10:29:28 +02:00
David Tomaschik
75d0943548 Merge branch 'master' of https://github.com./Matir/skel 2019-04-08 10:22:16 +02:00
David Tomaschik
78b9efc04b Add gocode path to GOPATH. 2019-04-08 10:22:13 +02:00
David Tomaschik
6c2bb3ded8 Add vim-go. 2019-04-04 23:24:32 -07:00
David Tomaschik
312036587e Add vim-go. 2019-04-03 14:07:34 -07:00
David Tomaschik
0f97610473 Add id_ecdsa_chromebook.pub to trusted set. 2019-03-31 15:58:10 -07:00
David Tomaschik
c825c6af28 Add more editing tools. 2019-03-29 21:24:59 -07:00
David Tomaschik
394eb7996c Conditionally start ipython. 2019-03-27 22:46:06 -07:00
David Tomaschik
c7619f93dc Support submodules in install. 2019-03-25 21:03:42 -07:00
David Tomaschik
ee67442965 Fix aliases file. 2019-03-21 15:25:05 -07:00
David Tomaschik
f70488eab7 Better support on FreeBSD. 2019-03-21 14:15:09 -07:00
David Tomaschik
4cb51c3bba Add fugitive. 2019-03-21 14:10:17 -07:00
David Tomaschik
d77d76f184 Add more vim plugins. 2019-03-19 21:19:38 -07:00
David Tomaschik
b3224e9ad3 Begin migrating from Vundle to Vim8 packages. 2019-03-19 20:23:54 -07:00
David Tomaschik
6bd457700e Merge branch 'master' of https://github.com./Matir/skel 2019-03-06 13:14:41 -08:00
David Tomaschik
4b189b73dd Only autocomplete root and current user. 2019-03-06 11:24:06 -08:00
David Tomaschik
c86050bc3b Use ipython when available. 2019-03-04 07:40:08 -08:00
David Tomaschik
10cd949696 Add editorconfig VIM plugin. 2019-02-21 22:53:13 -06:00
David Tomaschik
81d4dbbdba Merge branch 'master' of https://github.com./Matir/skel 2018-12-20 13:38:42 -08:00
David Tomaschik
14197fe6c0 Add pwgen. 2018-11-07 10:10:53 -08:00
David Tomaschik
5cda2fc25b Update packages. 2018-11-02 20:48:57 -05:00
David Tomaschik
8b0c4dd29a Update packages. 2018-11-02 12:34:38 -07:00
David Tomaschik
2ab99dd2b4 Add gibson key. 2018-11-02 11:16:18 -07:00
David Tomaschik
3f69a044d3 Fix install_tool for new installs. 2018-11-02 11:12:48 -07:00
David Tomaschik
76d0078497 Add symlink for john. 2018-10-23 00:33:51 -05:00
David Tomaschik
523f272c58 Update john.conf to bleeding edge. 2018-10-23 00:32:57 -05:00
David Tomaschik
475e347fe6 Remove noglob scp workaround. 2018-10-17 15:55:28 -07:00
David Tomaschik
2bd6d63fe4 Merge pull request #5 from Matir/noutility
Stop including prezto alias module.
2018-10-17 11:28:32 -07:00
David Tomaschik
db14ac6e06 Stop including prezto alias module. 2018-10-17 11:27:48 -07:00
David Tomaschik
584678d67e Merge pull request #4 from Matir/workupdates
Add msitools.
2018-10-11 20:22:20 -07:00
David Tomaschik
815dc47846 Merge pull request #3 from Matir/ptffix
PTF fix
2018-10-03 05:46:06 -07:00
David Tomaschik
e52cf7ae00 Add ptf to install_tool. 2018-10-03 05:45:07 -07:00
David Tomaschik
eb2d6e776f Remove ptf from default install script. 2018-10-03 05:39:42 -07:00
David Tomaschik
af85d6f81f Add seclists tool. 2018-10-03 05:38:57 -07:00
226 changed files with 11042 additions and 11239 deletions

6
.Brewfile.ignore Normal file
View File

@@ -0,0 +1,6 @@
# Add package names here to ignore them in Brewfile updates.
# One package per line.
# Example:
# iterm2
# wget
orbstack

5
.gemini/settings.json Normal file
View File

@@ -0,0 +1,5 @@
{
"context": {
"fileName": "AGENTS.md"
}
}

View File

@@ -1,3 +0,0 @@
# Do not edit this file. To specify the files to encrypt, create your own
# .gitattributes file in the directory where your files are.
* !filter !diff

1
.gitattributes vendored
View File

@@ -1 +0,0 @@
private_dotfiles/** filter=git-crypt diff=git-crypt

80
.githooks/githooks.sh Executable file
View File

@@ -0,0 +1,80 @@
#!/usr/bin/env bash
# --- 1. Identity Resolution ---
# Finds the physical location of this script, regardless of symlinks
REAL_PATH=$(realpath "$0")
REAL_NAME=$(basename "$REAL_PATH")
HOOKS_DIR=$(dirname "$REAL_PATH")
CALLED_AS=$(basename "$0")
# --- 2. Self-Installation / Sync Logic ---
if [ "$CALLED_AS" == "$REAL_NAME" ]; then
echo "🔧 Synchronizing Git Hook Dispatcher..."
# Point Git to this directory
git config core.hooksPath "$HOOKS_DIR"
# Create symlinks for any [hook-name].d directories found
for d in "$HOOKS_DIR"/*.d/; do
[ -d "$d" ] || continue
HOOK_NAME=$(basename "$d" .d)
TARGET="$HOOKS_DIR/$HOOK_NAME"
if [ ! -L "$TARGET" ]; then
ln -sf "$REAL_NAME" "$TARGET"
chmod +x "$TARGET"
echo " ✨ Linked: $HOOK_NAME"
fi
done
# Cleanup: Remove symlinks that no longer have a matching .d directory
for link in "$HOOKS_DIR"/*; do
if [ -L "$link" ] && [ "$(basename "$link")" != "$REAL_NAME" ]; then
if [ ! -d "${link}.d" ]; then
rm "$link"
echo " 🗑️ Removed: $(basename "$link")"
fi
fi
done
echo "✅ Done."
exit 0
fi
# --- 3. Selective Stdin Buffering ---
# Buffer stdin only for hooks that expect it to prevent hanging/performance hits
STDIN_DATA=""
case "$CALLED_AS" in
pre-push|post-rewrite|pre-receive|post-receive|reference-transaction)
# Check if stdin has data (is not a terminal)
if [ ! -t 0 ]; then
STDIN_DATA=$(cat)
fi
;;
esac
# --- 4. Dispatch Logic ---
SUB_HOOK_DIR="${HOOKS_DIR}/${CALLED_AS}.d"
if [ -d "$SUB_HOOK_DIR" ]; then
# Sort files naturally so 01- runs before 02-
for script in $(ls "$SUB_HOOK_DIR" | sort); do
FULL_PATH="$SUB_HOOK_DIR/$script"
[ -x "$FULL_PATH" ] || continue
# Replay stdin if we captured it, otherwise execute normally
if [ -n "$STDIN_DATA" ]; then
echo "$STDIN_DATA" | "$FULL_PATH" "$@"
else
"$FULL_PATH" "$@"
fi
# Exit immediately if any sub-script fails
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
echo "❌ Hook '$CALLED_AS' failed at: $script"
exit $EXIT_CODE
fi
done
fi
exit 0

1
.githooks/pre-commit Symbolic link
View File

@@ -0,0 +1 @@
githooks.sh

View File

@@ -0,0 +1,21 @@
#!/usr/bin/env bash
# Check if Brewfile needs updating
if [[ "$(uname)" != "Darwin" ]]; then
exit 0
fi
# We use the script we just created
UPDATE_SCRIPT="bin/macos/update_brewfile"
if [[ -x "$UPDATE_SCRIPT" ]]; then
echo "🔍 Checking Brewfile synchronization..."
# Run in dry-run mode with --add-only and see if there's output
DIFF_OUTPUT=$("$UPDATE_SCRIPT" --dry-run --add-only 2>/dev/null)
if [[ "$DIFF_OUTPUT" == *"Changes detected"* ]]; then
echo "⚠️ Brewfile is out of sync with your installed packages."
echo " Run '$UPDATE_SCRIPT' to synchronize it."
echo ""
# We don't fail the commit, just warn.
fi
fi

3
.gitignore vendored
View File

@@ -4,3 +4,6 @@ installed-prefs
*~ *~
*.bak *.bak
local_dotfiles local_dotfiles
dotfile_overlays/*
!dotfile_overlays/.keep
!dotfile_overlays/README

1
.gitmodules vendored Normal file
View File

@@ -0,0 +1 @@

70
AGENTS.md Normal file
View File

@@ -0,0 +1,70 @@
## Installation and Environment
This is a set of dotfiles and utilities for setting up my personal environment
on POSIX-style environments. It is cloned from github and installed from the
`install.sh` script.
It mostly relies on symlinking dotfiles and other resources into the appropriate
locations, but also installs dependencies in various ways.
I primarily target Debian Linux-based (Debian, Ubuntu, and Kali Linux) systems
as well as MacOS. Other platforms are lower priorities. Shell scripts ending
in `.sh` should use only POSIX features unless there is a shebang line at the
beginning suggesting a different shell will be used. In particular, those
in directories with names like bash might use those shells.
`zsh` and `fish` are the key interactive shells to be configured, but `bash`
may also be used at times.
## Project Structure
* `bin/`: Contains executable scripts symlinked to `~/bin/`. Subdirectories like `macos/`, `restic/`, and `setup/` are included.
* `dotfiles/`: Contains configuration files (dotfiles) symlinked to the home directory.
* `dotfile_overlays/`: Each directory within is symlinked to the home directory, allowing for modular or git-submodule-based configurations.
* `local_dotfiles/`: If present, its contents are symlinked to the home directory (ignored by git).
* `packages/`: Contains lists of packages (one per line) for different environments or toolsets.
* `keys/`: Contains SSH keys (`ssh/`), GPG keys (`gpg/`), and a `known_hosts` file to be installed/merged.
* `skeltools/`: Internal utilities used by the installation scripts.
* `sysctl/` and `udev/`: Linux system configuration files.
* `Brewfile`: Homebrew package list for macOS environments.
* `install.sh`: The primary installation script for symlinking and basic setup.
## Notes on Security Issues
It is safe to have scripts and tools re-invoke themselves with sudo when they
require elevated privileges, as these are my own. Do not attempt to remove
these use cases.
## Making Changes
**IMPORTANT**: Only make those changes which are explicitly requested. If you
identify other issues, notify me about them, but do not suggest changes until I
ask for them.
When making large changes, explain your chain of thought transparently and
explain solution design.
If making changes that affects how the user installs the tools, update
`README.md` accordingly.
### Adding a new dotfile
1. Place the new dotfile in the `dotfiles/` directory.
2. Alternatively, use `dotfile_overlays/` if the dotfile belongs to a specific group or submodule.
3. The `install.sh` script will automatically symlink it to the home directory.
### Adding a new script to `bin/`
1. Add the new script to the `bin/` directory (or an appropriate subdirectory).
2. Ensure the script is executable (`chmod +x`).
### Adding a new package
1. Identify the appropriate package list in the `packages/` directory (e.g., `packages/cli`, `packages/kali`).
2. Add the new package name to the list (one per line).
3. If a new package set is required, create a new file in the `packages/` directory.
4. For macOS-specific packages, also consider adding them to the `Brewfile`.
### Platform-specific changes
When making changes that are specific to a platform (e.g., Debian vs. macOS), please check for existing conventions in the `install.sh` script or other files. Use conditional logic (e.g., checking `uname`) to apply platform-specific settings.

112
Brewfile Normal file
View File

@@ -0,0 +1,112 @@
tap "dart-lang/dart"
tap "sass/sass"
brew "ack"
brew "acme.sh"
brew "age"
brew "autoconf"
brew "automake"
brew "b2-tools"
brew "bat"
brew "bazelisk"
brew "binwalk"
brew "cask"
brew "ccache"
brew "certbot"
brew "cmake"
brew "colima"
brew "devcontainer"
brew "dfu-util"
brew "difftastic"
brew "direnv"
brew "duck"
brew "earthly"
brew "esptool"
brew "gh"
brew "ghidra", link: false
brew "git"
brew "git-delta"
brew "git-lfs"
brew "gnupg"
brew "go"
brew "gradle"
brew "hf"
brew "htop"
brew "httpie"
brew "huggingface-cli"
brew "hugo"
brew "imagemagick"
brew "john-jumbo"
brew "jq"
brew "lima"
brew "mise"
brew "mosh"
brew "neovim"
brew "ninja"
brew "nmap"
brew "ollama"
brew "p7zip"
brew "pipenv"
brew "pipx"
brew "pkgconf"
brew "protobuf"
brew "pwgen"
brew "pwntools"
brew "qemu"
brew "restic"
brew "ripgrep"
brew "ruby"
brew "ruby@3.3"
brew "rustup"
brew "sass/sass/migrator"
brew "sass/sass/sass"
brew "shellcheck"
brew "smartmontools"
brew "starship"
brew "tmux"
brew "uv"
brew "virtualenvwrapper"
brew "wget"
brew "yt-dlp"
brew "zlib"
brew "zsh-syntax-highlighting"
cask "codeql"
cask "cyberduck"
cask "font-fira-code-nerd-font"
cask "font-fira-mono-nerd-font"
cask "font-go-mono-nerd-font"
cask "font-hack-nerd-font"
cask "font-inconsolata-nerd-font"
cask "font-symbols-only-nerd-font"
cask "font-terminess-ttf-nerd-font"
cask "ghidra"
cask "gimp"
cask "github"
cask "iterm2"
cask "macfuse"
cask "meld"
cask "mitmproxy"
cask "processmonitor"
cask "raycast"
cask "rectangle"
cask "scroll-reverser"
cask "temurin"
cask "veracrypt"
cask "zulu@17"
def is_corp?
# Check for MDM enrollment (Enrolled via DEP: Yes)
`profiles status -type enrollment 2>/dev/null`.include?("Enrolled via DEP: Yes")
end
# non-corp
if !is_corp?
brew "bazel"
brew "openssh"
cask "claude-code"
cask "cryptomator"
cask "gcloud-cli"
cask "google-cloud-sdk"
cask "orbstack"
end

View File

@@ -1,39 +1,86 @@
### About ### ### About ###
This is a repository of configuration files that I like to have on all the This is a repository of configuration files that I like to have on all the
machines that I use. I can just clone the repository and run "repo/setup.sh" machines that I use. For new systems, you can bootstrap by running the
and get most things setup the way I like them. included `clone.sh` script:
```bash
curl -L https://raw.githubusercontent.com/Matir/skel/master/clone.sh | bash
```
Alternatively, you can manually clone the repository and run `./install.sh`.
This started just as dotfiles, but expanded to include SSH keys, GPG keys, This started just as dotfiles, but expanded to include SSH keys, GPG keys,
packages I like installed, and an ever-growing setup script. There are various and an ever-growing setup script. There are various
options to install just parts of it, such as on a machine where I only have a options to install just parts of it, such as on a machine where I only have a
user account but no root. user account but no root.
This now uses [git-crypt](https://github.com/AGWA/git-crypt) to protect This environment supports using `dotfile_overlays/` or `local_dotfiles/` to
`private_dotfiles` for things I don't want to splash all over the internet. :) manage machine-specific or private configurations. You can use
[git-crypt](https://github.com/AGWA/git-crypt) on these overlay directories
for things you don't want to splash all over the internet. :)
I still wouldn't check in anything terribly sensitive, like private keys. I still wouldn't check in anything terribly sensitive, like private keys.
### Usefulness ### ### Usefulness ###
Mostly I post this to github so I can quickly grab the things I want, but it Mostly I post this to github so I can quickly grab the things I want, but it
might also be useful to others. Feel free to raise an issue if you have any might also be useful to others. Feel free to raise an issue if you have any
questions. I don't anticipating taking merge requests -- make your own questions. I don't anticipating taking merge requests -- make your own
dotfiles. ;) dotfiles. ;)
### Options ### ### Options ###
### macOS-like Copy/Paste ###
To address keyboard shortcut conflicts between operating systems, this environment
now supports using `Alt+C` for copy and `Alt+V` for paste, similar to macOS.
This functionality is context-aware: it will automatically use `Ctrl+Shift+C/V`
in terminals and `Ctrl+C/V` in all other applications.
This feature requires the following packages to be installed:
- `xbindkeys`: To listen for the keyboard shortcuts.
- `xdotool`: To send the appropriate keypresses.
On Debian-based systems (like Ubuntu or Kali), you can install them with:
```bash
sudo apt-get update
sudo apt-get install xbindkeys xdotool
```
After installation, the functionality will be enabled automatically on your
next login.
On macOS, you can install the recommended packages using the included `Brewfile`:
```bash
brew bundle install
```
### Packages ###
The `packages/` directory contains lists of recommended packages. You can
manually install a set (e.g., on a Debian-based system) using:
```bash
grep -v "^#" packages/cli | xargs sudo apt-get install -y
```
``` ```
BASEDIR: Where the skel framework is installed. Defaults to $HOME/.skel BASEDIR: Where the skel framework is installed. Defaults to $HOME/.skel
MINIMAL: Don't do things that require git clones or installation of anything MINIMAL: Don't do things that require git clones or installation of anything
not included in my .skel. (Defaults to 0, installs everything.) not included in my .skel. (e.g., skips vim-plug, TPM) (Defaults to 0)
INSTALL_KEYS: Install GnuPG and SSH keys. SSH keys are placed in INSTALL_KEYS: Install GnuPG and SSH keys. SSH keys are placed in
authorized_keys. (Defaults to 1, installs keys.) authorized_keys. (Defaults to 1, installs keys.)
TRUST_ALL_KEYS: Allow all keys to be used for SSH login, versus a small subset. TRUST_ALL_KEYS: Allow all keys to be used for SSH login, versus a small subset.
INSTALL_PKGS: Install common packages, if on a Debian-like system. VERBOSE: Enable verbose output during installation. (Defaults to 0)
(Defaults to opposite of $MINIMAL.) SAVE: Save the install options to ${BASEDIR}/.installed-prefs
SAVE: Save the install options to ${BASEDIR}/installed-prefs
``` ```
### TODO ### ### TODO ###
[ ] Re-do the installation of packages. - [X] Re-do the installation of packages.
[ ] Make manual installation of sets easy/possible. - [X] Make manual installation of sets easy/possible.
[ ] Make missing packages not cause a full set failure. - [X] Make missing packages not cause a full set failure.
[X] Allow comments and blank lines. - [X] Allow comments and blank lines. in packages

70
bin/add_hosts_entry Normal file
View File

@@ -0,0 +1,70 @@
#!/usr/bin/env python3
# vim: set ft=python:
import datetime
import ipaddress
import os
import sys
import sys.path
def generate_hosts_entry(ip_address_str, hostnames):
"""
Generates a string formatted for /etc/hosts after validating the IP address.
Args:
ip_address_str (str): The IP address string.
hostnames (list): A list of hostname strings.
Returns:
str: A formatted string for /etc/hosts, or None if validation fails.
"""
try:
# Validate the IP address
ip = ipaddress.ip_address(ip_address_str)
except ValueError:
print(f"Error: '{ip_address_str}' is not a valid IP address.", file=sys.stderr)
return None
# Join hostnames with spaces
hostnames_str = " ".join(hostnames)
# Return the formatted line
return f"{ip} {hostnames_str}"
def append_hosts_entry(entry, hosts_file="/etc/hosts"):
when = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
try:
with open(hosts_file, "a") as fp:
fp.write(f"# Added by add_hosts_entry {when}\n{entry}\n")
return True
except PermissionError:
if os.geteuid() == 0:
print(f"Error: failed opening {hosts_file} for writing.",
file=sys.stderr)
return False
return relaunch_with_sudo()
def relaunch_with_sudo():
script_abspath = os.path.abspath(sys.argv[0])
os.execvp("sudo", [script_abspath] + sys.argv[1:])
if __name__ == "__main__":
# Check for correct number of arguments
if len(sys.argv) < 3:
print("Usage: python3 generate_hosts_entry.py <ip_address> <hostname1> [hostname2 ...]", file=sys.stderr)
sys.exit(1)
ip_to_add = sys.argv[1]
hostnames_to_add = sys.argv[2:]
# Generate the entry
entry = generate_hosts_entry(ip_to_add, hostnames_to_add)
if not entry:
sys.exit(1)
if not append_hosts_entry(entry):
sys.exit(1)

View File

@@ -3,6 +3,11 @@
set -o nounset set -o nounset
set -o errexit set -o errexit
if [ "$(uname)" != "Linux" ]; then
echo "Error: This backup script is only intended for use on Linux." >&2
exit 1
fi
DEFAULT=`echo /media/${USER}/[bB]ackup/${USER}/` DEFAULT=`echo /media/${USER}/[bB]ackup/${USER}/`
DEST="${1:-${DEFAULT}}" DEST="${1:-${DEFAULT}}"
@@ -26,5 +31,8 @@ function verify_dest {
verify_dest "$DEST" verify_dest "$DEST"
exec nice rsync -Hax --delete --exclude-from="$HOME/.rsync_ignore" \ time nice rsync -Hax --delete --exclude-from="$HOME/.rsync_ignore" \
--delete-excluded "${HOME}/" "$DEST" --delete-excluded "${HOME}/" "$DEST"
echo "Backup completed..."
time sync
echo "Run finished, safe to unmount."

View File

@@ -835,14 +835,14 @@ case "$1" in
fi fi
cd /proc cd /proc
N=$2 N=$2
if [ -d $N ] ; then if [ -d "$N" ] ; then
# read permissions? # read permissions?
if [ ! -r $N/exe ] ; then if [ ! -r "$N/exe" ] ; then
if !(root_privs) ; then if !(root_privs) ; then
printf "\033[31mNo read permissions for '/proc/$N/exe' (run as root).\033[m\n\n" printf "\033[31mNo read permissions for '/proc/%s/exe' (run as root).\033[m\n\n" "$N"
exit 1 exit 1
fi fi
if [ ! `readlink $N/exe` ] ; then if [ ! "$(readlink "$N/exe")" ] ; then
printf "\033[31mPermission denied. Requested process ID belongs to a kernel thread.\033[m\n\n" printf "\033[31mPermission denied. Requested process ID belongs to a kernel thread.\033[m\n\n"
exit 1 exit 1
fi fi
@@ -860,9 +860,9 @@ case "$1" in
printf "\033[31mError: libc not found.\033[m\n\n" printf "\033[31mError: libc not found.\033[m\n\n"
exit 1 exit 1
fi fi
printf "* Process name (PID) : %s (%d)\n" `head -1 $N/status | cut -b 7-` $N printf "* Process name (PID) : %s (%d)\n" "$(head -1 "$N/status" | cut -b 7-)" "$N"
FS_chk_func_libc=( $(readelf -s $FS_libc | grep _chk@@ | awk '{ print $8 }' | cut -c 3- | sed -e 's/_chk@.*//') ) FS_chk_func_libc=( $(readelf -s "$FS_libc" | grep _chk@@ | awk '{ print $8 }' | cut -c 3- | sed -e 's/_chk@.*//') )
FS_functions=( $(readelf -s $2/exe | awk '{ print $8 }' | sed 's/_*//' | sed -e 's/@.*//') ) FS_functions=( $(readelf -s "$2/exe" | awk '{ print $8 }' | sed 's/_*//' | sed -e 's/@.*//') )
FS_libc_check FS_libc_check
FS_binary_check FS_binary_check

148
bin/cloudy.sh Executable file
View File

@@ -0,0 +1,148 @@
#!/usr/bin/env bash
set -ueo pipefail
shopt -s extglob
# get libraries
. ${HOME}/.local/lib/bash/tui.sh
COMMANDS=(
gctx
kctx
)
_make_extglob() {
local IFS='|'
echo "@($*)"
}
CMD_PATTERN=$(_make_extglob "${COMMANDS[@]}")
usage() {
echo "Available Subcommands:"
printf " - %-10s\n" "${COMMANDS[@]}"
exit 1
}
_gctx_set() {
gcloud config configurations activate "${1}" </dev/null
}
_gctx_choose() {
local lines=()
local default=''
local maxnamelen=0
local active name description
while IFS=$'\t' read -r active name description ; do
(( maxnamelen = ( ${#name} > maxnamelen ) ? ${#name} : maxnamelen ))
if [[ "$active" == "True" ]] ; then
default="${name}"
fi
lines+=("${name}" "${description}")
done < <(gcloud config configurations list \
--format='value(is_active, name, format("{} (as {})", properties.core.project, properties.core.account))')
local choice
if choice=$(printf "%-${maxnamelen}s %s\n" "${lines[@]}" | select_entry "gcloud config" "$default") ; then
_gctx_set "${choice}"
else
echo "No option selected, leaving unchanged."
fi
return 0
}
_gctx_new() {
local cname="${1:-}"
if test -z "${cname}" ; then
echo "Usage: gctx new <new name>" >&2
return 1
fi
gcloud config configurations create "${cname}"
}
_gctx_name() {
gcloud info --format='value(config.active_config_name)'
}
_gctx_clone() {
# save old config
local oldconfig=()
local line
while IFS= read -r line ; do
old_config+=("$line")
done < <(gcloud config configurations describe "$(_gctx_name)" --format='multi(properties:format="flattened[separator=\" \"]")')
# create new
_gctx_new "${1:-}"
# set config
for line in "${oldconfig[@]}" ; do
local keyname="${line%% *}"
local keypath="${keyname//\.//}"
local value="${line#* }"
gcloud config set "${keypath}" "${value}"
done
return 0
}
gctx() {
local subcmd="${1:-}"
shift || true
case "${subcmd}" in
clone)
_gctx_clone "$@"
return
;;
new)
_gctx_new "$@"
return
;;
show)
gcloud config configurations list --filter="is_active=True" \
--format='table(name, properties.core.account, properties.core.project, properties.compute.zone:label=COMPUTE_DEFAULT_ZONE, properties.compute.region:label=COMPUTE_DEFAULT_REGION)' \
"$@"
;;
list)
gcloud config configurations list "$@"
return
;;
activate)
_gctx_set "$@"
return
;;
""|choose)
_gctx_choose
return
;;
*)
if _gctx_set "${subcmd}" 2>/dev/null ; then
return 0
fi
echo "Usage: gctx [show|list|new|choose|clone|<name>]" >&2
return 1
;;
esac
}
kctx() {
return 0
}
INVOKED_AS=$(basename "$0")
# shellcheck disable=SC2053
if [[ "$INVOKED_AS" == $CMD_PATTERN ]] ; then
CMD="${INVOKED_AS}"
else
CMD="${1:-}"
shift || usage
fi
# shellcheck disable=SC2254
case "${CMD}" in
${CMD_PATTERN})
"${CMD}" "$@"
;;
*)
usage
;;
esac

8
bin/darwin-env.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/bin/sh
env > ${TMPDIR}/env-pre
. ${HOME}/.shenv
env > ${TMPDIR}/env-post
for VAR in $(env | cut -d'=' -f1) ; do
/bin/launchctl setenv "${VAR}" "$(eval echo \$${VAR})"
done

22
bin/disk-benchmark Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
set -ue
FILENAME=${1}
BENCHMARK_SIZE=${BENCHMARK_SIZE:-1000m}
if [ -f ${FILENAME} ] ; then
echo "File ${FILENAME} already exists!" >/dev/stderr
exit 1
fi
trap "test -f ${FILENAME} && rm -f ${FILENAME}" EXIT
fio --loops=5 --size=${BENCHMARK_SIZE} --filename=${FILENAME} \
--stonewall --ioengine=libaio --direct=1 \
--name=Seqread --bs=1m --rw=read \
--name=Seqwrite --bs=1m --rw=write \
--name=512Kread --bs=512k --rw=randread \
--name=512Kwrite --bs=512k --rw=randwrite \
--name=4kQD32read --bs=4k --iodepth=32 --rw=randread \
--name=4kQD32write --bs=4k --iodepth=32 --rw=randwrite

93
bin/fix-broken-symlinks.sh Executable file
View File

@@ -0,0 +1,93 @@
#!/bin/bash
# A script to find and remove broken symbolic links in a directory.
#
# OPTIONS:
# -y: Automatically remove all broken links without confirmation.
# -q: Quiet mode. Suppress all non-error output.
set -euo pipefail
# --- Default settings ---
FORCE_DELETE=0
QUIET=0
TARGET_DIR="."
# --- Helper function for logging ---
log() {
if [ "${QUIET}" -eq 0 ]; then
echo "$@"
fi
}
# --- Usage function ---
usage() {
echo "Usage: $0 [-y] [-q] [TARGET_DIRECTORY]"
echo " -y: Yes. Automatically remove broken symlinks without confirmation."
echo " -q: Quiet. Suppress all output except for errors."
echo " TARGET_DIRECTORY: The directory to scan. Defaults to the current directory."
exit 1
}
# --- Parse command-line options ---
while getopts "yq" opt; do
case ${opt} in
y)
FORCE_DELETE=1
;;
q)
QUIET=1
;;
*)
usage
;;
esac
done
shift $((OPTIND - 1)) # Remove the parsed options
# --- Set target directory ---
# Use the first remaining argument as the target directory.
if [ -n "$1" ]; then
TARGET_DIR="$1"
fi
if [ ! -d "${TARGET_DIR}" ]; then
echo "Error: Directory '${TARGET_DIR}' not found." >&2
exit 1
fi
log "Searching for broken symlinks in '${TARGET_DIR}'..."
# --- Main logic ---
# Find broken symlinks and process them.
find "${TARGET_DIR}" -type l ! -exec test -e {} \; -print0 | while IFS= read -r -d '' link; do
if [ "${FORCE_DELETE}" -eq 1 ]; then
# No confirmation needed, just delete.
if rm "${link}"; then
log "Removed '${link}'."
else
# Errors should still be reported.
echo "Failed to remove '${link}'." >&2
fi
else
# If in quiet mode but not force mode, we can't prompt, so we skip.
if [ "${QUIET}" -eq 1 ]; then
continue
fi
# Ask the user for confirmation.
read -p "Remove broken symlink '${link}'? [y/N] " -n 1 -r
echo # Move to a new line after input.
if [[ $REPLY =~ ^[Yy]$ ]]; then
if rm "${link}"; then
log "Removed '${link}'."
else
echo "Failed to remove '${link}'." >&2
fi
else
log "Skipped '${link}'."
fi
fi
done
log "Cleanup complete."

View File

@@ -1,10 +0,0 @@
#!/bin/bash
CHROME=`which google-chrome`
if [ `id -u` != "0" ] ; then
exec $CHROME "$@"
fi
CMD="${CHROME} --user-data-dir=${HOME}/.chrome-data-dir \"$@\""
su -c "${CMD}" chromeuser

View File

@@ -1,3 +1,21 @@
#!/bin/bash #!/bin/bash
CHROME_BINS="google-chrome-beta google-chrome"
for bin in ${CHROME_BINS} ; do
if command -v ${bin} >/dev/null 2>&1 ; then
CHROME=$(command -v ${bin})
break
fi
done
if test -z "${CHROME}" ; then
echo "Chrome not found!" >/dev/stderr
exit 1
fi
# Set alternate HOME to use alternate NSS DB
export HOME=${HOME}/.chrome-pentest
mkdir -p ${HOME}
# Launch chrome for burp # Launch chrome for burp
exec /usr/bin/google-chrome-beta --ignore-certificate-errors --user-data-dir=${HOME}/.config/chrome-pentest --proxy-server=127.0.0.1:8080 exec ${CHROME} --user-data-dir=${HOME}/chrome-pentest --proxy-server=127.0.0.1:8080

14
bin/google-chrome-noroot Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
CHROME=`which google-chrome`
if [ `id -u` != "0" ] ; then
exec "$CHROME" "$@"
fi
args=()
for x in "$@"; do
args+=("$(printf %q "$x")")
done
su -c "$CHROME --user-data-dir=${HOME}/.chrome-data-dir ${args[*]}" chromeuser

View File

@@ -1,8 +1,11 @@
#!/bin/sh #!/bin/sh
LOCKTIME="${SCREENSAVER_MIN:-5}"
LOCKER="i3lock -c 000000" LOCKER="i3lock -c 000000"
/usr/bin/xss-lock -- "${LOCKER}" & # intentionally want word splitting below
# do not quote this
/usr/bin/xss-lock -- ${LOCKER} &
exec /usr/bin/xautolock \ exec /usr/bin/xautolock \
-time 5 \ -time "${LOCKTIME}" \
-detectsleep \ -detectsleep \
-locker "${LOCKER}" \ -locker "${LOCKER}" \
-notify 30 \ -notify 30 \

137
bin/install_ansible.sh Executable file
View File

@@ -0,0 +1,137 @@
#!/bin/bash
#
# Installs Ansible, trying user-space methods first before falling back to sudo.
# This script is designed to be idempotent and safe to run multiple times.
set -e # Exit immediately if a command exits with a non-zero status.
# --- Helper Functions ---
info() { echo "[INFO] $1"; }
warn() { echo "[WARN] $1"; }
error() { echo "[ERROR] $1" >&2; exit 1; }
# --- Main Logic ---
# 1. Check if Ansible is already installed
if command -v ansible >/dev/null 2>&1; then
info "Ansible is already installed at $(command -v ansible)."
exit 0
fi
info "Ansible not found. Attempting installation..."
# 2. Try user-space installation (no sudo)
info "--- Attempting user-space installation (no sudo required) ---"
# Try pipx first, as it's the cleanest user-space method
if command -v pipx >/dev/null 2>&1; then
info "Found pipx. Trying to install Ansible with it..."
if pipx install ansible;
then
# pipx requires adding ~/.local/bin to PATH, which might not be sourced yet.
# Check the executable directly.
if [[ -x "${HOME}/.local/bin/ansible" ]]; then
info "Ansible installed successfully with pipx."
info "Please ensure '${HOME}/.local/bin' is in your PATH."
info "You may need to restart your shell or run: export PATH=\"$HOME/.local/bin:$PATH\""
exit 0
else
warn "pipx install seemed to succeed, but ansible executable not found where expected."
fi
else
warn "pipx install ansible failed."
fi
fi
# Try Python's venv module if pipx failed or wasn't present
VENV_PATH="${HOME}/.local/share/ansible_venv"
# Create a temp path to avoid clobbering a failed install
VENV_TEST_PATH="/tmp/ansible_venv_test_$$"
if python3 -m venv "${VENV_TEST_PATH}" >/dev/null 2>&1; then
rm -rf "${VENV_TEST_PATH}" # Clean up test
info "Python's venv module is available. Creating a virtual environment at ${VENV_PATH}..."
python3 -m venv "${VENV_PATH}"
if "${VENV_PATH}/bin/pip" install --quiet ansible;
then
info "Ansible installed successfully into a virtual environment."
info "To use it, run: '${VENV_PATH}/bin/ansible'"
info "To make it available everywhere, add its bin directory to your PATH:"
info " echo 'export PATH="${VENV_PATH}/bin:$PATH"' >> ~/.profile"
info "(You may need to source ~/.profile or restart your shell)."
exit 0
else
warn "Failed to install ansible into the virtual environment."
rm -rf "${VENV_PATH}" # Clean up failed attempt
fi
else
info "Python's venv module not available or failed to create a test environment."
fi
# 3. Fallback to sudo installation
info "--- User-space installation failed. Falling back to system-wide installation (sudo required) ---"
if ! command -v sudo >/dev/null 2>&1; then
error "sudo command not found. Cannot attempt system-wide installation. Aborting."
fi
# Prompt for sudo password upfront so it doesn't happen in the middle of the script
info "Sudo privileges are required. You may be prompted for your password."
if ! sudo -v; then
error "Failed to acquire sudo privileges. Aborting."
fi
# Detect package manager and install
if command -v apt-get >/dev/null 2>&1; then
info "Detected Debian-based system (apt)."
sudo apt-get update -y
info "Attempting to install 'ansible' package..."
if sudo apt-get install -y ansible;
then
info "System package 'ansible' installed successfully."
else
warn "Failed to install 'ansible' package directly. Trying to install prerequisites for user-space install..."
if sudo apt-get install -y pipx;
then
info "Installed pipx. Attempting to install Ansible with it..."
if pipx install ansible;
then
info "Ansible installed successfully with pipx."
info "Please ensure '${HOME}/.local/bin' is in your PATH."
exit 0
fi
else
error "Failed to install 'ansible' or 'pipx' via apt. Aborting."
fi
fi
elif command -v dnf >/dev/null 2>&1; then
info "Detected Red Hat-based system (dnf)."
info "Attempting to install 'ansible-core' package..."
if ! sudo dnf install -y ansible-core;
then
error "Failed to install ansible-core via dnf. Aborting."
fi
elif command -v pacman >/dev/null 2>&1; then
info "Detected Arch-based system (pacman)."
info "Attempting to install 'ansible' package..."
if ! sudo pacman -Syu --noconfirm ansible;
then
error "Failed to install ansible via pacman. Aborting."
fi
elif command -v brew >/dev/null 2>&1; then
info "Detected macOS (brew)."
info "Attempting to install 'ansible' package..."
if ! brew install ansible;
then
error "Failed to install ansible via brew. Aborting."
fi
else
error "Could not detect a known package manager (apt, dnf, pacman, brew). Aborting."
fi
# 4. Final verification
info "--- Verifying final installation ---"
if command -v ansible >/dev/null 2>&1; then
info "Ansible successfully installed at $(command -v ansible)."
exit 0
else
error "Installation attempted but the 'ansible' command is still not available. Please check the output for errors."
fi

92
bin/install_package.sh Normal file
View File

@@ -0,0 +1,92 @@
#!/bin/bash
# Attempt to install packages regardless of OS
set -ue
is_sourced() {
if [ -n "${ZSH_VERSION:-}" ]; then
case $ZSH_EVAL_CONTEXT in *:file:*) return 0;; esac
else # Add additional POSIX-compatible shell names here, if needed.
case ${0##*/} in dash|-dash|bash|-bash|ksh|-ksh|sh|-sh) return 0;; esac
fi
return 1 # NOT sourced.
}
# Format is <apt name>:<manager>:<alternate name>
# Use "-" for alternate name if not available
PACKAGE_ALIASES=$(cat <<'EOF'
binfmt-support:brew:-
cryptsetup:brew:-
lvm2:brew:-
EOF
)
package_alias() {
local manager="$1"
local package="$2"
local alias=$(echo "$PACKAGE_ALIASES" | \
awk -F: -v manager="${manager}" -v package="${package}" \
'$1 == package && $2 == manager { print $3 }' 2>/dev/null)
echo "${alias:-${package}}"
}
install_package() {
local package="$1"
# Check for apt-get
if command -v apt-get &> /dev/null; then
package=$(package_alias apt "${package}")
if [ "$package" == "-" ] ; then
echo "Package not available on this platform"
return 1
fi
echo "Installing '$package' using apt-get..."
sudo apt-get install -y -- "$package"
return 0
elif command -v yum &> /dev/null; then
package=$(package_alias yum "${package}")
if [ "$package" == "-" ] ; then
echo "Package not available on this platform"
return 1
fi
echo "Installing '$package' using yum..."
sudo yum install -y -- "$package"
return 0
elif command -v pacman &> /dev/null; then
package=$(package_alias pacman "${package}")
if [ "$package" == "-" ] ; then
echo "Package not available on this platform"
return 1
fi
echo "Installing '$package' using pacman..."
sudo pacman -S -- "$package"
return 0
# For macOS, assume Homebrew is installed
elif command -v brew &> /dev/null; then
package=$(package_alias brew "${package}")
if [ "$package" == "-" ] ; then
echo "Package not available on this platform"
return 1
fi
echo "Installing '$package' using Homebrew..."
brew install -- "$package"
return 0
else
echo "Error: No suitable package manager found."
return 1
fi
}
is_sourced || {
# Get the package name from the command line argument
if [ $# -eq 0 ]; then
echo "Usage: $0 <package_name>"
exit 1
fi
package_name="$1"
# Call the install function
install_package "$package_name"
}

View File

@@ -2,10 +2,16 @@
set -ue set -ue
TMPDIR=$(mktemp -d)
trap 'rm -rf -- "${TMPDIR}"' EXIT
REINSTALL=0 REINSTALL=0
PACKAGES=1 PACKAGES=1
export GO111MODULE=on
while getopts -- "-:" a ; do while getopts -- "-:" a ; do
# shellcheck disable=SC2154
case "${a}" in case "${a}" in
-) -)
case "${OPTARG}" in case "${OPTARG}" in
@@ -20,20 +26,33 @@ while getopts -- "-:" a ; do
exit 1 exit 1
;; ;;
esac esac
;;
*)
echo "Unknown short option ${OPTARG}" >/dev/stderr
exit 1
;;
esac esac
done done
shift $(($OPTIND-1)) shift $((OPTIND-1))
function list_tools {
echo "Options:" >/dev/stderr
awk 'BEGIN {s=0;FS=")"};/main tool selection/{s=1};/^\s+\w+)$/{if(s==1){print $1}}' "$0" | sort | while read -r opt; do
echo -e "\\t${opt}" >/dev/stderr
done
}
if [ $# -ne 1 ] ; then if [ $# -ne 1 ] ; then
echo "Usage: ${0} <tool>" >/dev/stderr echo "Usage: ${0} <tool>" >/dev/stderr
list_tools
exit 1 exit 1
fi fi
TOOL=${1} TOOL=${1}
function die { function die {
echo $* >/dev/stderr echo "$@" >/dev/stderr
return 1 exit 1
} }
function install_pkgs { function install_pkgs {
@@ -41,23 +60,22 @@ function install_pkgs {
return 0 return 0
fi fi
# TODO: check if packages are already installed # TODO: check if packages are already installed
if [ `id -u` -ne "0" ] ; then if [ "$(id -u)" -ne "0" ] ; then
sudo apt-get -y install $* || ( sudo apt-get -y install "$@" || (
echo -n "Unable to install packages, please ensure these " >/dev/stderr echo -n "Unable to install packages, please ensure these " >/dev/stderr
echo "are installed, then run with --no-packages." >/dev/stderr echo "are installed, then run with --no-packages." >/dev/stderr
echo $* echo "$@"
false ) false )
return 0 return 0
fi fi
apt-get -y install $* apt-get -y install "$@"
} }
function download { function download {
SRC=${1} SRC=${1}
DST=${2} DST=${2}
echo -n "Downloading ${SRC} to ${DST}..." >&2 echo -n "Downloading ${SRC} to ${DST}..." >&2
# TODO: consider curl instead? curl -fL -o "${DST}" "${SRC}"
wget --no-server-response -q -O ${DST} --content-disposition ${SRC}
echo " done." >&2 echo " done." >&2
} }
@@ -67,151 +85,479 @@ function check_sudo {
function add_bin_symlink { function add_bin_symlink {
local TARGET NAME BINDIR local TARGET NAME BINDIR
TARGET=${1} TARGET="${1}"
NAME=${2:-$(basename ${1})} NAME="${2:-$(basename "${1}")}"
BINDIR=${HOME}/bin/tools/ BINDIR="${HOME}/bin/tools/"
mkdir -p -- ${BINDIR} mkdir -p -- "${BINDIR}"
ln -sf ${DESTDIR}/${TARGET} ${BINDIR}/${NAME} ln -sf "${DESTDIR}/${TARGET}" "${BINDIR}/${NAME}"
} }
mkdir -p "${HOME}/tools"
DESTDIR="${HOME}/tools/${TOOL}" DESTDIR="${HOME}/tools/${TOOL}"
if [ -d ${DESTDIR} ] ; then function makedest {
if [ ${REINSTALL} -eq 1 ] ; then if [ -d "${DESTDIR}" ] ; then
rm -ri ${DESTDIR} if [ "${REINSTALL}" -eq 1 ] ; then
rm -ri "${DESTDIR}"
else else
echo "${DESTDIR} exists but not reinstalling." >/dev/stderr echo "${DESTDIR} exists but not reinstalling." >/dev/stderr
return 1
fi
fi
mkdir -p "${DESTDIR}"
}
function makedest_or_die {
makedest || die "Aborting."
}
function deb_only {
# Error if not on a debian or derivative
if ! test -f /etc/debian_version ; then
echo "This tool only available for debian." >&2
exit 1 exit 1
fi fi
fi }
function get_latest_github_release_url {
local repo="$1"
local glob="$2"
curl -s "https://api.github.com/repos/${repo}/releases/latest" | \
jq -r ".assets[] | select(.name|test(\"${glob}\")) | .browser_download_url"
}
function require_pipx {
command -v pipx >/dev/null 2>&1 || die "Requires pipx"
}
# Begin main tool selection
case ${TOOL} in case ${TOOL} in
john) john)
deb_only
makedest_or_die
install_pkgs libssl-dev git build-essential yasm libgmp-dev libpcap-dev \ install_pkgs libssl-dev git build-essential yasm libgmp-dev libpcap-dev \
pkg-config libbz2-dev libopenmpi-dev openmpi-bin libnss3-dev \ pkg-config libbz2-dev libopenmpi-dev openmpi-bin libnss3-dev \
libkrb5-dev libgmp-dev libkrb5-dev libgmp-dev
jtemp=`mktemp -d` jtemp="${TMPDIR}/john"
git clone https://github.com/magnumripper/JohnTheRipper.git ${jtemp}/john mkdir -p "${jtemp}"
cd ${jtemp}/john/src git clone https://github.com/magnumripper/JohnTheRipper.git "${jtemp}/john"
cd "${jtemp}/john/src" || exit
./configure && make -sj2 ./configure && make -sj2
mkdir -p ${DESTDIR} cp -r "${jtemp}"/john/run/* "${DESTDIR}"
cp -r ${jtemp}/john/run/* ${DESTDIR}
rm -rf ${jtemp}
# Persistent files # Persistent files
mkdir -p ${HOME}/.john mkdir -p "${HOME}/.john"
touch ${HOME}/.john/john.pot touch "${HOME}/.john/john.pot"
ln -sf ${HOME}/.john/* ${DESTDIR} ln -sf "${HOME}/.john/*" "${DESTDIR}"
add_bin_symlink john
;; ;;
wordlists) wordlists)
mkdir -p ${DESTDIR} makedest
download \ download \
http://downloads.skullsecurity.org/passwords/rockyou.txt.bz2 \ "http://downloads.skullsecurity.org/passwords/rockyou.txt.bz2" \
${DESTDIR}/rockyou.txt.bz2 "${DESTDIR}/rockyou.txt.bz2"
bunzip2 ${DESTDIR}/rockyou.txt.bz2 bunzip2 "${DESTDIR}/rockyou.txt.bz2"
download \ download \
http://downloads.skullsecurity.org/passwords/phpbb.txt.bz2 \ "http://downloads.skullsecurity.org/passwords/phpbb.txt.bz2" \
${DESTDIR}/phpbb.txt.bz2 "${DESTDIR}/phpbb.txt.bz2"
bunzip2 ${DESTDIR}/phpbb.txt.bz2 bunzip2 "${DESTDIR}/phpbb.txt.bz2"
download \ download \
http://downloads.skullsecurity.org/passwords/hak5.txt.bz2 \ "http://downloads.skullsecurity.org/passwords/hak5.txt.bz2" \
${DESTDIR}/hak5.txt.bz2 "${DESTDIR}/hak5.txt.bz2"
bunzip2 ${DESTDIR}/hak5.txt.bz2 bunzip2 "${DESTDIR}/hak5.txt.bz2"
;;
seclists)
git clone https://github.com/danielmiessler/SecLists.git "${DESTDIR}"
;;
werdlists)
git clone --depth 1 https://github.com/decal/werdlists.git "${DESTDIR}"
;; ;;
gcloud) gcloud)
mkdir -p ${DESTDIR} makedest_or_die
gtemp=`mktemp -d`
gbase="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/" gbase="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/"
# TODO: find a way to make this version independent gsdk=$(curl -s https://cloud.google.com/sdk/docs/install-sdk | grep -o "google-cloud-sdk-[0-9.]*-linux-x86_64.tar.gz" | head -n 1)
gsdk="google-cloud-sdk-209.0.0-linux-x86_64.tar.gz" download "${gbase}${gsdk}" "${TMPDIR}/gcloud.tar.gz"
download "${gbase}${gsdk}" /tmp/gcloud.tar.gz tar zxf "${TMPDIR}/gcloud.tar.gz" --strip-components=1 -C "${DESTDIR}"
tar zxf /tmp/gcloud.tar.gz --strip-components=1 -C ${DESTDIR}
rm /tmp/gcloud.tar.gz
add_bin_symlink bin/gcloud add_bin_symlink bin/gcloud
;; ;;
android-sdk) android-sdk)
# TODO: find a way to make this version independent asdk=$(curl -s https://developer.android.com/studio/releases/platform-tools | grep -o "https://dl.google.com/android/repository/platform-tools_r[0-9.]*-linux.zip" | head -n 1)
asdk="https://dl.google.com/android/repository/tools_r25.2.3-linux.zip" download "${asdk}" "${TMPDIR}/android-tools.zip"
download ${asdk} /tmp/android-tools.zip unzip -d "${DESTDIR}" "${TMPDIR}/android-tools.zip"
unzip -d ${DESTDIR} /tmp/android-tools.zip
rm /tmp/android-tools.zip
# Install components # Install components
${DESTDIR}/tools/bin/sdkmanager "emulator" "platform-tools" "${DESTDIR}/tools/bin/sdkmanager" "emulator" "platform-tools"
;; ;;
burp) burp)
# Install latest burp free # Install latest burp free
mkdir -p ${DESTDIR} makedest
download \ if ! download \
https://portswigger.net/DownloadUpdate.ashx\?Product\=Free \ https://portswigger.net/DownloadUpdate.ashx\?Product=Free \
${DESTDIR}/burp-free.jar "${DESTDIR}/burp-free.jar" ; then
if [ $? -ne 0 ] ; then
echo "Download failed." >&2 echo "Download failed." >&2
exit 1 exit 1
fi fi
if [ -x /usr/bin/jarwrapper ] ; then if [ -x /usr/bin/jarwrapper ] ; then
# We have binfmt support for jar, so add to bin # We have binfmt support for jar, so add to bin
chmod +x ${DESTDIR}/*.jar chmod +x "${DESTDIR}"/*.jar
ln -sf ${DESTDIR}/*.jar ${HOME}/bin/burp ln -sf "${DESTDIR}"/*.jar "${HOME}/bin/burp"
fi fi
;; ;;
mitmproxy) mitmproxy)
ver=$(python -c 'import urllib2; import json; print(json.load(urllib2.urlopen("https://api.github.com/repos/mitmproxy/mitmproxy/releases/latest"))["name"].replace("v",""))') makedest_or_die
download https://snapshots.mitmproxy.org/${ver}/mitmproxy-${ver}-linux.tar.gz /tmp/mitmproxy.tar.gz download \
mkdir -p ${DESTDIR} "$(get_latest_github_release_url "mitmproxy/mitmproxy" ".*-linux\\.tar\\.gz")" \
tar zx -C ${DESTDIR} -f /tmp/mitmproxy.tar.gz "${TMPDIR}/mitmproxy.tar.gz"
rm /tmp/mitmproxy.tar.gz tar zx -C "${DESTDIR}" -f "${TMPDIR}/mitmproxy.tar.gz"
add_bin_symlink mitmproxy add_bin_symlink mitmproxy
add_bin_symlink mitmweb add_bin_symlink mitmweb
add_bin_symlink mitmdump
;; ;;
esp) esp)
makedest_or_die
src="https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz" src="https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz"
download ${src} /tmp/esp32.tar.gz download "${src}" "${TMPDIR}/esp32.tar.gz"
mkdir -p ${DESTDIR} tar zx -C "${DESTDIR}" -f "${TMPDIR}/esp32.tar.gz"
tar zx -C ${DESTDIR} -f /tmp/esp32.tar.gz git clone --recursive https://github.com/espressif/esp-idf.git "${DESTDIR}/esp-idf"
rm /tmp/esp32.tar.gz
git clone --recursive https://github.com/espressif/esp-idf.git ${DESTDIR}/esp-idf
;; ;;
dex2jar) dex2jar)
src="https://github.com/pxb1988/dex2jar/releases/download/2.0/dex-tools-2.0.zip" makedest_or_die
download ${src} /tmp/dex2jar.zip src="https://github.com/pxb1988/dex2jar/releases/download/v2.4/dex-tools-v2.4.zip"
tmpd=`mktemp -d` download "${src}" "${TMPDIR}/dex2jar.zip"
unzip -d ${tmpd} /tmp/dex2jar.zip tmpd="${TMPDIR}/dex2jar"
mv ${tmpd}/* ${DESTDIR} mkdir -p "${tmpd}"
rm /tmp/dex2jar.zip unzip -d "${tmpd}" "${TMPDIR}/dex2jar.zip"
rm -rf ${tmpd} mv "${tmpd}"/dex-tools-*/* "${DESTDIR}"
rm ${DESTDIR}/*.bat rm "${DESTDIR}"/*.bat
chmod +x ${DESTDIR}/*.sh chmod +x "${DESTDIR}"/*.sh
;; ;;
proxmark3) proxmark3)
deb_only
install_pkgs p7zip git build-essential libreadline5 libreadline-dev \ install_pkgs p7zip git build-essential libreadline5 libreadline-dev \
libusb-0.1-4 libusb-dev libqt4-dev perl pkg-config wget libncurses5-dev \ libusb-0.1-4 libusb-dev libqt4-dev perl pkg-config wget libncurses5-dev \
gcc-arm-none-eabi libstdc++-arm-none-eabi-newlib gcc-arm-none-eabi libstdc++-arm-none-eabi-newlib
src="https://github.com/Proxmark/proxmark3.git" src="https://github.com/Proxmark/proxmark3.git"
git clone ${src} ${DESTDIR} git clone "${src}" "${DESTDIR}"
cd ${DESTDIR} cd "${DESTDIR}" || exit
make -sj2 make -sj2
check_sudo && sudo /bin/sh -c \ check_sudo && sudo /bin/sh -c \
"cp -rf driver/78-mm-usb-device-blacklist.rules \ "cp -rf driver/78-mm-usb-device-blacklist.rules \
/etc/udev/rules.d/77-mm-usb-device-blacklist.rules && /etc/udev/rules.d/77-mm-usb-device-blacklist.rules &&\
udevadm control --reload-rules" udevadm control --reload-rules"
;; ;;
pm3iceman)
deb_only
# arch:
# sudo pacman -Syu git base-devel readline bzip2 lz4 arm-none-eabi-gcc arm-none-eabi-newlib qt5-base bluez python gd --needed
install_pkgs git ca-certificates build-essential pkg-config \
libreadline-dev gcc-arm-none-eabi libnewlib-dev qtbase5-dev \
libbz2-dev libbluetooth-dev libpython3-dev libssl-dev
src="https://github.com/RfidResearchGroup/proxmark3.git"
git clone "${src}" "${DESTDIR}"
cd "${DESTDIR}" || exit
make clean && make -sj2
check_sudo && sudo /bin/sh -c \
"cp -rf ./driver/77-pm3-usb-device-blacklist.rules \
/etc/udev/rules.d/77-pm3-usb-device-blacklist.rules &&\
udevadm control --reload-rules"
add_bin_symlink pm3
;;
cyberchef) cyberchef)
mkdir -p ${DESTDIR} makedest
src=$(python -c 'import urllib2; import json; print(filter(lambda x: x["name"]=="cyberchef.htm", json.load(urllib2.urlopen("https://api.github.com/repos/gchq/CyberChef/releases/latest"))["assets"])[0]["browser_download_url"])') cd "${DESTDIR}" || exit
download ${src} ${DESTDIR}/cyberchef.html download \
"$(get_latest_github_release_url "gchq/CyberChef" ".*\\.zip")" \
"${DESTDIR}/cyberchef.zip"
unzip -d "${DESTDIR}" "${DESTDIR}/cyberchef.zip"
ln -sf CyberChef*.html "${DESTDIR}/cyberchef.html"
;; ;;
apktool) apktool)
mkdir -p ${DESTDIR} makedest_or_die
download \ download \
https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool \ https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool \
${DESTDIR}/apktool "${DESTDIR}/apktool"
jar_url=$(curl -s https://bitbucket.org/iBotPeaches/apktool/downloads/ | grep -o "/iBotPeaches/apktool/downloads/apktool_[0-9.]*.jar" | head -n 1)
download \ download \
https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.3.3.jar \ "https://bitbucket.org${jar_url}" \
${DESTDIR}/apktool.jar "${DESTDIR}/apktool.jar"
chmod +x ${DESTDIR}/apktool chmod +x "${DESTDIR}/apktool"
add_bin_symlink apktool add_bin_symlink apktool
;; ;;
ptf)
makedest_or_die
src="https://github.com/trustedsec/ptf.git"
git clone "${src}" "${DESTDIR}"
;;
pwndbg)
if ! command -v gdb > /dev/null 2>&1 ; then
echo 'No gdb available!' >/dev/stderr
exit 1
fi
git clone --depth 1 -b stable https://github.com/pwndbg/pwndbg.git "${DESTDIR}"
PY_PACKAGES=${DESTDIR}/vendor
mkdir -p "${PY_PACKAGES}"
PYVER=$(gdb -batch -q --nx -ex 'pi import platform; print(".".join(platform.python_version_tuple()[:2]))')
PYTHON=$(gdb -batch -q --nx -ex 'pi import sys; print(sys.executable)')
PYTHON="${PYTHON}${PYVER}"
"${PYTHON}" -m pip install --target "${PY_PACKAGES}" -Ur "${DESTDIR}/requirements.txt"
"${PYTHON}" -m pip install --target "${PY_PACKAGES}" -U capstone unicorn
# capstone package is broken, find and copy the library manually
capstone_so_path=$(find "${PY_PACKAGES}/usr/lib" -name "libcapstone.so" -type f)
if [ -z "${capstone_so_path}" ]; then
die "Could not find libcapstone.so for pwndbg."
elif [ "$(echo "${capstone_so_path}" | wc -l)" -ne 1 ]; then
die "Found multiple libcapstone.so files for pwndbg, aborting."
fi
cp "${capstone_so_path}" "${PY_PACKAGES}/capstone/"
;;
gef)
makedest_or_die
if ! command -v gdb > /dev/null 2>&1 ; then
echo 'No gdb available!' >/dev/stderr
exit 1
fi
download \
https://github.com/hugsy/gef/raw/master/gef.py \
"${DESTDIR}/gef.py"
;;
aflplusplus)
deb_only
install_pkgs libtool-bin libglib2.0-dev libpixman-1-dev clang clang-tools \
llvm python3-setuptools
git clone "https://github.com/vanhauser-thc/AFLplusplus" "${DESTDIR}"
make -C "${DESTDIR}" distrib
;;
exploitdb)
if test -d "${DESTDIR}" ; then
echo "Already installed, updating instead..." >/dev/stderr
"${DESTDIR}/searchsploit" -u
else
git clone --depth 1 \
https://github.com/offensive-security/exploitdb.git \
"${DESTDIR}"
add_bin_symlink searchsploit
cp "${DESTDIR}/.searchsploit_rc" "${HOME}/.searchsploit_rc"
sed -i "s|/opt/exploitdb|${DESTDIR}|" "${HOME}/.searchsploit_rc"
fi
;;
cura)
makedest
download \
"$(get_latest_github_release_url "Ultimaker/Cura" ".*\\.AppImage")" \
"${DESTDIR}/Cura.AppImage"
chmod +x "${DESTDIR}/Cura.AppImage"
add_bin_symlink "Cura.AppImage" cura
;;
rr)
deb_only
check_sudo
download \
"$(get_latest_github_release_url "mozilla/rr" ".*-Linux-.*\\.deb")" \
"${TMPDIR}/rr.deb"
sudo dpkg -i "${TMPDIR}/rr.deb"
;;
nmap-parse-output)
git clone --depth 1 \
https://github.com/ernw/nmap-parse-output.git \
"${DESTDIR}"
add_bin_symlink nmap-parse-output
cat <<EOF >"${HOME}/.zshrc.d/99-nmap-parse-output.zsh"
if test -d ${DESTDIR} ; then
autoload bashcompinit
bashcompinit
source ${DESTDIR}/_nmap-parse-output
fi
EOF
;;
logiops)
deb_only
install_pkgs cmake libevdev-dev libudev-dev libconfig++-dev checkinstall
git clone "https://github.com/PixlOne/logiops.git" "${DESTDIR}"
mkdir -p "${DESTDIR}/build"
cd "${DESTDIR}/build" || exit
cmake ..
make
check_sudo
sudo checkinstall --pkgname logiops --maintainer "${USER}" -y
;;
aws)
DN="${TMPDIR}/aws"
mkdir -p "${DN}"
cd "${DN}" || exit
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "${DN}/awscliv2.zip"
unzip "${DN}/awscliv2.zip"
mv "${DN}/aws/dist" "${DESTDIR}"
add_bin_symlink aws
;;
tmpmail)
install_pkgs curl w3m jq
mkdir -p "${DESTDIR}"
download "https://git.io/tmpmail" "${DESTDIR}/tmpmail"
chmod +x "${DESTDIR}/tmpmail"
add_bin_symlink tmpmail
;;
gf)
install_pkgs golang-go silversearcher-ag
go install github.com/tomnomnom/gf@latest
mkdir -p "${HOME}/.config"
if test -d "${HOME}/.config/gf" ; then
git -C "${HOME}/.config/gf" pull
else
git clone https://github.com/Matir/gf-patterns.git "${HOME}/.config/gf"
fi
;;
gron)
go install github.com/tomnomnom/gron@latest
;;
httprobe)
go install github.com/tomnomnom/httprobe@latest
;;
ffuf)
go install github.com/ffuf/ffuf@latest
;;
gobuster)
go install github.com/OJ/gobuster@latest
;;
amass)
go install github.com/OWASP/Amass/v3/...
;;
cht.sh)
install_pkgs rlwrap
mkdir -p "${DESTDIR}"
download "https://cht.sh/:cht.sh" "${DESTDIR}/cht.sh"
chmod +x "${DESTDIR}/cht.sh"
add_bin_symlink cht.sh
;;
age)
go install filippo.io/age/cmd/age@latest
go install filippo.io/age/cmd/age-keygen@latest
;;
docker-compose)
mkdir -p "${DESTDIR}"
latest_version=$(curl -s "https://api.github.com/repos/docker/compose/releases/latest" | jq -r '.tag_name')
curl -L \
"https://github.com/docker/compose/releases/download/${latest_version}/docker-compose-$(uname -s)-$(uname -m)" \
-o "${DESTDIR}/docker-compose"
chmod +x "${DESTDIR}/docker-compose"
add_bin_symlink docker-compose
;;
tldr)
require_pipx
pipx install tldr
;;
blint)
require_pipx
pipx install blint
;;
dust)
if ! command -v cargo >/dev/null 2>&1 ; then
echo "This needs cargo (for rust)!" >/dev/stderr
exit 1
fi
cargo install du-dust
;;
bottom)
if ! command -v cargo >/dev/null 2>&1 ; then
echo "This needs cargo (for rust)!" >/dev/stderr
exit 1
fi
cargo install bottom
;;
delta)
deb_only
if ! check_sudo ; then
echo "Must be able to run as sudo."
exit 1
fi
dpkg_url=$(get_latest_github_release_url "dandavison/delta" ".*_amd64.deb")
dpkg_name="${TMPDIR}/delta_amd64.deb"
download "${dpkg_url}" "${dpkg_name}"
sudo dpkg -i "${dpkg_name}"
;;
ropper)
deb_only
install_pkgs python3-z3
pip3 install --user pyvex ropper
;;
kubeconform)
go install github.com/yannh/kubeconform/cmd/kubeconform@latest
;;
kubectx)
git clone https://github.com/ahmetb/kubectx.git "${DESTDIR}"
add_bin_symlink kubectx
add_bin_symlink kubens
COMPDIR="${HOME}/.zshrc.completions"
mkdir -p "${COMPDIR}"
ln -sf "${DESTDIR}/completion/_kubectx.zsh" "${COMPDIR}"
ln -sf "${DESTDIR}/completion/_kubens.zsh" "${COMPDIR}"
;;
starship)
mkdir -p "${DESTDIR}"
download \
"https://github.com/starship/starship/releases/latest/download/starship-$(uname -m)-unknown-linux-musl.tar.gz" \
"${TMPDIR}/starship.tar.gz"
tar -C "${DESTDIR}" -zxf "${TMPDIR}/starship.tar.gz" starship
add_bin_symlink starship
;;
arduino-cli)
mkdir -p "${DESTDIR}"
download \
"https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_64bit.tar.gz" \
"${TMPDIR}/arduino-cli.tar.gz"
tar -C "${DESTDIR}" -zxf "${TMPDIR}/arduino-cli.tar.gz" arduino-cli
add_bin_symlink arduino-cli
;;
ghidra)
zip_url=$(get_latest_github_release_url "NationalSecurityAgency/ghidra" ".*\\.zip")
download "${zip_url}" "${TMPDIR}/ghidra.zip"
unzip -d "${DESTDIR}" "${TMPDIR}/ghidra.zip"
mv "${DESTDIR}"/*/* "${DESTDIR}"
add_bin_symlink ghidraRun ghidra
;;
doctl)
# TODO: other architectures
tar_url=$(get_latest_github_release_url "digitalocean/doctl" ".*linux-amd64\\.tar\\.gz")
download "${tar_url}" "${TMPDIR}/doctl.tar.gz"
mkdir -p "${DESTDIR}"
tar -C "${DESTDIR}" -zxf "${TMPDIR}/doctl.tar.gz" "doctl"
add_bin_symlink doctl
;;
rustup)
rustup_init="${TMPDIR}/rustup-init.sh"
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o "${rustup_init}"
sh "${rustup_init}" --no-modify-path -y
;;
igrep)
if ! command -v cargo >/dev/null 2>&1 ; then
echo "This needs cargo (for rust)!" >/dev/stderr
exit 1
fi
cargo install igrep
;;
unblob)
require_pipx
pipx install unblob
;;
fq)
go install github.com/wader/fq@latest
;;
mise)
if command -v brew >/dev/null 2>&1; then
brew install mise
else
curl -sSL https://mise.jdx.dev/gpg-key.pub | gpg --import
INSTALL_FILE_AND_SIG="${TMPDIR}/install.sh.sig"
download "https://mise.jdx.dev/install.sh.sig" "${INSTALL_FILE_AND_SIG}"
DECRYPTED_SCRIPT="${TMPDIR}/mise_install.sh"
if gpg --assert-signer 24853EC9F655CE80B48E6C3A8B81C9D17413A06D --decrypt -o "${DECRYPTED_SCRIPT}" "${INSTALL_FILE_AND_SIG}" >/dev/null 2>&1; then
sh "${DECRYPTED_SCRIPT}"
else
die "gpg verification or decryption failed for mise installer"
fi
fi
;;
*) *)
echo "Unknown tool: ${TOOL}" >/dev/stderr echo "Unknown tool: ${TOOL}" >/dev/stderr
list_tools
exit 1 exit 1
;; ;;
esac esac

546
bin/macos/chromebundles.py Executable file
View File

@@ -0,0 +1,546 @@
#!/usr/bin/env python3
import argparse
import plistlib
import shutil
import stat
import subprocess
import sys
import tempfile
from pathlib import Path
from PIL import Image, ImageEnhance
DEFAULT_CHROME_APP = Path("/Applications/Google Chrome.app")
DEFAULT_APPS_DIR = Path.home() / "Applications" / "Chrome Containers"
# Edit this list for your containers.
CONTAINERS = [
# {
# "name": "Chrome Work",
# "bundle_id": "com.example.chrome.work",
# "mode": "persistent",
# "profile_dir": str(Path.home() / ".chrome-work"),
# "badge_path": str(Path.home() / ".chrome-container-badges" / "briefcase.svg"),
# },
{
"name": "Chrome Family",
"bundle_id": "com.example.chrome.family",
"mode": "persistent",
"profile_dir": str(Path.home() / ".chrome-family"),
"badge_path": str(Path.home() / ".chrome-container-badges" / "family.svg"),
},
{
"name": "Chrome Research",
"bundle_id": "com.example.chrome.research",
"mode": "persistent",
"profile_dir": str(Path.home() / ".chrome-research"),
"badge_path": str(Path.home() / ".chrome-container-badges" / "research.svg"),
},
{
"name": "Chrome Ephemeral",
"bundle_id": "com.example.chrome.ephemeral",
"mode": "ephemeral",
"profile_dir": None,
"badge_path": str(Path.home() / ".chrome-container-badges" / "fire.svg"),
},
]
DEFAULT_COLOR_FACTOR = 0.55
DEFAULT_BRIGHTNESS_FACTOR = 0.94
DEFAULT_CONTRAST_FACTOR = 0.97
DEFAULT_BADGE_FRACTION = 0.50
DEFAULT_PADDING_FRACTION = 0.03
DEFAULT_BADGE_OPACITY = 0.96
def run(cmd, check=True, capture_output=False, text=True):
return subprocess.run(cmd, check=check, capture_output=capture_output, text=text)
def require_tool(name: str):
if shutil.which(name) is None:
print(f"Missing required tool: {name}", file=sys.stderr)
sys.exit(1)
def parse_icon_size(path: Path):
name = path.name
if not name.endswith(".png") or not name.startswith("icon_"):
return (0, 0)
stem = name[:-4]
rest = stem[len("icon_"):]
scale = 1
if rest.endswith("@2x"):
rest = rest[:-3]
scale = 2
try:
left, right = rest.split("x", 1)
return (int(left) * scale, int(right) * scale)
except Exception:
return (0, 0)
def find_source_icns(app_path: Path) -> Path:
info_plist = app_path / "Contents" / "Info.plist"
resources_dir = app_path / "Contents" / "Resources"
if not info_plist.exists():
raise FileNotFoundError(f"Missing Info.plist: {info_plist}")
if not resources_dir.exists():
raise FileNotFoundError(f"Missing Resources directory: {resources_dir}")
with info_plist.open("rb") as f:
plist = plistlib.load(f)
icon_name = plist.get("CFBundleIconFile")
if icon_name:
if not icon_name.endswith(".icns"):
icon_name += ".icns"
candidate = resources_dir / icon_name
if candidate.exists():
return candidate
chrome_named = sorted(resources_dir.glob("*[Cc]hrome*.icns"))
if chrome_named:
return chrome_named[0]
any_icns = sorted(resources_dir.glob("*.icns"))
if any_icns:
return any_icns[0]
raise FileNotFoundError(f"No .icns file found in {resources_dir}")
def extract_iconset(icns_path: Path, out_iconset: Path):
run(["iconutil", "-c", "iconset", str(icns_path), "-o", str(out_iconset)])
def largest_png(iconset_dir: Path) -> Path:
pngs = list(iconset_dir.glob("*.png"))
if not pngs:
raise FileNotFoundError(f"No PNGs found in {iconset_dir}")
pngs.sort(key=lambda p: parse_icon_size(p)[0] * parse_icon_size(p)[1], reverse=True)
return pngs[0]
def rasterize_svg(svg_path: Path, out_png: Path, size: int = 1024):
# Prefer librsvg if installed.
if shutil.which("rsvg-convert"):
run([
"rsvg-convert",
"-w", str(size),
"-h", str(size),
"-o", str(out_png),
str(svg_path),
])
return
# Fallback to Inkscape CLI if available.
if shutil.which("inkscape"):
run([
"inkscape",
str(svg_path),
"--export-type=png",
f"--export-filename={out_png}",
"-w", str(size),
"-h", str(size),
])
return
raise RuntimeError(
f"SVG badge provided but no SVG rasterizer found for {svg_path}. "
"Install librsvg (rsvg-convert) or Inkscape."
)
def load_badge_image(badge_path: Path, temp_dir: Path) -> Image.Image | None:
if not badge_path.exists():
print(f"Warning: badge file not found, skipping overlay: {badge_path}")
return None
suffix = badge_path.suffix.lower()
if suffix == ".png":
return Image.open(badge_path).convert("RGBA")
if suffix == ".svg":
rasterized = temp_dir / f"{badge_path.stem}.png"
rasterize_svg(badge_path, rasterized, size=1024)
return Image.open(rasterized).convert("RGBA")
raise RuntimeError(
f"Unsupported badge format for {badge_path}. "
"Supported formats: .png, .svg"
)
def compose_icon(
base_png: Path,
badge_path: str | None,
out_master: Path,
color_factor: float,
brightness_factor: float,
contrast_factor: float,
badge_fraction: float,
padding_fraction: float,
badge_opacity: float,
temp_dir: Path,
):
base = Image.open(base_png).convert("RGBA")
muted = ImageEnhance.Color(base).enhance(color_factor)
muted = ImageEnhance.Brightness(muted).enhance(brightness_factor)
muted = ImageEnhance.Contrast(muted).enhance(contrast_factor)
result = muted.copy()
if badge_path:
badge = load_badge_image(Path(badge_path).expanduser(), temp_dir)
if badge is not None:
w, h = result.size
max_badge_w = int(w * badge_fraction)
max_badge_h = int(h * badge_fraction)
pad = max(4, int(w * padding_fraction))
bw, bh = badge.size
scale = min(max_badge_w / bw, max_badge_h / bh)
new_size = (max(1, int(bw * scale)), max(1, int(bh * scale)))
badge = badge.resize(new_size, Image.LANCZOS)
if badge_opacity < 1.0:
alpha = badge.getchannel("A")
alpha = ImageEnhance.Brightness(alpha).enhance(badge_opacity)
badge.putalpha(alpha)
x = w - badge.width - pad
y = h - badge.height - pad
result.alpha_composite(badge, (x, y))
result.save(out_master)
def build_iconset_from_master(master_png: Path, out_iconset: Path):
out_iconset.mkdir(parents=True, exist_ok=True)
img = Image.open(master_png).convert("RGBA")
sizes = [
("icon_16x16.png", 16),
("icon_16x16@2x.png", 32),
("icon_32x32.png", 32),
("icon_32x32@2x.png", 64),
("icon_128x128.png", 128),
("icon_128x128@2x.png", 256),
("icon_256x256.png", 256),
("icon_256x256@2x.png", 512),
("icon_512x512.png", 512),
("icon_512x512@2x.png", 1024),
]
for filename, size in sizes:
resized = img.resize((size, size), Image.LANCZOS)
resized.save(out_iconset / filename)
def iconset_to_icns(iconset_dir: Path, out_icns: Path):
run(["iconutil", "-c", "icns", str(iconset_dir), "-o", str(out_icns)])
def make_launch_script(chrome_bin: Path, mode: str, profile_dir: str | None) -> str:
chrome_bin_escaped = str(chrome_bin).replace("\\", "\\\\").replace('"', '\\"')
if mode == "persistent":
if not profile_dir:
raise ValueError("Persistent container requires profile_dir")
profile_dir_escaped = profile_dir.replace("\\", "\\\\").replace('"', '\\"')
return f"""#!/bin/bash
set -euo pipefail
CHROME_BIN="{chrome_bin_escaped}"
PROFILE_DIR="{profile_dir_escaped}"
mkdir -p "$PROFILE_DIR"
exec "$CHROME_BIN" \\
--user-data-dir="$PROFILE_DIR" \\
--no-first-run \\
--no-default-browser-check \\
--new-window
"""
elif mode == "ephemeral":
return f"""#!/bin/bash
set -euo pipefail
CHROME_BIN="{chrome_bin_escaped}"
PROFILE_DIR="$(mktemp -d /tmp/chrome-ephemeral-XXXXXX)"
cleanup() {{
rm -rf "$PROFILE_DIR"
}}
trap cleanup EXIT INT TERM
exec "$CHROME_BIN" \\
--user-data-dir="$PROFILE_DIR" \\
--no-first-run \\
--no-default-browser-check \\
--new-window
"""
else:
raise ValueError(f"Unknown mode: {mode}")
def write_plist(app_name: str, bundle_id: str, plist_path: Path):
plist = {
"CFBundleDisplayName": app_name,
"CFBundleExecutable": "launch",
"CFBundleIdentifier": bundle_id,
"CFBundleName": app_name,
"CFBundlePackageType": "APPL",
"CFBundleShortVersionString": "1.0",
"CFBundleVersion": "1",
"LSMinimumSystemVersion": "12.0",
"NSHighResolutionCapable": True,
"CFBundleIconFile": "applet",
}
with plist_path.open("wb") as f:
plistlib.dump(plist, f)
def codesign_app(app_dir: Path):
try:
run(["/usr/bin/codesign", "--force", "--deep", "--sign", "-", str(app_dir)])
except subprocess.CalledProcessError as e:
print(f"Warning: codesign failed for {app_dir}: {e}")
def sanitize_container(container: dict) -> dict:
required = ["name", "bundle_id", "mode"]
for key in required:
if key not in container or not container[key]:
raise ValueError(f"Container missing required key: {key}")
mode = container["mode"]
if mode not in {"persistent", "ephemeral"}:
raise ValueError(f"Invalid mode for {container['name']}: {mode}")
if mode == "persistent" and not container.get("profile_dir"):
raise ValueError(f"Persistent container missing profile_dir: {container['name']}")
return container
def container_matches_filter(name: str, only_names: set[str]) -> bool:
if not only_names:
return True
return name in only_names
def build_icon_for_app(
source_icns: Path,
badge_path: str | None,
out_icns: Path,
color_factor: float,
brightness_factor: float,
contrast_factor: float,
badge_fraction: float,
padding_fraction: float,
badge_opacity: float,
):
with tempfile.TemporaryDirectory() as tmp:
tmpdir = Path(tmp)
base_iconset = tmpdir / "base.iconset"
new_iconset = tmpdir / "new.iconset"
master_png = tmpdir / "master.png"
extract_iconset(source_icns, base_iconset)
base_png = largest_png(base_iconset)
size = parse_icon_size(base_png)
print(f" Base icon source: {base_png.name} ({size[0]}x{size[1]})")
compose_icon(
base_png=base_png,
badge_path=badge_path,
out_master=master_png,
color_factor=color_factor,
brightness_factor=brightness_factor,
contrast_factor=contrast_factor,
badge_fraction=badge_fraction,
padding_fraction=padding_fraction,
badge_opacity=badge_opacity,
temp_dir=tmpdir,
)
build_iconset_from_master(master_png, new_iconset)
iconset_to_icns(new_iconset, out_icns)
def create_or_update_container(
container: dict,
apps_dir: Path,
chrome_bin: Path,
source_icns: Path,
force: bool,
update_icons_only: bool,
codesign: bool,
color_factor: float,
brightness_factor: float,
contrast_factor: float,
badge_fraction: float,
padding_fraction: float,
badge_opacity: float,
):
app_name = container["name"]
bundle_id = container["bundle_id"]
mode = container["mode"]
profile_dir = container.get("profile_dir")
badge_path = container.get("badge_path")
app_dir = apps_dir / f"{app_name}.app"
contents_dir = app_dir / "Contents"
macos_dir = contents_dir / "MacOS"
resources_dir = contents_dir / "Resources"
out_icns = resources_dir / "applet.icns"
exists = app_dir.exists()
if update_icons_only:
if not exists:
print(f"Skipping missing app for icon update: {app_dir}")
return
print(f"Updating icon only for {app_name}...")
resources_dir.mkdir(parents=True, exist_ok=True)
build_icon_for_app(
source_icns,
badge_path,
out_icns,
color_factor,
brightness_factor,
contrast_factor,
badge_fraction,
padding_fraction,
badge_opacity,
)
if codesign:
codesign_app(app_dir)
print(f" Updated icon: {out_icns}")
return
if exists and not force:
print(f"Skipping existing app: {app_dir}")
return
if exists and force:
print(f"Recreating existing app: {app_dir}")
shutil.rmtree(app_dir)
else:
print(f"Creating {app_name}...")
macos_dir.mkdir(parents=True, exist_ok=True)
resources_dir.mkdir(parents=True, exist_ok=True)
write_plist(app_name, bundle_id, contents_dir / "Info.plist")
launch_script = make_launch_script(chrome_bin, mode, profile_dir)
launch_path = macos_dir / "launch"
launch_path.write_text(launch_script, encoding="utf-8")
launch_path.chmod(launch_path.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
if mode == "persistent":
Path(profile_dir).expanduser().mkdir(parents=True, exist_ok=True)
build_icon_for_app(
source_icns,
badge_path,
out_icns,
color_factor,
brightness_factor,
contrast_factor,
badge_fraction,
padding_fraction,
badge_opacity,
)
if codesign:
codesign_app(app_dir)
print(f" Created: {app_dir}")
def main():
parser = argparse.ArgumentParser(description="Create and manage Chrome container wrapper apps on macOS.")
parser.add_argument("--chrome-app", default=str(DEFAULT_CHROME_APP), help="Path to Chrome app bundle")
parser.add_argument("--apps-dir", default=str(DEFAULT_APPS_DIR), help="Directory for generated wrapper apps")
parser.add_argument("--force", action="store_true", help="Recreate containers even if they already exist")
parser.add_argument("--update-icons-only", action="store_true", help="Only rebuild icons for existing containers")
parser.add_argument("--no-codesign", action="store_true", help="Skip ad-hoc codesigning")
parser.add_argument(
"--only",
action="append",
default=[],
help="Limit to specific container name; can be passed multiple times",
)
parser.add_argument("--color-factor", type=float, default=DEFAULT_COLOR_FACTOR)
parser.add_argument("--brightness-factor", type=float, default=DEFAULT_BRIGHTNESS_FACTOR)
parser.add_argument("--contrast-factor", type=float, default=DEFAULT_CONTRAST_FACTOR)
parser.add_argument("--badge-fraction", type=float, default=DEFAULT_BADGE_FRACTION)
parser.add_argument("--padding-fraction", type=float, default=DEFAULT_PADDING_FRACTION)
parser.add_argument("--badge-opacity", type=float, default=DEFAULT_BADGE_OPACITY)
args = parser.parse_args()
require_tool("iconutil")
chrome_app = Path(args.chrome_app).expanduser().resolve()
apps_dir = Path(args.apps_dir).expanduser().resolve()
chrome_bin = chrome_app / "Contents" / "MacOS" / "Google Chrome"
if not chrome_bin.exists():
print(f"Chrome binary not found: {chrome_bin}", file=sys.stderr)
sys.exit(1)
try:
import PIL # noqa: F401
except ImportError:
print("Pillow is required. Install it with:", file=sys.stderr)
print(" python3 -m pip install --user pillow", file=sys.stderr)
sys.exit(1)
source_icns = find_source_icns(chrome_app)
apps_dir.mkdir(parents=True, exist_ok=True)
only_names = set(args.only)
print(f"Using Python: {sys.executable}")
print(f"Using Chrome app: {chrome_app}")
print(f"Using source icon: {source_icns}")
print(f"Apps directory: {apps_dir}")
print()
for raw_container in CONTAINERS:
container = sanitize_container(raw_container)
if not container_matches_filter(container["name"], only_names):
continue
create_or_update_container(
container=container,
apps_dir=apps_dir,
chrome_bin=chrome_bin,
source_icns=source_icns,
force=args.force,
update_icons_only=args.update_icons_only,
codesign=not args.no_codesign,
color_factor=args.color_factor,
brightness_factor=args.brightness_factor,
contrast_factor=args.contrast_factor,
badge_fraction=args.badge_fraction,
padding_fraction=args.padding_fraction,
badge_opacity=args.badge_opacity,
)
print()
print("Done.")
if __name__ == "__main__":
main()

298
bin/macos/update_brewfile Executable file
View File

@@ -0,0 +1,298 @@
#!/usr/bin/env python3
import os
import subprocess
import re
import sys
import argparse
import difflib
import tempfile
# Regex to match brew/cask/tap/mas lines
PKG_RE = re.compile(r'^\s*(brew|cask|tap|mas)\s+["\']([^"\']+)["\'](.*)$')
def colorize_diff(lines):
for line in lines:
if line.startswith('+') and not line.startswith('+++'):
yield f"\033[32m{line}\033[0m"
elif line.startswith('-') and not line.startswith('---'):
yield f"\033[31m{line}\033[0m"
elif line.startswith('^'):
yield f"\033[36m{line}\033[0m"
else:
yield line
class Entry:
def sort_key(self): raise NotImplementedError()
def to_lines(self): raise NotImplementedError()
class PackageEntry(Entry):
def __init__(self, pkg_type, name, options, comments=None):
self.pkg_type = pkg_type
self.name = name
self.options = options.strip()
self.comments = comments or []
def sort_key(self):
order = {'tap': 0, 'brew': 1, 'cask': 2, 'mas': 3}
return (order.get(self.pkg_type, 4), self.name)
def to_lines(self):
res = list(self.comments)
pkg_line = f'{self.pkg_type} "{self.name}"'
if self.options:
if not self.options.startswith(','):
pkg_line += ' '
pkg_line += self.options
res.append(pkg_line)
return res
class TextEntry(Entry):
def __init__(self, lines, is_header=True):
self.lines = lines
self.is_header = is_header
def sort_key(self):
# Header is -1, Trailing is 5 (after all package types 0-4)
return (-1 if self.is_header else 5, "")
def to_lines(self):
return self.lines
def get_repo_root():
script_dir = os.path.dirname(os.path.realpath(__file__))
try:
root = subprocess.check_output(['git', 'rev-parse', '--show-toplevel'],
cwd=script_dir,
stderr=subprocess.STDOUT).decode().strip()
return root
except subprocess.CalledProcessError:
# If not in a git repo, go up 2 levels from script_dir (bin/macos/)
return os.path.abspath(os.path.join(script_dir, '..', '..'))
def get_ignore_list(repo_root):
ignore = set()
paths = [
os.path.join(repo_root, '.Brewfile.ignore'),
os.path.expanduser('~/.Brewfile.ignore'),
os.path.expanduser('~/.config/homebrew/ignore')
]
for path in paths:
if os.path.exists(path):
with open(path) as f:
for line in f:
line = line.split('#')[0].strip()
if line:
ignore.add(line)
return ignore
def get_current_packages(args):
"""Runs brew bundle dump and returns lines."""
env = os.environ.copy()
env["HOMEBREW_NO_AUTO_UPDATE"] = "1"
env["HOMEBREW_NO_INSTALL_CLEANUP"] = "1"
env["HOMEBREW_NO_ENV_HINTS"] = "1"
cmd = ['brew', 'bundle', 'dump', '--file=-']
if args.no_mas: cmd.append('--no-mas')
if args.no_vscode: cmd.append('--no-vscode')
try:
output = subprocess.check_output(cmd, env=env, stderr=subprocess.DEVNULL).decode()
return output.splitlines()
except subprocess.CalledProcessError:
print("Error: 'brew bundle dump' failed. Is homebrew installed?", file=sys.stderr)
sys.exit(1)
def parse_brewfile(content):
"""
Parses Brewfile content.
Returns:
- entries: list of Entry objects
- conditional_pkgs: set of (type, name)
- footer: string (everything from first conditional onwards)
"""
lines = content.splitlines()
conditional_pkgs = set()
# Find the start of the first conditional block
first_conditional_idx = -1
in_conditional = 0
for i, line in enumerate(lines):
stripped = line.strip()
if stripped.startswith(('if ', 'unless ', 'case ', 'def ', 'begin ')) and not stripped.endswith('; end'):
if first_conditional_idx == -1:
# Look back for comments that might belong to this block
j = i - 1
while j >= 0 and (lines[j].strip().startswith('#') or not lines[j].strip()):
j -= 1
first_conditional_idx = j + 1
in_conditional += 1
if in_conditional > 0:
match = PKG_RE.match(line)
if match:
conditional_pkgs.add((match.group(1), match.group(2)))
if stripped == 'end' or stripped.endswith('; end'):
in_conditional -= 1
unconditional_lines = lines[:first_conditional_idx] if first_conditional_idx != -1 else lines
footer = "\n".join(lines[first_conditional_idx:]) if first_conditional_idx != -1 else ""
entries = []
comment_buffer = []
first_pkg_seen = False
for line in unconditional_lines:
match = PKG_RE.match(line)
if match:
if not first_pkg_seen:
if comment_buffer:
entries.append(TextEntry(comment_buffer, is_header=True))
comment_buffer = []
first_pkg_seen = True
entries.append(PackageEntry(match.group(1), match.group(2), match.group(3), comment_buffer))
comment_buffer = []
else:
comment_buffer.append(line)
if comment_buffer:
entries.append(TextEntry(comment_buffer, is_header=False))
return entries, conditional_pkgs, footer
def main(args):
if sys.platform != "darwin":
print(f"Warning: Running on {sys.platform}. Brewfile is primarily for macOS.", file=sys.stderr)
repo_root = get_repo_root()
brewfile_path = os.path.join(repo_root, 'Brewfile')
if not os.path.exists(brewfile_path):
print(f"Error: Brewfile not found at {brewfile_path}", file=sys.stderr)
sys.exit(1)
with open(brewfile_path) as f:
old_content = f.read()
old_entries, conditional_pkgs, footer = parse_brewfile(old_content)
ignore_list = get_ignore_list(repo_root)
old_pkg_map = {}
for e in old_entries:
if isinstance(e, PackageEntry):
key = (e.pkg_type, e.name)
if key not in old_pkg_map:
old_pkg_map[key] = e
dumped_lines = get_current_packages(args)
dumped_pkgs = []
for line in dumped_lines:
match = PKG_RE.match(line)
if match:
pkg_type, pkg_name, pkg_options = match.group(1), match.group(2), match.group(3)
if pkg_name in ignore_list or (pkg_type, pkg_name) in conditional_pkgs:
continue
dumped_pkgs.append(PackageEntry(pkg_type, pkg_name, pkg_options))
new_entries = []
for e in old_entries:
if isinstance(e, TextEntry) and e.is_header:
new_entries.append(e)
seen_in_new = set()
added_count = 0
removed_count = 0
merged_count = 0
if args.add_only:
for e in old_entries:
if isinstance(e, PackageEntry):
new_entries.append(e)
seen_in_new.add((e.pkg_type, e.name))
for d in dumped_pkgs:
if (d.pkg_type, d.name) not in seen_in_new:
new_entries.append(d)
seen_in_new.add((d.pkg_type, d.name))
added_count += 1
else:
for d in dumped_pkgs:
key = (d.pkg_type, d.name)
if key in seen_in_new: continue
if key in old_pkg_map:
merged = old_pkg_map[key]
if not merged.options:
merged.options = d.options
new_entries.append(merged)
merged_count += 1
else:
new_entries.append(d)
added_count += 1
seen_in_new.add(key)
# Check for removals
for key in old_pkg_map:
if key not in seen_in_new:
removed_count += 1
for e in old_entries:
if isinstance(e, TextEntry) and not e.is_header:
new_entries.append(e)
new_entries.sort(key=lambda x: x.sort_key())
output_lines = []
last_type = None
for e in new_entries:
if isinstance(e, PackageEntry):
if last_type and e.pkg_type != last_type:
output_lines.append("")
last_type = e.pkg_type
output_lines.extend(e.to_lines())
new_content = "\n".join(output_lines)
if footer:
if output_lines and output_lines[-1].strip():
new_content += "\n\n"
new_content += footer.strip() + "\n"
else:
new_content += "\n"
if new_content == old_content:
print("Brewfile is already up to date.")
else:
if args.dry_run:
print("Changes detected (dry run):")
diff = list(difflib.unified_diff(
old_content.splitlines(keepends=True),
new_content.splitlines(keepends=True),
fromfile='Brewfile (original)',
tofile='Brewfile (new)'
))
if sys.stdout.isatty():
sys.stdout.writelines(colorize_diff(diff))
else:
sys.stdout.writelines(diff)
else:
dir_name = os.path.dirname(brewfile_path)
with tempfile.NamedTemporaryFile('w', dir=dir_name, delete=False) as tf:
tf.write(new_content)
tempname = tf.name
os.replace(tempname, brewfile_path)
print("Brewfile updated.")
if args.verbose:
print(f"Summary: {added_count} added, {removed_count} removed, {merged_count} kept/merged.")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Update Brewfile while preserving conditionals.")
parser.add_argument("--dry-run", action="store_true", help="Show changes without applying them.")
parser.add_argument("--add-only", action="store_true", help="Only add missing entries, do not remove existing ones.")
parser.add_argument("--verbose", "-v", action="store_true", help="Print summary of changes.")
parser.add_argument("--no-mas", action="store_true", help="Do not include Mac App Store apps.")
parser.add_argument("--no-vscode", action="store_true", help="Do not include VSCode extensions.")
args = parser.parse_args()
main(args)

View File

@@ -1,33 +1,13 @@
#!/bin/sh #!/bin/sh
export NAME=$(basename "$0") export NAME=$(basename "$0")
export BASE="/opt/metasploit" # TODO: search this path export BASE="/opt/metasploit-framework" # TODO: search this path
unset GEM_PATH
# Autogen'd if [ -f "${BASE}/bin/${NAME}" ] ; then
if [ -f "${BASE}/scripts/setenv.sh" ] ; then exec "${BASE}/bin/${NAME}" "$@"
. ${BASE}/scripts/setenv.sh
fi fi
# Use Pro's bundled gems instead of the gemcache
export MSF_BUNDLE_GEMS=0
export BUNDLE_GEMFILE=${BASE}/apps/pro/Gemfile
# Set a flag so Gemfile can limit gems
export FRAMEWORK_FLAG=true
export MSF_DATABASE_CONFIG=${BASE}/apps/pro/ui/config/database.yml
export TERMINFO=${BASE}/common/share/terminfo/
# Check for ruby scripts such as msfconsole directly to avoid having to add
# msf3 to the path.
if [ -f "${BASE}/apps/pro/msf3/${NAME}" ]; then
exec ${BASE}/apps/pro/msf3/${NAME} "$@"
fi
if [ -f "${BASE}/apps/pro/msf3/tools/exploit/${NAME}.rb" ]; then
exec ${BASE}/apps/pro/msf3/tools/exploit/${NAME}.rb "$@"
fi
export BASE="/opt/metasploit-framework"
if [ -f "${BASE}/embedded/framework/tools/exploit/${NAME}.rb" ]; then if [ -f "${BASE}/embedded/framework/tools/exploit/${NAME}.rb" ]; then
exec ${BASE}/embedded/bin/ruby \ exec ${BASE}/embedded/bin/ruby \
"${BASE}/embedded/framework/tools/exploit/${NAME}.rb" "$@" "${BASE}/embedded/framework/tools/exploit/${NAME}.rb" "$@"

22
bin/nvidia_hold.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
function list_nvidia_installed {
dpkg-query -l '*nvidia*' | grep '^[hi]i' | awk '{print $2}'
}
function hold_or_unhold {
list_nvidia_installed | xargs apt-mark "${1:-hold}"
}
case "$1" in
hold|h)
hold_or_unhold hold
;;
unhold|u)
hold_or_unhold unhold
;;
*)
echo "$0 <hold|unhold>" >/dev/stderr
exit 1
;;
esac

46
bin/pactl_helper Executable file
View File

@@ -0,0 +1,46 @@
#!/bin/bash
function get_active_sink {
pactl list short sinks | grep RUNNING | awk '{print $2}'
}
function get_active_source {
pactl list short sources | grep RUNNING | awk '{print $2}'
}
function get_default_sink {
pactl info | grep '^Default Sink:' | awk '{print $NF}'
}
function get_default_source {
pactl info | grep '^Default Source:' | awk '{print $NF}'
}
function micmute {
MODE=${1:-toggle}
pactl set-source-mute $(get_default_source) ${MODE}
}
function mute {
MODE=${1:-toggle}
pactl set-sink-mute $(get_default_sink) ${MODE}
}
function volume {
VOL="${1}"
if test -z "${VOL}" ; then
echo "Need volume spec!"
exit 1
fi
pactl set-sink-volume $(get_default_sink) "${VOL}"
}
case "$1" in
mute|micmute|volume)
"$@"
;;
*)
echo "Unknown command!"
exit 1
;;
esac

46
bin/prune-broken-symlinks.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/bin/sh
# shellcheck disable=SC2039,SC2086
set -o nounset
prune_broken_symlinks() {
ask=1
dir="."
if [ "${1:-}" = "-y" ]; then
ask=0
shift
fi
if [ -n "${1:-}" ]; then
dir="$1"
fi
# Check if there are any broken symlinks first
broken_links=$(find -L "$dir" -xdev -type l -print 2>/dev/null)
if [ -z "$broken_links" ]; then
return 0
fi
if [ "$ask" -eq 1 ]; then
# Print broken links
echo "$broken_links"
printf "Delete these links? [y/N] "
read -r reply
case "$reply" in
[yY]*)
;;
*)
echo "Aborted."
return 0
;;
esac
fi
# Perform deletion
find -L "$dir" -xdev -type l -exec rm -- {} + 2>/dev/null
}
# Execute the function
prune_broken_symlinks "$@"

48
bin/qdisc_span.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/bin/bash
set -ue
ACTION="add"
if [ "${1}" == "-d" ] ; then
ACTION="del"
shift
fi
BRIDGE="${1}"
DEST="${2}"
function setup_span {
if tc qdisc show dev "${1}" | grep -q 'qdisc ingress ffff' ; then
return 0
fi
tc qdisc add dev "${1}" ingress
tc filter add dev "${1}" parent ffff: protocol all u32 match u8 0 0 action mirred egress mirror dev "${DEST}"
}
function del_span {
tc qdisc del dev "${1}" ingress
}
function handle_iface {
case "${ACTION}" in
add)
setup_span "${1}"
;;
del)
del_span "${1}"
;;
*)
echo "Unknown action!"
exit 1
;;
esac
}
function get_bridge_ifaces {
bridge link | grep "master ${1}" | cut -d: -f2 | cut -d@ -f1
}
get_bridge_ifaces "${BRIDGE}" | while IFS= read -r iface ; do
handle_iface "$iface"
done

5
bin/remove-wine-associations Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
rm -f ~/.local/share/applications/wine*.desktop
update-desktop-database ~/.local/share/applications
rm -f ~/.local/share/mime/packages/x-wine*.xml
update-mime-database ~/.local/share/mime

83
bin/resign_for_debug.sh Executable file
View File

@@ -0,0 +1,83 @@
#!/bin/bash
# Default values
FORCE=false
TARGET_PATH=""
DEST_PATH=""
# Parse flags (looking for -f)
while getopts "f" opt; do
case $opt in
f) FORCE=true ;;
*) echo "Usage: $0 [-f] <binary_name_or_path> [destination]"; exit 1 ;;
esac
done
shift $((OPTIND-1))
# Check for first argument
if [ -z "$1" ]; then
echo "Error: No binary specified."
echo "Usage: $0 [-f] <binary_name_or_path> [destination]"
exit 1
fi
# 1. Resolve the Source Binary
if [[ "$1" == *"/"* ]]; then
SOURCE_BIN="$1"
else
SOURCE_BIN=$(command -v "$1")
fi
if [ ! -f "$SOURCE_BIN" ]; then
echo "Error: Could not find binary at '$1'"
exit 1
fi
# 2. Determine Destination Path
if [ -n "$2" ]; then
DEST_PATH="$2"
# If destination is a directory, append the basename
if [ -d "$DEST_PATH" ]; then
DEST_PATH="${DEST_PATH%/}/$(basename "$SOURCE_BIN")"
fi
else
# No destination given: create a temp directory
TMP_DIR=$(mktemp -d -t "debug_unlock_XXXXXX")
DEST_PATH="$TMP_DIR/$(basename "$SOURCE_BIN")"
echo "Notice: No destination provided. Using temp path: $DEST_PATH"
fi
# 3. Check for Collision
if [ -f "$DEST_PATH" ] && [ "$FORCE" = false ]; then
echo "Error: Destination '$DEST_PATH' already exists. Use -f to overwrite."
exit 1
fi
# 4. Copy and Sign
cp -f "$SOURCE_BIN" "$DEST_PATH"
chmod +x "$DEST_PATH"
ENTITLEMENTS_FILE=$(mktemp)
cat <<EOF > "$ENTITLEMENTS_FILE"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.get-task-allow</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
</plist>
EOF
echo "Unlocking: $SOURCE_BIN -> $DEST_PATH"
codesign -s - --entitlements "$ENTITLEMENTS_FILE" -f "$DEST_PATH" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✅ Success! You can now debug: $DEST_PATH"
else
echo "❌ Error: Code signing failed."
fi
rm "$ENTITLEMENTS_FILE"

26
bin/restic.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/bin/bash
#
# Script to execute a restic backup script specific to the current hostname.
#
set -o errexit
set -o nounset
set -o pipefail
# Get the current hostname
HOSTNAME=$(hostname)
# Define the directory where hostname-specific scripts are stored
RESTIC_SCRIPTS_DIR="${HOME}/bin/restic"
# Construct the full path to the hostname-specific script
HOST_SPECIFIC_SCRIPT="${RESTIC_SCRIPTS_DIR}/${HOSTNAME}"
# Check if the script exists and is executable
if [[ -f "${HOST_SPECIFIC_SCRIPT}" && -x "${HOST_SPECIFIC_SCRIPT}" ]]; then
echo "Executing restic script for hostname: ${HOSTNAME}"
"${HOST_SPECIFIC_SCRIPT}"
else
echo "Error: No executable restic script found for hostname '${HOSTNAME}' at '${HOST_SPECIFIC_SCRIPT}'." >&2
echo "Please create an executable script at that path if you want to use this functionality." >&2
exit 1
fi

165
bin/restic/baymax Executable file
View File

@@ -0,0 +1,165 @@
#!/bin/bash
#
# A script to backup a single-user MacBook using restic to either a local
# filesystem or Backblaze B2.
set -o errexit
set -o nounset
set -o pipefail
# --- Configuration ---
# Directory to be backed up.
# For this script, we assume the user's home directory.
SOURCE_DIR="${HOME}"
# Exclude file location. We'll create a default one next to the script.
EXCLUDE_FILE="$HOME/.restic_exclude.darwin"
# --- Functions ---
usage() {
cat << EOF
Usage: $(basename "$0") [-l /path/to/repo | -b [bucket]] [-u UPLOAD_LIMIT]
A script to backup a single-user MacBook using restic.
Options:
-l <path> Backup to a local filesystem repository at the given path.
-b [bucket] Backup to a Backblaze B2 bucket. The bucket name is optional.
If not provided, it will be read from the B2_BUCKET_NAME
environment variable.
-u <limit> Limit the upload speed to the given value in KB/s.
-h Show this help message.
EOF
}
# --- Main Script ---
# Check if restic is installed
if ! command -v restic &> /dev/null; then
echo "Error: restic command not found." >&2
echo "Please install restic first: https://restic.net/" >&2
exit 1
fi
if [[ $# -eq 0 ]]; then
usage
exit 1
fi
BACKUP_MODE=""
REPO=""
UPLOAD_LIMIT=""
while getopts ":l:bu:h" opt; do
case ${opt} in
l)
BACKUP_MODE="local"
REPO="${OPTARG}"
;;
b)
BACKUP_MODE="b2"
if [[ ${OPTIND} -le $# && "${!OPTIND}" != -* ]]; then
REPO="b2:${!OPTIND}:"
OPTIND=$((OPTIND + 1))
fi
;;
u)
UPLOAD_LIMIT="${OPTARG}"
;;
h)
usage
exit 0
;;
\?)
echo "Invalid option: -${OPTARG}" >&2
usage
exit 1
;;
:)
echo "Option -${OPTARG} requires an argument." >&2
usage
exit 1
;;
esac
done
# --- Pre-run checks ---
if [[ -z "${BACKUP_MODE}" ]]; then
echo "Error: You must specify a backup mode (-l or -b)." >&2
usage
exit 1
fi
if [[ "${BACKUP_MODE}" == "b2" ]]; then
if [[ -f "${HOME}/.resticb2" ]] ; then
. "${HOME}/.resticb2"
fi
export B2_ACCOUNT_ID
export B2_ACCOUNT_KEY
export B2_BUCKET_NAME
if [[ -z "${B2_ACCOUNT_ID:-}" || -z "${B2_ACCOUNT_KEY:-}" ]]; then
echo "Error: For Backblaze B2 backups, you must set the B2_ACCOUNT_ID and B2_ACCOUNT_KEY environment variables." >&2
exit 1
fi
if [[ -z "${REPO:-}" ]]; then
if [[ -n "${B2_BUCKET_NAME:-}" ]]; then
REPO="b2:${B2_BUCKET_NAME}:"
else
echo "Error: Backup mode is B2 but no bucket name was provided and the B2_BUCKET_NAME environment variable is not set." >&2
usage
exit 1
fi
fi
fi
KEYCHAIN_ENTRY_NAME="restic_repo_password"
if security find-generic-password -a "$(whoami)" -s "${KEYCHAIN_ENTRY_NAME}" >/dev/null 2>&1 ; then
export RESTIC_PASSWORD_COMMAND="security find-generic-password -a \"$(whoami)\" -s \"${KEYCHAIN_ENTRY_NAME}\" -w"
# Source file?
elif [[ -f "${HOME}/.resticpass" ]] ; then
export RESTIC_PASSWORD_FILE="${HOME}/.resticpass"
fi
# If the repository does not exist, initialize it.
# The user will be prompted for a password, which will be required for all
# future interactions with the repository.
if ! restic -r "${REPO}" snapshots &> /dev/null; then
echo "Restic repository not found or not accessible. Initializing..."
restic init -r "${REPO}"
fi
# --- Run Backup ---
echo "Starting restic backup..."
echo "Source: ${SOURCE_DIR}"
echo "Repository: ${REPO}"
BACKUP_CMD="restic backup \
--verbose \
--repo \"${REPO}\" \
--exclude-file \"${EXCLUDE_FILE}\" \
--one-file-system \
--tag \"macbook-backup\""
if [[ -n "${UPLOAD_LIMIT}" ]]; then
BACKUP_CMD="${BACKUP_CMD} --limit-upload ${UPLOAD_LIMIT}"
fi
BACKUP_CMD="${BACKUP_CMD} \"${SOURCE_DIR}\""
eval "${BACKUP_CMD}"
echo "Backup complete."
# --- Prune old snapshots (optional, but recommended) ---
# Keeps the last 7 daily, 4 weekly, and 6 monthly snapshots.
echo "Pruning old snapshots..."
restic forget \
--repo "${REPO}" \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
--prune
echo "Pruning complete."
echo "Restic backup script finished."

37
bin/restic/scar Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/bash
set -ue
export RESTIC_DEFAULT_BE="google"
export RESTIC_PASSWORD_FILE=${HOME}/.restic-password
case "${RESTIC_BACKEND:=${RESTIC_DEFAULT_BE}}" in
google)
export GOOGLE_PROJECT_ID=systemoverlord.com:systemoverlord
export GOOGLE_APPLICATION_CREDENTIALS=${HOME}/.config/boto/restic-creds.json
export RESTIC_REPOSITORY="gs:systemoverlord-backups-scar-2:/"
;;
b2)
. "${HOME}/.restic-backups-scar-creds"
export AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY
export RESTIC_REPOSITORY="s3:s3.us-west-004.backblazeb2.com/systemoverlord-backups-scar"
;;
*)
echo "Unknown restic backend $RESTIC_BACKEND" >&2
exit 1
;;
esac
cd "${HOME}"
if [ -z "${1}" ] ; then
restic backup \
--files-from "${HOME}/.restic-backup" \
--limit-upload 5000 \
--limit-download 10000
else
restic "$@"
fi

82
bin/screenshot.sh Executable file
View File

@@ -0,0 +1,82 @@
#!/bin/bash
# Screenshot tool to try a few different tools
set -ue
TOOLS="flameshot scrot"
SCREENDIR=${SCREENDIR:-${HOME}/Pictures/Screenshots}
SCROT_FORMAT="%F-%T.png"
function default_screenshot_command {
for tool in ${TOOLS} ; do
if which "${tool}" >/dev/null 2>&1 ; then
echo "${tool}"
return 0
fi
done
exit 1
}
TOOL=${SHOT:-$(default_screenshot_command)}
CMD=${1:-region}
function flameshot_gui_capture {
flameshot gui -p "${SCREENDIR}"
}
function flameshot_full_capture {
flameshot full -p "${SCREENDIR}"
}
function scrot_region_capture {
scrot -s "${SCREENDIR}/${SCROT_FORMAT}"
}
function scrot_window_capture {
scrot -u "${SCREENDIR}/${SCROT_FORMAT}"
}
function scrot_full_capture {
scrot "${SCREENDIR}/${SCROT_FORMAT}"
}
case "${CMD}" in
region|window|full)
mkdir -p "${SCREENDIR}"
case "${TOOL}" in
flameshot)
case "${CMD}" in
region|window)
flameshot_gui_capture
;;
full)
flameshot_full_capture
;;
esac
;;
scrot)
case "${CMD}" in
region)
scrot_region_capture
;;
window)
scrot_window_capture
;;
full)
scrot_full_capture
;;
esac
;;
*)
echo "Error: Unknown or unsupported tool '${TOOL}'" >&2
exit 1
;;
esac
exit $?
;;
*)
echo "Usage: $0 [region|window|full]" >/dev/stderr
exit 1
;;
esac

View File

@@ -2,4 +2,4 @@
apt-get install -y \ apt-get install -y \
i3 i3lock xss-lock rxvt-unicode-256color fonts-inconsolata scrot \ i3 i3lock xss-lock rxvt-unicode-256color fonts-inconsolata scrot \
xautolock xbacklight i3status dex xautolock xbacklight i3status dex libnotify-bin

33
bin/setup/nerdfonts.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
set -ue
VER="v3.4.0"
FONTS=(
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/DejaVuSansMono.zip
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/FiraCode.zip
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/FiraMono.zip
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/Hack.zip
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/Inconsolata.zip
https://github.com/ryanoasis/nerd-fonts/releases/download/${VER}/OpenDyslexic.zip
)
if [ "$(uname)" = "Darwin" ]; then
FPATH="${HOME}/Library/Fonts"
else
FPATH="${HOME}/.local/share/fonts/nerdfonts"
fi
mkdir -p "${FPATH}"
cd "${FPATH}"
for f in "${FONTS[@]}"; do
BN=$(basename "$f")
wget -O "${FPATH}/${BN}" "$f"
unzip -o -d "${FPATH}" "${FPATH}/${BN}"
done
if command -v fc-cache >/dev/null 2>&1; then
fc-cache -v
fi

18
bin/setup/spicerandr.sh Normal file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -ue
cat >/usr/local/bin/x-resize <<"EOF"
#!/bin/sh
PATH=/usr/bin:/bin:/usr/local/bin
desktopuser=$(/bin/ps -ef | /bin/grep -oP '^\w+ (?=.*vdagent( |$))') || exit 0
export DISPLAY=:0
export XAUTHORITY=$(eval echo "~$desktopuser")/.Xauthority
/usr/bin/xrandr --output $(/usr/bin/xrandr | awk '/ connected/{print $1; exit; }') --auto
EOF
chmod 755 /usr/local/bin/x-resize
cat >/etc/udev/rules.d/50-resize.rules <<"EOF"
ACTION=="change",KERNEL=="card0", SUBSYSTEM=="drm", RUN+="/usr/local/bin/x-resize"
EOF
chmod 644 /etc/udev/rules.d/50-resize.rules

36
bin/smart-copy-paste Executable file
View File

@@ -0,0 +1,36 @@
#!/bin/sh
#
# smart-copy-paste
#
# This script provides context-aware copy and paste operations, mimicking
# macOS behavior (Alt+C/V) while correctly handling terminals that require
# the Shift key.
# Exit silently if xdotool is not installed.
if ! command -v xdotool > /dev/null; then
exit 1
fi
# Get the class name of the currently focused window.
# We need to get the window on focus, to avoid issues with transparent terminals.
class=$(xdotool getwindowclassname "$(xdotool getwindowfocus)")
# Semicolon-separated list of terminal class names.
terminals='Gnome-terminal;Xfce4-terminal;konsole;xterm;URxvt;Terminator;Alacritty;kitty;wezterm'
# Determine the keystroke based on the window type and the argument passed.
if echo "$terminals" | grep -q "$class"; then
# This is a terminal, so use Shift.
if [ "$1" = "copy" ]; then
xdotool key --clearmodifiers ctrl+shift+c
elif [ "$1" = "paste" ]; then
xdotool key --clearmodifiers ctrl+shift+v
fi
else
# This is a standard GUI app.
if [ "$1" = "copy" ]; then
xdotool key --clearmodifiers ctrl+c
elif [ "$1" = "paste" ]; then
xdotool key --clearmodifiers ctrl+v
fi
fi

164
bin/ssh-sign Executable file
View File

@@ -0,0 +1,164 @@
#!/bin/bash
# A robust wrapper for ssh-keygen to sign and verify files.
# --- Color Codes for Output ---
COLOR_RED='\033[0;31m'
COLOR_GREEN='\033[0;32m'
COLOR_NONE='\033[0m' # No Color
# --- Default values ---
DEFAULT_SIGNING_KEY="$HOME/.ssh/id_signing"
DEFAULT_ALLOWED_SIGNERS="$HOME/.ssh/allowed_signers"
DEFAULT_IDENTITY="david@systemoverlord.com"
DEFAULT_NAMESPACE="file"
# --- Usage Message ---
usage() {
cat << EOF
Usage: $(basename "$0") <sign|verify> [OPTIONS] [FILE]
A wrapper for 'ssh-keygen -Y' to simplify file signing and verification.
COMMANDS:
sign Sign a file. The path to the file to be signed is provided as a positional argument.
verify Verify a signature. The original file content is read from stdin.
OPTIONS:
-f <file> For 'sign': Path to the private key for signing.
Defaults to '$DEFAULT_SIGNING_KEY' if it exists.
For 'verify': Path to the allowed_signers file.
Defaults to '$DEFAULT_ALLOWED_SIGNERS'.
-n <namespace> Signature namespace.
Defaults to '$DEFAULT_NAMESPACE'.
-I <identity> For 'verify': The identity to check the signature against.
Defaults to '$DEFAULT_IDENTITY'.
-s <sig_file> For 'verify': Path to the signature file to verify (e.g., file.sig). REQUIRED for verify.
-h, --help Show this help message.
EXAMPLE USAGE:
# Sign a file using the default key
$(basename "$0") sign release.tar.gz
# Sign a file with a specific key
$(basename "$0") sign -f ~/.ssh/id_ed25519_my_signing_key release.tar.gz
# Verify a signature using default allowed_signers and identity
cat release.tar.gz | $(basename "$0") verify -s release.tar.gz.sig
# Verify a signature with a specific allowed_signers file and identity
cat release.tar.gz | $(basename "$0") verify -f ./my_signers -I other@example.com -s release.tar.gz.sig
EOF
exit 1
}
# --- Helper for error messages ---
error() {
echo -e "${COLOR_RED}Error: $1${COLOR_NONE}" >&2
exit 1
}
# --- Main Script Logic ---
if [[ "$1" != "sign" && "$1" != "verify" ]]; then
usage
fi
SUBCOMMAND=$1
shift # Consume the subcommand
# --- Argument Parsing and Validation ---
# Separate arguments from the file to be signed
declare -a remaining_args
file_to_sign=""
while [[ "$#" -gt 0 ]]; do
# If we see a non-flag argument, assume it's the file to sign.
# This works because the file to sign is the only positional argument.
if [[ "$1" != -* ]] && [[ -z "$file_to_sign" ]]; then
file_to_sign="$1"
else
remaining_args+=("$1")
fi
shift
done
# --- Build command based on subcommand ---
declare -a CMD_ARGS
CMD_ARGS=("ssh-keygen" "-Y" "$SUBCOMMAND")
# Append all the flag-based arguments (-f, -n, -I, -s)
CMD_ARGS+=("${remaining_args[@]}")
# Scan for provided flags to handle defaults correctly
f_provided=false
n_provided=false
I_provided=false
s_provided=false
for arg in "${remaining_args[@]}"; do
[[ "$arg" == "-f" ]] && f_provided=true
[[ "$arg" == "-n" ]] && n_provided=true
[[ "$arg" == "-I" ]] && I_provided=true
[[ "$arg" == "-s" ]] && s_provided=true
done
if [[ "$SUBCOMMAND" == "sign" ]]; then
if [[ -z "$file_to_sign" ]]; then
error "Path to file to be signed is required for 'sign' command."
fi
# Set default signing key if -f was not provided
if ! $f_provided; then
if [[ ! -f "$DEFAULT_SIGNING_KEY" ]]; then
error "Default signing key not found at '$DEFAULT_SIGNING_KEY'. Specify one with -f."
fi
CMD_ARGS+=("-f" "$DEFAULT_SIGNING_KEY")
fi
# Set default namespace if -n was not provided
if ! $n_provided; then
CMD_ARGS+=("-n" "$DEFAULT_NAMESPACE")
fi
# The file to sign MUST be the last argument for ssh-keygen
CMD_ARGS+=("$file_to_sign")
elif [[ "$SUBCOMMAND" == "verify" ]]; then
if [[ -n "$file_to_sign" ]]; then
error "The 'verify' command reads from stdin and does not accept a positional file argument. Found '$file_to_sign'."
fi
if ! $s_provided; then
error "Signature file must be provided with -s for 'verify' command."
fi
# Set default allowed_signers if -f was not provided
if ! $f_provided; then
if [[ ! -f "$DEFAULT_ALLOWED_SIGNERS" ]]; then
error "Default allowed signers file not found at '$DEFAULT_ALLOWED_SIGNERS'. Specify one with -f."
fi
CMD_ARGS+=("-f" "$DEFAULT_ALLOWED_SIGNERS")
fi
# Set default identity if -I was not provided
if ! $I_provided; then
CMD_ARGS+=("-I" "$DEFAULT_IDENTITY")
fi
# Set default namespace if -n was not provided
if ! $n_provided; then
CMD_ARGS+=("-n" "$DEFAULT_NAMESPACE")
fi
fi
# --- Execute and Report ---
# We capture the output and stderr to show it to the user
if output=$("${CMD_ARGS[@]}" 2>&1); then
echo -e "${COLOR_GREEN}Success:${COLOR_NONE}"
echo "$output"
exit 0
else
echo -e "${COLOR_RED}Command Failed:${COLOR_NONE}"
echo "$output" >&2
exit 1
fi

View File

@@ -7,7 +7,7 @@ fi
if [ `whoami` != "root" ] ; then if [ `whoami` != "root" ] ; then
if which sudo >/dev/null 2>&1 ; then if which sudo >/dev/null 2>&1 ; then
sudo $0 $* sudo "$0" "$@"
exit exit
fi fi
echo "Sorry, this requires root." >&2 echo "Sorry, this requires root." >&2

7
bin/update_skel Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/sh
set -e
SKEL_DIR=$(dirname -- "$(readlink -f -- "$HOME/.profile")")
cd -- "$SKEL_DIR"
cd -- "$(git rev-parse --show-toplevel)"
git pull
./install.sh

69
clone.sh Executable file
View File

@@ -0,0 +1,69 @@
#!/bin/bash
set -ue
# --- Helper function to install git ---
install_git() {
echo "Git not found. Attempting to install..." >&2
case "$(uname)" in
Darwin)
if command -v brew >/dev/null 2>&1; then
echo "Using Homebrew to install git..." >&2
brew install git
else
echo "Error: Homebrew not found on your macOS system." >&2
echo "Please install Homebrew first by visiting https://brew.sh/ then run this script again." >&2
return 1
fi
;;
Linux)
if command -v apt-get >/dev/null 2>&1; then
echo "Using apt-get to install git..." >&2
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
sudo apt-get update && sudo apt-get install -y git
else
apt-get update && apt-get install -y git
fi
else
echo "Error: This script requires 'apt-get' on Linux to install git." >&2
echo "Please install git using your system's package manager and run this script again." >&2
return 1
fi
;;
*)
echo "Error: Unsupported operating system '$(uname)'." >&2
echo "Please install git manually and run this script again." >&2
return 1
;;
esac
}
# --- Main script logic ---
installer_main() {
# 1. Check for git, and try to install it if it's missing.
if ! command -v git >/dev/null 2>&1; then
install_git
# Final check after attempting installation
if ! command -v git >/dev/null 2>&1; then
echo "ERROR: git installation failed or was not found." >&2
echo "Please install git manually and re-run this script." >&2
exit 1
fi
fi
# 2. Clone the repository if it doesn't exist
local dest="${HOME}/.skel"
if [ -d "${dest}" ]; then
echo "Repository already exists in ${dest}. Skipping clone." >&2
else
echo "Cloning repository..." >&2
git clone --depth 1 https://github.com/Matir/skel.git "${dest}"
fi
# 3. Run the main installer
echo "Running main installer..." >&2
"${dest}/install.sh"
}
installer_main

10
conf/logid.cfg Normal file
View File

@@ -0,0 +1,10 @@
devices: ({
name: "Wireless Mouse MX Master 3";
smartshift: {
on: true;
threshold: 30;
};
dpi: 1500;
});

16
darwin-env.plist Normal file
View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.loadvars</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>-c</string>
<string>~/bin/darwin-env.sh || true</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

View File

@@ -1,24 +0,0 @@
[media-keys]
screensaver=['<Primary><Alt>l', 'XF86ScreenSaver']
[wm]
move-to-workspace-1=['<Shift><Super>exclam']
move-to-workspace-2=['<Shift><Super>at']
move-to-workspace-3=['<Shift><Super>numbersign']
move-to-workspace-4=['<Shift><Super>dollar']
move-to-workspace-5=['<Shift><Super>percent']
move-to-workspace-6=['<Shift><Super>asciicircum']
move-to-workspace-7=['<Shift><Super>ampersand']
move-to-workspace-8=['<Shift><Super>asterisk']
move-to-workspace-9=['<Shift><Super>parenleft']
switch-to-workspace-4=['<Super>4']
switch-to-workspace-1=['<Super>1']
switch-to-workspace-10=['<Super>0']
switch-to-workspace-3=['<Super>3']
switch-to-workspace-8=['<Super>8']
switch-to-workspace-5=['<Super>5']
move-to-workspace-10=['<Shift><Super>parenright']
switch-to-workspace-2=['<Super>2']
switch-to-workspace-9=['<Super>9']
switch-to-workspace-6=['<Super>6']
switch-to-workspace-7=['<Super>7']

1
dotfile_overlays/README Normal file
View File

@@ -0,0 +1 @@
Each directory in this directory will be symlinked as dotfiles.

1
dotfiles/Xkbmap Normal file
View File

@@ -0,0 +1 @@
-option ctrl:nocaps -option compose:ralt

View File

@@ -4,7 +4,7 @@ Xcursor.size: 16
! Xft for fonts ! Xft for fonts
!!! !!!
!Xft.dpi: 144 !Xft.dpi: 144
Xft.antialias: false Xft.antialias: true
Xft.lcdfilter: lcddefault Xft.lcdfilter: lcddefault
Xft.rgba: rgb Xft.rgba: rgb
Xft.hinting: true Xft.hinting: true
@@ -27,21 +27,34 @@ URxvt.lineSpace: 0
URxvt.iso14755: false URxvt.iso14755: false
! Fonts ! Fonts
URxvt*font: xft:inconsolata:pixelsize=16 URxvt.font: xft:inconsolata:pixelsize=17,xft:monospace:size=12
! Fix font space ! Fix font space
URxvt*letterSpace: -1 URxvt.letterSpace: -1
! Scrollbar ! Scrollbar and scrolling
URxvt.scrollStyle: rxvt URxvt.scrollStyle: rxvt
URxvt.scrollBar: false URxvt.scrollBar: false
! do not scroll with output
URxvt.scrollTtyOutput: false
! scroll in relation to buffer (with mouse scroll or Shift+Page Up)
URxvt.scrollWithBuffer: true
! scroll back to the bottom on keypress
URxvt.scrollTtyKeypress: true
! Allow apps to manage their own secondary screen
URxvt.secondaryScreen: 1
URxvt.secondaryScroll: 0
! Perl extensions ! Perl extensions
URxvt.perl-ext-common: default,matcher,resize-font URxvt.perl-ext-common: default,matcher,font-size,eval
URxvt.matcher.button: 1 URxvt.matcher.button: 1
URxvt.urlLauncher: /usr/bin/xdg-open URxvt.urlLauncher: /usr/bin/xdg-open
URxvt.resize-font.smaller: C-Down URxvt.url-launcher: /usr/bin/xdg-open
URxvt.resize-font.bigger: C-Up
! Copy/Paste Stuff
URxvt.keysym.Shift-Control-V: eval:paste_clipboard
URxvt.keysym.Shift-Control-C: eval:selection_to_clipboard
! Cursor ! Cursor
URxvt.cursorBlink: true URxvt.cursorBlink: true
@@ -50,12 +63,21 @@ URxvt.cursorUnderline: false
! Pointer ! Pointer
URxvt.pointerBlank: true URxvt.pointerBlank: true
! Solarized colors begin ! Disable printing the terminal contents when pressing PrintScreen.
URxvt.print-pipe: "cat > /dev/null"
!!! Solarized colors begin
! base03
URxvt.background: #002b36 URxvt.background: #002b36
URxvt.foreground: #657b83 ! base0
URxvt.foreground: #839496
! base03
URxvt.fadeColor: #002b36 URxvt.fadeColor: #002b36
! base1
URxvt.cursorColor: #93a1a1 URxvt.cursorColor: #93a1a1
! base01
URxvt.pointerColorBackground: #586e75 URxvt.pointerColorBackground: #586e75
! base1
URxvt.pointerColorForeground: #93a1a1 URxvt.pointerColorForeground: #93a1a1
!! black dark/light !! black dark/light

View File

@@ -1,3 +1,4 @@
--follow --follow
--pager=less -LMXRF --pager=less -LMXRF
--smart-case --smart-case
--ignore-dir=match:bazel-.*

View File

@@ -1,23 +1,8 @@
# General aliases, should only be sourced in interactive shells # General aliases, should only be sourced in interactive shells
# Try to keep in sync with ~/.config/fish/conf.d/aliases.fish
# Add an "alert" alias for long running commands. Use like so:
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
# Cryptsetup alias # Cryptsetup alias
alias luksFormat='cryptsetup luksFormat -s 512 -c aes-xts-plain64 -h sha256 -i 15000' alias luksFormat='cryptsetup luksFormat --type=luks2 --pbkdf-memory=2560000 --pbkdf=argon2id -i 15000 -s 512 -h sha256 -c aes-xts-plain64'
# Colors
if [ `uname` != 'Darwin' -a `uname` != 'NetBSD' ] ; then
# Should have a better way to check for GNU versions
alias ls='ls --color=auto'
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
fi
# Easy upgrade
alias dist-upgrade="sudo sh -c 'apt-get update && apt-get -y dist-upgrade'"
# Timestamp in a machine-sortable form # Timestamp in a machine-sortable form
alias tstamp="date '+%Y%m%d-%H%M%S'" alias tstamp="date '+%Y%m%d-%H%M%S'"
@@ -28,8 +13,38 @@ alias mdcode="sed 's/^/ /'"
# Intel format plz # Intel format plz
alias objdump="command objdump -M intel" alias objdump="command objdump -M intel"
# Useful directory utilities
alias dircount="for d in * ; do find \$d -type d | wc -l | tr -d '\n' ; echo ' ' \$d ; done | sort -n"
# Drop caches for swap issues # Drop caches for swap issues
alias drop_caches="echo 3 | sudo /usr/bin/tee /proc/sys/vm/drop_caches" alias drop_caches="echo 3 | sudo /usr/bin/tee /proc/sys/vm/drop_caches"
# dump acpi temperature
alias gettemp='printf "%02.2f\n" "$(cat /sys/class/thermal/thermal_zone0/temp)e-3"'
# get git working directory
alias gitroot="git rev-parse --show-toplevel"
# SSH without host key checking
alias sshanon="ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no"
# Straight to ipython
alias ipy="ipython3 --no-banner"
# Skip the header on bc
alias bc="command bc -q"
# Get a decently readable df
alias dfh="df -h -x tmpfs -x devtmpfs -x squashfs -x fuse -x efivarfs"
# Clear the GPG agent
alias clear-gpg-agent="echo RELOADAGENT | gpg-connect-agent"
# Battery details
alias bat-details='upower -i $(upower -e | grep battery)'
# Nvidia refresh rate
alias nvidia-refresh-rate='nvidia-settings --display=:0 -q RefreshRate -t'
# Earthly ssh
alias earthly='earthly --ssh-auth-sock ""'
# to clipboard
alias toclip='xclip -selection clipboard'

View File

@@ -1,5 +1,5 @@
# Load env first # Load env first
if [ -f $HOME/.env ] ; then source $HOME/.env ; fi if [ -f $HOME/.shenv ] ; then source $HOME/.shenv ; fi
# History settings # History settings
HISTCONTROL=ignoredups:ignorespace HISTCONTROL=ignoredups:ignorespace

View File

@@ -0,0 +1,15 @@
{
"editor.accessibilitySupport": "off",
"telemetry.telemetryLevel": "off",
"dotfiles.repository": "matir/skel",
"dotfiles.targetPath": "~/.skel",
"remote.defaultExtensionsIfInstalledLocally": [],
"mise.configureExtensionsAutomatically": true,
"kilo-code.debug": false,
"kilo-code.allowedCommands": [
"git log",
"git diff",
"git show"
],
"kilo-code.deniedCommands": []
}

View File

@@ -0,0 +1,5 @@
if command -v mise ; then
use_mise() {
eval "$(mise direnv activate)"
}
fi

View File

@@ -0,0 +1,16 @@
layout_python() {
local DIR_NAME="$(basename $(pwd))"
VIRTUAL_ENV="${VIRTUAL_ENV:-$(pwd)/.venv/${DIR_NAME}}"
local PYBIN="$(command -v python 2>/dev/null || command -v python3 2>/dev/null)"
if [[ -z "${PYBIN}" ]]; then
log_error "No python found!"
return 1
fi
if [[ ! -d $VIRTUAL_ENV ]]; then
log_status "No virtual environment exists. Executing \`${PYBIN} -m venv ${VIRTUAL_ENV}\`."
"${PYBIN}" -m venv "${VIRTUAL_ENV}"
fi
# Activate the virtual environment
. $VIRTUAL_ENV/bin/activate
}

View File

@@ -0,0 +1,77 @@
# Cryptsetup alias
alias luksFormat 'cryptsetup luksFormat --type=luks2 --pbkdf-memory=2560000 --pbkdf=argon2id -i 15000 -s 512 -h sha256 -c aes-xts-plain64'
# Timestamp in a machine-sortable form
alias tstamp "date '+%Y%m%d-%H%M%S'"
# Prepare code for markdown
alias mdcode "sed 's/^/ /'"
# Intel format plz
alias objdump "command objdump -M intel"
# Drop caches for swap issues
alias drop_caches "echo 3 | sudo /usr/bin/tee /proc/sys/vm/drop_caches"
# dump acpi temperature
alias gettemp 'printf "%02.2f\n" (cat /sys/class/thermal/thermal_zone0/temp)e-3'
# get git working directory
alias gitroot "git rev-parse --show-toplevel"
# SSH without host key checking
alias sshanon "ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no"
# Straight to ipython
alias ipy "ipython3 --no-banner"
# Skip the header on bc
alias bc "command bc -q"
# Get a decently readable df
alias dfh "df -h -x tmpfs -x devtmpfs -x squashfs -x fuse -x efivarfs"
# Clear the GPG agent
alias clear-gpg-agent "echo RELOADAGENT | gpg-connect-agent"
# Battery details
alias bat-details 'upower -i (upower -e | grep battery)'
# Nvidia refresh rate
alias nvidia-refresh-rate 'nvidia-settings --display=:0 -q RefreshRate -t'
# Earthly ssh
alias earthly 'earthly --ssh-auth-sock ""'
# to clipboard
alias toclip 'xclip -selection clipboard'
# On some systems, bat is batcat
if not command -v bat >/dev/null 2>&1
if command -v batcat >/dev/null 2>&1
alias bat (command -v batcat)
end
end
# FFUF aliases
if command -v ffuf >/dev/null 2>&1
if test -d $HOME/tools/seclists
alias ffuf-files "ffuf -c -w $HOME/tools/seclists/Discovery/Web-Content/raft-large-files.txt"
alias ffuf-dirs "ffuf -c -w $HOME/tools/seclists/Discovery/Web-Content/raft-large-directories.txt"
alias ffuf-quick "ffuf -c -w $HOME/tools/seclists/Discovery/Web-Content/quickhits.txt"
end
end
if grep --help 2>/dev/null | grep -q 'color'
# Should have a better way to check for GNU versions
alias grep 'grep --color=auto'
alias egrep 'egrep --color=auto'
alias fgrep 'fgrep --color=auto'
end
# Detect which `ls` flavor is in use and use the right flag for colors.
if ls --help 2>&1 | grep -q -- '--color'
alias ls 'ls --color=auto' # GNU `ls`
else if test (uname) = "Darwin"
alias ls 'ls -G' # macOS `ls`
end

View File

@@ -0,0 +1,14 @@
# This file was created by fish when upgrading to version 4.3, to migrate
# the 'fish_key_bindings' variable from its old default scope (universal)
# to its new default scope (global). We recommend you delete this file
# and configure key bindings in ~/.config/fish/config.fish if needed.
# set --global fish_key_bindings fish_default_key_bindings
# Prior to version 4.3, fish shipped an event handler that runs
# `set --universal fish_key_bindings fish_default_key_bindings`
# whenever the fish_key_bindings variable is erased.
# This means that as long as any fish < 4.3 is still running on this system,
# we cannot complete the migration.
# As a workaround, erase the universal variable at every shell startup.
set --erase --universal fish_key_bindings

View File

@@ -0,0 +1,48 @@
# This file was created by fish when upgrading to version 4.3, to migrate
# theme variables from universal to global scope.
# Don't edit this file, as it will be written by the web-config tool (`fish_config`).
# To customize your theme, delete this file and see
# help interactive#syntax-highlighting
# or
# man fish-interactive | less +/^SYNTAX.HIGHLIGHTING
# for appropriate commands to add to ~/.config/fish/config.fish instead.
# See also the release notes for fish 4.3.0 (run `help relnotes`).
set --global fish_color_autosuggestion 4D5566
set --global fish_color_cancel --reverse
set --global fish_color_command 39BAE6
set --global fish_color_comment 626A73
set --global fish_color_cwd 59C2FF
set --global fish_color_cwd_root red
set --global fish_color_end F29668
set --global fish_color_error FF3333
set --global fish_color_escape 95E6CB
set --global fish_color_history_current --bold
set --global fish_color_host normal
set --global fish_color_host_remote yellow
set --global fish_color_keyword 39BAE6
set --global fish_color_match F07178
set --global fish_color_normal B3B1AD
set --global fish_color_operator E6B450
set --global fish_color_option B3B1AD
set --global fish_color_param B3B1AD
set --global fish_color_quote C2D94C
set --global fish_color_redirection FFEE99
set --global fish_color_search_match --background=E6B450
set --global fish_color_selection --background=E6B450
set --global fish_color_status red
set --global fish_color_user brgreen
set --global fish_color_valid_path --underline
set --global fish_pager_color_background
set --global fish_pager_color_completion normal
set --global fish_pager_color_description B3A06D
set --global fish_pager_color_prefix normal --bold --underline
set --global fish_pager_color_progress brwhite --background=cyan
set --global fish_pager_color_secondary_background
set --global fish_pager_color_secondary_completion
set --global fish_pager_color_secondary_description
set --global fish_pager_color_secondary_prefix
set --global fish_pager_color_selected_background --background=E6B450
set --global fish_pager_color_selected_completion
set --global fish_pager_color_selected_description
set --global fish_pager_color_selected_prefix

View File

@@ -0,0 +1,95 @@
# Bridge to Gemini CLI Context Management (Zsh-backed)
# This allows using the Zsh implementation from Fish to avoid dual maintenance.
# Ensure the base context directory exists
if set -q XDG_CONFIG_HOME
set -gx GEMINI_CONTEXT_DIR $XDG_CONFIG_HOME/gemini
else
set -gx GEMINI_CONTEXT_DIR $HOME/.config/gemini
end
mkdir -p "$GEMINI_CONTEXT_DIR"
# Path to the source of truth
set -l gemini_zsh_script "$HOME/.skel/dotfiles/zshrc.d/gemini.zsh"
function _gemini_context_bridge
# Check if Zsh script exists
if not test -f "$gemini_zsh_script"
echo "Error: Gemini Zsh script not found at $gemini_zsh_script"
return 1
end
# We use a temporary file to reliably pass the environment variable back
set -l env_file (mktemp -t gemini_context.XXXXXX)
# Run zsh with -e (exit on error):
# 1. Source the context manager
# 2. Run the requested command with arguments
# 3. Write the resulting GEMINI_CLI_HOME to the temp file
command zsh -ec "
source '$gemini_zsh_script'
$argv
echo \"\$GEMINI_CLI_HOME\" > '$env_file'
"
set -l zsh_status $status
# Only sync environment and clean up on success
if test $zsh_status -eq 0
set -l new_home (cat $env_file | string trim)
if test -n "$new_home"
set -gx GEMINI_CLI_HOME "$new_home"
else
set -e GEMINI_CLI_HOME
end
end
rm -f $env_file
return $zsh_status
end
# Wrapper functions
function gemini-context-use
_gemini_context_bridge "gemini-context-use $argv"
end
function gemini-context-create
_gemini_context_bridge "gemini-context-create $argv"
end
function gemini-context-list
_gemini_context_bridge "gemini-context-list $argv"
end
function gemini-context-delete
_gemini_context_bridge "gemini-context-delete $argv"
end
function gemini-context-rename
_gemini_context_bridge "gemini-context-rename $argv"
end
function gemini-context-edit
_gemini_context_bridge "gemini-context-edit $argv"
end
function gemini-context-current
_gemini_context_bridge "gemini-context-current $argv"
end
function gemini-context-unset
_gemini_context_bridge "gemini-context-unset $argv"
end
# Aliases
alias gemctx='gemini-context-use'
# Completion
function _gemini_context_list
zsh -c "source '$gemini_zsh_script'; _gemini_context_list_internal"
end
complete -c gemini-context-use -f -a "(_gemini_context_list)"
complete -c gemctx -f -a "(_gemini_context_list)"
complete -c gemini-context-edit -f -a "(_gemini_context_list)"
complete -c gemini-context-delete -f -a "(_gemini_context_list)"
complete -c gemini-context-rename -f -a "(_gemini_context_list)"

View File

@@ -0,0 +1,37 @@
if test -x /opt/homebrew/bin/brew
/opt/homebrew/bin/brew shellenv fish | source
if test -d (brew --prefix)"/share/fish/completions"
set -p fish_complete_path (brew --prefix)/share/fish/completions
end
if test -d (brew --prefix)"/share/fish/vendor_completions.d"
set -p fish_complete_path (brew --prefix)/share/fish/vendor_completions.d
end
# mise, if installed
if type -q mise
mise activate fish | source
end
end
if command -q starship
starship init fish --print-full-init | source
end
function install_fisher
if not test -e ~/.config/fish/functions/fisher.fish
echo "Installing Fisher for fish shell..."
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source
fisher install jorgebucaran/fisher
end
end
if status --is-interactive
install_fisher
end
# Want these at the bottom to put them first in PATH
fish_add_path --move --path {$HOME}/bin
if test (uname) = "Darwin"
fish_add_path --move --path {$HOME}/bin/macos
end

View File

@@ -0,0 +1,2 @@
jorgebucaran/fisher
wfxr/forgit

View File

@@ -0,0 +1,8 @@
# Change to the root of the git repository.
# If not in a git repo, do nothing.
function cdgr
set git_root (git rev-parse --show-toplevel 2>/dev/null)
if test -n "$git_root"
cd "$git_root"
end
end

View File

@@ -0,0 +1,15 @@
{
"editor": {
"mode": "vim"
},
"context": {
"includeFiles": [
"/usr/local/google/home/davidtomaschik/.skel/GEMINI.md",
"/usr/local/google/home/davidtomaschik/.skel/AGENTS.md"
]
},
"experimental": {
"skills": true,
"planMode": true
}
}

View File

@@ -0,0 +1,12 @@
# What protocol to use when performing git operations. Supported values: ssh, https
git_protocol: https
# What editor gh should run when creating issues, pull requests, etc. If blank, will refer to environment.
editor: !!null vim
# When to interactively prompt. This is a global config that cannot be overridden by hostname. Supported values: enabled, disabled
prompt: enabled
# A pager program to send command output to, e.g. "less". Set the value to "cat" to disable the pager.
pager: !!null less -R
# Aliases allow you to create nicknames for gh commands
aliases:
co: pr checkout
version: "1"

View File

@@ -0,0 +1,64 @@
# Beware! This file is rewritten by htop when settings are changed in the interface.
# The parser is also very primitive, and not human-friendly.
htop_version=3.4.1-3.4.1
config_reader_min_version=3
fields=0 48 17 18 38 39 40 2 46 47 49 1
hide_kernel_threads=1
hide_userland_threads=1
hide_running_in_container=0
shadow_other_users=0
show_thread_names=0
show_program_path=1
highlight_base_name=0
highlight_deleted_exe=1
shadow_distribution_path_prefix=0
highlight_megabytes=1
highlight_threads=1
highlight_changes=0
highlight_changes_delay_secs=5
find_comm_in_cmdline=1
strip_exe_from_cmdline=1
show_merged_command=0
header_margin=1
screen_tabs=0
detailed_cpu_time=0
cpu_count_from_one=1
show_cpu_usage=1
show_cpu_frequency=0
show_cpu_temperature=0
degree_fahrenheit=0
show_cached_memory=1
update_process_names=0
account_guest_in_cpu_meter=0
color_scheme=6
enable_mouse=1
delay=15
hide_function_bar=0
header_layout=two_50_50
column_meters_0=AllCPUs Memory Swap
column_meter_modes_0=1 1 1
column_meters_1=Tasks LoadAverage Uptime
column_meter_modes_1=2 2 2
tree_view=0
sort_key=46
tree_sort_key=0
sort_direction=-1
tree_sort_direction=1
tree_view_always_by_pid=0
all_branches_collapsed=0
screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command
.sort_key=PERCENT_CPU
.tree_sort_key=PID
.tree_view_always_by_pid=0
.tree_view=0
.sort_direction=-1
.tree_sort_direction=1
.all_branches_collapsed=0
screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE PERCENT_SWAP_DELAY PERCENT_IO_DELAY Command
.sort_key=IO_RATE
.tree_sort_key=PID
.tree_view_always_by_pid=0
.tree_view=0
.sort_direction=-1
.tree_sort_direction=1
.all_branches_collapsed=0

View File

@@ -87,6 +87,10 @@ bindsym $mod+Shift+8 move container to workspace 8
bindsym $mod+Shift+9 move container to workspace 9 bindsym $mod+Shift+9 move container to workspace 9
bindsym $mod+Shift+0 move container to workspace 10 bindsym $mod+Shift+0 move container to workspace 10
# do some scratchpad
bindsym $mod+Shift+minus move scratchpad
bindsym $mod+minus scratchpad show
# Move workspaces between monitors # Move workspaces between monitors
bindsym $mod+Shift+greater move workspace to output right bindsym $mod+Shift+greater move workspace to output right
bindsym $mod+Shift+less move workspace to output left bindsym $mod+Shift+less move workspace to output left
@@ -130,10 +134,13 @@ bindsym $alt+Control+Left workspace prev
# i3 lock # i3 lock
exec --no-startup-id ~/bin/i3lock.sh & exec --no-startup-id ~/bin/i3lock.sh &
exec --no-startup-id xset dpms 600
bindsym $mod+l exec \ bindsym $mod+l exec \
bash -c "i3lock -c 000000 -d && (sleep 2 && xset dpms force off) &" bash -c "i3lock -c 000000 && (sleep 2 && xset dpms force off) &"
bindsym $alt+Control+l exec \ bindsym $alt+Control+l exec \
bash -c "i3lock -c 000000 -d && (sleep 2 && xset dpms force off) &" bash -c "i3lock -c 000000 && (sleep 2 && xset dpms force off) &"
# suspend under systemd
bindsym $mod+Control+s exec --no-startup-id systemctl suspend
# things to start quickly # things to start quickly
bindsym $mod+g exec /usr/bin/google-chrome-beta --password-store=gnome bindsym $mod+g exec /usr/bin/google-chrome-beta --password-store=gnome
@@ -145,39 +152,33 @@ bindsym --whole-window $mod+button3 floating toggle
# media keys # media keys
# Pulse Audio controls # Pulse Audio controls
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume 0 +5% bindsym XF86AudioRaiseVolume exec --no-startup-id ~/bin/pactl_helper volume +5%
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume 0 -5% bindsym XF86AudioLowerVolume exec --no-startup-id ~/bin/pactl_helper volume -5%
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 0 toggle bindsym XF86AudioMute exec --no-startup-id ~/bin/pactl_helper mute toggle
bindsym XF86AudioMicMute exec --no-startup-id ~/bin/pactl_helper micmute toggle
bindsym F13 exec --no-startup-id ~/bin/pactl_helper micmute toggle
# Screen brightness controls # Screen brightness controls
bindsym XF86MonBrightnessUp exec --no-startup-id xbacklight -inc 10 bindsym XF86MonBrightnessUp exec --no-startup-id xbacklight -inc 10
bindsym XF86MonBrightnessDown exec --no-startup-id xbacklight -dec 10 bindsym XF86MonBrightnessDown exec --no-startup-id xbacklight -dec 10
# screenshots # screenshots
set $scrotformat %F-%T.png # region/selection
set $screendir ~/Pictures/Screenshots
# whole screen
bindsym --release Print exec --no-startup-id \ bindsym --release Print exec --no-startup-id \
mkdir -p $screendir && \ ~/bin/screenshot.sh region
/usr/bin/scrot $screendir/$scrotformat # full screen
# current window
bindsym --release Shift+Print exec --no-startup-id \ bindsym --release Shift+Print exec --no-startup-id \
mkdir -p $screendir && \ ~/bin/screenshot.sh full
/usr/bin/scrot -u $screendir/$scrotformat # single window
# selection
bindsym --release $alt+Sys_Req exec --no-startup-id \ bindsym --release $alt+Sys_Req exec --no-startup-id \
mkdir -p $screendir && \ ~/bin/screenshot.sh window
/usr/bin/scrot -s $screendir/$scrotformat
# useful utilities # useful utilities
exec --no-startup-id \
(which xss-lock >/dev/null || /usr/bin/cinnamon-settings-daemon) &
exec --no-startup-id gnome-keyring-daemon --start --components=pkcs11,secrets exec --no-startup-id gnome-keyring-daemon --start --components=pkcs11,secrets
# Make GTK fonts look great again
exec --no-startup-id gnome-settings-daemon
exec --no-startup-id (sleep 2; nm-applet) &
exec --no-startup-id xset r rate 200 20 exec --no-startup-id xset r rate 200 20
exec --no-startup-id ~/bin/autostart.py #exec --no-startup-id ~/bin/autostart.py
exec --no-startup-id dex --autostart --environment x-cinnamon exec --no-startup-id dex --autostart --environment x-cinnamon
# Solaar for mouse
exec --no-startup-id sh -c 'command solaar -w hide || true'
# customize windows # customize windows
for_window [window_role="pop-up"] floating enable for_window [window_role="pop-up"] floating enable

View File

@@ -45,6 +45,17 @@ function wireless {
} }
function wired { function wired {
local def_iface="$(ip route get 1.1.1.1 2>&1 | grep -oP 'dev \K\S+')"
if test -n "${def_iface}" ; then
cat <<-EOF
ethernet "${def_iface}" {
format_up = "E: %ip"
format_down = "E: down"
}
order += "ethernet ${def_iface}"
EOF
return 0
fi
cat <<-EOF cat <<-EOF
ethernet _first_ { ethernet _first_ {
format_up = "E: %ip" format_up = "E: %ip"

View File

@@ -0,0 +1,20 @@
[settings]
experimental = true
[settings.pipx]
uvx = true
[settings.python]
uv_venv_auto = true
[tools]
age = "latest"
age-plugin-yubikey = "latest"
usage = "latest"
uv = "latest"
[hooks]
postinstall = "mise sync python --uv"
[env]
UV_PROJECT_ENVIRONMENT = { value='{% if env.PROJECT_SLUG %}{{ env.HOME}}/.cache/uv-venvs/{{ env.PROJECT_SLUG }}{% endif %}', tools = true }

View File

@@ -0,0 +1,4 @@
" nvim config
set runtimepath^=~/.vim runtimepath+=~/.vim/after
let &packpath = &runtimepath
source ~/.vimrc

View File

@@ -0,0 +1,53 @@
"$schema" = 'https://starship.rs/config-schema.json'
[directory]
fish_style_pwd_dir_length = 1
truncate_to_repo = false
[gcloud]
symbol = "️🇬️ "
format = "on [$symbol$project]($style) "
detect_env_vars = ["STARSHIP_SHOW_GCLOUD"]
[status]
disabled = false
symbol = "⛌"
[username]
show_always = true
[ruby]
detect_variables = []
[shell]
fish_indicator = '🐟 '
zsh_indicator = ''
bash_indicator = ''
powershell_indicator = '_'
unknown_indicator = '??'
style = 'cyan bold'
disabled = false
format = '[$indicator]($style)'
[pulumi]
disabled = true
[docker_context]
# really long paths when DOCKER_HOST is set
disabled = true
[kubernetes]
disabled = false
detect_folders = ["k8s"]
[custom.gemini_context]
description = "Displays the current Gemini CLI context"
when = "test -n \"$GEMINI_CLI_HOME\""
command = """
context_dir=\"${XDG_CONFIG_HOME:-$HOME/.config}/gemini\"
if [[ \"$GEMINI_CLI_HOME\" == $context_dir/* ]]; then
basename \"$GEMINI_CLI_HOME\"
fi
"""
style = "bold blue"
format = "♊[$output](blue) "

View File

@@ -0,0 +1,15 @@
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/"
XDG_PUBLICSHARE_DIR="$HOME/Shared"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"

View File

@@ -0,0 +1,181 @@
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0-- https://wezfurlong.org/wezterm/config/files.html
-- https://alexplescan.com/posts/2024/08/10/wezterm/
-- https://github.com/wez/wezterm/issues/6112
-- https://github.com/wez/wezterm/issues/5754
local wezterm = require "wezterm"
local config = wezterm.config_builder()
local action = wezterm.action
local mux = wezterm.mux
config.audible_bell = "Disabled"
config.check_for_updates = false -- managed by brew
config.set_environment_variables = {
PATH = '/opt/homebrew/bin:/usr/local/bin/:' .. os.getenv('PATH')
}
local function scheme_for_appearance(a)
return a:find("Dark") and "Catppuccin Macchiato" or "Catppuccin Latte"
end
config.font = wezterm.font { family = 'JetBrains Mono', weight = 'Medium', harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' } }
config.font_size = 15.0
config.line_height = 1.0
config.bold_brightens_ansi_colors = true
config.color_scheme = scheme_for_appearance(wezterm.gui.get_appearance())
config.macos_window_background_blur = 20
config.window_background_opacity = 0.96
config.window_decorations = 'RESIZE|INTEGRATED_BUTTONS'
config.window_padding = { left = '0.5cell', right = '0.5cell', top = '1.5cell', bottom = '0.5cell' }
config.enable_tab_bar = true
config.use_fancy_tab_bar = false
config.tab_bar_at_bottom = true
config.tab_max_width = 32
config.show_new_tab_button_in_tab_bar = false
-- config.hide_tab_bar_if_only_one_tab = true -- sometimes procude wrong window size on maximize
config.default_cursor_style = 'BlinkingBar'
config.animation_fps = 1
config.cursor_blink_rate = 500
config.prefer_egl = true
config.max_fps = 60
config.enable_scroll_bar = true
config.scrollback_lines = 10000
-- makes wezterm to work like tmux; see also: https://bower.sh/zmx-session-persistence
config.default_gui_startup_args = { 'connect', 'unix' }
config.window_close_confirmation = 'NeverPrompt'
local function maximize_window(window)
if not window.gui_window then return end
local screen = wezterm.gui.screens().active
local guiwin = window:gui_window()
if not screen or not guiwin then return end
-- window:gui_window():maximize() -- have long animation
guiwin:set_position(screen.x, screen.y)
guiwin:set_inner_size(screen.width, screen.height)
end
-- https://github.com/wez/wezterm/issues/3299#issuecomment-2145712082
wezterm.on("gui-startup", function(cmd)
local tab, pane, window = mux.spawn_window(cmd or {})
maximize_window(window)
end)
wezterm.on("gui-attached", function(window)
local workspace = mux.get_active_workspace()
for _, window in ipairs(mux.all_windows()) do
if window:get_workspace() == workspace then
maximize_window(window)
end
end
end)
wezterm.on("window-resized", function(window, pane)
maximize_window(window)
end)
-- see also https://wezterm.org/config/lua/wezterm/battery_info.html
wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width)
local title = (tab.tab_title ~= "" and tab.tab_title) or tab.active_pane.title
title = title:lower()
local prefix = tostring(tab.tab_index + 1) .. ":"
local width = math.max(1, max_width - (#prefix + 2))
title = wezterm.truncate_right(title, width)
return " " .. prefix .. title .. " "
end)
-- https://github.com/wezterm/wezterm/issues/1988#issuecomment-2462216249
local function search_cmd(window, pane)
window:perform_action(action.Search 'CurrentSelectionOrEmptyString', pane)
window:perform_action(action.Multiple {
action.CopyMode 'ClearPattern',
action.CopyMode 'ClearSelectionMode',
action.CopyMode 'MoveToScrollbackBottom'
}, pane)
end
config.keys = {
{ key = 'q', mods = 'CMD', action = wezterm.action.Nop }, -- prevent accidental quit
{ key = 't', mods = 'CMD', action = action.SpawnTab 'CurrentPaneDomain' },
{ key = 'd', mods = 'CMD', action = action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
{ key = 'd', mods = 'CMD|SHIFT', action = action.SplitVertical { domain = 'CurrentPaneDomain' } },
{ key = 'k', mods = 'CMD', action = action.ClearScrollback 'ScrollbackAndViewport' },
{ key = 'w', mods = 'CMD', action = action.CloseCurrentPane { confirm
100 6869 100 6869 0 0 42178 0 --:--:-- --:--:-- --:--:-- 42401
= false } },
{ key = 'w', mods = 'CMD|SHIFT', action = action.CloseCurrentTab { confirm = false } },
{ key = 'a', mods = 'CMD', action = action.SelectTextAtMouseCursor 'SemanticZone', },
{ key = 'LeftArrow', mods = 'CMD', action = action.SendKey { key = 'Home' } },
{ key = 'RightArrow', mods = 'CMD', action = action.SendKey { key = 'End' } },
{ key = 'Backspace', mods = 'CMD', action = action.SendKey({ mods = "CTRL", key = "u" }) },
{ key = 'Backspace', mods = 'OPT', action = action.SendKey({ mods = "CTRL", key = "w" }) },
{ key = 'P', mods = 'CMD|SHIFT', action = action.ActivateCommandPalette },
{ key = 'f', mods = 'CMD', action = wezterm.action_callback(search_cmd) },
{ key = ',', mods = 'CMD', action = action.SpawnCommandInNewTab { cwd = wezterm.home_dir, args = { 'code', wezterm.config_file } } },
{ key = 'E', mods = 'CMD|SHIFT', action = action.PromptInputLine {
description = 'Enter tab title (empty to unset):',
action = wezterm.action_callback(function(window, _, line)
window:active_tab():set_title(line)
end),
}},
}
config.mouse_bindings = {
{ event = { Up = { streak = 1, button = "Left" } }, mods = "NONE", action = action.Nop },
{ event = { Up = { streak = 1, button = "Left" } }, mods = "CMD", action = action.OpenLinkAtMouseCursor },
-- Disable CMD + LeftClick window drag (make it behave like normal select)
-- { event = { Drag = { streak = 1, button = 'Left' } }, mods = "CMD", action = action.Nop },
{ event = { Drag = { streak = 1, button = "Left" } }, mods = "CMD", action = action.ExtendSelectionToMouseCursor("Cell") },
}
-- https://code.visualstudio.com/docs/configure/command-line#_opening-vs-code-with-urls
-- path-symbols: [\w@\.\/\-\[\]\(\)]
local function path_exists(path)
local ok, _, _ = wezterm.run_child_process { "test", "-e", path }
return ok
end
config.hyperlink_rules = wezterm.default_hyperlink_rules()
-- config.hyperlink_rules = {}
table.insert(config.hyperlink_rules, {
regex = [[((?:[\w@\.\/\-\[\]\(\)]+\/)+[\w@\.\/\-\[\]\(\)]+\.\w+)\b]],
format = "vscode://file/$PWD/$1",
highlight = 1,
})
table.insert(config.hyperlink_rules, {
regex = [[((?:[\w@\.\/\-\[\]\(\)]+\/)+[\w@\.\/\-\[\]\(\)]+\.\w+):(\d+):(\d+)]],
format = "vscode://file/$PWD/$1:$2:$3",
highlight = 1,
})
wezterm.on("open-uri", function(window, pane, uri)
if uri:find("$PWD") then
local cwd_uri = pane:get_current_working_dir()
local before, after = uri:match("^(.-)$PWD/(.+)$")
wezterm.log_info(before, after, path_exists(after))
if path_exists(after) then
uri = before .. after
else
uri = uri:gsub("$PWD", cwd_uri.file_path)
end
wezterm.log_info(uri)
wezterm.open_with(uri)
return false
end
return true
end)

View File

@@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfce4-keyboard-shortcuts" version="1.0">
<property name="commands" type="empty">
<property name="default" type="empty">
<property name="&lt;Alt&gt;F1" type="empty"/>
<property name="&lt;Alt&gt;F2" type="empty">
<property name="startup-notify" type="empty"/>
</property>
<property name="&lt;Alt&gt;F3" type="empty">
<property name="startup-notify" type="empty"/>
</property>
<property name="&lt;Primary&gt;&lt;Alt&gt;Delete" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;l" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;t" type="empty"/>
<property name="XF86Display" type="empty"/>
<property name="&lt;Super&gt;p" type="empty"/>
<property name="&lt;Primary&gt;Escape" type="empty"/>
<property name="XF86WWW" type="empty"/>
<property name="HomePage" type="empty"/>
<property name="XF86Mail" type="empty"/>
<property name="Print" type="empty"/>
<property name="&lt;Alt&gt;Print" type="empty"/>
<property name="&lt;Shift&gt;Print" type="empty"/>
<property name="&lt;Super&gt;e" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;f" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Escape" type="empty"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;Escape" type="empty"/>
<property name="&lt;Super&gt;r" type="empty">
<property name="startup-notify" type="empty"/>
</property>
<property name="&lt;Alt&gt;&lt;Super&gt;s" type="empty"/>
</property>
<property name="custom" type="empty">
<property name="&lt;Alt&gt;F2" type="string" value="xfce4-appfinder --collapsed">
<property name="startup-notify" type="bool" value="true"/>
</property>
<property name="&lt;Super&gt;r" type="string" value="xfce4-appfinder -c">
<property name="startup-notify" type="bool" value="true"/>
</property>
<property name="XF86WWW" type="string" value="exo-open --launch WebBrowser"/>
<property name="XF86Mail" type="string" value="exo-open --launch MailReader"/>
<property name="&lt;Alt&gt;F3" type="string" value="xfce4-appfinder">
<property name="startup-notify" type="bool" value="true"/>
</property>
<property name="&lt;Primary&gt;Escape" type="string" value="xfdesktop --menu"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Delete" type="string" value="xfce4-session-logout"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;t" type="string" value="exo-open --launch TerminalEmulator"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;f" type="string" value="thunar"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;l" type="string" value="xflock4"/>
<property name="&lt;Alt&gt;F1" type="string" value="xfce4-popup-applicationsmenu"/>
<property name="&lt;Super&gt;p" type="string" value="xfce4-display-settings --minimal"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;Escape" type="string" value="xfce4-taskmanager"/>
<property name="&lt;Super&gt;e" type="string" value="thunar"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Escape" type="string" value="xkill"/>
<property name="HomePage" type="string" value="exo-open --launch WebBrowser"/>
<property name="XF86Display" type="string" value="xfce4-display-settings --minimal"/>
<property name="override" type="bool" value="true"/>
<property name="&lt;Super&gt;l" type="string" value="xflock4"/>
<property name="Print" type="string" value="flameshot gui"/>
<property name="&lt;Shift&gt;Print" type="string" value="flameshot full"/>
</property>
</property>
<property name="xfwm4" type="empty">
<property name="default" type="empty">
<property name="&lt;Alt&gt;Insert" type="empty"/>
<property name="Escape" type="empty"/>
<property name="Left" type="empty"/>
<property name="Right" type="empty"/>
<property name="Up" type="empty"/>
<property name="Down" type="empty"/>
<property name="&lt;Alt&gt;Tab" type="empty"/>
<property name="&lt;Alt&gt;&lt;Shift&gt;Tab" type="empty"/>
<property name="&lt;Alt&gt;Delete" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Down" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Left" type="empty"/>
<property name="&lt;Shift&gt;&lt;Alt&gt;Page_Down" type="empty"/>
<property name="&lt;Alt&gt;F4" type="empty"/>
<property name="&lt;Alt&gt;F6" type="empty"/>
<property name="&lt;Alt&gt;F7" type="empty"/>
<property name="&lt;Alt&gt;F8" type="empty"/>
<property name="&lt;Alt&gt;F9" type="empty"/>
<property name="&lt;Alt&gt;F10" type="empty"/>
<property name="&lt;Alt&gt;F11" type="empty"/>
<property name="&lt;Alt&gt;F12" type="empty"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;&lt;Alt&gt;Left" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;End" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Home" type="empty"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;&lt;Alt&gt;Right" type="empty"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;&lt;Alt&gt;Up" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_1" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_2" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_3" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_4" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_5" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_6" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_7" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_8" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_9" type="empty"/>
<property name="&lt;Alt&gt;space" type="empty"/>
<property name="&lt;Shift&gt;&lt;Alt&gt;Page_Up" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Right" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;d" type="empty"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Up" type="empty"/>
<property name="&lt;Super&gt;Tab" type="empty"/>
<property name="&lt;Primary&gt;F1" type="empty"/>
<property name="&lt;Primary&gt;F2" type="empty"/>
<property name="&lt;Primary&gt;F3" type="empty"/>
<property name="&lt;Primary&gt;F4" type="empty"/>
<property name="&lt;Primary&gt;F5" type="empty"/>
<property name="&lt;Primary&gt;F6" type="empty"/>
<property name="&lt;Primary&gt;F7" type="empty"/>
<property name="&lt;Primary&gt;F8" type="empty"/>
<property name="&lt;Primary&gt;F9" type="empty"/>
<property name="&lt;Primary&gt;F10" type="empty"/>
<property name="&lt;Primary&gt;F11" type="empty"/>
<property name="&lt;Primary&gt;F12" type="empty"/>
<property name="&lt;Super&gt;KP_Left" type="empty"/>
<property name="&lt;Super&gt;KP_Right" type="empty"/>
<property name="&lt;Super&gt;KP_Down" type="empty"/>
<property name="&lt;Super&gt;KP_Up" type="empty"/>
<property name="&lt;Super&gt;KP_Page_Up" type="empty"/>
<property name="&lt;Super&gt;KP_Home" type="empty"/>
<property name="&lt;Super&gt;KP_End" type="empty"/>
<property name="&lt;Super&gt;KP_Next" type="empty"/>
</property>
<property name="custom" type="empty">
<property name="&lt;Primary&gt;F12" type="string" value="workspace_12_key"/>
<property name="&lt;Alt&gt;F4" type="string" value="close_window_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_3" type="string" value="move_window_workspace_3_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Down" type="string" value="down_workspace_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_9" type="string" value="move_window_workspace_9_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;End" type="string" value="move_window_next_workspace_key"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;&lt;Alt&gt;Left" type="string" value="move_window_left_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_4" type="string" value="move_window_workspace_4_key"/>
<property name="Right" type="string" value="right_key"/>
<property name="Down" type="string" value="down_key"/>
<property name="&lt;Shift&gt;&lt;Alt&gt;Page_Down" type="string" value="lower_window_key"/>
<property name="&lt;Alt&gt;Tab" type="string" value="cycle_windows_key"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;&lt;Alt&gt;Right" type="string" value="move_window_right_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Right" type="string" value="right_workspace_key"/>
<property name="&lt;Alt&gt;F6" type="string" value="stick_window_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_5" type="string" value="move_window_workspace_5_key"/>
<property name="&lt;Primary&gt;F11" type="string" value="workspace_11_key"/>
<property name="&lt;Alt&gt;F10" type="string" value="maximize_window_key"/>
<property name="&lt;Alt&gt;Delete" type="string" value="del_workspace_key"/>
<property name="&lt;Super&gt;Tab" type="string" value="switch_window_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;d" type="string" value="show_desktop_key"/>
<property name="&lt;Super&gt;KP_Page_Up" type="string" value="tile_up_right_key"/>
<property name="&lt;Alt&gt;F7" type="string" value="move_window_key"/>
<property name="Up" type="string" value="up_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_6" type="string" value="move_window_workspace_6_key"/>
<property name="&lt;Alt&gt;F11" type="string" value="fullscreen_key"/>
<property name="&lt;Alt&gt;space" type="string" value="popup_menu_key"/>
<property name="&lt;Super&gt;KP_Home" type="string" value="tile_up_left_key"/>
<property name="Escape" type="string" value="cancel_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_1" type="string" value="move_window_workspace_1_key"/>
<property name="&lt;Shift&gt;&lt;Alt&gt;Page_Up" type="string" value="raise_window_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Home" type="string" value="move_window_prev_workspace_key"/>
<property name="&lt;Alt&gt;&lt;Shift&gt;Tab" type="string" value="cycle_reverse_windows_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Left" type="string" value="left_workspace_key"/>
<property name="&lt;Alt&gt;F12" type="string" value="above_key"/>
<property name="&lt;Primary&gt;&lt;Shift&gt;&lt;Alt&gt;Up" type="string" value="move_window_up_key"/>
<property name="&lt;Alt&gt;F8" type="string" value="resize_window_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_7" type="string" value="move_window_workspace_7_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_2" type="string" value="move_window_workspace_2_key"/>
<property name="&lt;Super&gt;KP_End" type="string" value="tile_down_left_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;Up" type="string" value="up_workspace_key"/>
<property name="&lt;Alt&gt;F9" type="string" value="hide_window_key"/>
<property name="Left" type="string" value="left_key"/>
<property name="&lt;Primary&gt;&lt;Alt&gt;KP_8" type="string" value="move_window_workspace_8_key"/>
<property name="&lt;Alt&gt;Insert" type="string" value="add_workspace_key"/>
<property name="override" type="bool" value="true"/>
<property name="&lt;Super&gt;1" type="string" value="workspace_1_key"/>
<property name="&lt;Super&gt;2" type="string" value="workspace_2_key"/>
<property name="&lt;Super&gt;3" type="string" value="workspace_3_key"/>
<property name="&lt;Super&gt;4" type="string" value="workspace_4_key"/>
<property name="&lt;Super&gt;5" type="string" value="workspace_5_key"/>
<property name="&lt;Super&gt;6" type="string" value="workspace_6_key"/>
<property name="&lt;Super&gt;7" type="string" value="workspace_7_key"/>
<property name="&lt;Super&gt;8" type="string" value="workspace_8_key"/>
<property name="&lt;Super&gt;9" type="string" value="workspace_9_key"/>
<property name="&lt;Super&gt;0" type="string" value="workspace_10_key"/>
<property name="&lt;Super&gt;Left" type="string" value="tile_left_key"/>
<property name="&lt;Super&gt;Right" type="string" value="tile_right_key"/>
<property name="&lt;Super&gt;Up" type="string" value="tile_down_key"/>
<property name="&lt;Super&gt;Down" type="string" value="tile_up_key"/>
<property name="&lt;Super&gt;Page_Down" type="string" value="tile_down_right_key"/>
</property>
</property>
<property name="providers" type="array">
<value type="string" value="xfwm4"/>
<value type="string" value="commands"/>
</property>
</channel>

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<channel name="xfwm4" version="1.0">
<property name="general" type="empty">
<property name="activate_action" type="string" value="switch"/>
<property name="borderless_maximize" type="bool" value="true"/>
<property name="box_move" type="bool" value="false"/>
<property name="box_resize" type="bool" value="false"/>
<property name="button_layout" type="string" value="O|SHMC"/>
<property name="button_offset" type="int" value="0"/>
<property name="button_spacing" type="int" value="0"/>
<property name="click_to_focus" type="bool" value="false"/>
<property name="cycle_apps_only" type="bool" value="false"/>
<property name="cycle_draw_frame" type="bool" value="true"/>
<property name="cycle_raise" type="bool" value="false"/>
<property name="cycle_hidden" type="bool" value="true"/>
<property name="cycle_minimum" type="bool" value="true"/>
<property name="cycle_minimized" type="bool" value="false"/>
<property name="cycle_preview" type="bool" value="true"/>
<property name="cycle_tabwin_mode" type="int" value="0"/>
<property name="cycle_workspaces" type="bool" value="false"/>
<property name="double_click_action" type="string" value="maximize"/>
<property name="double_click_distance" type="int" value="5"/>
<property name="double_click_time" type="int" value="250"/>
<property name="easy_click" type="string" value="Alt"/>
<property name="focus_delay" type="int" value="316"/>
<property name="focus_hint" type="bool" value="true"/>
<property name="focus_new" type="bool" value="true"/>
<property name="frame_opacity" type="int" value="100"/>
<property name="frame_border_top" type="int" value="0"/>
<property name="full_width_title" type="bool" value="true"/>
<property name="horiz_scroll_opacity" type="bool" value="false"/>
<property name="inactive_opacity" type="int" value="100"/>
<property name="maximized_offset" type="int" value="0"/>
<property name="mousewheel_rollup" type="bool" value="true"/>
<property name="move_opacity" type="int" value="100"/>
<property name="placement_mode" type="string" value="center"/>
<property name="placement_ratio" type="int" value="20"/>
<property name="popup_opacity" type="int" value="100"/>
<property name="prevent_focus_stealing" type="bool" value="false"/>
<property name="raise_delay" type="int" value="250"/>
<property name="raise_on_click" type="bool" value="true"/>
<property name="raise_on_focus" type="bool" value="false"/>
<property name="raise_with_any_button" type="bool" value="true"/>
<property name="repeat_urgent_blink" type="bool" value="false"/>
<property name="resize_opacity" type="int" value="100"/>
<property name="scroll_workspaces" type="bool" value="true"/>
<property name="shadow_delta_height" type="int" value="0"/>
<property name="shadow_delta_width" type="int" value="0"/>
<property name="shadow_delta_x" type="int" value="0"/>
<property name="shadow_delta_y" type="int" value="-3"/>
<property name="shadow_opacity" type="int" value="50"/>
<property name="show_app_icon" type="bool" value="false"/>
<property name="show_dock_shadow" type="bool" value="true"/>
<property name="show_frame_shadow" type="bool" value="true"/>
<property name="show_popup_shadow" type="bool" value="false"/>
<property name="snap_resist" type="bool" value="false"/>
<property name="snap_to_border" type="bool" value="true"/>
<property name="snap_to_windows" type="bool" value="false"/>
<property name="snap_width" type="int" value="10"/>
<property name="vblank_mode" type="string" value="auto"/>
<property name="theme" type="string" value="Default"/>
<property name="tile_on_move" type="bool" value="true"/>
<property name="title_alignment" type="string" value="center"/>
<property name="title_font" type="string" value="Sans Bold 9"/>
<property name="title_horizontal_offset" type="int" value="0"/>
<property name="titleless_maximize" type="bool" value="false"/>
<property name="title_shadow_active" type="string" value="false"/>
<property name="title_shadow_inactive" type="string" value="false"/>
<property name="title_vertical_offset_active" type="int" value="0"/>
<property name="title_vertical_offset_inactive" type="int" value="0"/>
<property name="toggle_workspaces" type="bool" value="false"/>
<property name="unredirect_overlays" type="bool" value="true"/>
<property name="urgent_blink" type="bool" value="false"/>
<property name="use_compositing" type="bool" value="true"/>
<property name="workspace_count" type="int" value="6"/>
<property name="wrap_cycle" type="bool" value="true"/>
<property name="wrap_layout" type="bool" value="true"/>
<property name="wrap_resistance" type="int" value="10"/>
<property name="wrap_windows" type="bool" value="false"/>
<property name="wrap_workspaces" type="bool" value="false"/>
<property name="zoom_desktop" type="bool" value="true"/>
<property name="zoom_pointer" type="bool" value="true"/>
<property name="workspace_names" type="array">
<value type="string" value="Workspace 1"/>
<value type="string" value="Workspace 2"/>
<value type="string" value="Workspace 3"/>
<value type="string" value="Workspace 4"/>
<value type="string" value="Workspace 5"/>
<value type="string" value="Workspace 6"/>
</property>
</property>
</channel>

View File

@@ -0,0 +1,6 @@
def Settings( **kwargs ):
client_data = kwargs[ 'client_data' ]
return {
'interpreter_path': client_data[ 'g:ycm_python_interpreter_path' ] or '/usr/bin/python3',
'sys_path': client_data[ 'g:ycm_python_sys_path' ]
}

View File

@@ -1,16 +1,51 @@
# Exact Solarized Dark color theme for the color GNU ls utility.
# Dark 256 color solarized theme for the color GNU ls utility. # Designed for dircolors (GNU coreutils) 5.97
# Used and tested with dircolors (GNU coreutils) 8.5
# #
# @author {@link http://sebastian.tramp.name Sebastian Tramp} # This simple theme was simultaneously designed for these terminal color schemes:
# @license http://sam.zoy.org/wtfpl/ Do What The Fuck You Want To Public License (WTFPL) # - Solarized dark (best)
# - Solarized light
# - default dark
# - default light
# with a slight optimization for Solarized Dark.
# #
# More Information at # How the colors were selected:
# https://github.com/seebi/dircolors-solarized # - Terminal emulators often have an option typically enabled by default that makes
# bold a different color. It is important to leave this option enabled so that
# you can access the entire 16-color Solarized palette, and not just 8 colors.
# - We favor universality over a greater number of colors. So we limit the number
# of colors so that this theme will work out of the box in all terminals,
# Solarized or not, dark or light.
# - We choose to have the following category of files:
# NORMAL & FILE, DIR, LINK, EXEC and
# editable text including source, unimportant text, binary docs & multimedia source
# files, viewable multimedia, archived/compressed, and unimportant non-text
# - For uniqueness, we stay away from the Solarized foreground colors are -- either
# base00 (brightyellow) or base0 (brightblue). However, they can be used if
# you know what the bg/fg colors of your terminal are, in order to optimize the display.
# - 3 different options are provided: universal, solarized dark, and solarized light.
# The only difference between the universal scheme and one that's optimized for
# dark/light is the color of "unimportant" files, which should blend more with the
# background
# - We note that blue is the hardest color to see on dark bg and yellow is the hardest
# color to see on light bg (with blue being particularly bad). So we choose yellow
# for multimedia files which are usually accessed in a GUI folder browser anyway.
# And blue is kept for custom use of this scheme's user.
# - See table below to see the assignments.
# Term Section
TERM Eterm # Installation instructions:
# This file goes in the /etc directory, and must be world readable.
# You can copy this file to .dir_colors in your $HOME directory to override
# the system defaults.
# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not
# pipes. 'all' adds color characters to all output. 'none' shuts colorization
# off.
COLOR tty
# Below, there should be one TERM entry for each termtype that is colorizable
TERM ansi TERM ansi
TERM color_xterm
TERM color-xterm TERM color-xterm
TERM con132x25 TERM con132x25
TERM con132x30 TERM con132x30
@@ -28,6 +63,7 @@ TERM cygwin
TERM dtterm TERM dtterm
TERM dvtm TERM dvtm
TERM dvtm-256color TERM dvtm-256color
TERM Eterm
TERM eterm-color TERM eterm-color
TERM fbterm TERM fbterm
TERM gnome TERM gnome
@@ -40,6 +76,7 @@ TERM linux
TERM linux-c TERM linux-c
TERM mach-color TERM mach-color
TERM mlterm TERM mlterm
TERM nxterm
TERM putty TERM putty
TERM putty-256color TERM putty-256color
TERM rxvt TERM rxvt
@@ -63,12 +100,16 @@ TERM screen-bce
TERM screen-w TERM screen-w
TERM screen.linux TERM screen.linux
TERM screen.xterm-256color TERM screen.xterm-256color
TERM screen.xterm-new
TERM st TERM st
TERM st-meta TERM st-meta
TERM st-256color TERM st-256color
TERM st-meta-256color TERM st-meta-256color
TERM tmux
TERM tmux-256color
TERM vt100 TERM vt100
TERM xterm TERM xterm
TERM xterm-new
TERM xterm-16color TERM xterm-16color
TERM xterm-256color TERM xterm-256color
TERM xterm-256color-italic TERM xterm-256color-italic
@@ -77,12 +118,13 @@ TERM xterm-color
TERM xterm-debian TERM xterm-debian
TERM xterm-termite TERM xterm-termite
## Documentation # EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output)
# EIGHTBIT 1
# standard colors
# #############################################################################
# Below are the color init strings for the basic file types. A color init # Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes: # string consists of one or more of the following numeric codes:
#
# Attribute codes: # Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes: # Text color codes:
@@ -90,206 +132,349 @@ TERM xterm-termite
# Background color codes: # Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
# #
# # NOTES:
# 256 color support # - See http://www.oreilly.com/catalog/wdnut/excerpt/color_names.html
# see here: http://www.mail-archive.com/bug-coreutils@gnu.org/msg11030.html) # - Color combinations
# # ANSI Color code Solarized Notes Universal SolDark SolLight
# Text 256 color coding: # ~~~~~~~~~~~~~~~ ~~~~~~~~~ ~~~~~ ~~~~~~~~~ ~~~~~~~ ~~~~~~~~
# 38;5;COLOR_NUMBER # 00 none NORMAL, FILE <SAME> <SAME>
# Background 256 color coding: # 30 black base02
# 48;5;COLOR_NUMBER # 01;30 bright black base03 bg of SolDark
# 31 red red docs & mm src <SAME> <SAME>
## Special files # 01;31 bright red orange EXEC <SAME> <SAME>
# 32 green green editable text <SAME> <SAME>
NORMAL 00;38;5;244 # no color code at all # 01;32 bright green base01 unimportant text <SAME>
#FILE 00 # regular file: use no color at all # 33 yellow yellow unclear in light bg multimedia <SAME> <SAME>
RESET 0 # reset to "normal" color # 01;33 bright yellow base00 fg of SolLight unimportant non-text
DIR 00;38;5;33 # directory 01;34 # 34 blue blue unclear in dark bg user customized <SAME> <SAME>
LINK 00;38;5;37 # symbolic link. (If you set this to 'target' instead of a # 01;34 bright blue base0 fg in SolDark unimportant text
# numerical value, the color is as for the file pointed to.) # 35 magenta magenta LINK <SAME> <SAME>
MULTIHARDLINK 00 # regular file with more than one link # 01;35 bright magenta violet archive/compressed <SAME> <SAME>
FIFO 48;5;230;38;5;136;01 # pipe # 36 cyan cyan DIR <SAME> <SAME>
SOCK 48;5;230;38;5;136;01 # socket # 01;36 bright cyan base1 unimportant non-text <SAME>
DOOR 48;5;230;38;5;136;01 # door # 37 white base2
BLK 48;5;230;38;5;244;01 # block device driver # 01;37 bright white base3 bg in SolLight
CHR 48;5;230;38;5;244;01 # character device driver # 05;37;41 unclear in Putty dark
ORPHAN 48;5;235;38;5;160 # symlink to nonexistent file, or non-stat'able file
SETUID 48;5;160;38;5;230 # file that is setuid (u+s)
SETGID 48;5;136;38;5;230 # file that is setgid (g+s)
CAPABILITY 30;41 # file with capability
STICKY_OTHER_WRITABLE 48;5;64;38;5;230 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 48;5;235;38;5;33 # dir that is other-writable (o+w) and not sticky
STICKY 48;5;33;38;5;230 # dir with the sticky bit set (+t) and not other-writable
# This is for files with execute permission:
EXEC 00;38;5;64
## Archives or compressed (violet + bold for compression)
.tar 00;38;5;61
.tgz 00;38;5;61
.arj 00;38;5;61
.taz 00;38;5;61
.lzh 00;38;5;61
.lzma 00;38;5;61
.tlz 00;38;5;61
.txz 00;38;5;61
.zip 00;38;5;61
.z 00;38;5;61
.Z 00;38;5;61
.dz 00;38;5;61
.gz 00;38;5;61
.lz 00;38;5;61
.xz 00;38;5;61
.bz2 00;38;5;61
.bz 00;38;5;61
.tbz 00;38;5;61
.tbz2 00;38;5;61
.tz 00;38;5;61
.deb 00;38;5;61
.rpm 00;38;5;61
.jar 00;38;5;61
.rar 00;38;5;61
.ace 00;38;5;61
.zoo 00;38;5;61
.cpio 00;38;5;61
.7z 00;38;5;61
.rz 00;38;5;61
.apk 00;38;5;61
.gem 00;38;5;61
# Image formats (yellow)
.jpg 00;38;5;136
.JPG 00;38;5;136 #stupid but needed
.jpeg 00;38;5;136
.gif 00;38;5;136
.bmp 00;38;5;136
.pbm 00;38;5;136
.pgm 00;38;5;136
.ppm 00;38;5;136
.tga 00;38;5;136
.xbm 00;38;5;136
.xpm 00;38;5;136
.tif 00;38;5;136
.tiff 00;38;5;136
.png 00;38;5;136
.PNG 00;38;5;136
.svg 00;38;5;136
.svgz 00;38;5;136
.mng 00;38;5;136
.pcx 00;38;5;136
.dl 00;38;5;136
.xcf 00;38;5;136
.xwd 00;38;5;136
.yuv 00;38;5;136
.cgm 00;38;5;136
.emf 00;38;5;136
.eps 00;38;5;136
.CR2 00;38;5;136
.ico 00;38;5;136
# Files of special interest (base1)
.tex 00;38;5;245
.rdf 00;38;5;245
.owl 00;38;5;245
.n3 00;38;5;245
.ttl 00;38;5;245
.nt 00;38;5;245
.torrent 00;38;5;245
.xml 00;38;5;245
*Makefile 00;38;5;245
*Rakefile 00;38;5;245
*Dockerfile 00;38;5;245
*build.xml 00;38;5;245
*rc 00;38;5;245
*1 00;38;5;245
.nfo 00;38;5;245
*README 00;38;5;245
*README.txt 00;38;5;245
*readme.txt 00;38;5;245
.md 00;38;5;245
*README.markdown 00;38;5;245
.ini 00;38;5;245
.yml 00;38;5;245
.cfg 00;38;5;245
.conf 00;38;5;245
.c 00;38;5;245
.cpp 00;38;5;245
.cc 00;38;5;245
.sqlite 00;38;5;245
.go 00;38;5;245
.sql 00;38;5;245
# "unimportant" files as logs and backups (base01)
.log 00;38;5;240
.bak 00;38;5;240
.aux 00;38;5;240
.lof 00;38;5;240
.lol 00;38;5;240
.lot 00;38;5;240
.out 00;38;5;240
.toc 00;38;5;240
.bbl 00;38;5;240
.blg 00;38;5;240
*~ 00;38;5;240
*# 00;38;5;240
.part 00;38;5;240
.incomplete 00;38;5;240
.swp 00;38;5;240
.tmp 00;38;5;240
.temp 00;38;5;240
.o 00;38;5;240
.pyc 00;38;5;240
.class 00;38;5;240
.cache 00;38;5;240
# Audio formats (orange)
.aac 00;38;5;166
.au 00;38;5;166
.flac 00;38;5;166
.mid 00;38;5;166
.midi 00;38;5;166
.mka 00;38;5;166
.mp3 00;38;5;166
.mpc 00;38;5;166
.ogg 00;38;5;166
.ra 00;38;5;166
.wav 00;38;5;166
.m4a 00;38;5;166
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axa 00;38;5;166
.oga 00;38;5;166
.spx 00;38;5;166
.xspf 00;38;5;166
# Video formats (as audio + bold)
.mov 00;38;5;166
.MOV 00;38;5;166
.mpg 00;38;5;166
.mpeg 00;38;5;166
.m2v 00;38;5;166
.mkv 00;38;5;166
.ogm 00;38;5;166
.mp4 00;38;5;166
.m4v 00;38;5;166
.mp4v 00;38;5;166
.vob 00;38;5;166
.qt 00;38;5;166
.nuv 00;38;5;166
.wmv 00;38;5;166
.asf 00;38;5;166
.rm 00;38;5;166
.rmvb 00;38;5;166
.flc 00;38;5;166
.avi 00;38;5;166
.fli 00;38;5;166
.flv 00;38;5;166
.gl 00;38;5;166
.m2ts 00;38;5;166
.divx 00;38;5;166
.webm 00;38;5;166
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
.axv 00;38;5;166
.anx 00;38;5;166
.ogv 00;38;5;166
.ogx 00;38;5;166
### By file type
# global default
NORMAL 00
# normal file
FILE 00
# directory
DIR 34
# 777 directory
OTHER_WRITABLE 34;40
# symbolic link
LINK 35
# pipe, socket, block device, character device (blue bg)
FIFO 30;44
SOCK 35;44
DOOR 35;44 # Solaris 2.5 and later
BLK 33;44
CHR 37;44
#############################################################################
### By file attributes
# Orphaned symlinks (blinking white on red)
# Blink may or may not work (works on iTerm dark or light, and Putty dark)
ORPHAN 05;37;41
# ... and the files that orphaned symlinks point to (blinking white on red)
MISSING 05;37;41
# files with execute permission
EXEC 01;31 # Unix
.cmd 01;31 # Win
.exe 01;31 # Win
.com 01;31 # Win
.bat 01;31 # Win
.reg 01;31 # Win
.app 01;31 # OSX
#############################################################################
### By extension
# List any file extensions like '.gz' or '.tar' that you would like ls
# to colorize below. Put the extension, a space, and the color init string.
# (and any comments you want to add after a '#')
### Text formats
# Text that we can edit with a regular editor
.txt 32
.org 32
.md 32
.mkd 32
# Source text
.h 32
.hpp 32
.c 32
.C 32
.cc 32
.cpp 32
.cxx 32
.objc 32
.cl 32
.sh 32
.bash 32
.csh 32
.zsh 32
.el 32
.vim 32
.java 32
.pl 32
.pm 32
.py 32
.rb 32
.hs 32
.php 32
.htm 32
.html 32
.shtml 32
.erb 32
.haml 32
.xml 32
.rdf 32
.css 32
.sass 32
.scss 32
.less 32
.js 32
.coffee 32
.man 32
.0 32
.1 32
.2 32
.3 32
.4 32
.5 32
.6 32
.7 32
.8 32
.9 32
.l 32
.n 32
.p 32
.pod 32
.tex 32
.go 32
.sql 32
.csv 32
.sv 32
.svh 32
.v 32
.vh 32
.vhd 32
### Multimedia formats
# Image
.bmp 33
.cgm 33
.dl 33
.dvi 33
.emf 33
.eps 33
.gif 33
.jpeg 33
.jpg 33
.JPG 33
.mng 33
.pbm 33
.pcx 33
.pdf 33
.pgm 33
.png 33
.PNG 33
.ppm 33
.pps 33
.ppsx 33
.ps 33
.svg 33
.svgz 33
.tga 33
.tif 33
.tiff 33
.xbm 33
.xcf 33
.xpm 33
.xwd 33
.xwd 33
.yuv 33
# Audio
.aac 33
.au 33
.flac 33
.m4a 33
.mid 33
.midi 33
.mka 33
.mp3 33
.mpa 33
.mpeg 33
.mpg 33
.ogg 33
.opus 33
.ra 33
.wav 33
# Video
.anx 33
.asf 33
.avi 33
.axv 33
.flc 33
.fli 33
.flv 33
.gl 33
.m2v 33
.m4v 33
.mkv 33
.mov 33
.MOV 33
.mp4 33
.mp4v 33
.mpeg 33
.mpg 33
.nuv 33
.ogm 33
.ogv 33
.ogx 33
.qt 33
.rm 33
.rmvb 33
.swf 33
.vob 33
.webm 33
.wmv 33
### Misc
# Binary document formats and multimedia source
.doc 31
.docx 31
.rtf 31
.odt 31
.dot 31
.dotx 31
.ott 31
.xls 31
.xlsx 31
.ods 31
.ots 31
.ppt 31
.pptx 31
.odp 31
.otp 31
.fla 31
.psd 31
# Archives, compressed
.7z 1;35
.apk 1;35
.arj 1;35
.bin 1;35
.bz 1;35
.bz2 1;35
.cab 1;35 # Win
.deb 1;35
.dmg 1;35 # OSX
.gem 1;35
.gz 1;35
.iso 1;35
.jar 1;35
.msi 1;35 # Win
.rar 1;35
.rpm 1;35
.tar 1;35
.tbz 1;35
.tbz2 1;35
.tgz 1;35
.tx 1;35
.war 1;35
.xpi 1;35
.xz 1;35
.z 1;35
.Z 1;35
.zip 1;35
# For testing
.ANSI-30-black 30
.ANSI-01;30-brblack 01;30
.ANSI-31-red 31
.ANSI-01;31-brred 01;31
.ANSI-32-green 32
.ANSI-01;32-brgreen 01;32
.ANSI-33-yellow 33
.ANSI-01;33-bryellow 01;33
.ANSI-34-blue 34
.ANSI-01;34-brblue 01;34
.ANSI-35-magenta 35
.ANSI-01;35-brmagenta 01;35
.ANSI-36-cyan 36
.ANSI-01;36-brcyan 01;36
.ANSI-37-white 37
.ANSI-01;37-brwhite 01;37
#############################################################################
# Your customizations
# Unimportant text files
# For universal scheme, use brightgreen 01;32
# For optimal on light bg (but too prominent on dark bg), use white 01;34
.log 01;32
*~ 01;32
*# 01;32
#.log 01;34
#*~ 01;34
#*# 01;34
# Unimportant non-text files
# For universal scheme, use brightcyan 01;36
# For optimal on dark bg (but too prominent on light bg), change to 01;33
#.bak 01;36
#.BAK 01;36
#.old 01;36
#.OLD 01;36
#.org_archive 01;36
#.off 01;36
#.OFF 01;36
#.dist 01;36
#.DIST 01;36
#.orig 01;36
#.ORIG 01;36
#.swp 01;36
#.swo 01;36
#*,v 01;36
.bak 01;33
.BAK 01;33
.old 01;33
.OLD 01;33
.org_archive 01;33
.off 01;33
.OFF 01;33
.dist 01;33
.DIST 01;33
.orig 01;33
.ORIG 01;33
.swp 01;33
.swo 01;33
*,v 01;33
# The brightmagenta (Solarized: purple) color is free for you to use for your
# custom file type
.gpg 34
.gpg 34
.pgp 34
.asc 34
.3des 34
.aes 34
.enc 34
.sqlite 34

View File

@@ -1,62 +0,0 @@
# Sourced by zshrc as well as bash.
umask 027
ulimit -c unlimited
# Paths and preferences
export PYTHONPATH="$HOME/.python:$PYTHONPATH"
export GOPATH="$HOME/Projects/Go"
export PATH="$HOME/bin:/sbin:/usr/sbin:$PATH:$GOPATH/bin"
export VISUAL=vim
export EDITOR=vim
export DEBEMAIL="david@systemoverlord.com"
export DEBFULLNAME="David Tomaschik"
export LESS="-MR"
export QUOTING_STYLE="literal" # Coreutils quotes
# Fix gnome-terminal
if [ "$TERM" = "xterm" -a "$COLORTERM" = "gnome-terminal" ] ; then
export TERM="xterm-256color"
fi
# For virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'
# GPG full key id
export GPG_ID=7FD58D9A196DCEEEAD671F94F4D7A7915DEA789B
# Setup locale
if test -x /usr/bin/locale ; then
for l in en_US.UTF-8 C.UTF-8 C ; do
if /usr/bin/locale -a | grep -q "${l}" ; then
export LC_CTYPE=${l}
export LC_NUMERIC=${l}
export LC_TIME=${l}
export LC_MONETARY=${l}
export LC_MESSAGES=${l}
export LC_PAPER=${l}
export LC_NAME=${l}
export LC_ADDRESS=${l}
export LC_TELEPHONE=${l}
export LC_MEASUREMENT=${l}
export LC_IDENTIFICATION=${l}
break
fi
done
else
export LC_CTYPE=C
export LC_NUMERIC=C
export LC_TIME=C
export LC_MONETARY=C
export LC_MESSAGES=C
export LC_PAPER=C
export LC_NAME=C
export LC_ADDRESS=C
export LC_TELEPHONE=C
export LC_MEASUREMENT=C
export LC_IDENTIFICATION=C
fi
export LC_COLLATE=C
if [ -e $HOME/.localenv ] ; then source $HOME/.localenv ; fi

View File

@@ -26,10 +26,13 @@ end
python python
import sys import sys
import os.path import os.path
pwndbg = os.path.expanduser('~/.pwndbg/gdbinit.py') gef = os.path.expanduser('~/tools/gef/gef.py')
pwndbg = os.path.expanduser('~/tools/pwndbg/gdbinit.py')
peda = os.path.expanduser('~/.peda/peda.py') peda = os.path.expanduser('~/.peda/peda.py')
if os.path.isfile(pwndbg): if os.path.isfile(gef):
sys.path.insert(0, os.path.expanduser('~/.pwndbg/vendor')) gdb.execute('source {}'.format(gef))
elif os.path.isfile(pwndbg):
sys.path.insert(0, os.path.expanduser('~/tools/pwndbg/vendor'))
gdb.execute('source {}'.format(pwndbg)) gdb.execute('source {}'.format(pwndbg))
elif os.path.isfile(peda): elif os.path.isfile(peda):
gdb.execute('source {}'.format(peda)) gdb.execute('source {}'.format(peda))

125
dotfiles/gef.rc Normal file
View File

@@ -0,0 +1,125 @@
[context]
clear_screen = False
enable = True
grow_stack_down = False
ignore_registers =
layout = legend regs stack code args source memory threads trace extra
nb_lines_backtrace = 10
nb_lines_code = 6
nb_lines_code_prev = 3
nb_lines_stack = 8
nb_lines_threads = -1
peek_calls = True
peek_ret = True
redirect =
show_registers_raw = False
show_stack_raw = False
[dereference]
max_recursion = 7
[entry-break]
entrypoint_symbols = main _main __libc_start_main __uClibc_main start _start
[gef-remote]
clean_on_exit = False
[gef]
autosave_breakpoints_file =
debug = False
disable_color = False
extra_plugins_dir =
follow_child = True
readline_compat = False
[got]
function_not_resolved = yellow
function_resolved = green
[heap-analysis-helper]
check_double_free = True
check_free_null = False
check_heap_overlap = True
check_uaf = True
check_weird_free = True
[heap-chunks]
peek_nb_byte = 16
[hexdump]
always_show_ascii = False
[highlight]
regex = False
[ida-interact]
host = 127.0.0.1
port = 1337
sync_cursor = False
[pattern]
length = 1024
[pcustom]
struct_path = /tmp/gef/structs
[process-search]
ps_command = /bin/ps auxww
[syscall-args]
path = /tmp/gef/syscall-tables
[theme]
address_code = red
address_heap = green
address_stack = pink
context_title_line = gray
context_title_message = cyan
default_title_line = gray
default_title_message = cyan
dereference_base_address = cyan
dereference_code = gray
dereference_register_value = bold blue
dereference_string = yellow
disassemble_current_instruction = green
registers_register_name = blue
registers_value_changed = bold red
source_current_line = green
table_heading = blue
[trace-run]
max_tracing_recursion = 1
tracefile_prefix = ./gef-trace-
[aliases]
pf = print-format
status = process-status
binaryninja-interact = ida-interact
bn = ida-interact
binja = ida-interact
lookup = scan
grep = search-pattern
xref = search-pattern
flags = edit-flags
sc-search = shellcode search
sc-get = shellcode get
ps = process-search
start = entry-break
nb = name-break
ctx = context
telescope = dereference
pattern offset = pattern search
hl = highlight
highlight ls = highlight list
hll = highlight list
hlc = highlight clear
highlight set = highlight add
hla = highlight add
highlight delete = highlight remove
highlight del = highlight remove
highlight unset = highlight remove
highlight rm = highlight remove
hlr = highlight remove
fmtstr-helper = format-string-helper
screen-setup = tmux-setup

View File

@@ -0,0 +1,22 @@
{
"security": {
"auth": {
"selectedType": "oauth-personal"
}
},
"context": {
"fileName": [
"AGENTS.md",
"GEMINI.md"
]
},
"selectedAuthType": "gemini-api-key",
"general": {
"vimMode": true,
"sessionRetention": {
"enabled": true,
"maxAge": "30d",
"warningAcknowledged": true
}
}
}

View File

@@ -1,12 +1,12 @@
[user] [user]
name = David Tomaschik name = David Tomaschik
email = david@systemoverlord.com useConfigOnly = true
signingKey = 0x5DEA789B
[core] [core]
excludesfile = ~/.gitignore excludesfile = ~/.gitignore
editor = vim editor = vim
whitespace = trailing-space,space-before-tab whitespace = trailing-space,space-before-tab
pager = command -v delta >/dev/null 2>&1 && delta || less -eFiJM~ -j3
[color] [color]
diff = auto diff = auto
@@ -14,6 +14,7 @@
[diff] [diff]
tool = vimdiff tool = vimdiff
colorMoved = default
[difftool] [difftool]
prompt = false prompt = false
@@ -23,9 +24,12 @@
last = log -1 HEAD last = log -1 HEAD
# Thanks to # Thanks to
# http://durdn.com/blog/2012/11/22/must-have-git-aliases-advanced-examples/ # http://durdn.com/blog/2012/11/22/must-have-git-aliases-advanced-examples/
ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate logs = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate
lg = log -p
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
files = ls-files files = ls-files
ls = ls-files
lol = log --graph --pretty=format:'%C(yellow)%h%Creset %an: %s - %Creset %C(yellow)%d%Creset %Cblue(%cr)%Creset' --abbrev-commit --date=relative
f = "!git ls-files | grep -i" f = "!git ls-files | grep -i"
logtree = log --graph --oneline --decorate --all logtree = log --graph --oneline --decorate --all
@@ -39,13 +43,14 @@
user = matir user = matir
# Site specific config # Site specific config
[url "https://github.com./"] [url "https://github.com/"]
insteadOf = "github:" insteadOf = "github:"
insteadOf = "github://" insteadOf = "github://"
[url "ssh://git@github.com/"] [url "ssh://git@github.com/"]
pushInsteadOf = "github:" pushInsteadOf = "github:"
pushInsteadOf = "github://" pushInsteadOf = "github://"
pushInsteadOf = "https://github.com/"
[url "git://gist.github.com/"] [url "git://gist.github.com/"]
insteadOf = "gist:" insteadOf = "gist:"
@@ -56,5 +61,39 @@
[credential] [credential]
helper = cache --timeout=36000 helper = cache --timeout=36000
[receive] [receive]
denyCurrentBranch = updateInstead denyCurrentBranch = updateInstead
[merge]
tool = vimdiff
conflictstyle = diff3
[mergetool]
prompt = false
[pull]
rebase = false
[init]
defaultBranch = main
[interactive]
diffFilter = command -v delta >/dev/null 2>&1 && delta || cat
[delta]
navigate = true
line-numbers = true
[filter "lfs"]
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
[include]
path = ~/.gitconfig.d/override
path = ~/.gitconfig.d/local
[includeIf "gitdir:~/personal/"]
path = ~/.gitconfig.d/personal

View File

@@ -0,0 +1,5 @@
[user]
email = david@systemoverlord.com
[github]
user = matir

View File

@@ -0,0 +1,2 @@
[user]
email = david@systemoverlord.com

View File

@@ -17,6 +17,24 @@ Thumbs.db
# Try to avoid accidentally checking in private keys # Try to avoid accidentally checking in private keys
id_rsa id_rsa
id_ecdsa id_ecdsa
id_ed25519
# Kicad backup files # Kicad backup files
*.kicad_pcb-bak *.kicad_pcb-bak
# Mypy cache path
.mypy_cache
# These files should basically never be committed
.env
# Mise local
mise.local.toml
# AI Tool Configs
.aider/
.claude/
.continue/
.copilot/
.cursor/
.gemini/

View File

@@ -1,2 +1 @@
keyserver hkps://hkps.pool.sks-keyservers.net keyserver hkps://keys.openpgp.org
hkp-cacert ~/.gnupg/sks-keyservers.pem

View File

@@ -2,4 +2,3 @@ default-cache-ttl 7200
default-cache-ttl-ssh 7200 default-cache-ttl-ssh 7200
max-cache-ttl 86400 max-cache-ttl 86400
max-cache-ttl-ssh 86400 max-cache-ttl-ssh 86400
enable-ssh-support

View File

@@ -1,6 +1,6 @@
use-agent use-agent
# HKPS requires gnupg-curl for gpg1 # HKPS requires gnupg-curl for gpg1
keyserver hkps://hkps.pool.sks-keyservers.net keyserver hkps://keyserver.ubuntu.com
keyserver-options auto-key-retrieve no-honor-keyserver-url keyserver-options auto-key-retrieve no-honor-keyserver-url
auto-key-locate keyserver auto-key-locate keyserver
personal-digest-preferences SHA256 personal-digest-preferences SHA256

10
dotfiles/ipython.py Normal file
View File

@@ -0,0 +1,10 @@
try:
import os, IPython
from traitlets import config
os.environ['PYTHONSTARTUP'] = '' # Prevent running this again
cfg = config.Config()
cfg.TerminalIPythonApp.display_banner = False
IPython.start_ipython(config=cfg)
raise SystemExit
except ImportError:
pass

View File

@@ -0,0 +1,611 @@
# Configuration file for ipython.
#------------------------------------------------------------------------------
# InteractiveShellApp(Configurable) configuration
#------------------------------------------------------------------------------
## A Mixin for applications that start InteractiveShell instances.
#
# Provides configurables for loading extensions and executing files as part of
# configuring a Shell environment.
#
# The following methods should be called by the :meth:`initialize` method of the
# subclass:
#
# - :meth:`init_path`
# - :meth:`init_shell` (to be implemented by the subclass)
# - :meth:`init_gui_pylab`
# - :meth:`init_extensions`
# - :meth:`init_code`
## Execute the given command string.
#c.InteractiveShellApp.code_to_run = ''
## Run the file referenced by the PYTHONSTARTUP environment variable at IPython
# startup.
c.InteractiveShellApp.exec_PYTHONSTARTUP = False
## List of files to run at IPython startup.
#c.InteractiveShellApp.exec_files = []
## lines of code to run at IPython startup.
#c.InteractiveShellApp.exec_lines = []
## A list of dotted module names of IPython extensions to load.
#c.InteractiveShellApp.extensions = []
## dotted module name of an IPython extension to load.
#c.InteractiveShellApp.extra_extension = ''
## A file to be run
#c.InteractiveShellApp.file_to_run = ''
## Enable GUI event loop integration with any of ('glut', 'gtk', 'gtk2', 'gtk3',
# 'osx', 'pyglet', 'qt', 'qt4', 'qt5', 'tk', 'wx', 'gtk2', 'qt4').
#c.InteractiveShellApp.gui = None
## Should variables loaded at startup (by startup files, exec_lines, etc.) be
# hidden from tools like %who?
#c.InteractiveShellApp.hide_initial_ns = True
## Configure matplotlib for interactive use with the default matplotlib backend.
#c.InteractiveShellApp.matplotlib = None
## Run the module as a script.
#c.InteractiveShellApp.module_to_run = ''
## Pre-load matplotlib and numpy for interactive use, selecting a particular
# matplotlib backend and loop integration.
#c.InteractiveShellApp.pylab = None
## If true, IPython will populate the user namespace with numpy, pylab, etc. and
# an ``import *`` is done from numpy and pylab, when using pylab mode.
#
# When False, pylab mode should not import any names into the user namespace.
#c.InteractiveShellApp.pylab_import_all = True
## Reraise exceptions encountered loading IPython extensions?
#c.InteractiveShellApp.reraise_ipython_extension_failures = False
#------------------------------------------------------------------------------
# Application(SingletonConfigurable) configuration
#------------------------------------------------------------------------------
## This is an application.
## The date format used by logging formatters for %(asctime)s
#c.Application.log_datefmt = '%Y-%m-%d %H:%M:%S'
## The Logging format template
#c.Application.log_format = '[%(name)s]%(highlevel)s %(message)s'
## Set the log level by value or name.
#c.Application.log_level = 30
#------------------------------------------------------------------------------
# BaseIPythonApplication(Application) configuration
#------------------------------------------------------------------------------
## IPython: an enhanced interactive Python shell.
## Whether to create profile dir if it doesn't exist
#c.BaseIPythonApplication.auto_create = False
## Whether to install the default config files into the profile dir. If a new
# profile is being created, and IPython contains config files for that profile,
# then they will be staged into the new directory. Otherwise, default config
# files will be automatically generated.
#c.BaseIPythonApplication.copy_config_files = False
## Path to an extra config file to load.
#
# If specified, load this config file in addition to any other IPython config.
#c.BaseIPythonApplication.extra_config_file = ''
## The name of the IPython directory. This directory is used for logging
# configuration (through profiles), history storage, etc. The default is usually
# $HOME/.ipython. This option can also be specified through the environment
# variable IPYTHONDIR.
#c.BaseIPythonApplication.ipython_dir = ''
## Whether to overwrite existing config files when copying
#c.BaseIPythonApplication.overwrite = False
## The IPython profile to use.
#c.BaseIPythonApplication.profile = 'default'
## Create a massive crash report when IPython encounters what may be an internal
# error. The default is to append a short message to the usual traceback
#c.BaseIPythonApplication.verbose_crash = False
#------------------------------------------------------------------------------
# TerminalIPythonApp(BaseIPythonApplication,InteractiveShellApp) configuration
#------------------------------------------------------------------------------
## Whether to display a banner upon starting IPython.
#c.TerminalIPythonApp.display_banner = True
## If a command or file is given via the command-line, e.g. 'ipython foo.py',
# start an interactive shell after executing the file or command.
#c.TerminalIPythonApp.force_interact = False
## Class to use to instantiate the TerminalInteractiveShell object. Useful for
# custom Frontends
#c.TerminalIPythonApp.interactive_shell_class = 'IPython.terminal.interactiveshell.TerminalInteractiveShell'
## Start IPython quickly by skipping the loading of config files.
#c.TerminalIPythonApp.quick = False
#------------------------------------------------------------------------------
# InteractiveShell(SingletonConfigurable) configuration
#------------------------------------------------------------------------------
## An enhanced, interactive shell for Python.
## 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying which
# nodes should be run interactively (displaying output from expressions).
#c.InteractiveShell.ast_node_interactivity = 'last_expr'
## A list of ast.NodeTransformer subclass instances, which will be applied to
# user input before code is run.
#c.InteractiveShell.ast_transformers = []
## Automatically run await statement in the top level repl.
#c.InteractiveShell.autoawait = True
## Make IPython automatically call any callable object even if you didn't type
# explicit parentheses. For example, 'str 43' becomes 'str(43)' automatically.
# The value can be '0' to disable the feature, '1' for 'smart' autocall, where
# it is not applied if there are no more arguments on the line, and '2' for
# 'full' autocall, where all callable objects are automatically called (even if
# no arguments are present).
#c.InteractiveShell.autocall = 0
## Autoindent IPython code entered interactively.
#c.InteractiveShell.autoindent = True
## Enable magic commands to be called without the leading %.
#c.InteractiveShell.automagic = True
## The part of the banner to be printed before the profile
#c.InteractiveShell.banner1 = "Python 3.7.3rc1 (default, Mar 13 2019, 11:01:15) \nType 'copyright', 'credits' or 'license' for more information\nIPython 7.5.0 -- An enhanced Interactive Python. Type '?' for help.\n"
## The part of the banner to be printed after the profile
#c.InteractiveShell.banner2 = ''
## Set the size of the output cache. The default is 1000, you can change it
# permanently in your config file. Setting it to 0 completely disables the
# caching system, and the minimum value accepted is 3 (if you provide a value
# less than 3, it is reset to 0 and a warning is issued). This limit is defined
# because otherwise you'll spend more time re-flushing a too small cache than
# working
#c.InteractiveShell.cache_size = 1000
## Use colors for displaying information about objects. Because this information
# is passed through a pager (like 'less'), and some pagers get confused with
# color codes, this capability can be turned off.
#c.InteractiveShell.color_info = True
## Set the color scheme (NoColor, Neutral, Linux, or LightBG).
#c.InteractiveShell.colors = 'Neutral'
##
#c.InteractiveShell.debug = False
## Don't call post-execute functions that have failed in the past.
#c.InteractiveShell.disable_failing_post_execute = False
## If True, anything that would be passed to the pager will be displayed as
# regular output instead.
#c.InteractiveShell.display_page = False
## (Provisional API) enables html representation in mime bundles sent to pagers.
#c.InteractiveShell.enable_html_pager = False
## Total length of command history
#c.InteractiveShell.history_length = 10000
## The number of saved history entries to be loaded into the history buffer at
# startup.
#c.InteractiveShell.history_load_length = 1000
##
#c.InteractiveShell.ipython_dir = ''
## Start logging to the given file in append mode. Use `logfile` to specify a log
# file to **overwrite** logs to.
#c.InteractiveShell.logappend = ''
## The name of the logfile to use.
#c.InteractiveShell.logfile = ''
## Start logging to the default log file in overwrite mode. Use `logappend` to
# specify a log file to **append** logs to.
#c.InteractiveShell.logstart = False
## Select the loop runner that will be used to execute top-level asynchronous
# code
#c.InteractiveShell.loop_runner = 'IPython.core.interactiveshell._asyncio_runner'
##
#c.InteractiveShell.object_info_string_level = 0
## Automatically call the pdb debugger after every exception.
#c.InteractiveShell.pdb = False
## Deprecated since IPython 4.0 and ignored since 5.0, set
# TerminalInteractiveShell.prompts object directly.
#c.InteractiveShell.prompt_in1 = 'In [\\#]: '
## Deprecated since IPython 4.0 and ignored since 5.0, set
# TerminalInteractiveShell.prompts object directly.
#c.InteractiveShell.prompt_in2 = ' .\\D.: '
## Deprecated since IPython 4.0 and ignored since 5.0, set
# TerminalInteractiveShell.prompts object directly.
#c.InteractiveShell.prompt_out = 'Out[\\#]: '
## Deprecated since IPython 4.0 and ignored since 5.0, set
# TerminalInteractiveShell.prompts object directly.
#c.InteractiveShell.prompts_pad_left = True
##
#c.InteractiveShell.quiet = False
##
#c.InteractiveShell.separate_in = '\n'
##
#c.InteractiveShell.separate_out = ''
##
#c.InteractiveShell.separate_out2 = ''
## Show rewritten input, e.g. for autocall.
#c.InteractiveShell.show_rewritten_input = True
## Enables rich html representation of docstrings. (This requires the docrepr
# module).
#c.InteractiveShell.sphinxify_docstring = False
##
#c.InteractiveShell.wildcards_case_sensitive = True
## Switch modes for the IPython exception handlers.
#c.InteractiveShell.xmode = 'Context'
#------------------------------------------------------------------------------
# TerminalInteractiveShell(InteractiveShell) configuration
#------------------------------------------------------------------------------
## Set to confirm when you try to exit IPython with an EOF (Control-D in Unix,
# Control-Z/Enter in Windows). By typing 'exit' or 'quit', you can force a
# direct exit without any confirmation.
#c.TerminalInteractiveShell.confirm_exit = True
## Options for displaying tab completions, 'column', 'multicolumn', and
# 'readlinelike'. These options are for `prompt_toolkit`, see `prompt_toolkit`
# documentation for more information.
#c.TerminalInteractiveShell.display_completions = 'multicolumn'
## Shortcut style to use at the prompt. 'vi' or 'emacs'.
c.TerminalInteractiveShell.editing_mode = 'vi'
## Set the editor used by IPython (default to $EDITOR/vi/notepad).
#c.TerminalInteractiveShell.editor = 'vim'
## Allows to enable/disable the prompt toolkit history search
#c.TerminalInteractiveShell.enable_history_search = True
## Enable vi (v) or Emacs (C-X C-E) shortcuts to open an external editor. This is
# in addition to the F2 binding, which is always enabled.
#c.TerminalInteractiveShell.extra_open_editor_shortcuts = False
## Provide an alternative handler to be called when the user presses Return. This
# is an advanced option intended for debugging, which may be changed or removed
# in later releases.
#c.TerminalInteractiveShell.handle_return = None
## Highlight matching brackets.
#c.TerminalInteractiveShell.highlight_matching_brackets = True
## The name or class of a Pygments style to use for syntax highlighting. To see
# available styles, run `pygmentize -L styles`.
#c.TerminalInteractiveShell.highlighting_style = traitlets.Undefined
## Override highlighting format for specific tokens
#c.TerminalInteractiveShell.highlighting_style_overrides = {}
## Enable mouse support in the prompt (Note: prevents selecting text with the
# mouse)
#c.TerminalInteractiveShell.mouse_support = False
## Display the current vi mode (when using vi editing mode).
#c.TerminalInteractiveShell.prompt_includes_vi_mode = True
## Class used to generate Prompt token for prompt_toolkit
#c.TerminalInteractiveShell.prompts_class = 'IPython.terminal.prompts.Prompts'
## Use `raw_input` for the REPL, without completion and prompt colors.
#
# Useful when controlling IPython as a subprocess, and piping STDIN/OUT/ERR.
# Known usage are: IPython own testing machinery, and emacs inferior-shell
# integration through elpy.
#
# This mode default to `True` if the `IPY_TEST_SIMPLE_PROMPT` environment
# variable is set, or the current terminal is not a tty.
#c.TerminalInteractiveShell.simple_prompt = False
## Number of line at the bottom of the screen to reserve for the completion menu
#c.TerminalInteractiveShell.space_for_menu = 6
## Automatically set the terminal title
#c.TerminalInteractiveShell.term_title = True
## Customize the terminal title format. This is a python format string.
# Available substitutions are: {cwd}.
#c.TerminalInteractiveShell.term_title_format = 'IPython: {cwd}'
## Use 24bit colors instead of 256 colors in prompt highlighting. If your
# terminal supports true color, the following command should print 'TRUECOLOR'
# in orange: printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n"
#c.TerminalInteractiveShell.true_color = False
#------------------------------------------------------------------------------
# HistoryAccessor(HistoryAccessorBase) configuration
#------------------------------------------------------------------------------
## Access the history database without adding to it.
#
# This is intended for use by standalone history tools. IPython shells use
# HistoryManager, below, which is a subclass of this.
## Options for configuring the SQLite connection
#
# These options are passed as keyword args to sqlite3.connect when establishing
# database connections.
#c.HistoryAccessor.connection_options = {}
## enable the SQLite history
#
# set enabled=False to disable the SQLite history, in which case there will be
# no stored history, no SQLite connection, and no background saving thread.
# This may be necessary in some threaded environments where IPython is embedded.
#c.HistoryAccessor.enabled = True
## Path to file to use for SQLite history database.
#
# By default, IPython will put the history database in the IPython profile
# directory. If you would rather share one history among profiles, you can set
# this value in each, so that they are consistent.
#
# Due to an issue with fcntl, SQLite is known to misbehave on some NFS mounts.
# If you see IPython hanging, try setting this to something on a local disk,
# e.g::
#
# ipython --HistoryManager.hist_file=/tmp/ipython_hist.sqlite
#
# you can also use the specific value `:memory:` (including the colon at both
# end but not the back ticks), to avoid creating an history file.
#c.HistoryAccessor.hist_file = ''
#------------------------------------------------------------------------------
# HistoryManager(HistoryAccessor) configuration
#------------------------------------------------------------------------------
## A class to organize all history-related functionality in one place.
## Write to database every x commands (higher values save disk access & power).
# Values of 1 or less effectively disable caching.
#c.HistoryManager.db_cache_size = 0
## Should the history database include output? (default: no)
#c.HistoryManager.db_log_output = False
#------------------------------------------------------------------------------
# ProfileDir(LoggingConfigurable) configuration
#------------------------------------------------------------------------------
## An object to manage the profile directory and its resources.
#
# The profile directory is used by all IPython applications, to manage
# configuration, logging and security.
#
# This object knows how to find, create and manage these directories. This
# should be used by any code that wants to handle profiles.
## Set the profile location directly. This overrides the logic used by the
# `profile` option.
#c.ProfileDir.location = ''
#------------------------------------------------------------------------------
# BaseFormatter(Configurable) configuration
#------------------------------------------------------------------------------
## A base formatter class that is configurable.
#
# This formatter should usually be used as the base class of all formatters. It
# is a traited :class:`Configurable` class and includes an extensible API for
# users to determine how their objects are formatted. The following logic is
# used to find a function to format an given object.
#
# 1. The object is introspected to see if it has a method with the name
# :attr:`print_method`. If is does, that object is passed to that method
# for formatting.
# 2. If no print method is found, three internal dictionaries are consulted
# to find print method: :attr:`singleton_printers`, :attr:`type_printers`
# and :attr:`deferred_printers`.
#
# Users should use these dictionaries to register functions that will be used to
# compute the format data for their objects (if those objects don't have the
# special print methods). The easiest way of using these dictionaries is through
# the :meth:`for_type` and :meth:`for_type_by_name` methods.
#
# If no function/callable is found to compute the format data, ``None`` is
# returned and this format type is not used.
##
#c.BaseFormatter.deferred_printers = {}
##
#c.BaseFormatter.enabled = True
##
#c.BaseFormatter.singleton_printers = {}
##
#c.BaseFormatter.type_printers = {}
#------------------------------------------------------------------------------
# PlainTextFormatter(BaseFormatter) configuration
#------------------------------------------------------------------------------
## The default pretty-printer.
#
# This uses :mod:`IPython.lib.pretty` to compute the format data of the object.
# If the object cannot be pretty printed, :func:`repr` is used. See the
# documentation of :mod:`IPython.lib.pretty` for details on how to write pretty
# printers. Here is a simple example::
#
# def dtype_pprinter(obj, p, cycle):
# if cycle:
# return p.text('dtype(...)')
# if hasattr(obj, 'fields'):
# if obj.fields is None:
# p.text(repr(obj))
# else:
# p.begin_group(7, 'dtype([')
# for i, field in enumerate(obj.descr):
# if i > 0:
# p.text(',')
# p.breakable()
# p.pretty(field)
# p.end_group(7, '])')
##
#c.PlainTextFormatter.float_precision = ''
## Truncate large collections (lists, dicts, tuples, sets) to this size.
#
# Set to 0 to disable truncation.
#c.PlainTextFormatter.max_seq_length = 1000
##
#c.PlainTextFormatter.max_width = 79
##
#c.PlainTextFormatter.newline = '\n'
##
#c.PlainTextFormatter.pprint = True
##
#c.PlainTextFormatter.verbose = False
#------------------------------------------------------------------------------
# Completer(Configurable) configuration
#------------------------------------------------------------------------------
## Enable unicode completions, e.g. \alpha<tab> . Includes completion of latex
# commands, unicode names, and expanding unicode characters back to latex
# commands.
#c.Completer.backslash_combining_completions = True
## Enable debug for the Completer. Mostly print extra information for
# experimental jedi integration.
#c.Completer.debug = False
## Activate greedy completion PENDING DEPRECTION. this is now mostly taken care
# of with Jedi.
#
# This will enable completion on elements of lists, results of function calls,
# etc., but can be unsafe because the code is actually evaluated on TAB.
#c.Completer.greedy = False
## Experimental: restrict time (in milliseconds) during which Jedi can compute
# types. Set to 0 to stop computing types. Non-zero value lower than 100ms may
# hurt performance by preventing jedi to build its cache.
#c.Completer.jedi_compute_type_timeout = 400
## Experimental: Use Jedi to generate autocompletions. Default to True if jedi is
# installed.
#c.Completer.use_jedi = True
#------------------------------------------------------------------------------
# IPCompleter(Completer) configuration
#------------------------------------------------------------------------------
## Extension of the completer class with IPython-specific features
## DEPRECATED as of version 5.0.
#
# Instruct the completer to use __all__ for the completion
#
# Specifically, when completing on ``object.<tab>``.
#
# When True: only those names in obj.__all__ will be included.
#
# When False [default]: the __all__ attribute is ignored
#c.IPCompleter.limit_to__all__ = False
## Whether to merge completion results into a single list
#
# If False, only the completion results from the first non-empty completer will
# be returned.
#c.IPCompleter.merge_completions = True
## Instruct the completer to omit private method names
#
# Specifically, when completing on ``object.<tab>``.
#
# When 2 [default]: all names that start with '_' will be excluded.
#
# When 1: all 'magic' names (``__foo__``) will be excluded.
#
# When 0: nothing will be excluded.
#c.IPCompleter.omit__names = 2
#------------------------------------------------------------------------------
# ScriptMagics(Magics) configuration
#------------------------------------------------------------------------------
## Magics for talking to scripts
#
# This defines a base `%%script` cell magic for running a cell with a program in
# a subprocess, and registers a few top-level magics that call %%script with
# common interpreters.
## Extra script cell magics to define
#
# This generates simple wrappers of `%%script foo` as `%%foo`.
#
# If you want to add script magics that aren't on your path, specify them in
# script_paths
#c.ScriptMagics.script_magics = []
## Dict mapping short 'ruby' names to full paths, such as '/opt/secret/bin/ruby'
#
# Only necessary for items in script_magics where the default path will not find
# the right interpreter.
#c.ScriptMagics.script_paths = {}
#------------------------------------------------------------------------------
# LoggingMagics(Magics) configuration
#------------------------------------------------------------------------------
## Magics related to all logging machinery.
## Suppress output of log state when logging is enabled
#c.LoggingMagics.quiet = False
#------------------------------------------------------------------------------
# StoreMagics(Magics) configuration
#------------------------------------------------------------------------------
## Lightweight persistence for python variables.
#
# Provides the %store magic.
## If True, any %store-d variables will be automatically restored when IPython
# starts.
#c.StoreMagics.autorestore = False

View File

@@ -0,0 +1,60 @@
import os
import sys
from IPython.terminal import prompts
def _setup_environment():
ip = get_ipython()
if not ip:
return
# 1. SEARCH LOGIC: Walk up the tree for a venv
active_venv_name = None
curr = os.getcwd()
while True:
for venv_name in ['.venv', 'env', 'venv']:
venv_path = os.path.join(curr, venv_name)
if os.path.isdir(venv_path):
# Platform-specific site-packages path
py_ver = f"python{sys.version_info.major}.{sys.version_info.minor}"
site_pkgs = os.path.join(venv_path, 'lib', py_ver, 'site-packages')
if os.path.exists(site_pkgs):
if site_pkgs not in sys.path:
sys.path.insert(0, site_pkgs)
sys.prefix = venv_path
active_venv_name = os.path.basename(venv_path)
break
if active_venv_name or os.path.exists(os.path.join(curr, '.git')):
break
parent = os.path.dirname(curr)
if parent == curr:
break
curr = parent
# 2. PROMPT LOGIC: Inject venv name into the UI
class VenvPrompts(prompts.Prompts):
_prompts = prompts
def in_prompt_tokens(self):
tokens = []
if active_venv_name:
tokens.append((self._prompts.Token.Prompt, f'({active_venv_name}) '))
tokens.extend([
(self._prompts.Token.Prompt, 'In ['),
(self._prompts.Token.PromptNum, str(self.shell.execution_count)),
(self._prompts.Token.Prompt, ']: '),
])
return tokens
ip.prompts = VenvPrompts(ip)
# Execute the setup
_setup_environment()
# cleanup
del _setup_environment, prompts

View File

@@ -1,415 +0,0 @@
servers = (
{
address = "ircs.overthewire.org";
chatnet = "overthewire";
port = "6697";
use_ssl = "yes";
ssl_verify = "no";
autoconnect = "yes";
},
{
address = "irc.secfo.org";
chatnet = "secfo";
port = "7000";
use_ssl = "yes";
ssl_verify = "no";
autoconnect = "yes";
},
{
address = "irc.hackint.eu";
chatnet = "hackint";
port = "9999";
use_ssl = "yes";
ssl_verify = "no";
autoconnect = "yes";
},
{
address = "irc.geekshed.net";
chatnet = "geekshed";
port = "6697";
use_ssl = "yes";
ssl_verify = "no";
autoconnect = "no";
},
{
address = "irc.rpis.ec";
chatnet = "rpisec";
port = "6697";
use_ssl = "yes";
ssl_verify = "no";
autoconnect = "yes";
},
{
address = "chat.freenode.net";
chatnet = "freenode";
port = "7000";
use_ssl = "yes";
ssl_cert = "~/.irssi/matir.pem";
ssl_verify = "yes";
ssl_capath = "/etc/ssl/certs";
family = "inet";
autoconnect = "yes";
}
);
chatnets = {
OFTC = {
type = "IRC";
max_kicks = "1";
max_msgs = "3";
max_whois = "30";
};
overthewire = { type = "IRC"; nick = "Matir"; };
secfo = { type = "IRC"; };
hackint = { type = "IRC"; nick = "Matir"; };
freenode = {
type = "IRC";
nick = "Matir";
username = "matir";
realname = "Matir";
max_kicks = "1";
max_msgs = "4";
max_modes = "4";
max_whois = "1";
};
geekshed = {
type = "IRC";
nick = "KF4MDV";
username = "kf4mdv";
realname = "David";
};
rpisec = { type = "IRC"; };
};
channels = (
{ name = "#kali-linux"; chatnet = "freenode"; autojoin = "yes"; },
{ name = "#hak5"; chatnet = "secfo"; autojoin = "yes"; },
{ name = "#wargames"; chatnet = "overthewire"; autojoin = "yes"; },
{ name = "#social"; chatnet = "overthewire"; autojoin = "yes"; },
{ name = "#openvpn"; chatnet = "freenode"; autojoin = "yes"; },
{ name = "#amateria"; chatnet = "overthewire"; autojoin = "yes"; },
{ name = "#io"; chatnet = "overthewire"; autojoin = "yes"; },
{ name = "#radare"; chatnet = "freenode"; autojoin = "yes"; },
{ name = "#vulnhub"; chatnet = "freenode"; autojoin = "yes"; },
{ name = "#redditnet"; chatnet = "geekshed"; autojoin = "yes"; },
{ name = "#rpisec"; chatnet = "rpisec"; autojoin = "yes"; },
{ name = "#offsec"; chatnet = "freenode"; autojoin = "yes"; },
{ name = "#offtopicsec"; chatnet = "freenode"; autojoin = "yes"; }
);
aliases = {
J = "join";
WJOIN = "join -window";
WQUERY = "query -window";
LEAVE = "part";
BYE = "quit";
EXIT = "quit";
SIGNOFF = "quit";
DESCRIBE = "action";
DATE = "time";
HOST = "userhost";
LAST = "lastlog";
SAY = "msg *";
WI = "whois";
WII = "whois $0 $0";
WW = "whowas";
W = "who";
N = "names";
M = "msg";
T = "topic";
C = "clear";
CL = "clear";
K = "kick";
KB = "kickban";
KN = "knockout";
BANS = "ban";
B = "ban";
MUB = "unban *";
UB = "unban";
IG = "ignore";
UNIG = "unignore";
SB = "scrollback";
UMODE = "mode $N";
WC = "window close";
WN = "window new hide";
SV = "say Irssi $J ($V) - http://irssi.org/";
GOTO = "sb goto";
CHAT = "dcc chat";
RUN = "SCRIPT LOAD";
CALC = "exec - if command -v bc >/dev/null 2>&1\\; then printf '%s=' '$*'\\; echo '$*' | bc -l\\; else echo bc was not found\\; fi";
SBAR = "STATUSBAR";
INVITELIST = "mode $C +I";
Q = "QUERY";
"MANUAL-WINDOWS" = "set use_status_window off;set autocreate_windows off;set autocreate_query_level none;set autoclose_windows off;set reuse_unused_windows on;save";
EXEMPTLIST = "mode $C +e";
ATAG = "WINDOW SERVER";
UNSET = "set -clear";
RESET = "set -default";
};
statusbar = {
# formats:
# when using {templates}, the template is shown only if it's argument isn't
# empty unless no argument is given. for example {sb} is printed always,
# but {sb $T} is printed only if $T isn't empty.
items = {
# start/end text in statusbars
barstart = "{sbstart}";
barend = "{sbend}";
topicbarstart = "{topicsbstart}";
topicbarend = "{topicsbend}";
# treated "normally", you could change the time/user name to whatever
time = "{sb $Z}";
user = "{sb {sbnickmode $cumode}$N{sbmode $usermode}{sbaway $A}}";
# treated specially .. window is printed with non-empty windows,
# window_empty is printed with empty windows
window = "{sb $winref:$tag/$itemname{sbmode $M}}";
window_empty = "{sb $winref{sbservertag $tag}}";
prompt = "{prompt $[.15]itemname}";
prompt_empty = "{prompt $winname}";
topic = " $topic";
topic_empty = " Irssi v$J - http://www.irssi.org";
# all of these treated specially, they're only displayed when needed
lag = "{sb Lag: $0-}";
act = "{sb Act: $0-}";
more = "-- more --";
};
# there's two type of statusbars. root statusbars are either at the top
# of the screen or at the bottom of the screen. window statusbars are at
# the top/bottom of each split window in screen.
default = {
# the "default statusbar" to be displayed at the bottom of the window.
# contains all the normal items.
window = {
disabled = "yes";
# window, root
type = "window";
# top, bottom
placement = "bottom";
# number
position = "1";
# active, inactive, always
visible = "active";
# list of items in statusbar in the display order
items = {
barstart = { priority = "100"; };
time = { };
user = { };
window = { };
window_empty = { };
lag = { priority = "-1"; };
more = { priority = "-1"; alignment = "right"; };
barend = { priority = "100"; alignment = "right"; };
};
};
# statusbar to use in inactive split windows
window_inact = {
type = "window";
placement = "bottom";
position = "1";
visible = "inactive";
items = {
barstart = { priority = "100"; };
window = { };
window_empty = { };
more = { priority = "-1"; alignment = "right"; };
barend = { priority = "100"; alignment = "right"; };
};
};
# we treat input line as yet another statusbar :) It's possible to
# add other items before or after the input line item.
prompt = {
type = "root";
placement = "bottom";
# we want to be at the bottom always
position = "100";
visible = "always";
items = {
prompt = { priority = "-1"; };
prompt_empty = { priority = "-1"; };
# treated specially, this is the real input line.
input = { priority = "10"; };
};
};
# topicbar
topic = {
type = "root";
placement = "top";
position = "1";
visible = "always";
items = {
topicbarstart = { priority = "100"; };
time = { priority = "100"; };
topic = { };
topic_empty = { };
window_empty = { alignment = "right"; };
user = { priority = "100"; alignment = "right"; };
topicbarend = { priority = "100"; alignment = "right"; };
};
};
placement = { items = { }; disabled = "yes"; };
remove = { disabled = "yes"; };
awl_0 = {
items = {
barstart = { priority = "100"; };
awl_0 = { };
barend = { priority = "100"; alignment = "right"; };
};
};
awl_1 = {
items = {
barstart = { priority = "100"; };
awl_1 = { };
barend = { priority = "100"; alignment = "right"; };
};
};
awl_2 = {
items = {
barstart = { priority = "100"; };
awl_2 = { };
barend = { priority = "100"; alignment = "right"; };
};
};
};
};
settings = {
core = {
real_name = "Matir";
user_name = "matir";
nick = "Matir";
log_timestamp = "%Y%m%d %H%M";
};
"fe-text" = { actlist_sort = "refnum"; };
"fe-common/core" = {
autolog = "yes";
autolog_path = "~/irclogs/%Y/%m/$tag/$0.log";
autoclose_query = "1800";
autocreate_own_query = "no";
show_nickmode_empty = "no";
term_charset = "utf-8";
};
"perl/core/scripts" = {
awl_shared_sbar = "OFF";
awl_viewer = "no";
awl_block = "-15";
awl_maxlines = "3";
awl_height_adjust = "2";
awl_hide_empty = "0";
};
};
windows = {
1 = { immortal = "yes"; name = "(status)"; level = "ALL"; };
2 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#kali-linux";
tag = "freenode";
}
);
};
3 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#radare";
tag = "freenode";
}
);
};
4 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#vulnhub";
tag = "freenode";
}
);
};
5 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#openvpn";
tag = "freenode";
}
);
};
6 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#wargames";
tag = "overthewire";
}
);
};
7 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#social";
tag = "overthewire";
}
);
};
8 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#amateria";
tag = "overthewire";
}
);
};
9 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#io";
tag = "overthewire";
}
);
};
10 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#RedditNet";
tag = "geekshed";
}
);
};
11 = {
items = (
{
type = "CHANNEL";
chat_type = "IRC";
name = "#hak5";
tag = "secfo";
}
);
};
};
mainwindows = { 1 = { first_line = "1"; lines = "78"; }; };
logs = { };

View File

@@ -1,297 +0,0 @@
# When testing changes, the easiest way to reload the theme is with /RELOAD.
# This reloads the configuration file too, so if you did any changes remember
# to /SAVE it first. Remember also that /SAVE overwrites the theme file with
# old data so keep backups :)
# TEMPLATES:
# The real text formats that irssi uses are the ones you can find with
# /FORMAT command. Back in the old days all the colors and texts were mixed
# up in those formats, and it was really hard to change the colors since you
# might have had to change them in tens of different places. So, then came
# this templating system.
# Now the /FORMATs don't have any colors in them, and they also have very
# little other styling. Most of the stuff you need to change is in this
# theme file. If you can't change something here, you can always go back
# to change the /FORMATs directly, they're also saved in these .theme files.
# So .. the templates. They're those {blahblah} parts you see all over the
# /FORMATs and here. Their usage is simply {name parameter1 parameter2}.
# When irssi sees this kind of text, it goes to find "name" from abstracts
# block below and sets "parameter1" into $0 and "parameter2" into $1 (you
# can have more parameters of course). Templates can have subtemplates.
# Here's a small example:
# /FORMAT format hello {colorify {underline world}}
# abstracts = { colorify = "%G$0-%n"; underline = "%U$0-%U"; }
# When irssi expands the templates in "format", the final string would be:
# hello %G%Uworld%U%n
# ie. underlined bright green "world" text.
# and why "$0-", why not "$0"? $0 would only mean the first parameter,
# $0- means all the parameters. With {underline hello world} you'd really
# want to underline both of the words, not just the hello (and world would
# actually be removed entirely).
# COLORS:
# You can find definitions for the color format codes in docs/formats.txt.
# There's one difference here though. %n format. Normally it means the
# default color of the terminal (white mostly), but here it means the
# "reset color back to the one it was in higher template". For example
# if there was /FORMAT test %g{foo}bar, and foo = "%Y$0%n", irssi would
# print yellow "foo" (as set with %Y) but "bar" would be green, which was
# set at the beginning before the {foo} template. If there wasn't the %g
# at start, the normal behaviour of %n would occur. If you _really_ want
# to use the terminal's default color, use %N.
#############################################################################
# default foreground color (%N) - -1 is the "default terminal color"
default_color = "-1";
# print timestamp/servertag at the end of line, not at beginning
info_eol = "false";
# these characters are automatically replaced with specified color
# (dark grey by default)
replaces = { "[]=" = "%K$*%n"; };
abstracts = {
##
## generic
##
# text to insert at the beginning of each non-message line
line_start = "%B-%n!%B-%n ";
# timestamp styling, nothing by default
timestamp = "$*";
# any kind of text that needs hilighting, default is to bold
hilight = "%_$*%_";
# any kind of error message, default is bright red
error = "%R$*%n";
# channel name is printed
channel = "%_$*%_";
# nick is printed
nick = "%_$*%_";
# nick host is printed
nickhost = "[$*]";
# server name is printed
server = "%_$*%_";
# some kind of comment is printed
comment = "[$*]";
# reason for something is printed (part, quit, kick, ..)
reason = "{comment $*}";
# mode change is printed ([+o nick])
mode = "{comment $*}";
##
## channel specific messages
##
# highlighted nick/host is printed (joins)
channick_hilight = "%C$*%n";
chanhost_hilight = "{nickhost %c$*%n}";
# nick/host is printed (parts, quits, etc.)
channick = "%c$*%n";
chanhost = "{nickhost $*}";
# highlighted channel name is printed
channelhilight = "%c$*%n";
# ban/ban exception/invite list mask is printed
ban = "%c$*%n";
##
## messages
##
# the basic styling of how to print message, $0 = nick mode, $1 = nick
msgnick = "%K<%n$0$1-%K>%n %|";
# message from you is printed. "msgownnick" specifies the styling of the
# nick ($0 part in msgnick) and "ownmsgnick" specifies the styling of the
# whole line.
# Example1: You want the message text to be green:
# ownmsgnick = "{msgnick $0 $1-}%g";
# Example2.1: You want < and > chars to be yellow:
# ownmsgnick = "%Y{msgnick $0 $1-%Y}%n";
# (you'll also have to remove <> from replaces list above)
# Example2.2: But you still want to keep <> grey for other messages:
# pubmsgnick = "%K{msgnick $0 $1-%K}%n";
# pubmsgmenick = "%K{msgnick $0 $1-%K}%n";
# pubmsghinick = "%K{msgnick $1 $0$2-%n%K}%n";
# ownprivmsgnick = "%K{msgnick $*%K}%n";
# privmsgnick = "%K{msgnick %R$*%K}%n";
# $0 = nick mode, $1 = nick
ownmsgnick = "{msgnick $0 $1-}";
ownnick = "%_$*%n";
# public message in channel, $0 = nick mode, $1 = nick
pubmsgnick = "{msgnick $0 $1-}";
pubnick = "%N$*%n";
# public message in channel meant for me, $0 = nick mode, $1 = nick
pubmsgmenick = "{msgnick $0 $1-}";
menick = "%Y$*%n";
# public highlighted message in channel
# $0 = highlight color, $1 = nick mode, $2 = nick
pubmsghinick = "{msgnick $1 $0$2-%n}";
# channel name is printed with message
msgchannel = "%K:%c$*%n";
# private message, $0 = nick, $1 = host
privmsg = "[%R$0%K(%r$1-%K)%n] ";
# private message from you, $0 = "msg", $1 = target nick
ownprivmsg = "[%r$0%K(%R$1-%K)%n] ";
# own private message in query
ownprivmsgnick = "{msgnick $*}";
ownprivnick = "%_$*%n";
# private message in query
privmsgnick = "{msgnick %R$*%n}";
##
## Actions (/ME stuff)
##
# used internally by this theme
action_core = "%_ * $*%n";
# generic one that's used by most actions
action = "{action_core $*} ";
# own action, both private/public
ownaction = "{action $*}";
# own action with target, both private/public
ownaction_target = "{action_core $0}%K:%c$1%n ";
# private action sent by others
pvtaction = "%_ (*) $*%n ";
pvtaction_query = "{action $*}";
# public action sent by others
pubaction = "{action $*}";
##
## other IRC events
##
# whois
whois = "%# $[8]0 : $1-";
# notices
ownnotice = "[%r$0%K(%R$1-%K)]%n ";
notice = "%K-%M$*%K-%n ";
pubnotice_channel = "%K:%m$*";
pvtnotice_host = "%K(%m$*%K)";
servernotice = "%g!$*%n ";
# CTCPs
ownctcp = "[%r$0%K(%R$1-%K)] ";
ctcp = "%g$*%n";
# wallops
wallop = "%_$*%n: ";
wallop_nick = "%n$*";
wallop_action = "%_ * $*%n ";
# netsplits
netsplit = "%R$*%n";
netjoin = "%C$*%n";
# /names list
names_prefix = "";
names_nick = "[%_$0%_$1-] ";
names_nick_op = "{names_nick $*}";
names_nick_halfop = "{names_nick $*}";
names_nick_voice = "{names_nick $*}";
names_users = "[%g$*%n]";
names_channel = "%G$*%n";
# DCC
dcc = "%g$*%n";
dccfile = "%_$*%_";
# DCC chat, own msg/action
dccownmsg = "[%r$0%K($1-%K)%n] ";
dccownnick = "%R$*%n";
dccownquerynick = "%_$*%n";
dccownaction = "{action $*}";
dccownaction_target = "{action_core $0}%K:%c$1%n ";
# DCC chat, others
dccmsg = "[%G$1-%K(%g$0%K)%n] ";
dccquerynick = "%G$*%n";
dccaction = "%_ (*dcc*) $*%n %|";
##
## statusbar
##
# default background for all statusbars. You can also give
# the default foreground color for statusbar items.
sb_background = "%4%w";
# default backround for "default" statusbar group
#sb_default_bg = "%4";
# background for prompt / input line
sb_prompt_bg = "%n";
# background for info statusbar
sb_info_bg = "%8";
# background for topicbar (same default)
#sb_topic_bg = "%4";
# text at the beginning of statusbars. sb-item already puts
# space there,so we don't use anything by default.
sbstart = "";
# text at the end of statusbars. Use space so that it's never
# used for anything.
sbend = " ";
topicsbstart = "{sbstart $*}";
topicsbend = "{sbend $*}";
prompt = "[$*] ";
sb = " %c[%n$*%c]%n";
sbmode = "(%c+%n$*)";
sbaway = " (%GzZzZ%n)";
sbservertag = ":$0 (change with ^X)";
sbnickmode = "$0";
# activity in statusbar
# ',' separator
sb_act_sep = "%c$*";
# normal text
sb_act_text = "%c$*";
# public message
sb_act_msg = "%W$*";
# hilight
sb_act_hilight = "%M$*";
# hilight with specified color, $0 = color, $1 = text
sb_act_hilight_color = "$0$1-%n";
};
formats = {
"Irssi::Script::adv_windowlist" = { awl_display_header = ""; };
};

View File

@@ -1,26 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
-----END CERTIFICATE-----

Some files were not shown because too many files have changed in this diff Show More