Compare commits
622
Commits
b0debaa421
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
679a703ab2
|
||
|
|
ecfcea5106
|
||
|
|
4da176d507
|
||
|
|
cc9531f19f
|
||
|
|
4ab52329e1
|
||
|
|
2597b3ccd3
|
||
|
|
a751124b8b
|
||
|
|
6732a71eb7 | ||
|
|
e6c6d2533d
|
||
|
|
6199caf0d0 | ||
|
|
d93cb286ef | ||
|
|
3c621db727 | ||
|
|
04edd6de89
|
||
|
|
a1cf06624e
|
||
|
|
c7d7cea8ae
|
||
|
|
ff4f7b3909
|
||
|
|
b3082a3313
|
||
|
|
d926a632d5
|
||
|
|
e40d67df59
|
||
|
|
2dc978e719
|
||
|
|
de6349f2dc
|
||
|
|
b59318e957 | ||
|
|
90aaa6dcda | ||
|
|
9af0462d29
|
||
|
|
208ad95883
|
||
|
|
983434ffb4
|
||
|
|
078d01666e
|
||
|
|
c5d2624a06
|
||
|
|
69de224cbf | ||
|
|
8e4b719425 | ||
|
|
8f48120ba9 | ||
|
|
9d7cddf758
|
||
|
|
d4c40519e5 | ||
|
|
fb454da3bc | ||
|
|
91dabd565c
|
||
|
|
453a8500af | ||
|
|
afbc3e97d7
|
||
|
|
3c4f720749
|
||
|
|
a0491b2bd1
|
||
|
|
fae15b8d55
|
||
|
|
ab14837e39
|
||
|
|
ece3e9dbfb
|
||
|
|
7b02348f64
|
||
|
|
4f62710061 | ||
|
|
c77a52acd3
|
||
|
|
31b89bbac7 | ||
|
|
b541323949
|
||
|
|
6679d19a09 | ||
|
|
6b2cc3aefc
|
||
|
|
f2744a9a60 | ||
|
|
2e82761b7d
|
||
|
|
001c5d3df7 | ||
|
|
8487f124c7
|
||
|
|
a994f9e91c | ||
|
|
43752aa268
|
||
|
|
0a2290640f | ||
|
|
23bf649c5f
|
||
|
|
f5c4016fa6
|
||
|
|
dccf897c9f
|
||
|
|
3aa462a2b8
|
||
|
|
23420b3235
|
||
|
|
a3853a93d8
|
||
|
|
328e30882e
|
||
|
|
1f847bfce0
|
||
|
|
7a6a7339dc
|
||
|
|
7d815b17e8
|
||
|
|
2efbcfc53f
|
||
|
|
f6ead99f48
|
||
|
|
639d139799
|
||
|
|
d75bf4f1b4
|
||
|
|
2b1e99ab47
|
||
|
|
3d826c5407
|
||
|
|
a8d564803b
|
||
|
|
3399149cba
|
||
|
|
f3f6e6356b
|
||
|
|
a824005893
|
||
|
|
b0c6d7f7f5
|
||
|
|
71574b5030
|
||
|
|
53b353eb7f
|
||
|
|
ad9926861b
|
||
|
|
29afe5c89f
|
||
|
|
037588ecf6
|
||
|
|
0a9cfebcad
|
||
|
|
889f8e0768
|
||
|
|
e64e964666
|
||
|
|
bca79d3c5a
|
||
|
|
d49d90a2de
|
||
|
|
2ac8e5c0d4
|
||
|
|
85c753aaa6
|
||
|
|
b424b26700
|
||
|
|
d3028d7703
|
||
|
|
52711a42a2
|
||
|
|
c998d1b8d7
|
||
|
|
5fa849fd81 | ||
|
|
a31a46bdc2 | ||
|
|
8fc27fa9c2 | ||
|
|
2edea59ca3 | ||
|
|
5edfb5b720 | ||
|
|
9077d9837e | ||
|
|
dd672ded3b | ||
|
|
4d6b99fb28 | ||
|
|
51da3e9d83 | ||
|
|
bb5b6b361a | ||
|
|
13d415db2b | ||
|
|
c3a2b6fa0c | ||
|
|
3d8d6a4468 | ||
|
|
fb21fa550a | ||
|
|
321b80f1f8 | ||
|
|
574b235b6f | ||
|
|
8a2731d411 | ||
|
|
21a02fd0e4 | ||
|
|
08e66c81ca | ||
|
|
c009bbf257 | ||
|
|
e6d3fd80b3
|
||
|
|
54375a9530
|
||
|
|
2ee2806e01
|
||
|
|
23cae4bd10
|
||
|
|
8c21d34943
|
||
|
|
4912c4052f
|
||
|
|
c5bbbf06e3 | ||
|
|
76afcd5e13 | ||
|
|
28a88a9bdf | ||
|
|
d278a47b32 | ||
|
|
dc3236fddb | ||
|
|
73d41da07d
|
||
|
|
75fbfa1e16
|
||
|
|
3c967c0cee | ||
|
|
f9d400699f
|
||
|
|
d9b56790c5
|
||
|
|
16ea31289d
|
||
|
|
2ad5bf75d2
|
||
|
|
11f4551fa5
|
||
|
|
090779ae5d
|
||
|
|
45f0fb9688
|
||
|
|
4c7334c46e
|
||
|
|
1c9cedb8f3
|
||
|
|
a018d7997c
|
||
|
|
b7ff4e0981
|
||
|
|
2d8db42b12
|
||
|
|
19126316a7
|
||
|
|
2c185f7e23
|
||
|
|
b0585d00ad
|
||
|
|
b5d2c9ba87
|
||
|
|
51543cb7ca
|
||
|
|
3fd9476fbc
|
||
|
|
1dc0e5293d
|
||
|
|
335fdff433 | ||
|
|
a78c6a604d | ||
|
|
aed37d5a75 | ||
|
|
cff4f7b414 | ||
|
|
877c973e87 | ||
|
|
ce3c44a053 | ||
|
|
af764903e7 | ||
|
|
fcb9e0c468 | ||
|
|
1dc86b9ff0 | ||
|
|
ea8b13b38a | ||
|
|
2f49960149 | ||
|
|
f52bfaa55e | ||
|
|
dfb353af09 | ||
|
|
5328529e18 | ||
|
|
81d26e095a | ||
|
|
6cf690e637 | ||
|
|
f7a9ff9d23 | ||
|
|
577ad993ea | ||
|
|
f0de5378fe | ||
|
|
b01124f99d | ||
|
|
2ce8bebf29 | ||
|
|
618ce00f9e | ||
|
|
1aef0ffca8 | ||
|
|
a89a5576a3 | ||
|
|
b754709f02 | ||
|
|
f7cfad559c | ||
|
|
e97b3ee6ab | ||
|
|
d44dbd3564 | ||
|
|
2aad1aca98 | ||
|
|
9969f43ba3 | ||
|
|
82d78d19f5 | ||
|
|
38924d5c3c | ||
|
|
057d9913b9 | ||
|
|
62167a439e | ||
|
|
f4c4922f0e | ||
|
|
857faebeba | ||
|
|
b1a0c6c488 | ||
|
|
500dd8a735 | ||
|
|
9e74cb8f0a | ||
|
|
4006a2f855 | ||
|
|
8b9d0ac1f4 | ||
|
|
51fc669c02 | ||
|
|
c25bb3b105 | ||
|
|
4d7ad64c3a | ||
|
|
3c27e52ada | ||
|
|
70b5868e3e | ||
|
|
c47b51cd6e | ||
|
|
c4e225b007 | ||
|
|
f7598e5e23 | ||
|
|
a5cc8cbd36 | ||
|
|
616596726d | ||
|
|
7466188d35 | ||
|
|
2608a6cd72 | ||
|
|
642c981e4b | ||
|
|
451097d384 | ||
|
|
1ec69309cf | ||
|
|
27f780e733 | ||
|
|
9368a4864c | ||
|
|
6689e69ece | ||
|
|
5f55438581 | ||
|
|
0ef99e4874 | ||
|
|
df929c5335 | ||
|
|
6ef0859e43 | ||
|
|
01f4e376ae | ||
|
|
31d04a2fe0 | ||
|
|
8866236bda | ||
|
|
f7b207aaf4 | ||
|
|
1cb6f37b5b | ||
|
|
a8468f3402 | ||
|
|
040c98c0a7 | ||
|
|
3c0bba1737 | ||
|
|
489e3cc7de | ||
|
|
7ad3b90503 | ||
|
|
db21efee0c | ||
|
|
207540c093 | ||
|
|
6b2d3bf491 | ||
|
|
c3a2e35465 | ||
|
|
e02919de21 | ||
|
|
516b2ba26c | ||
|
|
a981fa7f0a | ||
|
|
760b8e68fd | ||
|
|
04fd832974 | ||
|
|
77c68558b2 | ||
|
|
0554a3dddc | ||
|
|
fbb6b6e740 | ||
|
|
2cf61b0590 | ||
|
|
d748289c11 | ||
|
|
d2e07effc1 | ||
|
|
9d6923f225 | ||
|
|
c0628dbd4c | ||
|
|
31b47ddfc5 | ||
|
|
9642cd69db | ||
|
|
7fa5ca2568 | ||
|
|
94a4fbe45f | ||
|
|
04a02d089f | ||
|
|
3ef83d1747 | ||
|
|
f865ad766d | ||
|
|
f32e0d0ce5 | ||
|
|
8a937124d3 | ||
|
|
d8feaf7143 | ||
|
|
22dcd31c05 | ||
|
|
cbce46b63f | ||
|
|
8ab69f53ed | ||
|
|
c17f6663db | ||
|
|
20adb8f75c | ||
|
|
0e63b4fbb7 | ||
|
|
adbcd1d3c0 | ||
|
|
9e037f2a08 | ||
|
|
96df21444b | ||
|
|
7875b83a94 | ||
|
|
0765a2726a | ||
|
|
80d4f5d9fa | ||
|
|
391e2b6750 | ||
|
|
fc420fad72 | ||
|
|
dfdc1063ba | ||
|
|
4ff120cc5d
|
||
|
|
7c99b475e3 | ||
|
|
262b53c6c4 | ||
|
|
0ff6be3f81 | ||
|
|
86d20105e5
|
||
|
|
6790bf1430
|
||
|
|
e76668d3b1
|
||
|
|
204b13781d
|
||
|
|
0b9cf5a928 | ||
|
|
93831564a8 | ||
|
|
82d761b026
|
||
|
|
742fd7941d
|
||
|
|
cb74cd84e2
|
||
|
|
89fdfc8e72
|
||
|
|
0e9c3b4b27
|
||
|
|
d5535a38ad
|
||
|
|
01553b71fd
|
||
|
|
ffff95f3b9
|
||
|
|
674a50ea05
|
||
|
|
a2d52e1ec2 | ||
|
|
84c6e9b79d | ||
|
|
2d84bcdf7e
|
||
|
|
935ba904bd
|
||
|
|
8b0b5ee85a | ||
|
|
a1297a417e | ||
|
|
5c54ede483
|
||
|
|
f9086bd2ca
|
||
|
|
f9dfc4ca4c | ||
|
|
a899448fda | ||
|
|
429c407548
|
||
|
|
2fb8e3718b
|
||
|
|
11097e32de
|
||
|
|
9d1acf0fb3 | ||
|
|
7d95e7854c | ||
|
|
1972ea5bb9
|
||
|
|
2b9b8e495c | ||
|
|
231162bd03
|
||
|
|
94e4e0dfab
|
||
|
|
7dca813556 | ||
|
|
0fe183c93e
|
||
|
|
dd28fc784b
|
||
|
|
7183ed712b
|
||
|
|
d91c0c8deb | ||
|
|
d2f3da4a23
|
||
|
|
0d8a2110cf | ||
|
|
7ca9d19b93
|
||
|
|
29daf01b95 | ||
|
|
4202be5d3a | ||
|
|
05db9b57d7
|
||
|
|
a690e814eb | ||
|
|
f2874bf890
|
||
|
|
d085d5c597 | ||
|
|
4a00bc5492
|
||
|
|
5b1d90c59d | ||
|
|
11a9db5fad | ||
|
|
12ee2bac89
|
||
|
|
6feaa0ea9e
|
||
|
|
7bbd705d0f
|
||
|
|
d9c8000f68
|
||
|
|
8dba8a31fe
|
||
|
|
6b484599ae | ||
|
|
6e6f276896 | ||
|
|
bbe8aaf88d
|
||
|
|
f62404c692
|
||
|
|
1192e62eaf | ||
|
|
2c624d1a28 | ||
|
|
69e59806df | ||
|
|
ba6146c343
|
||
|
|
8951644c75 | ||
|
|
e180e8d452
|
||
|
|
3155449ef6 | ||
|
|
528ce2a984
|
||
|
|
afad1c9933
|
||
|
|
ea66507c76
|
||
|
|
3e00f4e321
|
||
|
|
78f957b211 | ||
|
|
d6c37fe0ad
|
||
|
|
e63fd8b525
|
||
|
|
c770afa6c4 | ||
|
|
49e487ac3b | ||
|
|
911e656e5e
|
||
|
|
0f02def439 | ||
|
|
24cdfe4129
|
||
|
|
1b69ff9a7f | ||
|
|
0ba43b6226
|
||
|
|
b898cf1030
|
||
|
|
ce1722d97f | ||
|
|
f02714416c
|
||
|
|
cd08c0782e | ||
|
|
927d28c01a | ||
|
|
25fb02b7ac
|
||
|
|
c126296935
|
||
|
|
48e6a96c6d
|
||
|
|
a5e6efc761
|
||
|
|
ca130ff612 | ||
|
|
51f2c020d1 | ||
|
|
5b43f3bbd3
|
||
|
|
19e5225254 | ||
|
|
c2506bdf9c | ||
|
|
c4980a15b1
|
||
|
|
ddaaf35c85 | ||
|
|
7a0e1f0930 | ||
|
|
ef384b9c7c
|
||
|
|
fe59a7c22c
|
||
|
|
1c671d71ac
|
||
|
|
819a3b1541
|
||
|
|
6ac647e0c1
|
||
|
|
690bfd64d0
|
||
|
|
d972de3df5
|
||
|
|
413b8d8fa1
|
||
|
|
27b6b22f6a | ||
|
|
b6034114ad | ||
|
|
e651566e14
|
||
|
|
f6a3ba0453 | ||
|
|
cd08403416
|
||
|
|
4ca008836c
|
||
|
|
980834e961 | ||
|
|
f2f4d4ef49 | ||
|
|
05ba0a4f10
|
||
|
|
49c8191037 | ||
|
|
ab030d7ec0
|
||
|
|
4f00b5a0f4 | ||
|
|
5c21788c8f | ||
|
|
625a58fa9f
|
||
|
|
e20cff41d4
|
||
|
|
5c24d2c72d | ||
|
|
92bcc49962 | ||
|
|
4197e7faec
|
||
|
|
daf81bf0a4
|
||
|
|
cbd5faa66c
|
||
|
|
a65e05b661
|
||
|
|
00f70e8558
|
||
|
|
8d6ca1797a
|
||
|
|
02c46ebea7
|
||
|
|
5f4306b6ca
|
||
|
|
4c51ef7a33
|
||
|
|
67fb29687c
|
||
|
|
b4a58af23c | ||
|
|
073dbd9b14
|
||
|
|
6cd0de7ccf
|
||
|
|
d23cbfc733 | ||
|
|
1bfcd519b8 | ||
|
|
e684eb6134
|
||
|
|
ab2f03213b
|
||
|
|
16e969ee15
|
||
|
|
936f13f712
|
||
|
|
3bb534f20b
|
||
|
|
a4054de4f6
|
||
|
|
c096433b5d
|
||
|
|
36a03202c6
|
||
|
|
e4ef26fe03
|
||
|
|
424a3c76ab
|
||
|
|
beb89e406a
|
||
|
|
63e71ac9dd
|
||
|
|
61a82540fb
|
||
|
|
3ccc5d2210
|
||
|
|
efa86e8eda
|
||
|
|
83e8c52298 | ||
|
|
f674ae303c | ||
|
|
29b69c7b03
|
||
|
|
8c869cc1b9 | ||
|
|
fcc2f6ccc2 | ||
|
|
38bce499bd
|
||
|
|
f3533835be
|
||
|
|
68eb3b0092 | ||
|
|
3362c33339 | ||
|
|
ec47b0671c
|
||
|
|
8495cbaa24
|
||
|
|
fe3eb818ba | ||
|
|
5930514847 | ||
|
|
8068dcb312 | ||
|
|
7afb470a42
|
||
|
|
4761c48d96
|
||
|
|
0a83bd425c | ||
|
|
83d5bd2d40 | ||
|
|
de349a423e
|
||
|
|
0250669306
|
||
|
|
7caf75b940
|
||
|
|
453b5f1d50
|
||
|
|
5cf5ca07c5
|
||
|
|
fbfc52e675
|
||
|
|
b791010e48
|
||
|
|
c6c13c2e99
|
||
|
|
b82166872f
|
||
|
|
ec99ceb018
|
||
|
|
a422400d72
|
||
|
|
2772b26704
|
||
|
|
180ea9337f
|
||
|
|
72920c04ce
|
||
|
|
614c064524 | ||
|
|
5ee09bf13e | ||
|
|
390072e919
|
||
|
|
cd240f4460 | ||
|
|
f6fd093850 | ||
|
|
67f22c8a60
|
||
|
|
6f8fd855e4
|
||
|
|
93829285d8
|
||
|
|
533ab60321
|
||
|
|
43b3cf51f6
|
||
|
|
26b90ecc72
|
||
|
|
b506f2aa39
|
||
|
|
7a1a213add
|
||
|
|
98a5cb4c7c
|
||
|
|
93554695dc
|
||
|
|
8852ed3108 | ||
|
|
47487ddcc0 | ||
|
|
2a5aef2a64
|
||
|
|
bdf4581b28 | ||
|
|
f92ac6ac37
|
||
|
|
cb30f19c32
|
||
|
|
4a5536aeb6
|
||
|
|
5103ddc43d | ||
|
|
29637799f6 | ||
|
|
ec1f00320b
|
||
|
|
878bc360d9
|
||
|
|
6bd6436c81
|
||
|
|
a76e4de605 | ||
|
|
cf8dc8d7e1 | ||
|
|
d3851fcddc
|
||
|
|
261e663e97
|
||
|
|
83abb5b6c6 | ||
|
|
1433844c2b | ||
|
|
034ebade0d
|
||
|
|
8dfbc2a9be | ||
|
|
ed8de40d46
|
||
|
|
d87582253c | ||
|
|
7079319a09
|
||
|
|
3fcc8a3ab5 | ||
|
|
fdd0733b3f | ||
|
|
c3e39b7a96
|
||
|
|
c7d1e642e5
|
||
|
|
3bdc712fa9 | ||
|
|
b81cbd3b02 | ||
|
|
7474760525
|
||
|
|
70f1ec2eeb
|
||
|
|
46dd6cd3a9
|
||
|
|
58e21eba95
|
||
|
|
5cbb01497c
|
||
|
|
7d277e52bd | ||
|
|
dda63a05ff | ||
|
|
399f481adb | ||
|
|
6a6eff2d00 | ||
|
|
a9190cf7ec
|
||
|
|
0c7f7df4ec | ||
|
|
70b4492986 | ||
|
|
1aac43af62
|
||
|
|
68a9cd17bf
|
||
|
|
7564604c53
|
||
|
|
548df81c08 | ||
|
|
b4bac6a562 | ||
|
|
2ff553f7b6
|
||
|
|
914613c751
|
||
|
|
78df24cba1
|
||
|
|
4f266f691b
|
||
|
|
ca0a35e8c7
|
||
|
|
c2ec031af2
|
||
|
|
3990bd13b4 | ||
|
|
429ccc3876 | ||
|
|
a7e6ae4d21
|
||
|
|
5b74fbe427
|
||
|
|
b998cc652e
|
||
|
|
2e1750b5a4
|
||
|
|
764f2253f6
|
||
|
|
2e6abec499
|
||
|
|
5c3d169572 | ||
|
|
50e4d92249 | ||
|
|
a5966fd982
|
||
|
|
976f46757c
|
||
|
|
2a7cb0f5cb
|
||
|
|
8f845f7cf2
|
||
|
|
69384f6427
|
||
|
|
9f9248deb1
|
||
|
|
3a054021cf
|
||
|
|
015daec928
|
||
|
|
d68bedef95
|
||
|
|
e96f874469
|
||
|
|
178214c812
|
||
|
|
45cba3a15b
|
||
|
|
11dc584104
|
||
|
|
0167370823
|
||
|
|
8d0f425b10
|
||
|
|
a483c30c05
|
||
|
|
3befc07887
|
||
|
|
2a9a7ed2ff
|
||
|
|
d1949953df
|
||
|
|
7463d894f2
|
||
|
|
1e1c2003f3
|
||
|
|
e6de825fb1
|
||
|
|
b6ed77d8f9
|
||
|
|
522fd03c12
|
||
|
|
d68f68bec7 | ||
|
|
a92847e6ed | ||
|
|
682e93c794
|
||
|
|
953aafd055
|
||
|
|
39688b28f4 | ||
|
|
654503062b
|
||
|
|
9d2a498089 | ||
|
|
64c559dbab | ||
|
|
93fc5e0517
|
||
|
|
1253f67c9c | ||
|
|
045f141e30 | ||
|
|
f76a45e273
|
||
|
|
95f2ad9112 | ||
|
|
4210f3b445
|
||
|
|
8b9bd248fd | ||
|
|
b323fedf49 | ||
|
|
4f8c45c4ef
|
||
|
|
16394da0d9
|
||
|
|
7527f01a2b
|
||
|
|
0670fbbdad
|
||
|
|
b5513ccbde
|
||
|
|
4c77f3b0af
|
||
|
|
eb828a09d5
|
||
|
|
ab284641a5
|
||
|
|
fefcb9034b
|
||
|
|
e90cdeb259 | ||
|
|
3eec6c3f89 | ||
|
|
36a303f7d4
|
||
|
|
5c224694ec
|
||
|
|
bc0b67a498
|
||
|
|
a3b60718de
|
||
|
|
7744f4f569 | ||
|
|
4eea14576c | ||
|
|
681a48f3c5
|
||
|
|
965d72230c | ||
|
|
71aa38c7ca | ||
|
|
499bf672f8
|
||
|
|
477a4ab265
|
||
|
|
bd0eac8413
|
||
|
|
fc63b4f1b0
|
||
|
|
0cbb7c6892
|
||
|
|
35e86dcd6e
|
||
|
|
4bfea67cc5
|
||
|
|
85a7889c5c | ||
|
|
97f783e9a8 | ||
|
|
764a9d35e5
|
||
|
|
cfd4749e72
|
||
|
|
bddb068ec0
|
||
|
|
608b0227cb
|
||
|
|
5a018fe975
|
||
|
|
cc14f7fb3d
|
||
|
|
bff084db07
|
||
|
|
f75d64bf9c
|
||
|
|
43fd36f5ea
|
||
|
|
9a820fc3e6
|
||
|
|
d20f7f8d7b
|
||
|
|
a4f6ee26cb
|
||
|
|
c9174f9d4a
|
||
|
|
c372c96dd7
|
||
|
|
aa8e4437ec
|
||
|
|
87960cc8cc
|
||
|
|
a9d1d6ac4d | ||
|
|
fc17c9fd61 | ||
|
|
780bda7ab7
|
||
|
|
e4bcbd3da2 | ||
|
|
4bef8f9c91 | ||
|
|
e776e7fba6
|
||
|
|
a170d82086
|
||
|
|
c04c1a4bc2
|
||
|
|
4c989a45c1
|
||
|
|
cccef17031
|
@@ -1,48 +0,0 @@
|
|||||||
name: Generate documentation
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- "docs/fish-config.md"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-docs:
|
|
||||||
runs-on: racknerd-mini
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITEA_TOKEN }}
|
|
||||||
|
|
||||||
- name: Install pandoc
|
|
||||||
run: sudo apt-get update -qq && sudo apt-get install -y pandoc
|
|
||||||
|
|
||||||
- name: Compile man page
|
|
||||||
run: |
|
|
||||||
pandoc --standalone \
|
|
||||||
--from markdown \
|
|
||||||
--to man \
|
|
||||||
docs/fish-config.md \
|
|
||||||
-o docs/fish-config.1
|
|
||||||
|
|
||||||
- name: Generate chunked HTML docs
|
|
||||||
run: |
|
|
||||||
rm -rf docs/html/
|
|
||||||
pandoc -f gfm -t chunkedhtml --split-level=1 --toc \
|
|
||||||
--include-in-header docs/html-style.html \
|
|
||||||
docs/fish-config.md \
|
|
||||||
-o docs/html/
|
|
||||||
|
|
||||||
- name: Generate wiki markdown
|
|
||||||
run: python3 docs/split-wiki.py
|
|
||||||
|
|
||||||
- name: Commit generated docs
|
|
||||||
run: |
|
|
||||||
git config user.name "Gitea Actions"
|
|
||||||
git config user.email "actions@gitea"
|
|
||||||
git add docs/fish-config.1 docs/html/ docs/wiki/
|
|
||||||
git diff --cached --quiet && echo "No changes to commit" && exit 0
|
|
||||||
git commit -m "chore(docs): regenerate man page, HTML docs, and wiki"
|
|
||||||
git push
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
name: Offline docs drift reminder
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- "README.md"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
remind:
|
|
||||||
runs-on: racknerd-mini
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 2
|
|
||||||
|
|
||||||
- name: Check whether offline doc changed in same push
|
|
||||||
id: drift
|
|
||||||
run: |
|
|
||||||
if git diff --name-only HEAD~1 HEAD | grep -q '^docs/fish-config\.md$'; then
|
|
||||||
echo "synced=true" >> "$GITHUB_OUTPUT"
|
|
||||||
else
|
|
||||||
echo "synced=false" >> "$GITHUB_OUTPUT"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Open drift reminder issue
|
|
||||||
if: steps.drift.outputs.synced == 'false'
|
|
||||||
env:
|
|
||||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
|
||||||
SERVER_URL: ${{ github.server_url }}
|
|
||||||
REPO: ${{ github.repository }}
|
|
||||||
SHA: ${{ github.sha }}
|
|
||||||
BRANCH: ${{ github.ref_name }}
|
|
||||||
run: |
|
|
||||||
curl -s -X POST \
|
|
||||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
"${SERVER_URL}/api/v1/repos/${REPO}/issues" \
|
|
||||||
-d "{
|
|
||||||
\"title\": \"docs: README updated — review docs/fish-config.md for drift\",
|
|
||||||
\"body\": \"README.md was modified in commit ${SHA} but \`docs/fish-config.md\` (the offline manual) was not updated in the same push.\n\nPlease review the README diff and update the offline documentation if any functions, keybindings, abbreviations, or configuration options were added, removed, or changed.\n\nCommit: ${SHA}\nBranch: ${BRANCH}\",
|
|
||||||
\"labels\": [\"Kind/Documentation\"]
|
|
||||||
}"
|
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
# The key below is `description`, NOT `about`.
|
||||||
|
#
|
||||||
|
# GitHub requires `description` on a YAML issue form and rejects the
|
||||||
|
# template without it; Gitea wants `about` but explicitly accepts
|
||||||
|
# `description` as a compatible alias. `description` is therefore the
|
||||||
|
# only spelling that works on both the canonical repo and the mirror.
|
||||||
|
# The markdown templates beside this one still use `about`, which is
|
||||||
|
# correct for their format on both forges.
|
||||||
|
name: Bug report
|
||||||
|
description: Something in the config is broken or behaves unexpectedly
|
||||||
|
labels:
|
||||||
|
- Kind/Bug
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for filing a bug.
|
||||||
|
|
||||||
|
**Title it as a plain description of the problem**, not as a
|
||||||
|
conventional-commit subject — `mv clobbers a symlink when the target
|
||||||
|
exists`, not `fix(mv): ...`. The commit format belongs on the PR that
|
||||||
|
fixes this; the `Kind/` and `Area/` labels carry type and scope here.
|
||||||
|
|
||||||
|
Before filing, please confirm the problem survives a fresh shell
|
||||||
|
(`exec fish`) — a stale function definition in a long-lived session is
|
||||||
|
the single most common false alarm.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: fish-version
|
||||||
|
attributes:
|
||||||
|
label: fish version
|
||||||
|
description: Output of `fish --version`. This config targets fish 4.x.
|
||||||
|
placeholder: fish, version 4.0.2
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: os
|
||||||
|
attributes:
|
||||||
|
label: Operating system
|
||||||
|
description: Distribution and version, or macOS release.
|
||||||
|
placeholder: Arch Linux (CachyOS), kernel 6.12.4
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: terminal
|
||||||
|
attributes:
|
||||||
|
label: Terminal emulator
|
||||||
|
description: >-
|
||||||
|
Only matters for rendering, key bindings, and color problems. Leave it
|
||||||
|
blank if the bug has nothing to do with those.
|
||||||
|
placeholder: kitty 0.42.1
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: area
|
||||||
|
attributes:
|
||||||
|
label: Area
|
||||||
|
description: >-
|
||||||
|
Which part of the config is affected? Pick the closest match — a
|
||||||
|
maintainer translates this into the matching `Area/` label at triage,
|
||||||
|
since contributors without push access can't set labels themselves.
|
||||||
|
Choose "Not sure" rather than guessing.
|
||||||
|
options:
|
||||||
|
- Not sure
|
||||||
|
- Functions (functions/)
|
||||||
|
- Completions (completions/)
|
||||||
|
- Config and startup (config.fish, conf.d/)
|
||||||
|
- Docs (docs/manual/, man page, docs site)
|
||||||
|
- Tests (tests/)
|
||||||
|
- CI (.github/workflows/)
|
||||||
|
- Integrations (integrations/)
|
||||||
|
- Prompt and theme (themes/)
|
||||||
|
- Opinionated components (C1-C6 toggles)
|
||||||
|
- Scripts (scripts/)
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: summary
|
||||||
|
attributes:
|
||||||
|
label: What's broken
|
||||||
|
description: One or two sentences. Name the function or file if you know it.
|
||||||
|
placeholder: >-
|
||||||
|
`mv` replaces an existing symlink instead of prompting, so the link
|
||||||
|
target is lost with no confirmation.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: >-
|
||||||
|
Exact commands, starting from a fresh shell, that someone else can
|
||||||
|
paste and run. Include any setup needed to reach the broken state.
|
||||||
|
render: fish
|
||||||
|
placeholder: |
|
||||||
|
exec fish
|
||||||
|
mkdir -p /tmp/repro; cd /tmp/repro
|
||||||
|
touch real; ln -s real link
|
||||||
|
mv real link
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected
|
||||||
|
attributes:
|
||||||
|
label: Expected behavior
|
||||||
|
description: What you thought those commands would do.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: actual
|
||||||
|
attributes:
|
||||||
|
label: Actual behavior
|
||||||
|
description: >-
|
||||||
|
What happened instead. Paste the complete output, including any error
|
||||||
|
text and stack traces — truncated errors are the usual reason a bug
|
||||||
|
report stalls in Status/Need More Info.
|
||||||
|
render: text
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: preflight
|
||||||
|
attributes:
|
||||||
|
label: Pre-flight
|
||||||
|
options:
|
||||||
|
- label: I searched the existing issues and this isn't already reported.
|
||||||
|
required: true
|
||||||
|
- label: I reproduced this in a fresh shell (`exec fish`), not a long-lived session.
|
||||||
|
required: true
|
||||||
|
- label: I ran `fish tests/run-tests.fish` and noted the result below (or in the output above).
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: context
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: >-
|
||||||
|
Anything else worth knowing: a private overlay in
|
||||||
|
`~/.config/.user-dots/fish/` that may be involved, opinionated
|
||||||
|
components you've disabled, the last commit where it worked. Never
|
||||||
|
paste credentials, tokens, or machine-specific paths you'd rather not
|
||||||
|
publish.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Read by both Gitea (the canonical repo) and GitHub (the mirror).
|
||||||
|
#
|
||||||
|
# The .yml extension is required: Gitea accepts config.yaml or config.yml,
|
||||||
|
# but GitHub only recognizes config.yml and silently ignores config.yaml.
|
||||||
|
# Don't "tidy" this back to .yaml — the chooser on the mirror stops working.
|
||||||
|
#
|
||||||
|
# Blank issues stay enabled deliberately: the three templates cover bugs,
|
||||||
|
# features, and docs, and anything else (a chore, a refactor, a question)
|
||||||
|
# is better served by an empty box than by a template that doesn't fit.
|
||||||
|
blank_issues_enabled: true
|
||||||
|
|
||||||
|
contact_links:
|
||||||
|
- name: Canonical repository and issue tracker
|
||||||
|
url: https://git.rootiest.dev/rootiest/fish-config/issues
|
||||||
|
about: fish-config is developed on Gitea. If you came from the GitHub mirror, please file here instead — the mirror is read-only and issues opened there are easy to miss.
|
||||||
|
- name: Contributing guide
|
||||||
|
url: https://git.rootiest.dev/rootiest/fish-config/src/branch/main/CONTRIBUTING.md
|
||||||
|
about: Branch naming, commit conventions, coding standards, and the label taxonomy.
|
||||||
|
- name: Customization and personal overrides
|
||||||
|
url: https://git.rootiest.dev/rootiest/fish-config/src/branch/main/docs/manual/07-customization.md
|
||||||
|
about: Want to change behavior on just your machine? Use your private overlay — no issue needed.
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
name: Documentation issue
|
||||||
|
about: Something in the manual, man page, config-help, or docs site is wrong, missing, or unclear
|
||||||
|
labels:
|
||||||
|
- Kind/Documentation
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Title this as a plain description of the problem:
|
||||||
|
|
||||||
|
config-help shows literal backticks in the customization section
|
||||||
|
|
||||||
|
not `docs(help): ...`. See CONTRIBUTING.md § Labels.
|
||||||
|
|
||||||
|
Docs in this repo are GENERATED. docs/manual/** plus the doc-header
|
||||||
|
comments above each function are the single source of truth;
|
||||||
|
docs/fish-config.md and docs/fish-config.1 are build output and are never
|
||||||
|
hand-edited. So a fix always lands in the source, not in the page where you
|
||||||
|
saw the problem — the Location section below asks for both.
|
||||||
|
|
||||||
|
Delete these comments as you fill it in.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Location
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Where you saw it, and where it actually comes from.
|
||||||
|
|
||||||
|
- **Where you saw it** — the docs site URL, the `config-help <topic>` you
|
||||||
|
ran, `man fish-config`, or the README section.
|
||||||
|
- **Source file** — the docs/manual/** page, or the function whose
|
||||||
|
doc-header feeds it (e.g. `functions/mv.fish`). If you're not sure which,
|
||||||
|
say so and leave it to triage rather than guessing.
|
||||||
|
|
||||||
|
If the problem appears in one output but not the others — correct on the
|
||||||
|
site, broken in the pager — say which, since that usually points at the
|
||||||
|
rendering pass (docs/codespans.py) rather than the source text.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
<!--
|
||||||
|
What's wrong. Quote the current text so it can be found and compared.
|
||||||
|
Common shapes, if it helps you place yours:
|
||||||
|
|
||||||
|
- **Wrong** — documents behavior the code doesn't have.
|
||||||
|
- **Stale** — described a flag or path that has since changed.
|
||||||
|
- **Missing** — a function, flag, or setting with no entry at all. Note
|
||||||
|
that a function with no `# CATEGORY` header is omitted from the manual
|
||||||
|
deliberately, so "missing" may be an intentional opt-out.
|
||||||
|
- **Unclear** — accurate, but a reader can't act on it. Say what you
|
||||||
|
expected to learn and what you concluded instead.
|
||||||
|
- **Renders wrong** — a broken code span, a mangled table, a bad anchor.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Suggested fix
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Proposed wording or structure, if you have one — a diff-shaped
|
||||||
|
before/after is ideal, but a rough sketch is welcome too. "I don't know
|
||||||
|
what it should say, only that this confused me" is a legitimate and useful
|
||||||
|
report; keep the heading and say that.
|
||||||
|
|
||||||
|
Two constraints on any text under docs/manual/, both enforced by
|
||||||
|
docs/verify-manual.py:
|
||||||
|
|
||||||
|
- No backticks inside an indented block.
|
||||||
|
- No backtick span wrapped across a line break.
|
||||||
|
|
||||||
|
Doc-headers in .fish files take no backticks at all — docs/codespans.py
|
||||||
|
adds code spans when it renders. See CONTRIBUTING.md § Documentation
|
||||||
|
Pipeline.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Anything else — related issues (`Refs #42`), the commit that introduced the
|
||||||
|
problem, other pages with the same mistake. Drop this heading if empty.
|
||||||
|
-->
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
---
|
||||||
|
name: Feature or enhancement request
|
||||||
|
about: Propose new functionality, or an improvement to something that already exists
|
||||||
|
labels:
|
||||||
|
- Kind/Feature
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Title this as a plain description of what you want, NOT as a
|
||||||
|
conventional-commit subject:
|
||||||
|
|
||||||
|
A picker for switching themes without editing config.fish
|
||||||
|
|
||||||
|
not `feat(theme): add theme picker`. That format belongs on the PR that
|
||||||
|
implements this; here, the Kind/ and Area/ labels carry type and scope.
|
||||||
|
See CONTRIBUTING.md § Labels.
|
||||||
|
|
||||||
|
This template applies Kind/Feature. If you're proposing an improvement to
|
||||||
|
something that already exists rather than genuinely new functionality, say
|
||||||
|
so in the Summary — a maintainer will swap the label to Kind/Enhancement
|
||||||
|
at triage. Contributors without push access can't set labels directly.
|
||||||
|
|
||||||
|
Keep every heading below except Alternatives considered and Notes, which
|
||||||
|
you can drop if they'd be empty. Delete these comments as you go.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
<!--
|
||||||
|
What you want, in one or two sentences. Lead with the capability, not the
|
||||||
|
implementation — "a way to preview a theme before committing to it" rather
|
||||||
|
than "add a --preview flag to theme-set".
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
<!--
|
||||||
|
What's awkward, slow, or impossible today. Be concrete about the situation
|
||||||
|
that led you here: the sequence of commands you run now, what you have to
|
||||||
|
remember, or what goes wrong. A proposal is only as good as the problem it
|
||||||
|
names, and this section is what a reviewer weighs the cost against.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Proposed behavior
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The concrete shape of the thing. Where they apply:
|
||||||
|
|
||||||
|
- The command or function name, and its flags.
|
||||||
|
- What it prints on success, and what it does on the error paths.
|
||||||
|
- What happens with no arguments, or with a missing dependency.
|
||||||
|
- Whether it's interactive, and what it falls back to when it isn't.
|
||||||
|
|
||||||
|
A short usage sketch in a ```fish block is worth several paragraphs.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Alternatives considered
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Other approaches you weighed and why you set them aside — including
|
||||||
|
"solve it in my own ~/.config/.user-dots/fish/local.fish instead", which is
|
||||||
|
the right answer for anything genuinely specific to one machine or one
|
||||||
|
person's taste. See CONTRIBUTING.md § Secrets & Machine-Specific Config.
|
||||||
|
|
||||||
|
Drop this heading if there were no real alternatives.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Answer these — they determine how the change has to be built, and getting
|
||||||
|
them wrong late is expensive:
|
||||||
|
|
||||||
|
- Does this shadow a builtin or an existing command?
|
||||||
|
- Does it run at startup, or bind a key, or set an environment variable?
|
||||||
|
- Does it need a new external dependency, and what should happen when that
|
||||||
|
dependency is missing?
|
||||||
|
- Is it opinionated enough that users should be able to turn it off? If any
|
||||||
|
of the above is yes, it likely needs a `# COMPONENT` header and an
|
||||||
|
`__fish_config_op_enabled` guard — see CONTRIBUTING.md § Opinionated
|
||||||
|
Components.
|
||||||
|
- Does it need a manual entry (a `# CATEGORY` header), and under which of
|
||||||
|
the docs/manual/05-functions/ categories?
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Acceptance criteria
|
||||||
|
|
||||||
|
<!--
|
||||||
|
What must be true for this issue to close, as a checkbox list. This is the
|
||||||
|
issue-side counterpart to a PR's ## Verification: it's the shared
|
||||||
|
definition of done, agreed before the work starts rather than argued about
|
||||||
|
after.
|
||||||
|
|
||||||
|
- One observable outcome per line — behavior a reader could check, not
|
||||||
|
implementation steps.
|
||||||
|
- Cover the error and fallback paths, not just the happy one.
|
||||||
|
- Include the docs and tests the change will owe.
|
||||||
|
|
||||||
|
Leave the boxes unchecked; they get ticked as the work lands.
|
||||||
|
-->
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Anything else: prior art in other shells or dotfiles, links to the relevant
|
||||||
|
upstream tool's docs, related issues (`Refs #42`). Drop this heading if
|
||||||
|
there's nothing to add.
|
||||||
|
-->
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
<!--
|
||||||
|
PR title: Conventional Commits — type(scope): description
|
||||||
|
e.g. fix(mv): bring header and completions up to repo conventions
|
||||||
|
Lowercase after the colon, imperative mood, no trailing period.
|
||||||
|
Append `!` after the scope for a breaking change: feat(logging)!: ...
|
||||||
|
Types in use: feat, fix, docs, test, chore, perf, refactor, style.
|
||||||
|
See CONTRIBUTING.md § Commit Conventions.
|
||||||
|
|
||||||
|
Still writing code? Prefix the title with `WIP:` —
|
||||||
|
WIP: feat(media): add play-media fzf picker
|
||||||
|
Gitea recognizes the prefix, marks the PR a draft, and blocks merging
|
||||||
|
until you remove it. The prefix goes before the whole conventional
|
||||||
|
subject, and comes off when the branch is complete.
|
||||||
|
|
||||||
|
`WIP:` means MORE CHANGES ARE COMING. It is not for a finished branch
|
||||||
|
waiting on verification — that is what an unchecked box in Verification
|
||||||
|
already signals. A complete branch with open checkboxes is a normal PR,
|
||||||
|
not a WIP.
|
||||||
|
|
||||||
|
Keep the two headings below, in this order, and delete these comments.
|
||||||
|
Optional sections may be added between them (see the note above
|
||||||
|
"Verification").
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
<!--
|
||||||
|
What changed and why. A short prose paragraph, 2-5 bullets, or a
|
||||||
|
paragraph followed by bullets — whichever fits the change.
|
||||||
|
|
||||||
|
- Name concrete paths and identifiers in backticks (`functions/mv.fish`,
|
||||||
|
`$__fish_config_op_autoexec`), not vague descriptions.
|
||||||
|
- Lead a bullet with a **bold phrase** when it covers a distinct file or
|
||||||
|
behavior, so the list scans at a glance.
|
||||||
|
- Explain the reasoning, not just the diff — a reader should understand
|
||||||
|
why this approach over the obvious alternative.
|
||||||
|
- Say so explicitly when there is no behavioral change, when a file is
|
||||||
|
generated by the docs pipeline, or when the change is scoped to the
|
||||||
|
site build only.
|
||||||
|
|
||||||
|
If this PR resolves a tracked issue, close it with a trailing line at the
|
||||||
|
end of this section — not at the very bottom, since Verification is
|
||||||
|
always last:
|
||||||
|
|
||||||
|
Closes #42
|
||||||
|
|
||||||
|
Gitea and GitHub both auto-close the issue on merge. `Fixes #N` and
|
||||||
|
`Resolves #N` work identically; pick whichever reads correctly. Use one
|
||||||
|
line per issue (`Closes #42, closes #43` — the keyword must be repeated,
|
||||||
|
a bare `#43` after a comma is only a link and will NOT close). For an
|
||||||
|
issue that is related but should stay open, reference it without a
|
||||||
|
keyword: `Refs #42`. Omit all of this entirely when no issue is involved
|
||||||
|
— do not leave an empty `Closes #` behind.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
OPTIONAL SECTIONS — add any `##` heading here that the change actually
|
||||||
|
needs, and skip them entirely for a straightforward one. Used in this
|
||||||
|
repo, roughly in order of frequency:
|
||||||
|
|
||||||
|
## Root cause — for a bug fix, what was actually wrong
|
||||||
|
## Why — motivation, when it isn't obvious
|
||||||
|
## How it works — mechanism, for a non-trivial new feature
|
||||||
|
## Behavior — user-visible behavior before/after
|
||||||
|
## Changes — a longer breakdown than Summary can carry
|
||||||
|
## Docs — documentation touched by this change
|
||||||
|
## Notes — caveats, follow-ups, deferred work
|
||||||
|
## Scope note — what this deliberately does NOT cover
|
||||||
|
## Opinionated guard (C1-C6)
|
||||||
|
— which tier gates this, and behavior when off
|
||||||
|
## ⚠️ Breaking Change — required whenever the title carries `!`;
|
||||||
|
state the break and the migration path
|
||||||
|
|
||||||
|
A "Why not <alternative>?" heading is also common when a reviewer would
|
||||||
|
reasonably ask why the obvious approach was rejected.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Every check this change needs, as a checkbox list. Always the last
|
||||||
|
section.
|
||||||
|
|
||||||
|
A CHECKED box means verified — either it ran programmatically (test
|
||||||
|
suite, linter, docs verifier, CI) or the author performed it by hand and
|
||||||
|
confirmed the result. Check these off before opening the PR.
|
||||||
|
|
||||||
|
An UNCHECKED box is an outstanding manual check the reviewer still has to
|
||||||
|
perform. Leave anything you could not verify yourself unchecked rather
|
||||||
|
than dropping it, so it stays visible.
|
||||||
|
|
||||||
|
**This list is the merge gate: the PR does not merge until every box is
|
||||||
|
checked.** So only put things here that can actually be resolved — a
|
||||||
|
check nobody is able to run blocks the PR forever. Genuinely unverifiable
|
||||||
|
caveats, assumptions, and known limitations belong in a `## Notes`
|
||||||
|
section instead, where they inform the review without gating it.
|
||||||
|
|
||||||
|
- One check per line, imperative, with the exact command in backticks
|
||||||
|
and the expected result stated.
|
||||||
|
- Cover the regression path, not just the happy path: the old behavior
|
||||||
|
still working, the opinionated toggle disabled, the error branch.
|
||||||
|
- Include the repo's standing gates when the change touches what they
|
||||||
|
guard: `fish -n <file>`, `fish_indent`, `python3 docs/verify-manual.py`,
|
||||||
|
`python3 docs/build-manual.py --site`, `fish tests/run-tests.fish`.
|
||||||
|
- Reset any universal variable you set during a check.
|
||||||
|
-->
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
- [ ]
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- "docs/manual/**"
|
||||||
|
- "docs/build-manual.py"
|
||||||
|
- "docs/manualtools.py"
|
||||||
|
- "docs/verify-manual.py"
|
||||||
|
- "docs/site/**"
|
||||||
|
- "functions/**"
|
||||||
|
- "conf.d/**"
|
||||||
|
- "config.fish"
|
||||||
|
- "completions/**"
|
||||||
|
- "integrations/**"
|
||||||
|
- "tests/**"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
job:
|
||||||
|
description: "Job to run"
|
||||||
|
required: false
|
||||||
|
default: all
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- all
|
||||||
|
- test
|
||||||
|
- build-docs
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# This workflow file is mirrored to GitHub as-is, but the runner label
|
||||||
|
# below (racknerd-mini) only exists on the Gitea instance -- on GitHub
|
||||||
|
# the job just sits queued forever with no matching runner, so the
|
||||||
|
# mirror never gets a completed status. Gate the real jobs to Gitea and
|
||||||
|
# let the github-mirror job below stand in on GitHub instead.
|
||||||
|
test:
|
||||||
|
if: |
|
||||||
|
github.server_url != 'https://github.com' &&
|
||||||
|
(github.event_name != 'workflow_dispatch' || github.event.inputs.job == 'all' || github.event.inputs.job == 'test')
|
||||||
|
runs-on: racknerd-mini
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
|
||||||
|
- name: Install fish
|
||||||
|
run: |
|
||||||
|
sudo apt-get -o Acquire::Retries=3 update -qq
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y software-properties-common
|
||||||
|
sudo add-apt-repository -y ppa:fish-shell/release-4
|
||||||
|
sudo apt-get -o Acquire::Retries=3 update -qq
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y fish
|
||||||
|
|
||||||
|
- name: Run fish config tests
|
||||||
|
run: fish tests/run-tests.fish
|
||||||
|
|
||||||
|
build-docs:
|
||||||
|
needs: test
|
||||||
|
if: |
|
||||||
|
github.server_url != 'https://github.com' &&
|
||||||
|
always() &&
|
||||||
|
(github.event.inputs.job == 'build-docs' ||
|
||||||
|
((github.event_name != 'workflow_dispatch' || github.event.inputs.job == 'all') &&
|
||||||
|
needs.test.result == 'success'))
|
||||||
|
runs-on: racknerd-mini
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get -o Acquire::Retries=3 update -qq
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y software-properties-common
|
||||||
|
sudo add-apt-repository -y ppa:fish-shell/release-4
|
||||||
|
sudo apt-get -o Acquire::Retries=3 update -qq
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y pandoc python3-yaml fish
|
||||||
|
|
||||||
|
- name: Generate concatenated markdown
|
||||||
|
run: python3 docs/build-manual.py --concat -o docs/fish-config.md
|
||||||
|
|
||||||
|
# Regeneration MUST run before verification: verify-manual.py's
|
||||||
|
# test_concat_roundtrips_original compares a freshly-built concat
|
||||||
|
# against docs/fish-config.md on disk. Before this step ran, that
|
||||||
|
# file was still the stale pre-push copy, so any ordinary edit under
|
||||||
|
# docs/manual/** failed the round-trip check before anything was
|
||||||
|
# regenerated. Do not reorder this back — verification still gates
|
||||||
|
# pandoc and the auto-commit below, it just no longer requires a
|
||||||
|
# contributor to hand-sync the generated file before pushing.
|
||||||
|
- name: Verify manual integrity
|
||||||
|
run: python3 docs/verify-manual.py
|
||||||
|
|
||||||
|
- name: Compile man page
|
||||||
|
run: |
|
||||||
|
pandoc --standalone \
|
||||||
|
--from markdown \
|
||||||
|
--to man \
|
||||||
|
docs/fish-config.md \
|
||||||
|
-o docs/fish-config.1
|
||||||
|
|
||||||
|
- name: Set up Node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: "24"
|
||||||
|
|
||||||
|
- name: Generate site content
|
||||||
|
run: python3 docs/build-manual.py --site
|
||||||
|
|
||||||
|
- name: Build documentation site
|
||||||
|
working-directory: docs/site
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
npx astro build
|
||||||
|
|
||||||
|
- name: Deploy to Cloudflare Pages
|
||||||
|
working-directory: docs/site
|
||||||
|
env:
|
||||||
|
CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
run: |
|
||||||
|
npx --yes wrangler pages deploy dist/ \
|
||||||
|
--project-name=fish-config-docs \
|
||||||
|
--branch=main \
|
||||||
|
--commit-dirty=true
|
||||||
|
|
||||||
|
- name: Commit generated docs
|
||||||
|
env:
|
||||||
|
BOT_GPG_KEY: ${{ secrets.CI_GPG_PRIVATE_KEY }}
|
||||||
|
run: |
|
||||||
|
# actions@gitea was never a verified email on any account, so
|
||||||
|
# these commits could never show as signed/verified regardless
|
||||||
|
# of server config. fishconfig-bot is a dedicated Gitea account
|
||||||
|
# (verified email, no login) that owns this key; the private
|
||||||
|
# key lives only in the CI_GPG_PRIVATE_KEY repo secret.
|
||||||
|
#
|
||||||
|
# Secret is base64-encoded: a raw multi-line armored key piped
|
||||||
|
# through `echo "$VAR" | gpg --import` came out CRC-corrupted
|
||||||
|
# ("Invalid keyring") the first time this ran -- something in
|
||||||
|
# the secret/env round-trip mangles embedded newlines. Base64
|
||||||
|
# collapses it to one line immune to that.
|
||||||
|
export GNUPGHOME="$(mktemp -d)"
|
||||||
|
chmod 700 "$GNUPGHOME"
|
||||||
|
echo "pinentry-mode loopback" > "$GNUPGHOME/gpg.conf"
|
||||||
|
echo "allow-loopback-pinentry" > "$GNUPGHOME/gpg-agent.conf"
|
||||||
|
command -v gpg >/dev/null || sudo apt-get install -y --no-install-recommends gnupg
|
||||||
|
echo "$BOT_GPG_KEY" | base64 -d | gpg --batch --import
|
||||||
|
git config user.name "Gitea Actions Bot"
|
||||||
|
git config user.email "fishconfig-bot@git.rootiest.dev"
|
||||||
|
git config user.signingkey CAA082C2F3467E1F7217AD492075C120312D23F4
|
||||||
|
git config commit.gpgsign true
|
||||||
|
git add docs/fish-config.md docs/fish-config.1 conf.d/__fish_config_op_registry.fish
|
||||||
|
git diff --cached --quiet && echo "No changes to commit" && exit 0
|
||||||
|
git commit -m "chore(docs): regenerate manual, man page, and component registry"
|
||||||
|
git push
|
||||||
|
|
||||||
|
# Stand-in for the GitHub mirror so the commit gets a completed status
|
||||||
|
# instead of the real jobs above sitting queued forever for a
|
||||||
|
# self-hosted runner that only exists on the Gitea instance.
|
||||||
|
github-mirror:
|
||||||
|
if: github.server_url == 'https://github.com'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Note that CI runs on Gitea
|
||||||
|
run: |
|
||||||
|
echo "This repository mirrors from Gitea (git.rootiest.dev), where CI actually runs."
|
||||||
|
echo "See the commit's status on the Gitea instance for the real test/build-docs results."
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
name: Sync labels to mirror
|
||||||
|
|
||||||
|
# Labels do not travel with a mirror push -- mirroring copies files, not
|
||||||
|
# repository settings -- but they matter on the GitHub side anyway, because
|
||||||
|
# GitHub reads the same .github/ISSUE_TEMPLATE/ files and silently drops a
|
||||||
|
# labels: entry naming a label it does not have. Gitea is the source of
|
||||||
|
# truth; this makes the mirror match.
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# 06:00 UTC daily. Label churn is rare, so a slower cadence than this
|
||||||
|
# would leave the mirror wrong for most of a working day after an edit.
|
||||||
|
- cron: "0 6 * * *"
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
# Exercise the sync as soon as its own logic changes, rather than
|
||||||
|
# waiting for the next scheduled run to find out it is broken.
|
||||||
|
- "scripts/sync-labels.py"
|
||||||
|
- ".github/workflows/sync-labels.yml"
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
dry_run:
|
||||||
|
description: "Report the plan without changing anything"
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync-labels:
|
||||||
|
# This file is mirrored to GitHub as-is. The runner label below only
|
||||||
|
# exists on the Gitea instance, so on GitHub the job would sit queued
|
||||||
|
# forever against a runner that will never pick it up -- the same
|
||||||
|
# problem the github-mirror stand-in in ci.yml exists to solve. A
|
||||||
|
# skipped job costs nothing and produces no stuck status.
|
||||||
|
if: github.server_url != 'https://github.com'
|
||||||
|
runs-on: racknerd-mini
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
|
||||||
|
- name: Install Python
|
||||||
|
run: |
|
||||||
|
sudo apt-get -o Acquire::Retries=3 update -qq
|
||||||
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install \
|
||||||
|
--no-install-recommends -y python3
|
||||||
|
|
||||||
|
# Cheap, offline, and no token needed. Catches a broken diff before
|
||||||
|
# anything is allowed to mutate labels on the mirror.
|
||||||
|
- name: Check the diff logic
|
||||||
|
run: python3 scripts/sync-labels.py --self-test
|
||||||
|
|
||||||
|
- name: Sync labels
|
||||||
|
env:
|
||||||
|
GH_MIRROR_TOKEN: ${{ secrets.GH_MIRROR_TOKEN }}
|
||||||
|
run: |
|
||||||
|
if [ -z "$GH_MIRROR_TOKEN" ]; then
|
||||||
|
echo "::error::GH_MIRROR_TOKEN is not set in this repository's Actions secrets."
|
||||||
|
echo "Create a fine-grained GitHub token scoped to rootiest/fish-config with"
|
||||||
|
echo "Issues: read and write, plus Pull requests: read, and add it as"
|
||||||
|
echo "GH_MIRROR_TOKEN under Settings -> Actions -> Secrets."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "${{ inputs.dry_run }}" = "true" ]; then
|
||||||
|
python3 scripts/sync-labels.py --dry-run
|
||||||
|
else
|
||||||
|
python3 scripts/sync-labels.py
|
||||||
|
fi
|
||||||
+204
-2
@@ -1,6 +1,6 @@
|
|||||||
# GitIgnore for Fish-config
|
# GitIgnore for Fish-config
|
||||||
|
|
||||||
# id: gitig-boilerplate-7f0528027e23f210196ae4583c408e5b
|
# id: gitig-boilerplate-a27b89403ff9f0bb3340ede87b42f93e
|
||||||
# ╭──────────────────────────────────────────────────────────╮
|
# ╭──────────────────────────────────────────────────────────╮
|
||||||
# │ GitIgnore Boilerplate Template │
|
# │ GitIgnore Boilerplate Template │
|
||||||
# ╰──────────────────────────────────────────────────────────╯
|
# ╰──────────────────────────────────────────────────────────╯
|
||||||
@@ -60,7 +60,10 @@
|
|||||||
# ──────────────────── Planning Artifacts ───────────────────
|
# ──────────────────── Planning Artifacts ───────────────────
|
||||||
# Catalog files generated by pre-implementation analysis passes
|
# Catalog files generated by pre-implementation analysis passes
|
||||||
opinionated_catalog.md
|
opinionated_catalog.md
|
||||||
|
.superpowers
|
||||||
docs/superpowers
|
docs/superpowers
|
||||||
|
docs/specs
|
||||||
|
docs/plans
|
||||||
|
|
||||||
# ──────────────────── Runtime State Files ───────────────────
|
# ──────────────────── Runtime State Files ───────────────────
|
||||||
# Sentinel file written/removed at runtime to coordinate logging state
|
# Sentinel file written/removed at runtime to coordinate logging state
|
||||||
@@ -90,8 +93,9 @@ functions/sponge_*.fish
|
|||||||
[Aa][nN][Tt][Ii][Gg][Rr][Aa][Vv][Ii][Tt][Yy].[Mm][Dd]
|
[Aa][nN][Tt][Ii][Gg][Rr][Aa][Vv][Ii][Tt][Yy].[Mm][Dd]
|
||||||
.[Aa][Nn][Tt][Ii][Gg][Rr][Aa][Vv]*
|
.[Aa][Nn][Tt][Ii][Gg][Rr][Aa][Vv]*
|
||||||
|
|
||||||
# Matches AGENTS.md, .remember, etc.
|
# Matches AGENTS.md, .agents/ (agy), .remember, etc.
|
||||||
[Aa][Gg][Ee][Nn][Tt][Ss].[Mm][Dd]
|
[Aa][Gg][Ee][Nn][Tt][Ss].[Mm][Dd]
|
||||||
|
.[Aa][Gg][Ee][Nn][Tt][Ss]*
|
||||||
.[Rr][Ee][Mm][Ee][Mm][Bb][Ee][Rr]
|
.[Rr][Ee][Mm][Ee][Mm][Bb][Ee][Rr]
|
||||||
|
|
||||||
# ──────────────────────────────────────────────────────────────
|
# ──────────────────────────────────────────────────────────────
|
||||||
@@ -107,3 +111,201 @@ fish_variables
|
|||||||
config.local.fish
|
config.local.fish
|
||||||
|
|
||||||
# End of https://www.toptal.com/developers/gitignore/api/fish
|
# End of https://www.toptal.com/developers/gitignore/api/fish
|
||||||
|
|
||||||
|
# id: gi-patterns-e390e9c720b3dda36906a2b4cb76ffdd
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/python
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=python
|
||||||
|
|
||||||
|
### Python ###
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
cover/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
db.sqlite3-journal
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
.pybuilder/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# IPython
|
||||||
|
profile_default/
|
||||||
|
ipython_config.py
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
# For a library or package, you might want to ignore these files since the code is
|
||||||
|
# intended to run in multiple environments; otherwise, check them in:
|
||||||
|
# .python-version
|
||||||
|
|
||||||
|
# pipenv
|
||||||
|
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||||
|
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||||
|
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||||
|
# install all needed dependencies.
|
||||||
|
#Pipfile.lock
|
||||||
|
|
||||||
|
# poetry
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||||
|
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||||
|
# commonly ignored for libraries.
|
||||||
|
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||||
|
#poetry.lock
|
||||||
|
|
||||||
|
# pdm
|
||||||
|
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||||
|
#pdm.lock
|
||||||
|
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||||
|
# in version control.
|
||||||
|
# https://pdm.fming.dev/#use-with-ide
|
||||||
|
.pdm.toml
|
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# pytype static type analyzer
|
||||||
|
.pytype/
|
||||||
|
|
||||||
|
# Cython debug symbols
|
||||||
|
cython_debug/
|
||||||
|
|
||||||
|
# PyCharm
|
||||||
|
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||||
|
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||||
|
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||||
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
|
#.idea/
|
||||||
|
|
||||||
|
### Python Patch ###
|
||||||
|
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
|
||||||
|
poetry.toml
|
||||||
|
|
||||||
|
# ruff
|
||||||
|
.ruff_cache/
|
||||||
|
|
||||||
|
# LSP config files
|
||||||
|
pyrightconfig.json
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/python
|
||||||
|
|
||||||
|
# ──────────────── Added by agents-init ──────────────────
|
||||||
|
# agents-init --agents
|
||||||
|
AGENTS/
|
||||||
|
# ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# ──────────────── Added by agents-init ──────────────────
|
||||||
|
# agents-init --plugins
|
||||||
|
docs/devlogs
|
||||||
|
# ────────────────────────────────────────────────────────
|
||||||
|
/.cache_ggshield
|
||||||
|
user-dots
|
||||||
|
|
||||||
|
# ──────────────────── Generated Docs Site ───────────────────
|
||||||
|
docs/site/node_modules/
|
||||||
|
docs/site/dist/
|
||||||
|
docs/site/.astro/
|
||||||
|
docs/site/src/content/docs/
|
||||||
|
docs/site/src/sidebar.json
|
||||||
|
/conf.d/uv.env.fish
|
||||||
|
|||||||
+568
@@ -0,0 +1,568 @@
|
|||||||
|
# Contributing to fish-config
|
||||||
|
|
||||||
|
This is a personal dotfiles repo, but it's run with practices meant to scale
|
||||||
|
to a team of contributors, not just one person's solo habits. This document
|
||||||
|
formalizes those practices so they live somewhere durable instead of only in
|
||||||
|
commit history and conversation memory. It will grow as the project does —
|
||||||
|
treat it as a living document, not a final word.
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [Getting Started](#getting-started)
|
||||||
|
- [Issues](#issues)
|
||||||
|
- [Branching & Pull Requests](#branching--pull-requests)
|
||||||
|
- [Labels](#labels)
|
||||||
|
- [Commit Conventions](#commit-conventions)
|
||||||
|
- [Fish Coding Standards](#fish-coding-standards)
|
||||||
|
- [Opinionated Components](#opinionated-components)
|
||||||
|
- [Documentation Pipeline](#documentation-pipeline)
|
||||||
|
- [Testing](#testing)
|
||||||
|
- [Secrets & Machine-Specific Config](#secrets--machine-specific-config)
|
||||||
|
- [License](#license)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
You'll need [fish 4.x](https://fishshell.com/). Clone the repo and run the
|
||||||
|
test suite to confirm your environment is sane:
|
||||||
|
|
||||||
|
```fish
|
||||||
|
fish tests/run-tests.fish
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're touching anything under `docs/manual/`, you'll also want `pandoc`,
|
||||||
|
`python3-yaml`, and Node 24+ to exercise the full doc-build pipeline locally
|
||||||
|
(see [Documentation Pipeline](#documentation-pipeline)) — otherwise CI will
|
||||||
|
catch problems on push.
|
||||||
|
|
||||||
|
## Issues
|
||||||
|
|
||||||
|
Issues live on the Gitea repo. Three templates cover the common cases, each
|
||||||
|
pre-applying its `Kind/` label; blank issues stay enabled for everything else
|
||||||
|
— a chore, a refactor, a question, a tracking issue.
|
||||||
|
|
||||||
|
| Template | Format | Use it for | Applies |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **Bug report** | web form | Something is broken or behaves unexpectedly | `Kind/Bug` |
|
||||||
|
| **Feature or enhancement request** | markdown | New functionality, or an improvement to what exists | `Kind/Feature` |
|
||||||
|
| **Documentation issue** | markdown | The manual, man page, `config-help`, or docs site is wrong, missing, or unclear | `Kind/Documentation` |
|
||||||
|
|
||||||
|
They live in `.github/ISSUE_TEMPLATE/`, next to the PR template, so the
|
||||||
|
GitHub mirror offers the same set. The bug report is a Gitea *issue form* —
|
||||||
|
a real web form with required fields — because a bug report missing its
|
||||||
|
version, reproduction, or full error text can't be acted on, and a form
|
||||||
|
refuses to submit without them. The other two are markdown templates in the
|
||||||
|
same comment-guided style as `.github/PULL_REQUEST_TEMPLATE.md`, since what
|
||||||
|
they ask for is open-ended prose that structure would only get in the way of.
|
||||||
|
|
||||||
|
GitHub reads these same files on the mirror, and its schema differs from
|
||||||
|
Gitea's in two places, so both are pinned to the spelling that works on both
|
||||||
|
and each file says so in a comment: the chooser config must be `config.yml`
|
||||||
|
(GitHub ignores `config.yaml`), and `bug.yml` declares `description:` rather
|
||||||
|
than `about:` (GitHub requires it; Gitea accepts it as an alias). The two
|
||||||
|
markdown templates keep `about:`, which is correct for their format on both.
|
||||||
|
|
||||||
|
### Issue titles
|
||||||
|
|
||||||
|
**Issue titles are plain descriptions of the problem, not Conventional
|
||||||
|
Commits subjects.**
|
||||||
|
|
||||||
|
```text
|
||||||
|
mv clobbers a symlink when the target exists ← yes
|
||||||
|
fix(mv): prompt before replacing an existing symlink ← no
|
||||||
|
```
|
||||||
|
|
||||||
|
An issue states a problem; a commit states a change. The type and scope that
|
||||||
|
`fix(mv):` would carry are already on the issue as its `Kind/` and `Area/`
|
||||||
|
labels, and the conventional subject belongs on the PR that closes it, where
|
||||||
|
it becomes the commit message. Writing the fix into the title also presumes
|
||||||
|
one, which is the wrong end to start from for anything still being diagnosed.
|
||||||
|
|
||||||
|
### What an issue owes
|
||||||
|
|
||||||
|
- **A bug** needs a reproduction someone else can paste and run, starting
|
||||||
|
from a fresh shell, plus the complete error output. A stale function
|
||||||
|
definition in a long-lived session is the most common false alarm, so
|
||||||
|
confirm it survives `exec fish` first. `Status/Need More Info` is where
|
||||||
|
reports without a reproduction end up.
|
||||||
|
- **A feature** needs `## Acceptance criteria` — the checkbox list of what
|
||||||
|
must be true for the issue to close. It is the issue-side counterpart to a
|
||||||
|
PR's `## Verification`: a definition of done agreed before the work starts
|
||||||
|
rather than argued about after, and the PR's checks usually grow out of it.
|
||||||
|
- **A docs issue** needs to name the `docs/manual/**` source, not just the
|
||||||
|
page where the problem showed up. `docs/fish-config.md` and
|
||||||
|
`docs/fish-config.1` are generated, and a fix applied there is overwritten
|
||||||
|
by the next CI run — see [Documentation
|
||||||
|
Pipeline](#documentation-pipeline).
|
||||||
|
|
||||||
|
### Triage
|
||||||
|
|
||||||
|
Reporters aren't expected to label anything. Contributors without push access
|
||||||
|
can't, and the templates apply the `Kind/` label by themselves; the rest is
|
||||||
|
the maintainer's job when the issue is triaged — add the `Area/` label (the
|
||||||
|
bug form's **Area** dropdown is how a reporter tells you, since no forge can
|
||||||
|
map a form field to a label), set a `Priority/` if it isn't ordinary, and
|
||||||
|
apply `Reviewed/Confirmed` once a bug actually reproduces. See
|
||||||
|
[Labels](#labels).
|
||||||
|
|
||||||
|
When a PR resolves an issue it closes it with a trailing `Closes #N` line —
|
||||||
|
see [Pull request descriptions](#pull-request-descriptions).
|
||||||
|
|
||||||
|
## Branching & Pull Requests
|
||||||
|
|
||||||
|
**If you don't have push access to this repo**, fork it and open your PR
|
||||||
|
from a branch on your fork back to `main` here — everything below about
|
||||||
|
branch naming and commit hygiene still applies, it just happens on your
|
||||||
|
fork instead of a branch of this repo directly. The rest of this section
|
||||||
|
assumes you *do* have push access (maintainers, regular contributors).
|
||||||
|
|
||||||
|
- **Branch off `main` before starting work.** Don't accumulate uncommitted
|
||||||
|
changes directly on `main`. (If you already started editing before
|
||||||
|
branching, that's fine — create the branch now, before your first commit;
|
||||||
|
branching doesn't touch the working tree.)
|
||||||
|
- **Merge target is `main`, via PR.** Contributors open the PR; the repo
|
||||||
|
owner merges it. Don't merge your own PR.
|
||||||
|
- **Label every PR.** At minimum one `Kind/` and one `Area/`, same as an
|
||||||
|
issue — see [Labels](#labels). If you can't set labels, say what the
|
||||||
|
change is in the description and a maintainer applies them.
|
||||||
|
- **Don't merge until the `## Verification` checklist is fully checked.**
|
||||||
|
Unchecked boxes are outstanding manual checks, not decoration. See
|
||||||
|
[Pull request descriptions](#pull-request-descriptions) below.
|
||||||
|
- **Prefix in-progress PRs with `WIP:`.** If the branch still has code
|
||||||
|
changes coming, open it as `WIP: type(scope): description`. Gitea
|
||||||
|
recognizes the prefix, flags the PR as a draft, and refuses to merge it
|
||||||
|
until the prefix is removed; drop it once the branch is complete.
|
||||||
|
|
||||||
|
`WIP:` signals **more changes are coming** — not "done but unverified".
|
||||||
|
A finished branch waiting on manual checks is an ordinary PR whose
|
||||||
|
`## Verification` boxes aren't all ticked yet; that's already the merge
|
||||||
|
gate above and doesn't need the prefix. The two are independent: a PR
|
||||||
|
can be WIP with everything ticked, or complete with checks outstanding.
|
||||||
|
- **Keep feature branches focused.** If you stumble onto something unrelated
|
||||||
|
to your current task while working (a pre-existing bug, a stray cleanup),
|
||||||
|
don't fold it into the same commit or PR. Handle it with one of these,
|
||||||
|
in order of preference:
|
||||||
|
1. **Separate branch, separate PR, merged to `main` independently.** The
|
||||||
|
default for anything that doesn't overlap the code your current branch
|
||||||
|
touches. The two PRs review and merge independently, in either order.
|
||||||
|
2. **Separate branch and PR, then sync `main` back into your feature
|
||||||
|
branch** once it merges. Use this only when the unrelated fix actually
|
||||||
|
touches the same file/function as your feature branch, or your feature
|
||||||
|
branch depends on the corrected behavior to work or test correctly.
|
||||||
|
3. **Commit directly to `main`.** Reserved for changes too small to
|
||||||
|
justify a branch, or genuinely urgent fixes. **Always ask for explicit
|
||||||
|
approval before doing this** — there's no standing exception, no matter
|
||||||
|
how trivial the change looks.
|
||||||
|
|
||||||
|
### Pull request descriptions
|
||||||
|
|
||||||
|
Fill in `.github/PULL_REQUEST_TEMPLATE.md` — Gitea pre-loads it into the
|
||||||
|
description box when you open a PR. Every PR carries, in this order:
|
||||||
|
|
||||||
|
- **`## Summary`** — what changed and why, as a short paragraph, 2-5
|
||||||
|
bullets, or both. Name concrete paths and identifiers in backticks, and
|
||||||
|
explain the reasoning rather than restating the diff.
|
||||||
|
- **Optional `##` sections** — add what the change actually needs
|
||||||
|
(`Root cause`, `Why`, `How it works`, `Behavior`, `Docs`, `Notes`,
|
||||||
|
`Scope note`, `Opinionated guard (C1-C6)`), and skip them entirely for a
|
||||||
|
straightforward change. A breaking change (title ending in `!` before
|
||||||
|
the colon) must include `## ⚠️ Breaking Change` with the migration path.
|
||||||
|
- **`## Verification`** — always last. Every check this change needs, as a
|
||||||
|
checkbox list, each with the exact command and its expected result.
|
||||||
|
A **checked** box means verified, whether programmatically (test suite,
|
||||||
|
linter, docs verifier, CI) or by hand; check those off before opening the
|
||||||
|
PR. An **unchecked** box is an outstanding manual check the reviewer
|
||||||
|
still has to perform — leave anything you couldn't verify yourself
|
||||||
|
unchecked rather than dropping it.
|
||||||
|
|
||||||
|
**This list is the merge gate: a PR isn't merged until every box is
|
||||||
|
checked.** Only list checks that can actually be resolved — one nobody
|
||||||
|
can run blocks the PR indefinitely. Put genuinely unverifiable caveats,
|
||||||
|
assumptions, and known limitations in `## Notes` instead, where they
|
||||||
|
inform the review without gating it.
|
||||||
|
|
||||||
|
When a PR resolves a tracked issue, close it with a trailing `Closes #42`
|
||||||
|
line at the end of `## Summary` — not at the very bottom of the body, since
|
||||||
|
`## Verification` is always last. `Fixes #N` and `Resolves #N` behave
|
||||||
|
identically. Repeat the keyword for each issue (`Closes #42, closes #43`); a
|
||||||
|
bare `#43` is only a link and won't close anything. To point at a related
|
||||||
|
issue that should stay open, drop the keyword and use `Refs #42`. Leave the
|
||||||
|
line out entirely when no issue is involved.
|
||||||
|
|
||||||
|
## Labels
|
||||||
|
|
||||||
|
**Every issue and every pull request carries exactly one `Kind/` label and at
|
||||||
|
least one `Area/` label.** Everything else is optional, and most of it is
|
||||||
|
applied by a maintainer at triage rather than by whoever opened the thing.
|
||||||
|
|
||||||
|
Labels are scoped: the `Group/Name` form renders as a two-tone chip in Gitea,
|
||||||
|
and for the three *exclusive* groups below Gitea enforces one-at-a-time by
|
||||||
|
swapping the old label out when you apply a new one.
|
||||||
|
|
||||||
|
### `Kind/` — what this is
|
||||||
|
|
||||||
|
Required, and by convention exactly one. Gitea doesn't enforce one-of here,
|
||||||
|
so pick the dominant character of the change instead of stacking two.
|
||||||
|
|
||||||
|
| Label | For |
|
||||||
|
|---|---|
|
||||||
|
| `Kind/Bug` | Something is not working |
|
||||||
|
| `Kind/Feature` | New functionality |
|
||||||
|
| `Kind/Enhancement` | Improves functionality that already exists |
|
||||||
|
| `Kind/Documentation` | Documentation changes |
|
||||||
|
| `Kind/Testing` | The test suite itself |
|
||||||
|
| `Kind/Refactor` | Restructures code without changing behavior |
|
||||||
|
| `Kind/Chore` | Tooling, dependencies, housekeeping |
|
||||||
|
| `Kind/Performance` | Makes existing behavior faster or lighter |
|
||||||
|
| `Kind/Security` | A security issue |
|
||||||
|
|
||||||
|
These deliberately mirror the Conventional Commits types in [Commit
|
||||||
|
Conventions](#commit-conventions), so a PR's label and its title agree:
|
||||||
|
`fix` → `Kind/Bug`, `feat` → `Kind/Feature` or `Kind/Enhancement`, `docs` →
|
||||||
|
`Kind/Documentation`, `test` → `Kind/Testing`, `refactor` →
|
||||||
|
`Kind/Refactor`, `chore` → `Kind/Chore`, `perf` → `Kind/Performance`.
|
||||||
|
|
||||||
|
### `Area/` — what it touches
|
||||||
|
|
||||||
|
Required, and non-exclusive on purpose: a change that adds a function, its
|
||||||
|
completions, and a manual entry gets all three.
|
||||||
|
|
||||||
|
| Label | Covers |
|
||||||
|
|---|---|
|
||||||
|
| `Area/Functions` | `functions/` |
|
||||||
|
| `Area/Completions` | `completions/` |
|
||||||
|
| `Area/Config` | `config.fish`, `conf.d/` — startup and environment |
|
||||||
|
| `Area/Docs` | `docs/manual/` and the generated manual, man page, and site |
|
||||||
|
| `Area/Tests` | `tests/` |
|
||||||
|
| `Area/CI` | `.github/workflows/` and repository automation |
|
||||||
|
| `Area/Integrations` | `integrations/` |
|
||||||
|
| `Area/Prompt & Theme` | `themes/` and prompt appearance |
|
||||||
|
| `Area/Components` | The opinionated-component system (C1-C6) |
|
||||||
|
| `Area/Scripts` | `scripts/` |
|
||||||
|
|
||||||
|
`Area/` is what makes the tracker searchable: it answers "what's still
|
||||||
|
outstanding in the docs pipeline?" in a way `Kind/` never can. Two edges
|
||||||
|
worth naming — `Area/Docs` covers the documentation *and its pipeline*, so
|
||||||
|
`README.md` and this file count even though they sit outside `docs/`; and
|
||||||
|
`Area/Components` is for the C1-C6 machinery itself, not for every function
|
||||||
|
that happens to carry a `# COMPONENT` header.
|
||||||
|
|
||||||
|
### `Compat/Breaking`
|
||||||
|
|
||||||
|
Applied to **any PR whose title carries `!` before the colon**, and to any
|
||||||
|
issue proposing a change that would. It travels with the `## ⚠️ Breaking
|
||||||
|
Change` section that such a PR must already include — see [Pull request
|
||||||
|
descriptions](#pull-request-descriptions).
|
||||||
|
|
||||||
|
### `Priority/` — exclusive, maintainer-applied
|
||||||
|
|
||||||
|
`Priority/Critical`, `Priority/High`, `Priority/Medium`, `Priority/Low`.
|
||||||
|
|
||||||
|
**No priority label means ordinary priority.** Labeling everything defeats
|
||||||
|
the point, so leave it off unless the item is genuinely more or less urgent
|
||||||
|
than the rest of the queue.
|
||||||
|
|
||||||
|
### `Reviewed/` — exclusive, maintainer-applied
|
||||||
|
|
||||||
|
`Reviewed/Confirmed` goes on a bug that has actually been reproduced —
|
||||||
|
that's the signal separating a report from a known defect.
|
||||||
|
`Reviewed/Duplicate`, `Reviewed/Invalid`, and `Reviewed/Won't Fix` accompany
|
||||||
|
closing an issue, always with a comment saying why; a close with only a
|
||||||
|
label on it is not an explanation.
|
||||||
|
|
||||||
|
### `Status/` — exclusive, maintainer-applied
|
||||||
|
|
||||||
|
`Status/Blocked`, `Status/Need More Info`, `Status/Abandoned`. These describe
|
||||||
|
the item's current state, so remove one as soon as it stops being true — a
|
||||||
|
stale `Status/Need More Info` on an issue that got its answer is worse than
|
||||||
|
no label, because it reads as still waiting.
|
||||||
|
|
||||||
|
### `good first issue` and `help wanted`
|
||||||
|
|
||||||
|
Invitations to contributors, applied by a maintainer. Both are deliberately
|
||||||
|
**unscoped**: they'd be a natural fit under `Status/`, but that group is
|
||||||
|
exclusive, and an issue is quite often both blocked on something *and* open
|
||||||
|
for someone to pick up. Keeping them outside the group lets them coexist
|
||||||
|
with a real status.
|
||||||
|
|
||||||
|
Use `good first issue` for work that is genuinely self-contained — a clear
|
||||||
|
acceptance criterion, one or two files, no need to understand the
|
||||||
|
opinionated-component system first.
|
||||||
|
|
||||||
|
### The GitHub mirror
|
||||||
|
|
||||||
|
The repo is mirrored to
|
||||||
|
[github.com/rootiest/fish-config](https://github.com/rootiest/fish-config),
|
||||||
|
and **the mirror carries the same labels, by the same names**. That isn't
|
||||||
|
cosmetic: GitHub reads the same `.github/ISSUE_TEMPLATE/` files, and a
|
||||||
|
`labels:` entry naming a label that doesn't exist on that side is silently
|
||||||
|
dropped rather than reported.
|
||||||
|
|
||||||
|
Mirroring copies files, not repository settings, so labels don't travel with
|
||||||
|
a push. **`.github/workflows/sync-labels.yml` closes that gap**: it runs
|
||||||
|
`scripts/sync-labels.py` on a daily schedule, and again whenever the script
|
||||||
|
itself changes, to make GitHub match Gitea. Manage labels here, in the Gitea
|
||||||
|
UI, and the mirror catches up within a day — or dispatch the workflow by
|
||||||
|
hand for it to happen now. Nothing needs doing on the GitHub side.
|
||||||
|
|
||||||
|
The sync creates what's missing and corrects color or description drift,
|
||||||
|
and it deletes an extra label on the mirror **only when no issue or PR there
|
||||||
|
carries it**; one that's in use is reported with its count and left for a
|
||||||
|
human to decide about. Run the script with `--dry-run` to see the plan
|
||||||
|
without changing anything, or `--self-test` to check its diff logic offline
|
||||||
|
— both are useful before editing it. Because labels are matched by name,
|
||||||
|
renaming one on Gitea reads as a delete plus a create: the new name appears
|
||||||
|
on the mirror, and the old one is pruned only if it's unused.
|
||||||
|
|
||||||
|
The workflow needs a GitHub token in this repo's Actions secrets as
|
||||||
|
`GH_MIRROR_TOKEN`, scoped to the mirror with **Issues: read and write**
|
||||||
|
(GitHub files labels under Issues) and **Pull requests: read** (so the
|
||||||
|
in-use check sees labels on PRs). The job fails with an explicit message if
|
||||||
|
it's missing rather than quietly doing nothing.
|
||||||
|
|
||||||
|
One behavioral difference to keep in mind: **GitHub has no exclusive
|
||||||
|
labels.** Gitea enforces one-at-a-time on `Priority/`, `Reviewed/`, and
|
||||||
|
`Status/` by swapping the old label out; on the mirror those are ordinary
|
||||||
|
labels and nothing stops two of a group coexisting, so there the one-of rule
|
||||||
|
holds by convention alone.
|
||||||
|
|
||||||
|
Issues and pull requests belong on the canonical Gitea repo — the template
|
||||||
|
chooser links there first, on both sides. The mirror's tracker stays open so
|
||||||
|
that a report which lands there anyway isn't lost, not because it's a second
|
||||||
|
supported front door.
|
||||||
|
|
||||||
|
## Commit Conventions
|
||||||
|
|
||||||
|
Commit subjects follow [Conventional Commits](https://www.conventionalcommits.org/):
|
||||||
|
|
||||||
|
```
|
||||||
|
type(scope): description
|
||||||
|
```
|
||||||
|
|
||||||
|
Types currently in use in this repo: `feat`, `fix`, `docs`, `test`, `chore`,
|
||||||
|
`perf`. The scope is usually the function, component, or subsystem touched
|
||||||
|
(e.g. `feat(help): ...`, `fix(scrub): ...`, `chore(docs): ...`). Look at
|
||||||
|
`git log` for recent examples before picking a type/scope for something
|
||||||
|
novel.
|
||||||
|
|
||||||
|
## Fish Coding Standards
|
||||||
|
|
||||||
|
### File header
|
||||||
|
|
||||||
|
Every hand-authored `.fish` file starts with:
|
||||||
|
|
||||||
|
```fish
|
||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
```
|
||||||
|
|
||||||
|
(A few completion scripts adapted directly from a tool's own upstream
|
||||||
|
completions keep that tool's original attribution comment instead of this
|
||||||
|
header — match whichever convention the specific file already follows. New
|
||||||
|
files use the standard header above.)
|
||||||
|
|
||||||
|
### Public function documentation header
|
||||||
|
|
||||||
|
Every user-facing function gets a machine-parsed comment header directly
|
||||||
|
above its `function` line. This header is the single source of truth for
|
||||||
|
the generated manual (`docs/fish-config.md` / the man page / the docs
|
||||||
|
site) — see [Documentation Pipeline](#documentation-pipeline) for how it
|
||||||
|
gets consumed. The parser (`docs/manualtools.py`) recognizes these labels,
|
||||||
|
all optional except where noted:
|
||||||
|
|
||||||
|
| Label | Purpose |
|
||||||
|
|---|---|
|
||||||
|
| `CATEGORY` | **Required to appear in the manual at all** — see below. |
|
||||||
|
| `COMPONENT` | Only for functions gated by the [opinionated-component system](#opinionated-components). |
|
||||||
|
| `DEPENDENCIES` | Other functions this one calls that a reader may want to look up. |
|
||||||
|
| `SYNOPSIS` | One-line usage form. |
|
||||||
|
| `DESCRIPTION` | Prose description; can span multiple paragraphs. |
|
||||||
|
| `ARGUMENTS` | Flags/positional args, one per line. |
|
||||||
|
| `EXIT STATUS` | Exit codes and what they mean. |
|
||||||
|
| `RETURNS` | For functions used for their output/return value rather than exit status. |
|
||||||
|
| `EXAMPLE` | One or more realistic invocations. |
|
||||||
|
| `NOTES` | Anything else worth flagging (fallback behavior, caveats, gotchas). |
|
||||||
|
|
||||||
|
A full example (`functions/claude.fish`):
|
||||||
|
|
||||||
|
```fish
|
||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# CATEGORY
|
||||||
|
# 12-ai-and-developer-tools
|
||||||
|
#
|
||||||
|
# COMPONENT
|
||||||
|
# aliases/dev-tools
|
||||||
|
#
|
||||||
|
# DEPENDENCIES
|
||||||
|
# agents-init
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
# claude [ARGS...]
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
# Wrapper for the claude CLI that ensures the AGENTS/ sub-repository is
|
||||||
|
# initialized and any agent-made changes are committed before launch.
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**`CATEGORY` is the opt-in gate for the manual:** a function with no
|
||||||
|
`# CATEGORY` line produces no manual entry at all — this is how bundled
|
||||||
|
plugin internals and prompt guts stay out of user-facing docs without an
|
||||||
|
exclusion list. `CATEGORY` must exactly match one of the existing
|
||||||
|
`docs/manual/05-functions/NN-*.md` stubs:
|
||||||
|
|
||||||
|
```
|
||||||
|
01-file-and-directory 08-terminal-management
|
||||||
|
02-navigation 09-clipboard
|
||||||
|
03-editors-and-viewers 10-network
|
||||||
|
04-git-and-version-control 11-pager-and-logging
|
||||||
|
05-package-management 12-ai-and-developer-tools
|
||||||
|
06-dependency-management 13-media-and-utilities
|
||||||
|
07-system-and-monitoring 14-miscellaneous
|
||||||
|
```
|
||||||
|
|
||||||
|
If your function genuinely doesn't fit any of these, add a new
|
||||||
|
`docs/manual/05-functions/NN-your-category.md` stub (with frontmatter
|
||||||
|
matching its siblings) rather than force-fitting it into an existing one.
|
||||||
|
|
||||||
|
### Private/internal helper functions
|
||||||
|
|
||||||
|
Functions named with a leading `_` (e.g. `_agents_init_ensure_gitignore`,
|
||||||
|
`__fish_config_op_enabled`) are excluded from the manual unconditionally,
|
||||||
|
regardless of whether they carry a `CATEGORY` line — so they generally don't
|
||||||
|
have one. They should still carry the standard file header, and a lighter
|
||||||
|
`SYNOPSIS`/`DESCRIPTION` comment is encouraged wherever the function's
|
||||||
|
purpose or calling convention isn't obvious from its body, matching the
|
||||||
|
convention already used across `__fish_config_op_*.fish` and similar files.
|
||||||
|
|
||||||
|
### Function declaration
|
||||||
|
|
||||||
|
Give every function a `--description`, since it's what shows up in `fish -c
|
||||||
|
'functions'`/completions and other introspection:
|
||||||
|
|
||||||
|
```fish
|
||||||
|
function my_function --description 'Short, imperative description'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Colored `--help` output
|
||||||
|
|
||||||
|
Every function with a `-h`/`--help` flag uses this standardized color
|
||||||
|
palette (established across the codebase 2026-08-22):
|
||||||
|
|
||||||
|
```fish
|
||||||
|
set -l c_head (set_color --bold cyan) # section headers
|
||||||
|
set -l c_cmd (set_color --bold) # the command name itself (theme-adaptive)
|
||||||
|
set -l c_flag (set_color yellow) # flags
|
||||||
|
set -l c_arg (set_color cyan) # required-argument placeholders
|
||||||
|
set -l c_dim (set_color brblack) # optional-argument placeholders
|
||||||
|
set -l c_ok (set_color green) # success/positive status
|
||||||
|
set -l c_warn (set_color yellow) # warnings
|
||||||
|
set -l c_err (set_color red) # errors
|
||||||
|
set -l c_reset (set_color normal)
|
||||||
|
```
|
||||||
|
|
||||||
|
Not every function needs every variable — pull in only the ones your help
|
||||||
|
text actually uses. Structure the usage block as `Usage:`, then sections
|
||||||
|
for arguments/flags/examples as needed; see `functions/rand_string.fish` or
|
||||||
|
any recently-touched function for a full worked example.
|
||||||
|
|
||||||
|
## Opinionated Components
|
||||||
|
|
||||||
|
Some functionality in this config is classified into one of six toggleable
|
||||||
|
categories (C1–C6: aliases, autoexec, overrides, integrations, logging,
|
||||||
|
greeting) plus sub-categories, so users can disable pieces of it via
|
||||||
|
`config-settings` or universal variables. If you're adding something that
|
||||||
|
shadows a builtin, runs at startup, overrides a key binding/environment
|
||||||
|
variable, or otherwise falls under an existing category, tag it with a
|
||||||
|
`# COMPONENT` header (`<category>/<subcategory>`, e.g.
|
||||||
|
`overrides/key-bindings`) and guard it with `__fish_config_op_enabled`. See
|
||||||
|
the [README's Minimal Mode section](README.md#minimal-mode) for the full
|
||||||
|
category list and toggle semantics. Most new functions are *not*
|
||||||
|
opinionated components — only tag something if it fits an existing
|
||||||
|
category; this isn't something to force.
|
||||||
|
|
||||||
|
## Documentation Pipeline
|
||||||
|
|
||||||
|
`docs/manual/` is the single source of truth for the user manual, man page,
|
||||||
|
and documentation site. **Never hand-edit `docs/fish-config.md` or
|
||||||
|
`docs/fish-config.1`** — they're generated by `docs/build-manual.py` from
|
||||||
|
`docs/manual/**` plus every function's doc-header (see above), verified by
|
||||||
|
`docs/verify-manual.py`, and auto-committed by CI on push to `main`
|
||||||
|
(`chore(docs): regenerate manual, man page, and component registry`).
|
||||||
|
|
||||||
|
If you're changing something under `docs/manual/` directly, or adding a
|
||||||
|
function whose `CATEGORY`/`COMPONENT` header should surface new content, you
|
||||||
|
can build and check it locally before pushing:
|
||||||
|
|
||||||
|
```fish
|
||||||
|
python3 docs/build-manual.py --concat -o docs/fish-config.md
|
||||||
|
python3 docs/verify-manual.py
|
||||||
|
```
|
||||||
|
|
||||||
|
CI runs the same verification and regenerates the site/man page — a broken
|
||||||
|
manual won't get published, but running it locally saves a round trip.
|
||||||
|
|
||||||
|
Write doc-headers as plain text — no backticks. `-a/--all`,
|
||||||
|
`__fish_config_op_aliases` and `~/.config/fish/config.fish` are typed
|
||||||
|
bare, because the header is also read as-is by `config-help` and by
|
||||||
|
anyone opening the file. `docs/codespans.py` adds the inline code spans
|
||||||
|
when it renders, so the SSOT never carries them; see
|
||||||
|
`docs/site/README.md` for which shapes it recognises. That pass runs for
|
||||||
|
every output — the site, the man page and `config-help` — so a token is
|
||||||
|
typeset the same way wherever it is read.
|
||||||
|
|
||||||
|
Two rules apply to backticks you write under `docs/manual/` as well:
|
||||||
|
|
||||||
|
- **Never inside an indented block.** A four-space block is verbatim in
|
||||||
|
every renderer, so a backtick there is a literal character on the page
|
||||||
|
rather than markup.
|
||||||
|
- **Never wrapped across a line break.** Markdown accepts a span split
|
||||||
|
over two lines, but `config-help` pairs backticks one line at a time
|
||||||
|
and would show the halves literally. Reflow the sentence instead.
|
||||||
|
|
||||||
|
`docs/verify-manual.py` enforces both.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
```fish
|
||||||
|
fish tests/run-tests.fish
|
||||||
|
```
|
||||||
|
|
||||||
|
Runs before every push and gates the documentation build in CI. Two phases:
|
||||||
|
|
||||||
|
1. **Syntax lint** — every tracked `.fish` file (`config.fish`, `functions/`,
|
||||||
|
`conf.d/`, `completions/`, `integrations/`) is checked with `fish -n`.
|
||||||
|
2. **Sandboxed functional checks** — the config is copied into a throwaway
|
||||||
|
`HOME`/`XDG_CONFIG_HOME` sandbox (never this checkout itself, since it
|
||||||
|
doubles as a real `~/.config/fish`) and loaded as an isolated interactive
|
||||||
|
session. `tests/functional.fish` then runs against foundational behavior:
|
||||||
|
XDG/PATH/CDPATH setup, key bindings, abbreviations, core functions, the
|
||||||
|
opinionated-component registry, and more.
|
||||||
|
|
||||||
|
To add a new functional check, add a `test_*` function to
|
||||||
|
`tests/functional.fish` — it's picked up automatically by
|
||||||
|
`functional_test_main`, no registration needed. Return 0 on pass, non-zero
|
||||||
|
on fail; print a short diagnostic on failure.
|
||||||
|
|
||||||
|
## Secrets & Machine-Specific Config
|
||||||
|
|
||||||
|
**Nothing containing credentials, tokens, personal identifiers, or a
|
||||||
|
specific machine's paths belongs in this repo — not even in a PR.** That
|
||||||
|
kind of thing lives in each user's own private overlay
|
||||||
|
(`~/.config/.user-dots/fish/secrets.fish` and `local.fish`), which is
|
||||||
|
git-ignored by design. If you're writing something that needs a secret or a
|
||||||
|
machine-specific path, source it from there rather than hardcoding it.
|
||||||
|
Everything else — general-purpose, reusable across machines — belongs in
|
||||||
|
the tracked repo as normal. See [README's Personalization
|
||||||
|
section](README.md#personalization) and
|
||||||
|
[`docs/manual/07-customization.md`](docs/manual/07-customization.md) for the
|
||||||
|
full mechanics.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under AGPL-3.0-or-later (see `LICENSE`). Every new
|
||||||
|
hand-authored file needs the SPDX header shown in [File
|
||||||
|
header](#file-header) above.
|
||||||
@@ -5,13 +5,18 @@ built around a Catppuccin Mocha aesthetic with a curated set of modern
|
|||||||
CLI tool integrations, smart shell functions, and a heavily customized
|
CLI tool integrations, smart shell functions, and a heavily customized
|
||||||
abbreviation system for keyboard-driven workflows.
|
abbreviation system for keyboard-driven workflows.
|
||||||
|
|
||||||
|
📖 **[Documentation site](https://fish.rootiest.fyi/)**
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
|
|
||||||
- [Overview](#overview)
|
- [Overview](#overview)
|
||||||
|
- [Session Logging](#session-logging)
|
||||||
- [Documentation](#documentation)
|
- [Documentation](#documentation)
|
||||||
- [Installation](#installation)
|
- [Installation](#installation)
|
||||||
- [Personalization](#personalization)
|
- [Personalization](#personalization)
|
||||||
- [Minimal Mode](#minimal-mode)
|
- [Minimal Mode](#minimal-mode)
|
||||||
|
- [Testing](#testing)
|
||||||
|
- [Contributing](#contributing)
|
||||||
- [Attribution](#attribution)
|
- [Attribution](#attribution)
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
|
|
||||||
@@ -22,24 +27,131 @@ abbreviation system for keyboard-driven workflows.
|
|||||||
This config layers on top of the CachyOS base Fish configuration and adds:
|
This config layers on top of the CachyOS base Fish configuration and adds:
|
||||||
|
|
||||||
- **Catppuccin Mocha** theming throughout (prompt, FZF, syntax highlighting)
|
- **Catppuccin Mocha** theming throughout (prompt, FZF, syntax highlighting)
|
||||||
- **Starship** prompt with VI key bindings
|
- **Starship** prompt with VI key bindings; Catppuccin Mocha nim-style fallback prompt when Starship is absent or C3 overrides are disabled
|
||||||
- **Fisher** plugin manager bootstrapped automatically; manages `sponge` (failed-command history filter); FZF bindings, Catppuccin theme, done, autopair, and puffer-fish are bundled directly with the config as customized versions
|
- **Fisher** plugin manager bootstrapped automatically; manages `sponge` (failed-command history filter); FZF bindings, Catppuccin theme, done, autopair, and puffer-fish are bundled directly with the config as customized versions
|
||||||
- **Smart CLI wrappers** that prefer modern tools (`eza`, `bat`, `btop`, `dust`, `prettyping`) with graceful fallbacks
|
- **Smart CLI wrappers** that prefer modern tools (`eza`, `bat`, `btop`, `dust`, `prettyping`) with graceful fallbacks
|
||||||
- **Auto Python venv** activation on directory change (direnv-aware)
|
- **Auto Python venv** activation on directory change (direnv-aware)
|
||||||
- **Kitty terminal** deep integration for splits, tabs, and SSH
|
- **Kitty terminal** deep integration for splits, tabs, and SSH
|
||||||
|
- **Named background jobs** — `jobrunner` (short: `jr`) starts, lists, inspects, re-attaches to, and kills detached tasks via `tmux` or GNU `screen`, so long-running work survives closing the shell
|
||||||
|
- **Optional session logging** — terminal scrollback, multiplexer panes (tmux/zellij), and AUR-helper output can be captured to `~/.terminal_history`; **off by default**, opt in when you want it (see the caution below and [Session Logging](#session-logging))
|
||||||
- **AI workflow** helpers for Claude and Antigravity session management
|
- **AI workflow** helpers for Claude and Antigravity session management
|
||||||
- **WakaTime** shell activity tracking
|
- **WakaTime** shell activity tracking
|
||||||
- **Opt-out toggles** for every opinionated component — see [Minimal Mode](#minimal-mode)
|
- **Opt-out toggles** for every opinionated component — see [Minimal Mode](#minimal-mode)
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> **This configuration *can* log your terminal sessions to disk.** Logging is
|
||||||
|
> **off by default** — but once enabled it silently captures terminal output to
|
||||||
|
> `~/.terminal_history`: Kitty scrollback when a window closes, live tmux pane
|
||||||
|
> streams, zellij pane snapshots on exit, and full `paru`/`yay` output. These
|
||||||
|
> logs can contain command output, file contents, and anything else printed to
|
||||||
|
> your terminal. Nothing is sent off your machine, but the files persist
|
||||||
|
> locally until pruned.
|
||||||
|
>
|
||||||
|
> To turn logging on, set the C5 category variable:
|
||||||
|
>
|
||||||
|
> ```fish
|
||||||
|
> set -U __fish_config_op_logging on
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> Or run **`config-settings`** for an interactive menu to flip logging (and any
|
||||||
|
> other opinionated category) on or off — no variable names to remember.
|
||||||
|
>
|
||||||
|
> This takes effect immediately in every open shell. See [Session Logging](#session-logging)
|
||||||
|
> for exactly what is captured and where, and [Minimal Mode](#minimal-mode) for the
|
||||||
|
> full set of opt-out toggles.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Session Logging
|
||||||
|
|
||||||
|
This config can capture terminal output to `~/.terminal_history` (override with
|
||||||
|
`$SCROLLBACK_HISTORY_DIR`) so you can search back through past sessions. It is
|
||||||
|
**off by default** — opt in with `set -U __fish_config_op_logging on`. Once
|
||||||
|
enabled, five sources feed it:
|
||||||
|
|
||||||
|
| Source | When it captures | Log file |
|
||||||
|
|---|---|---|
|
||||||
|
| Kitty scrollback | When a Kitty window/tab closes | `scrollback_<timestamp>.log` |
|
||||||
|
| tmux pane | Continuously while the pane is open (`pipe-pane`) | `tmux_<session>-w<win>-p<pane>_<timestamp>.log` |
|
||||||
|
| zellij pane | Snapshot taken on **clean** shell exit (`dump-screen`) | `zellij_<session>-p<pane>_<timestamp>.log` |
|
||||||
|
| `paru` wrapper | Every `paru` invocation | `paru_<timestamp>.log` |
|
||||||
|
| `yay` wrapper | Every `yay` invocation | `yay_<timestamp>.log` |
|
||||||
|
|
||||||
|
Old logs are pruned automatically to stay within `$SCROLLBACK_HISTORY_MAX_FILES`
|
||||||
|
(default 100) per source, and empty/trivial captures are discarded.
|
||||||
|
|
||||||
|
> **zellij caveat:** zellij has no continuous pipe like tmux, so its pane is
|
||||||
|
> snapshotted only on a clean shell exit (`exit`/Ctrl-D). Closing a pane or
|
||||||
|
> quitting zellij directly tears down the pane/server before it can be dumped,
|
||||||
|
> so those sessions are not logged. End with `exit` to guarantee a log.
|
||||||
|
|
||||||
|
**These logs can contain secrets** — anything printed to your terminal (command
|
||||||
|
output, file dumps, tokens echoed to stdout) ends up in them. They never leave
|
||||||
|
your machine, but treat `~/.terminal_history` as sensitive.
|
||||||
|
|
||||||
|
All of it is controlled by a single universal variable:
|
||||||
|
|
||||||
|
```fish
|
||||||
|
set -U __fish_config_op_logging on # enable; takes effect in every open shell
|
||||||
|
set -U __fish_config_op_logging off # disable again
|
||||||
|
set -Ue __fish_config_op_logging # erase — back to the default (off)
|
||||||
|
```
|
||||||
|
|
||||||
|
Unlike the other categories, C5 is opt-in: an unset variable means off, and
|
||||||
|
`__fish_config_opinionated` cannot turn it on for you.
|
||||||
|
|
||||||
|
Prefer an interactive interface? Run **`config-settings`** for a full-screen
|
||||||
|
picker that flips logging — and every other opinionated category — on or off
|
||||||
|
per session or universally, without memorizing variable names.
|
||||||
|
|
||||||
|
Disabling (or leaving it unset) also removes the generated `paru`/`yay` log
|
||||||
|
wrappers and tells the Kitty watcher to skip capture via a sentinel file — no
|
||||||
|
shell or terminal restart required. Logging is category **C5** in
|
||||||
|
[Minimal Mode](#minimal-mode); `set -U __fish_config_opinionated 0` keeps it
|
||||||
|
off along with everything else.
|
||||||
|
|
||||||
|
The Kitty scrollback capture is provided by a watcher script that fish-config can
|
||||||
|
install and manage for you. Inside Kitty, if it isn't set up yet, you'll see a
|
||||||
|
one-time-per-session reminder. Manage it with:
|
||||||
|
|
||||||
|
| Command | Action |
|
||||||
|
|---|---|
|
||||||
|
| `kitty-logging install` | Symlink the watcher into your Kitty config and wire it into `kitty.conf` |
|
||||||
|
| `kitty-logging uninstall` | Remove the managed block and the watcher symlink |
|
||||||
|
| `kitty-logging status` | Show whether it's wired, the watcher version, and C5 state |
|
||||||
|
| `kitty-logging dismiss` | Stop the per-session reminder without installing |
|
||||||
|
|
||||||
|
`install` adds a clearly-marked managed block to `kitty.conf` and comments out
|
||||||
|
any conflicting `watcher` line. It affects **new** Kitty windows (existing
|
||||||
|
windows keep their current watcher until restarted). With C5 logging off the
|
||||||
|
watcher is inert without needing to be uninstalled, and the reminder stays
|
||||||
|
silent until you enable logging.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
### [📖 Full Documentation Wiki](docs/wiki/index.md)
|
### [📖 Documentation Site](https://fish.rootiest.fyi/)
|
||||||
|
|
||||||
A multi-page Markdown wiki auto-generated from the single source file `docs/fish-config.md`
|
A Starlight-powered site rebuilt on every push to `main`. It covers
|
||||||
on every push to `main`. It covers configuration variables, key bindings, abbreviations,
|
configuration variables, key bindings, abbreviations, all functions, the
|
||||||
all functions, the dependency catalog, customization, and more.
|
dependency catalog, customization, and more, with full-text search. Also
|
||||||
|
published as [`llms.txt`](https://fish.rootiest.fyi/llms.txt) (with
|
||||||
|
`llms-full.txt` and `llms-small.txt` variants) for AI agents and other
|
||||||
|
LLM tooling.
|
||||||
|
|
||||||
|
Contributing to the docs? There are two sources, split by content type:
|
||||||
|
|
||||||
|
- **Function documentation** comes from the man-page-style comment header
|
||||||
|
above each function in `functions/*.fish`. Edit the function; the entry
|
||||||
|
and its site page are generated from the header.
|
||||||
|
- **Everything else** lives under `docs/manual/**`.
|
||||||
|
- **Testing, Contributing, Attribution, and License** are pulled straight
|
||||||
|
from this README (the sections below) rather than authored twice — edit
|
||||||
|
them here and the manual, man page, and site all pick up the change.
|
||||||
|
|
||||||
|
Never edit the generated `docs/fish-config.md` — it's rebuilt from all
|
||||||
|
three sources and any hand-edits are discarded.
|
||||||
|
|
||||||
To browse the docs from the terminal:
|
To browse the docs from the terminal:
|
||||||
|
|
||||||
@@ -47,10 +159,10 @@ To browse the docs from the terminal:
|
|||||||
|---|---|
|
|---|---|
|
||||||
| `help config` | Open the terminal manual in the best available pager |
|
| `help config` | Open the terminal manual in the best available pager |
|
||||||
| `help config <keyword>` | Jump directly to a section matching the keyword |
|
| `help config <keyword>` | Jump directly to a section matching the keyword |
|
||||||
| `help config --html` | Open the pre-built HTML docs in the default browser |
|
| `help config --html` | Open the documentation site in the default browser |
|
||||||
| `help config <keyword> --html` | Open HTML docs at the matching section anchor |
|
|
||||||
| `help config --man` | Open the compiled man page via `man -l` |
|
| `help config --man` | Open the compiled man page via `man -l` |
|
||||||
| `help config <keyword> --man` | Open the man page jumping to the nearest match |
|
| `help config <keyword> --man` | Open the man page jumping to the nearest match |
|
||||||
|
| `repo-open` | Open this repo's web page in the browser (deep-links to the current branch and sub-directory) |
|
||||||
|
|
||||||
The pager falls back through: **ov** → **bat** → **man -l** → **less** → **cat**.
|
The pager falls back through: **ov** → **bat** → **man -l** → **less** → **cat**.
|
||||||
|
|
||||||
@@ -72,7 +184,9 @@ git clone https://git.rootiest.dev/rootiest/fish-config.git ~/.config/fish
|
|||||||
|
|
||||||
Then open a new Fish shell — Fisher will be installed automatically on first launch and the Catppuccin Mocha theme will be applied. All plugin functionality is bundled directly with this config and requires no additional installation.
|
Then open a new Fish shell — Fisher will be installed automatically on first launch and the Catppuccin Mocha theme will be applied. All plugin functionality is bundled directly with this config and requires no additional installation.
|
||||||
|
|
||||||
A [chezmoi](https://www.chezmoi.io/) dotfile manager is also configured — secrets are sourced from `~/.config/.user-dots/fish/secrets.fish` and excluded from version control.
|
A [chezmoi](https://www.chezmoi.io/) dotfile manager is also configured — secrets are kept in a private overlay directory (see [Personalization](#personalization)) and excluded from version control.
|
||||||
|
|
||||||
|
**External requirements.** Everything degrades gracefully if a tool is missing, with two exceptions worth calling out. `python3` is required by the documentation pipeline and by `config-settings`, whose TUI is drawn with the stdlib `curses` module. That module ships with CPython on Arch, Fedora and a full Debian/Ubuntu `python3`; `python3-minimal` alone does **not** carry `_curses`, so install the complete `python3` package there. `config-settings` checks for both and tells you which is missing rather than failing inside the renderer.
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> `config.fish` ends with a `return` sentinel guard. Any lines appended **after** it by a tool's setup command will silently have no effect. Many tools (starship, zoxide, mise, etc.) offer a setup command that appends an `init | source` line to your `config.fish` — all integrations are managed through `conf.d/` files instead. If you add a new tool and its shell integration appears to do nothing, check whether its setup command appended an init line to the bottom of `config.fish` and create a `conf.d/<tool>.fish` file for it instead.
|
> `config.fish` ends with a `return` sentinel guard. Any lines appended **after** it by a tool's setup command will silently have no effect. Many tools (starship, zoxide, mise, etc.) offer a setup command that appends an `init | source` line to your `config.fish` — all integrations are managed through `conf.d/` files instead. If you add a new tool and its shell integration appears to do nothing, check whether its setup command appended an init line to the bottom of `config.fish` and create a `conf.d/<tool>.fish` file for it instead.
|
||||||
@@ -91,12 +205,18 @@ Pull the latest changes from upstream without needing a configured git remote:
|
|||||||
|
|
||||||
## Personalization
|
## Personalization
|
||||||
|
|
||||||
Sensitive credentials and machine-specific paths are kept out of version control via a secondary private directory at `~/.config/.user-dots/fish/`. Two files are sourced automatically by `config.fish` if they exist:
|
Sensitive credentials and machine-specific paths are kept out of version control via a private overlay directory. The path defaults to `~/.config/.user-dots/fish/` but can be changed by setting a universal variable:
|
||||||
|
|
||||||
|
```fish
|
||||||
|
set -U __fish_user_dots_path /path/to/your/dots/fish
|
||||||
|
```
|
||||||
|
|
||||||
|
`config.fish` sources `local.fish` from that directory. `local.fish` is responsible for sourcing its own `secrets.fish` companion:
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.config/.user-dots/fish/
|
$__fish_user_dots_path/
|
||||||
├── secrets.fish # API keys, tokens, passwords, personal identifiers
|
├── secrets.fish # API keys, tokens, passwords, personal identifiers
|
||||||
└── local.fish # Machine-specific paths and environment variables
|
└── local.fish # Machine-specific paths, env vars, and sourcing secrets
|
||||||
```
|
```
|
||||||
|
|
||||||
### secrets.fish
|
### secrets.fish
|
||||||
@@ -148,37 +268,43 @@ abbr -a dcw 'docker context use work-server'
|
|||||||
|
|
||||||
### How it works
|
### How it works
|
||||||
|
|
||||||
`config.fish` sources both files with an existence check so the public config works cleanly on any machine that doesn't have the private repo:
|
`config.fish` sources only `local.fish` with an existence check so the public config works cleanly on any machine without the private repo. `local.fish` is responsible for sourcing its own `secrets.fish`:
|
||||||
|
|
||||||
```fish
|
```fish
|
||||||
if test -f $HOME/.config/.user-dots/fish/secrets.fish
|
# config.fish resolves the path, then sources local.fish
|
||||||
source $HOME/.config/.user-dots/fish/secrets.fish
|
set -q __fish_user_dots_path
|
||||||
end
|
or set -l __fish_user_dots_path "$XDG_CONFIG_HOME/.user-dots/fish"
|
||||||
|
test -f "$__fish_user_dots_path/local.fish"
|
||||||
if test -f $HOME/.config/.user-dots/fish/local.fish
|
and source "$__fish_user_dots_path/local.fish"
|
||||||
source $HOME/.config/.user-dots/fish/local.fish
|
|
||||||
end
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For convenience, a git-ignored `user-dots` symlink in the fish config directory is pointed at `$__fish_user_dots_path` on startup, so the overlay can be browsed from `~/.config/fish/`. It is recreated if missing and repointed if the path variable changes. Creation is a C2 startup side-effect (`__fish_config_op_autoexec`); it only ever manages a symlink and never clobbers a real file or directory at that path.
|
||||||
|
|
||||||
|
To opt out, set `__fish_user_dots_symlink` to a falsy value (or toggle **Dots link** off on the **Paths** page of `config-settings`). Disabling it stops the symlink being generated and removes any existing one immediately — honoured regardless of the C2 master switch.
|
||||||
|
|
||||||
`fish_variables` (which fish auto-manages and may contain universal variable state) is excluded from this repo via `.gitignore`.
|
`fish_variables` (which fish auto-manages and may contain universal variable state) is excluded from this repo via `.gitignore`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Minimal Mode
|
## Minimal Mode
|
||||||
|
|
||||||
Everything opinionated in this config — command shadows, startup side-effects, key and environment overrides, terminal integrations, logging, and the first-run greeting — is active by default but can be switched off with universal variables. Six category toggles and one master switch are available:
|
Everything opinionated in this config — command shadows, startup side-effects, key and environment overrides, terminal integrations, and the first-run greeting — is active by default but can be switched off. Logging (C5) is the exception: it is **opt-in**, off until you explicitly enable it.
|
||||||
|
|
||||||
|
> **The easy way — `config-settings`:** Run `config-settings` for an interactive TUI that manages settings across four pages — **Universal** and **Session** (the opinionated category toggles below, persistent or per-shell), **Sponge** (history-scrubbing: delay, exit codes, purge-on-exit, and extra sensitive variable names), and **Paths** (scrollback log dir, max files, and the user-dots path) — without typing a single variable name. Navigate with the arrow keys (or `h`/`j`/`k`/`l`); toggle rows step OFF ← DEFAULT → ON, value rows edit inline with `Enter` and reset with `←`. `Enter` on a category opens its sub-categories, `/` filters the page — reaching into sub-categories too, listed as `Category › Sub` — `?` opens a help overlay, `Tab`/`Shift-Tab` cycle pages, and `q` applies your edits and quits. Edits are collected as you make them and written in one batch on exit; the status bar shows the pending count. The panel is drawn with Python's stdlib `curses`, so it resizes with the terminal and never flickers — see [Installation](#installation) for the `python3` requirement.
|
||||||
|
|
||||||
|
If you'd rather set them by hand, each category is controlled by a universal variable. Six category toggles and one master switch are available:
|
||||||
|
|
||||||
| Variable | Disables |
|
| Variable | Disables |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `__fish_config_op_aliases` | Command shadows: `ls`→eza, `cat`→bat, `cd`→zoxide, `rm`→trash, `top`→btop, and friends; `grep`/`cp`/`mv`/`wget` flag injection |
|
| `__fish_config_op_aliases` | Command shadows: `ls`→eza, `cat`→bat, `cd`→zoxide, `rm`→trash, `top`→btop, `edit`→multi-editor launcher, and friends; `grep`/`cp`/`mv`/`wget` flag injection |
|
||||||
| `__fish_config_op_autoexec` | Startup side-effects: Fisher bootstrap, theme apply, `paru`/`yay` wrapper generation, auto venv activation, WakaTime hook |
|
| `__fish_config_op_autoexec` | Startup side-effects: Fisher bootstrap, theme apply, `paru`/`yay` wrapper generation, auto venv activation, WakaTime hook, auto-pull background fast-forward |
|
||||||
| `__fish_config_op_overrides` | Vi mode, `exit`→`smart_exit`, `$PAGER`/`$MANPAGER`/`$CDPATH`, bang-bang history expansion, autopair, puffer, Starship prompt, theme colors |
|
| `__fish_config_op_overrides` | Vi mode, `exit`→`smart_exit`, `$PAGER`/`$MANPAGER`/`$CDPATH`/`XDG`/`PATH`, `$DO_NOT_TRACK`/`$DISABLE_TELEMETRY`, bang-bang history expansion, autopair, puffer, Starship prompt, theme colors |
|
||||||
| `__fish_config_op_integrations` | Kitty/WezTerm window abbreviations, `done` notifications, `spwin`/`tab`/`split`, `hist`, `logs`, `upgrade`, WakaTime |
|
| `__fish_config_op_integrations` | Kitty/WezTerm window abbreviations, `done` notifications, `spwin`/`tab`/`split`, `hist`, `logs`, `upgrade`, WakaTime |
|
||||||
| `__fish_config_op_logging` | Scrollback capture on exit, `paru`/`yay` AUR log wrappers, Kitty watcher capture (sentinel-file coordinated) |
|
| `__fish_config_op_logging` | **Opt-in — off unless explicitly enabled.** Scrollback capture on exit, tmux `pipe-pane` pane logging, zellij `dump-screen` capture on exit, `paru`/`yay` AUR log wrappers, Kitty watcher capture (sentinel-file coordinated) |
|
||||||
| `__fish_config_op_greeting` | Per-session `fish_greeting` (suppresses distro greetings such as CachyOS fastfetch by overriding with an empty function); first-run welcome banner |
|
| `__fish_config_op_greeting` | Per-session `fish_greeting` (suppresses distro greetings such as CachyOS fastfetch by overriding with an empty function); first-run welcome banner |
|
||||||
| `__fish_config_opinionated` | Master switch — all six categories at once |
|
| `__fish_config_opinionated` | Master switch — disables all six categories at once (it is a master *off* switch; it cannot enable opt-in C5 logging) |
|
||||||
|
|
||||||
Set any of them to a falsy value (`0`, `false`, `no`, `off`, `n`) to disable; erase the variable to re-enable:
|
Set any of them to a falsy value (`0`, `false`, `no`, `off`, `n`) to disable; erase the variable to re-enable. An explicit per-category truthy value overrides a falsy master switch, so you can disable everything with `__fish_config_opinionated=0` and selectively re-enable individual categories:
|
||||||
|
|
||||||
```fish
|
```fish
|
||||||
# Plain shell: disable everything opinionated
|
# Plain shell: disable everything opinionated
|
||||||
@@ -187,17 +313,61 @@ set -U __fish_config_opinionated 0
|
|||||||
# Or pick a single category, e.g. keep integrations but drop command shadows
|
# Or pick a single category, e.g. keep integrations but drop command shadows
|
||||||
set -U __fish_config_op_aliases off
|
set -U __fish_config_op_aliases off
|
||||||
|
|
||||||
|
# Minimal mode but keep the greeting (per-category overrides master)
|
||||||
|
set -U __fish_config_opinionated 0
|
||||||
|
set -U __fish_config_op_greeting 1
|
||||||
|
|
||||||
|
# Opt in to session logging (C5 is off by default)
|
||||||
|
set -U __fish_config_op_logging on
|
||||||
|
|
||||||
# Back to full flavor
|
# Back to full flavor
|
||||||
set -Ue __fish_config_opinionated
|
set -Ue __fish_config_opinionated
|
||||||
|
set -Ue __fish_config_op_greeting
|
||||||
```
|
```
|
||||||
|
|
||||||
Command shadows react immediately; bindings, prompt, and abbreviations take effect in new shells. With aliases disabled, `rm` deletes permanently again instead of trashing. See `help config opinionated` for the full component list.
|
Command shadows react immediately; bindings, prompt, and abbreviations take effect in new shells. With aliases disabled, `rm` deletes permanently again instead of trashing. See `help config opinionated` for the full component list.
|
||||||
|
|
||||||
|
Each category further sub-divides into two to six sub-categories with
|
||||||
|
their own `__fish_config_op_<category>_<subcategory>` toggles (e.g.
|
||||||
|
`__fish_config_op_aliases_filesystem`), following the exact same
|
||||||
|
truthy/falsy/unset cascade one level deeper. Run `config-settings` and
|
||||||
|
press Enter on a category row to browse and toggle its sub-categories —
|
||||||
|
or press `/` and type, which searches sub-categories across every
|
||||||
|
category at once and lists the hits as `Category › Sub`. Or see the
|
||||||
|
[Components Reference](https://fish.rootiest.fyi/08-components-reference/)
|
||||||
|
for the full sub-category list per category.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
```fish
|
||||||
|
fish tests/run-tests.fish
|
||||||
|
```
|
||||||
|
|
||||||
|
Runs before every push (and gates the [documentation build](.github/workflows/ci.yml) in CI, so a broken config can't get published): syntax-lints every `.fish` file, then loads the config in an isolated `HOME`/XDG sandbox — never this checkout itself, since it doubles as a real `~/.config/fish` — and runs functional checks against foundational behavior (XDG/PATH/CDPATH setup, key bindings, abbreviations, core functions, the opinionated-component registry, and more).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Interested in contributing? See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the
|
||||||
|
branching/PR workflow, commit conventions, fish coding standards, and the
|
||||||
|
docs/testing pipeline this repo follows.
|
||||||
|
|
||||||
|
**Preferred forge:** [git.rootiest.dev/rootiest/fish-config](https://git.rootiest.dev/rootiest/fish-config)
|
||||||
|
is the base repository. [github.com/rootiest/fish-config](https://github.com/rootiest/fish-config)
|
||||||
|
is a push-mirror of it — identical content, but one-way and read-only from a
|
||||||
|
contributor's perspective. Branches, forks, and merges made on the GitHub
|
||||||
|
side aren't fed back upstream, so they risk being silently overwritten by
|
||||||
|
the next mirror push. Until two-way sync exists, please fork, branch, and
|
||||||
|
open issues/PRs from the Gitea repository rather than the GitHub mirror.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Attribution
|
## Attribution
|
||||||
|
|
||||||
The core of the [Zoxide integration](docs/wiki/2-path-setup.md) in this repository was originally adapted from the [icezyclon/zoxide.fish](https://github.com/icezyclon/zoxide.fish) plugin (MIT Licensed) and has since been heavily customized for performance and Fish 4.x compatibility.
|
The core of the [Zoxide integration](https://fish.rootiest.fyi/02-path-setup/) in this repository was originally adapted from the [icezyclon/zoxide.fish](https://github.com/icezyclon/zoxide.fish) plugin (MIT Licensed) and has since been heavily customized for performance and Fish 4.x compatibility.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
#
|
||||||
|
# Completions for agents-vault.
|
||||||
|
|
||||||
|
complete -c agents-vault -f
|
||||||
|
complete -c agents-vault -s h -l help -d 'Show help message'
|
||||||
|
complete -c agents-vault -l link -d "Ensure this project's memory link only"
|
||||||
|
complete -c agents-vault -l push -d 'Commit and push to the vault remote'
|
||||||
|
complete -c agents-vault -l restore -d 'Relink everything possible, report the rest'
|
||||||
|
complete -c agents-vault -l status -d 'Show entries, link health, remote, orphans'
|
||||||
|
# --adopt takes an existing vault slug, so offer the entries that are
|
||||||
|
# actually there; the vault may not exist yet, in which case this is empty.
|
||||||
|
# -A because a dot-led slug is legitimate (a relative-path remote keys as
|
||||||
|
# ..-mirror), and an entry that cannot be completed reads as one that is
|
||||||
|
# not there.
|
||||||
|
complete -c agents-vault -l adopt -r -a '(command ls -1A (_agents_vault_dir)/projects 2>/dev/null)' -d 'Bind this project to an existing vault entry'
|
||||||
|
complete -c agents-vault -l remote -r -d 'Set the vault remote URL'
|
||||||
|
complete -c agents-vault -s v -l verbose -d 'Print all per-step output (default)'
|
||||||
|
complete -c agents-vault -s q -l quiet -d 'Print one summary line only if changed'
|
||||||
|
complete -c agents-vault -s s -l silent -d 'Suppress all output; errors only'
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# Completions for the `auto-pull` registry command.
|
||||||
|
|
||||||
|
function __auto_pull_registered
|
||||||
|
set -l list "$XDG_CONFIG_HOME/.user-dots/fish/auto-pull.list"
|
||||||
|
test -r "$list"; or return
|
||||||
|
for l in (command cat "$list" 2>/dev/null)
|
||||||
|
test -n "$l"; or continue
|
||||||
|
printf '%s\t%s\n' (path basename "$l") "$l"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
set -l subcmds list add remove status
|
||||||
|
|
||||||
|
# Subcommands (only as the first argument).
|
||||||
|
complete -c auto-pull -f -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a list -d 'Show registered repos'
|
||||||
|
complete -c auto-pull -f -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a add -d "Register a repo (default: current)"
|
||||||
|
complete -c auto-pull -f -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a remove -d 'Unregister a repo'
|
||||||
|
complete -c auto-pull -f -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a status -d 'Show enabled state and registry path'
|
||||||
|
complete -c auto-pull -f -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-s h -l help -d 'Show help'
|
||||||
|
|
||||||
|
# `add` takes a directory path.
|
||||||
|
complete -c auto-pull -n "__fish_seen_subcommand_from add" -a '(__fish_complete_directories)'
|
||||||
|
|
||||||
|
# `remove` completes registered repo basenames.
|
||||||
|
complete -c auto-pull -f -n "__fish_seen_subcommand_from remove" -a '(__auto_pull_registered)'
|
||||||
+4
-5
@@ -3,7 +3,7 @@
|
|||||||
function __bd_debug
|
function __bd_debug
|
||||||
set -l file "$BASH_COMP_DEBUG_FILE"
|
set -l file "$BASH_COMP_DEBUG_FILE"
|
||||||
if test -n "$file"
|
if test -n "$file"
|
||||||
echo "$argv" >> $file
|
echo "$argv" >>$file
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -108,7 +108,6 @@ function __bd_requires_order_preservation
|
|||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# This function does two things:
|
# This function does two things:
|
||||||
# - Obtain the completions and store them in the global __bd_comp_results
|
# - Obtain the completions and store them in the global __bd_comp_results
|
||||||
# - Return false if file completion should be performed
|
# - Return false if file completion should be performed
|
||||||
@@ -215,18 +214,18 @@ end
|
|||||||
# so we can properly delete any completions provided by another script.
|
# so we can properly delete any completions provided by another script.
|
||||||
# Only do this if the program can be found, or else fish may print some errors; besides,
|
# Only do this if the program can be found, or else fish may print some errors; besides,
|
||||||
# the existing completions will only be loaded if the program can be found.
|
# the existing completions will only be loaded if the program can be found.
|
||||||
if type -q "bd"
|
if type -q bd
|
||||||
# The space after the program name is essential to trigger completion for the program
|
# The space after the program name is essential to trigger completion for the program
|
||||||
# and not completion of the program name itself.
|
# and not completion of the program name itself.
|
||||||
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
|
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
|
||||||
complete --do-complete "bd " > /dev/null 2>&1
|
complete --do-complete "bd " >/dev/null 2>&1
|
||||||
end
|
end
|
||||||
|
|
||||||
# Remove any pre-existing completions for the program since we will be handling all of them.
|
# Remove any pre-existing completions for the program since we will be handling all of them.
|
||||||
complete -c bd -e
|
complete -c bd -e
|
||||||
|
|
||||||
# this will get called after the two calls below and clear the $__bd_perform_completion_once_result global
|
# this will get called after the two calls below and clear the $__bd_perform_completion_once_result global
|
||||||
complete -c bd -n '__bd_clear_perform_completion_once_result'
|
complete -c bd -n __bd_clear_perform_completion_once_result
|
||||||
# The call to __bd_prepare_completions will setup __bd_comp_results
|
# The call to __bd_prepare_completions will setup __bd_comp_results
|
||||||
# which provides the program's completion choices.
|
# which provides the program's completion choices.
|
||||||
# If this doesn't require order preservation, we don't use the -k flag
|
# If this doesn't require order preservation, we don't use the -k flag
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
# fish completion for copilot
|
||||||
|
# Generated by `copilot completion fish`. Do not edit by hand.
|
||||||
|
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a login -d 'Authenticate with Copilot'
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a help -d 'Display help information'
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a init -d 'Initialize Copilot instructions'
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a update -d 'Download the latest version'
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a version -d 'Display version information'
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a plugin -d 'Manage plugins'
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a mcp -d 'Manage MCP servers'
|
||||||
|
complete -c copilot -n __fish_use_subcommand -f -a completion -d 'Generate a shell completion script'
|
||||||
|
complete -c copilot -l version -s v -f -d 'show version information'
|
||||||
|
complete -c copilot -l interactive -s i -r -d 'Start interactive mode and automatically execute this prompt'
|
||||||
|
complete -c copilot -l prompt -s p -r -d 'Execute a prompt in non-interactive mode (exits after completion)'
|
||||||
|
complete -c copilot -l silent -s s -f -d 'Output only the agent response (no stats), useful for scripting with -p'
|
||||||
|
complete -c copilot -l enable-memory -f -d 'Enable memory in prompt mode (disabled by default)'
|
||||||
|
complete -c copilot -l model -r -d 'Set the AI model to use (use \'auto\' to let Copilot pick automatically)'
|
||||||
|
complete -c copilot -l effort -l reasoning-effort -r -d 'Set the reasoning effort level' -a 'none low medium high xhigh max'
|
||||||
|
complete -c copilot -l context -r -d 'Set the context window tier (overrides persisted setting)' -a 'default long_context'
|
||||||
|
complete -c copilot -l enable-reasoning-summaries -f -d 'Request reasoning summaries for OpenAI models'
|
||||||
|
complete -c copilot -l agent -r -d 'Specify a custom agent to use'
|
||||||
|
complete -c copilot -l resume -s r -r -d 'Resume from a previous session (optionally specify existing session ID, task ID, ID prefix, or name; name matching is exact, case-insensitive)'
|
||||||
|
complete -c copilot -l continue -f -d 'Resume the most recent session'
|
||||||
|
complete -c copilot -l name -s n -r -d 'Set a name for the new session'
|
||||||
|
complete -c copilot -l session-id -r -d 'Resume an existing session or task by ID, or set the UUID for a new session'
|
||||||
|
complete -c copilot -l connect -r -d 'Connect directly to a remote session (optionally specify session ID or task ID)'
|
||||||
|
complete -c copilot -l allow-all-tools -f -d 'Allow all tools to run automatically without confirmation; required for non-interactive mode'
|
||||||
|
complete -c copilot -l allow-all-paths -f -d 'Disable file path verification and allow access to any path'
|
||||||
|
complete -c copilot -l disallow-temp-dir -f -d 'Prevent automatic access to the system temporary directory'
|
||||||
|
complete -c copilot -l no-custom-instructions -f -d 'Disable loading of custom instructions from AGENTS.md and related files'
|
||||||
|
complete -c copilot -l no-auto-update -f -d 'Disable downloading CLI update automatically (disabled by default in CI environments)'
|
||||||
|
complete -c copilot -l no-ask-user -f -d 'Disable the ask_user tool (agent works autonomously without asking questions)'
|
||||||
|
complete -c copilot -l banner -f -d 'Show the startup banner'
|
||||||
|
complete -c copilot -l no-color -f -d 'Disable all color output'
|
||||||
|
complete -c copilot -l screen-reader -f -d 'Enable screen reader optimizations'
|
||||||
|
complete -c copilot -l plain-diff -f -d 'Disable rich diff rendering (syntax highlighting via diff tool specified by git config)'
|
||||||
|
complete -c copilot -s C -r -d 'Change working directory before doing anything else'
|
||||||
|
complete -c copilot -l log-dir -r -d 'Set log file directory (default: ~/.copilot/logs/)'
|
||||||
|
complete -c copilot -l extension-sdk-path -r -d 'Override the bundled @github/copilot-sdk injected into extension subprocesses with a local `copilot-sdk/` folder. Invalid paths fall back to the bundled SDK.'
|
||||||
|
complete -c copilot -l log-level -r -d 'Set the log level' -a 'none error warning info debug all default'
|
||||||
|
complete -c copilot -l stream -r -d 'Enable or disable streaming mode' -a 'on off'
|
||||||
|
complete -c copilot -l output-format -r -d 'Output format: \'text\' (default) or \'json\' (JSONL, one JSON object per line)' -a 'text json'
|
||||||
|
complete -c copilot -l share -r -d 'Share session to markdown file after completion in non-interactive mode (default: ./copilot-session-<id>.md)'
|
||||||
|
complete -c copilot -l share-gist -f -d 'Share session to a secret GitHub gist after completion in non-interactive mode'
|
||||||
|
complete -c copilot -l add-dir -r -d 'Add a directory to the allowed list for file access (can be used multiple times)'
|
||||||
|
complete -c copilot -l attachment -r -d 'Attach a file (image or native document) to the initial prompt; only valid in non-interactive mode (can be used multiple times)'
|
||||||
|
complete -c copilot -l disable-mcp-server -r -d 'Disable a specific MCP server (can be used multiple times)'
|
||||||
|
complete -c copilot -l disable-builtin-mcps -f -d 'Disable all built-in MCP servers (currently: github-mcp-server)'
|
||||||
|
complete -c copilot -l enable-all-github-mcp-tools -f -d 'Enable all GitHub MCP server tools instead of the default CLI subset. Overrides --add-github-mcp-toolset and --add-github-mcp-tool options.'
|
||||||
|
complete -c copilot -l add-github-mcp-toolset -r -d 'Add a toolset to enable for the GitHub MCP server instead of the default CLI subset (can be used multiple times). Use "all" for all toolsets.'
|
||||||
|
complete -c copilot -l add-github-mcp-tool -r -d 'Add a tool to enable for the GitHub MCP server instead of the default CLI subset (can be used multiple times). Use "*" for all tools.'
|
||||||
|
complete -c copilot -l plugin-dir -r -d 'Load a plugin from a local directory (can be used multiple times)'
|
||||||
|
complete -c copilot -l additional-mcp-config -r -d 'Additional MCP servers configuration as JSON string or file path (prefix with @) (can be used multiple times; augments config from ~/.copilot/mcp-config.json for this session)'
|
||||||
|
complete -c copilot -l allow-tool -r -d 'Tools the CLI has permission to use; will not prompt for permission'
|
||||||
|
complete -c copilot -l deny-tool -r -d 'Tools the CLI does not have permission to use; will not prompt for permission'
|
||||||
|
complete -c copilot -l available-tools -r -d 'Only these tools will be available to the model'
|
||||||
|
complete -c copilot -l excluded-tools -r -d 'These tools will not be available to the model'
|
||||||
|
complete -c copilot -l secret-env-vars -r -d 'Environment variable names whose values are stripped from shell and MCP server environments and redacted from output (e.g., --secret-env-vars=MY_KEY,OTHER_KEY)'
|
||||||
|
complete -c copilot -l allow-url -r -d 'Allow access to specific URLs or domains'
|
||||||
|
complete -c copilot -l deny-url -r -d 'Deny access to specific URLs or domains, takes precedence over --allow-url'
|
||||||
|
complete -c copilot -l allow-all-urls -f -d 'Allow access to all URLs without confirmation'
|
||||||
|
complete -c copilot -l allow-all -f -d 'Enable all permissions (equivalent to --allow-all-tools --allow-all-paths --allow-all-urls)'
|
||||||
|
complete -c copilot -l yolo -f -d 'Enable all permissions (equivalent to --allow-all-tools --allow-all-paths --allow-all-urls)'
|
||||||
|
complete -c copilot -l max-autopilot-continues -r -d 'Maximum number of continuation messages in autopilot mode'
|
||||||
|
complete -c copilot -l mode -r -d 'Set the initial agent mode' -a 'interactive plan autopilot'
|
||||||
|
complete -c copilot -l autopilot -f -d 'Start in autopilot mode'
|
||||||
|
complete -c copilot -l plan -f -d 'Start in plan mode'
|
||||||
|
complete -c copilot -l experimental -f -d 'Enable experimental features'
|
||||||
|
complete -c copilot -l no-experimental -f -d 'Disable experimental features'
|
||||||
|
complete -c copilot -l bash-env -r -d 'Enable BASH_ENV support for bash shells (on|off)'
|
||||||
|
complete -c copilot -l no-bash-env -f -d 'Disable BASH_ENV support for bash shells'
|
||||||
|
complete -c copilot -l mouse -r -d 'Enable mouse support in alt screen mode (on|off)'
|
||||||
|
complete -c copilot -l no-mouse -f -d 'Disable mouse support in alt screen mode'
|
||||||
|
complete -c copilot -l acp -f -d 'Start as Agent Client Protocol server'
|
||||||
|
complete -c copilot -l remote -f -d 'Enable remote control of your session from GitHub web and mobile'
|
||||||
|
complete -c copilot -l no-remote -f -d 'Disable remote control of your session from GitHub web and mobile'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from login' -l host -r -d 'GitHub host URL (default: https://github.com)'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a install -d 'Install a plugin'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a uninstall -d 'Uninstall a plugin'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a update -d 'Update a plugin'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a list -d 'List installed plugins'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a marketplace -d 'Manage plugin marketplaces'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from update' -l all -f -d 'Update all installed plugins'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a add -d 'Add a marketplace'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a remove -d 'Remove a marketplace'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a list -d 'List registered marketplaces'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a browse -d 'Browse plugins in a marketplace'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a update -d 'Update marketplace plugin catalogs'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace; and __fish_seen_subcommand_from remove' -l force -s f -f -d 'Force removal even if plugins are installed'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a list -d 'List configured MCP servers'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a get -d 'Show server details'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a add -d 'Add an MCP server'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a remove -d 'Remove an MCP server'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from list' -l json -f -d 'Output as JSON'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from get' -l json -f -d 'Output as JSON'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from get' -l show-secrets -f -d 'Show full environment variable and header values (masked by default)'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l transport -r -d 'Server transport' -a 'stdio http sse'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l env -r -d 'Environment variable (KEY=VALUE, can be repeated)'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l header -r -d 'HTTP header for remote servers, can be repeated'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l tools -r -d 'Tool filter: "*" for all, comma-separated list, or "" for none'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l timeout -r -d 'Timeout in milliseconds'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l json -f -d 'Output added config as JSON'
|
||||||
|
complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l show-secrets -f -d 'Show full environment variable and header values in output, masked by default'
|
||||||
+60
-60
@@ -1,38 +1,38 @@
|
|||||||
# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.
|
# Print an optspec for argparse to handle cmd's options that are independent of any subcommand.
|
||||||
function __fish_deadbranch_global_optspecs
|
function __fish_deadbranch_global_optspecs
|
||||||
string join \n h/help V/version
|
string join \n h/help V/version
|
||||||
end
|
end
|
||||||
|
|
||||||
function __fish_deadbranch_needs_command
|
function __fish_deadbranch_needs_command
|
||||||
# Figure out if the current invocation already has a command.
|
# Figure out if the current invocation already has a command.
|
||||||
set -l cmd (commandline -opc)
|
set -l cmd (commandline -opc)
|
||||||
set -e cmd[1]
|
set -e cmd[1]
|
||||||
argparse -s (__fish_deadbranch_global_optspecs) -- $cmd 2>/dev/null
|
argparse -s (__fish_deadbranch_global_optspecs) -- $cmd 2>/dev/null
|
||||||
or return
|
or return
|
||||||
if set -q argv[1]
|
if set -q argv[1]
|
||||||
# Also print the command, so this can be used to figure out what it is.
|
# Also print the command, so this can be used to figure out what it is.
|
||||||
echo $argv[1]
|
echo $argv[1]
|
||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
function __fish_deadbranch_using_subcommand
|
function __fish_deadbranch_using_subcommand
|
||||||
set -l cmd (__fish_deadbranch_needs_command)
|
set -l cmd (__fish_deadbranch_needs_command)
|
||||||
test -z "$cmd"
|
test -z "$cmd"
|
||||||
and return 1
|
and return 1
|
||||||
contains -- $cmd[1] $argv
|
contains -- $cmd[1] $argv
|
||||||
end
|
end
|
||||||
|
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -s h -l help -d 'Print help'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -s V -l version -d 'Print version'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -f -a "list" -d 'List stale branches'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -f -a list -d 'List stale branches'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -f -a "clean" -d 'Delete stale branches (merged only by default, use --force for unmerged)'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -f -a clean -d 'Delete stale branches (merged only by default, use --force for unmerged)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -f -a "config" -d 'Manage configuration'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -f -a config -d 'Manage configuration'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -f -a "backup" -d 'Manage backups'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -f -a backup -d 'Manage backups'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -f -a "stats" -d 'Show repository branch statistics'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -f -a stats -d 'Show repository branch statistics'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -f -a "completions" -d 'Generate shell completion scripts'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -f -a completions -d 'Generate shell completion scripts'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_needs_command" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
|
complete -c deadbranch -n __fish_deadbranch_needs_command -f -a help -d 'Print this message or the help of the given subcommand(s)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand list" -s d -l days -d 'Only show branches older than N days (default: from config or 30)' -r
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand list" -s d -l days -d 'Only show branches older than N days (default: from config or 30)' -r
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand list" -l local -d 'Only show local branches'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand list" -l local -d 'Only show local branches'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand list" -l remote -d 'Only show remote branches'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand list" -l remote -d 'Only show remote branches'
|
||||||
@@ -51,11 +51,11 @@ complete -c deadbranch -n "__fish_deadbranch_using_subcommand clean" -s h -l hel
|
|||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand clean" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand clean" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a "set" -d 'Set a configuration value'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a set -d 'Set a configuration value'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a "show" -d 'Show current configuration'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a show -d 'Show current configuration'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a "edit" -d 'Open config file in $EDITOR'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a edit -d 'Open config file in $EDITOR'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a "reset" -d 'Reset configuration to defaults'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a reset -d 'Reset configuration to defaults'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and not __fish_seen_subcommand_from set show edit reset help" -f -a help -d 'Print this message or the help of the given subcommand(s)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from set" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from set" -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from set" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from set" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from show" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from show" -s h -l help -d 'Print help'
|
||||||
@@ -64,18 +64,18 @@ complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish
|
|||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from edit" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from edit" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from reset" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from reset" -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from reset" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from reset" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "set" -d 'Set a configuration value'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a set -d 'Set a configuration value'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "show" -d 'Show current configuration'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a show -d 'Show current configuration'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "edit" -d 'Open config file in $EDITOR'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a edit -d 'Open config file in $EDITOR'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "reset" -d 'Reset configuration to defaults'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a reset -d 'Reset configuration to defaults'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand config; and __fish_seen_subcommand_from help" -f -a help -d 'Print this message or the help of the given subcommand(s)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a "list" -d 'List available backups'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a list -d 'List available backups'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a "restore" -d 'Restore a branch from backup'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a restore -d 'Restore a branch from backup'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a "stats" -d 'Show backup storage statistics'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a stats -d 'Show backup storage statistics'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a "clean" -d 'Remove old backups, keeping the most recent ones'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a clean -d 'Remove old backups, keeping the most recent ones'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and not __fish_seen_subcommand_from list restore stats clean help" -f -a help -d 'Print this message or the help of the given subcommand(s)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from list" -l repo -d 'Show backups for a specific repository by name' -r
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from list" -l repo -d 'Show backups for a specific repository by name' -r
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from list" -l current -d 'Only show backups for current repository'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from list" -l current -d 'Only show backups for current repository'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help'
|
||||||
@@ -94,28 +94,28 @@ complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish
|
|||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from clean" -s y -l yes -d 'Skip confirmation prompt'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from clean" -s y -l yes -d 'Skip confirmation prompt'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from clean" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from clean" -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from clean" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from clean" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a "list" -d 'List available backups'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a list -d 'List available backups'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a "restore" -d 'Restore a branch from backup'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a restore -d 'Restore a branch from backup'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a "stats" -d 'Show backup storage statistics'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a stats -d 'Show backup storage statistics'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a "clean" -d 'Remove old backups, keeping the most recent ones'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a clean -d 'Remove old backups, keeping the most recent ones'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand backup; and __fish_seen_subcommand_from help" -f -a help -d 'Print this message or the help of the given subcommand(s)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand stats" -s d -l days -d 'Treat branches older than N days as stale (default: from config or 30)' -r
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand stats" -s d -l days -d 'Treat branches older than N days as stale (default: from config or 30)' -r
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand stats" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand stats" -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand stats" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand stats" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand completions" -s h -l help -d 'Print help'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand completions" -s h -l help -d 'Print help'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand completions" -s V -l version -d 'Print version'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand completions" -s V -l version -d 'Print version'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a "list" -d 'List stale branches'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a list -d 'List stale branches'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a "clean" -d 'Delete stale branches (merged only by default, use --force for unmerged)'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a clean -d 'Delete stale branches (merged only by default, use --force for unmerged)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a "config" -d 'Manage configuration'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a config -d 'Manage configuration'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a "backup" -d 'Manage backups'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a backup -d 'Manage backups'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a "stats" -d 'Show repository branch statistics'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a stats -d 'Show repository branch statistics'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a "completions" -d 'Generate shell completion scripts'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a completions -d 'Generate shell completion scripts'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and not __fish_seen_subcommand_from list clean config backup stats completions help" -f -a help -d 'Print this message or the help of the given subcommand(s)'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "set" -d 'Set a configuration value'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a set -d 'Set a configuration value'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "show" -d 'Show current configuration'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a show -d 'Show current configuration'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "edit" -d 'Open config file in $EDITOR'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a edit -d 'Open config file in $EDITOR'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "reset" -d 'Reset configuration to defaults'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from config" -f -a reset -d 'Reset configuration to defaults'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a "list" -d 'List available backups'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a list -d 'List available backups'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a "restore" -d 'Restore a branch from backup'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a restore -d 'Restore a branch from backup'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a "stats" -d 'Show backup storage statistics'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a stats -d 'Show backup storage statistics'
|
||||||
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a "clean" -d 'Remove old backups, keeping the most recent ones'
|
complete -c deadbranch -n "__fish_deadbranch_using_subcommand help; and __fish_seen_subcommand_from backup" -f -a clean -d 'Remove old backups, keeping the most recent ones'
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# Completions for the `jobrunner` background job manager.
|
||||||
|
# `jr` inherits these via `function jr --wraps jobrunner`.
|
||||||
|
|
||||||
|
# Offer running jobs as name<TAB>description pairs.
|
||||||
|
function __jobrunner_complete_jobs
|
||||||
|
set -l tool ""
|
||||||
|
set -l tokens (commandline -opc)
|
||||||
|
set -l idx 1
|
||||||
|
while test $idx -le (count $tokens)
|
||||||
|
switch $tokens[$idx]
|
||||||
|
case -t --tool
|
||||||
|
set idx (math $idx + 1)
|
||||||
|
if test $idx -le (count $tokens)
|
||||||
|
set tool $tokens[$idx]
|
||||||
|
end
|
||||||
|
case '--tool=*'
|
||||||
|
set tool (string replace -- "--tool=" "" $tokens[$idx])
|
||||||
|
case '-t*'
|
||||||
|
set tool (string replace -r "^-t" "" $tokens[$idx])
|
||||||
|
end
|
||||||
|
set idx (math $idx + 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
for row in (__jobrunner_sessions $tool)
|
||||||
|
set -l f (string split \t -- $row)
|
||||||
|
printf '%s\t%s job (PID %s)\n' $f[1] $f[3] $f[2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
set -l subcmds run list attach kill logs help
|
||||||
|
set -l needs_job "__fish_seen_subcommand_from attach kill logs -a --attach -k --kill -o --output"
|
||||||
|
|
||||||
|
# No file completions; jobs are named, not paths.
|
||||||
|
complete -c jobrunner -f
|
||||||
|
|
||||||
|
# Backend tool selection flag.
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-s t -l tool -x -a "tmux screen" -d 'Force specific backend'
|
||||||
|
|
||||||
|
# Subcommands (only as the first argument).
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a run -d 'Start a named job in the background'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a list -d 'List all managed background jobs'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a attach -d 'Re-attach interactively to a job'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a kill -d 'Terminate a running background job'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a logs -d "Print a job's output without attaching"
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a help -d 'Show usage help'
|
||||||
|
|
||||||
|
# Flag forms.
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-s r -l run -d 'Start a named job in the background'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-s l -l list -d 'List all managed background jobs'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-s a -l attach -d 'Re-attach interactively to a job'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-s k -l kill -d 'Terminate a running background job'
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-s o -l output -d "Print a job's output without attaching"
|
||||||
|
complete -c jobrunner -s h -l help -d 'Show usage help'
|
||||||
|
|
||||||
|
# Running jobs, for the subcommands that take one.
|
||||||
|
complete -c jobrunner -n "$needs_job" -a '(__jobrunner_complete_jobs)'
|
||||||
|
|
||||||
|
# A bare job name attaches to it, so offer jobs in first position too.
|
||||||
|
complete -c jobrunner -n "not __fish_seen_subcommand_from $subcmds" \
|
||||||
|
-a '(__jobrunner_complete_jobs)'
|
||||||
|
|
||||||
|
# After `run <name>`, complete the command to execute.
|
||||||
|
complete -c jobrunner -n "__fish_seen_subcommand_from run -r --run; and test (count (commandline -opc)) -ge 3" \
|
||||||
|
-a '(__fish_complete_subcommand)'
|
||||||
+4
-5
@@ -3,7 +3,7 @@
|
|||||||
function __ov_debug
|
function __ov_debug
|
||||||
set -l file "$BASH_COMP_DEBUG_FILE"
|
set -l file "$BASH_COMP_DEBUG_FILE"
|
||||||
if test -n "$file"
|
if test -n "$file"
|
||||||
echo "$argv" >> $file
|
echo "$argv" >>$file
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -108,7 +108,6 @@ function __ov_requires_order_preservation
|
|||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# This function does two things:
|
# This function does two things:
|
||||||
# - Obtain the completions and store them in the global __ov_comp_results
|
# - Obtain the completions and store them in the global __ov_comp_results
|
||||||
# - Return false if file completion should be performed
|
# - Return false if file completion should be performed
|
||||||
@@ -215,18 +214,18 @@ end
|
|||||||
# so we can properly delete any completions provided by another script.
|
# so we can properly delete any completions provided by another script.
|
||||||
# Only do this if the program can be found, or else fish may print some errors; besides,
|
# Only do this if the program can be found, or else fish may print some errors; besides,
|
||||||
# the existing completions will only be loaded if the program can be found.
|
# the existing completions will only be loaded if the program can be found.
|
||||||
if type -q "ov"
|
if type -q ov
|
||||||
# The space after the program name is essential to trigger completion for the program
|
# The space after the program name is essential to trigger completion for the program
|
||||||
# and not completion of the program name itself.
|
# and not completion of the program name itself.
|
||||||
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
|
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
|
||||||
complete --do-complete "ov " > /dev/null 2>&1
|
complete --do-complete "ov " >/dev/null 2>&1
|
||||||
end
|
end
|
||||||
|
|
||||||
# Remove any pre-existing completions for the program since we will be handling all of them.
|
# Remove any pre-existing completions for the program since we will be handling all of them.
|
||||||
complete -c ov -e
|
complete -c ov -e
|
||||||
|
|
||||||
# this will get called after the two calls below and clear the $__ov_perform_completion_once_result global
|
# this will get called after the two calls below and clear the $__ov_perform_completion_once_result global
|
||||||
complete -c ov -n '__ov_clear_perform_completion_once_result'
|
complete -c ov -n __ov_clear_perform_completion_once_result
|
||||||
# The call to __ov_prepare_completions will setup __ov_comp_results
|
# The call to __ov_prepare_completions will setup __ov_comp_results
|
||||||
# which provides the program's completion choices.
|
# which provides the program's completion choices.
|
||||||
# If this doesn't require order preservation, we don't use the -k flag
|
# If this doesn't require order preservation, we don't use the -k flag
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
complete --command play-media --short p --long player --description "Force a specific media player" --require-parameter
|
||||||
|
complete --command play-media --short h --long help --description "Print this help message"
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
complete -c rand_string -f
|
||||||
|
|
||||||
|
complete -c rand_string -s s -l separator -x -a 'dash underscore dot none' -d 'Set separator for following words'
|
||||||
|
complete -c rand_string -s c -l case -x -a 'lower upper title' -d 'Set casing for following words'
|
||||||
|
complete -c rand_string -s h -l help -d 'Show usage help'
|
||||||
|
|
||||||
|
# List of all available lists in data/words
|
||||||
|
set -l categories
|
||||||
|
if set -q __fish_config_dir
|
||||||
|
set categories (string replace -r '\.txt$' '' (command ls $__fish_config_dir/data/words/*.txt 2>/dev/null | command xargs -n 1 basename 2>/dev/null))
|
||||||
|
end
|
||||||
|
|
||||||
|
for cat in $categories
|
||||||
|
complete -c rand_string -a "$cat" -d "Pick a random word from the $cat list"
|
||||||
|
end
|
||||||
|
|
||||||
|
complete -c rand_string -a 'digits=' -d 'Generate N random digits (e.g. digits=3)'
|
||||||
|
complete -c rand_string -a 'literal=' -d 'Insert a literal string exactly as provided'
|
||||||
@@ -21,7 +21,7 @@ end
|
|||||||
function __tailscale_debug
|
function __tailscale_debug
|
||||||
set -l file "$BASH_COMP_DEBUG_FILE"
|
set -l file "$BASH_COMP_DEBUG_FILE"
|
||||||
if test -n "$file"
|
if test -n "$file"
|
||||||
echo "$argv" >> $file
|
echo "$argv" >>$file
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -125,7 +125,6 @@ function __tailscale_requires_order_preservation
|
|||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
# This function does two things:
|
# This function does two things:
|
||||||
# - Obtain the completions and store them in the global __tailscale_comp_results
|
# - Obtain the completions and store them in the global __tailscale_comp_results
|
||||||
# - Return false if file completion should be performed
|
# - Return false if file completion should be performed
|
||||||
@@ -228,22 +227,21 @@ function __tailscale_prepare_completions
|
|||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves
|
# REMOVED (2026-09-07): Cobra's self-priming block —
|
||||||
# so we can properly delete any completions provided by another script.
|
# if type -q "tailscale"; complete --do-complete "tailscale " >/dev/null 2>&1; end
|
||||||
# Only do this if the program can be found, or else fish may print some errors; besides,
|
# It existed to force any pre-existing tailscale completions to load so the
|
||||||
# the existing completions will only be loaded if the program can be found.
|
# `complete -c tailscale -e` below could erase them. From completions/ it has
|
||||||
if type -q "tailscale"
|
# no job: fish autoloads only the FIRST match on $fish_complete_path, and
|
||||||
# The space after the program name is essential to trigger completion for the program
|
# $__fish_config_dir/completions precedes /usr/share/fish/vendor_completions.d,
|
||||||
# and not completion of the program name itself.
|
# so the vendor file is never sourced and there is nothing to erase. It also
|
||||||
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
|
# executed the tailscale binary at startup. Verified: completion output is
|
||||||
complete --do-complete "tailscale " > /dev/null 2>&1
|
# byte-identical with and without it.
|
||||||
end
|
|
||||||
|
|
||||||
# Remove any pre-existing completions for the program since we will be handling all of them.
|
# Remove any pre-existing completions for the program since we will be handling all of them.
|
||||||
complete -c tailscale -e
|
complete -c tailscale -e
|
||||||
|
|
||||||
# this will get called after the two calls below and clear the $__tailscale_perform_completion_once_result global
|
# this will get called after the two calls below and clear the $__tailscale_perform_completion_once_result global
|
||||||
complete -c tailscale -n '__tailscale_clear_perform_completion_once_result'
|
complete -c tailscale -n __tailscale_clear_perform_completion_once_result
|
||||||
# The call to __tailscale_prepare_completions will setup __tailscale_comp_results
|
# The call to __tailscale_prepare_completions will setup __tailscale_comp_results
|
||||||
# which provides the program's completion choices.
|
# which provides the program's completion choices.
|
||||||
# If this doesn't require order preservation, we don't use the -k flag
|
# If this doesn't require order preservation, we don't use the -k flag
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
#
|
||||||
|
# GENERATED FILE --- do not edit by hand.
|
||||||
|
# Regenerate with __fish_config_op_registry_rebuild after editing a
|
||||||
|
# # COMPONENT header, or automatically via docs/build-manual.py.
|
||||||
|
# Source: docs/generate_component_registry.py
|
||||||
|
#
|
||||||
|
# This file must be sourced before any other conf.d/*.fish file that
|
||||||
|
# calls the opinionated guard. That currently holds only because fish's
|
||||||
|
# glob-based conf.d loading happens to sort this filename first
|
||||||
|
# alphabetically among the guard-calling files -- do not rename it
|
||||||
|
# without preserving that ordering.
|
||||||
|
|
||||||
|
set -g __fish_config_op_registry_keys \
|
||||||
|
"__auto_source_fallback_venv:" \
|
||||||
|
"__fish_config_sync_logging:" \
|
||||||
|
"__fish_user_dots_link:" \
|
||||||
|
"_zellij_dump_log:" \
|
||||||
|
"abbr:abbr-integrations" \
|
||||||
|
"abbr:abbr-overrides" \
|
||||||
|
"agy:" \
|
||||||
|
"auto-pull:" \
|
||||||
|
"autopair:" \
|
||||||
|
"bash:" \
|
||||||
|
"bash_expands:" \
|
||||||
|
"cat:" \
|
||||||
|
"claude:" \
|
||||||
|
"config:cachyos-strip-aliases" \
|
||||||
|
"config:cachyos-strip-overrides" \
|
||||||
|
"config:cachyos-tricks" \
|
||||||
|
"config:cdpath" \
|
||||||
|
"config:exit-wiring" \
|
||||||
|
"config:greeting-stamp" \
|
||||||
|
"config:pager-editor-gpg" \
|
||||||
|
"config:path-setup" \
|
||||||
|
"config:privacy" \
|
||||||
|
"config:vi-mode" \
|
||||||
|
"done:" \
|
||||||
|
"du:" \
|
||||||
|
"edit:" \
|
||||||
|
"first_run:first-run-bootstrap" \
|
||||||
|
"first_run:first-run-greeting" \
|
||||||
|
"fish_right_prompt:" \
|
||||||
|
"help:" \
|
||||||
|
"hist:" \
|
||||||
|
"key_bindings:" \
|
||||||
|
"kitty-logging:" \
|
||||||
|
"kitty-watcher-reminder:" \
|
||||||
|
"less:" \
|
||||||
|
"logs:" \
|
||||||
|
"ls:" \
|
||||||
|
"mkdir:" \
|
||||||
|
"mv:" \
|
||||||
|
"paru-wrapper:paru-autoexec" \
|
||||||
|
"paru-wrapper:paru-logging" \
|
||||||
|
"ping:" \
|
||||||
|
"puffer:" \
|
||||||
|
"rg:" \
|
||||||
|
"rm:" \
|
||||||
|
"smart_exit:exit-plain" \
|
||||||
|
"smart_exit:logging-guard" \
|
||||||
|
"split:" \
|
||||||
|
"spwin:" \
|
||||||
|
"ssh:" \
|
||||||
|
"starship:" \
|
||||||
|
"tab:" \
|
||||||
|
"theme:" \
|
||||||
|
"tmux-logging:" \
|
||||||
|
"top:" \
|
||||||
|
"tricks:aliases-tricks" \
|
||||||
|
"tricks:tricks-bang" \
|
||||||
|
"tricks:tricks-manpager" \
|
||||||
|
"upgrade:" \
|
||||||
|
"wakatime:wakatime-autoexec" \
|
||||||
|
"wakatime:wakatime-hook" \
|
||||||
|
"yay-wrapper:yay-autoexec" \
|
||||||
|
"yay-wrapper:yay-logging" \
|
||||||
|
"yt-dlp:" \
|
||||||
|
"zoxide:"
|
||||||
|
|
||||||
|
set -g __fish_config_op_registry_values \
|
||||||
|
autoexec/venv \
|
||||||
|
logging/terminal-capture \
|
||||||
|
autoexec/sync \
|
||||||
|
logging/multiplexer-capture \
|
||||||
|
integrations/terminal-abbrs \
|
||||||
|
overrides/key-bindings \
|
||||||
|
aliases/dev-tools \
|
||||||
|
autoexec/sync \
|
||||||
|
overrides/key-bindings \
|
||||||
|
aliases/shell-tools \
|
||||||
|
overrides/key-bindings \
|
||||||
|
aliases/filesystem \
|
||||||
|
aliases/dev-tools \
|
||||||
|
aliases/filesystem \
|
||||||
|
overrides/key-bindings \
|
||||||
|
overrides/environment \
|
||||||
|
overrides/environment \
|
||||||
|
overrides/key-bindings \
|
||||||
|
greeting/greeting-message \
|
||||||
|
overrides/environment \
|
||||||
|
overrides/environment \
|
||||||
|
overrides/privacy \
|
||||||
|
overrides/key-bindings \
|
||||||
|
integrations/notifications \
|
||||||
|
aliases/filesystem \
|
||||||
|
aliases/dev-tools \
|
||||||
|
autoexec/plugin-management \
|
||||||
|
greeting/first-run \
|
||||||
|
overrides/prompt \
|
||||||
|
aliases/shell-tools \
|
||||||
|
integrations/history-logs \
|
||||||
|
overrides/key-bindings \
|
||||||
|
logging/terminal-capture \
|
||||||
|
logging/terminal-capture \
|
||||||
|
aliases/shell-tools \
|
||||||
|
integrations/history-logs \
|
||||||
|
aliases/filesystem \
|
||||||
|
aliases/filesystem \
|
||||||
|
aliases/filesystem \
|
||||||
|
autoexec/pkg-wrappers \
|
||||||
|
logging/pkg-logs \
|
||||||
|
aliases/network \
|
||||||
|
overrides/key-bindings \
|
||||||
|
aliases/search \
|
||||||
|
aliases/filesystem \
|
||||||
|
overrides/key-bindings \
|
||||||
|
logging/terminal-capture \
|
||||||
|
integrations/window-mgmt \
|
||||||
|
integrations/window-mgmt \
|
||||||
|
aliases/network \
|
||||||
|
overrides/prompt \
|
||||||
|
integrations/window-mgmt \
|
||||||
|
overrides/prompt \
|
||||||
|
logging/multiplexer-capture \
|
||||||
|
aliases/monitor \
|
||||||
|
aliases/filesystem \
|
||||||
|
overrides/key-bindings \
|
||||||
|
overrides/environment \
|
||||||
|
integrations/pkg-upgrade \
|
||||||
|
autoexec/telemetry \
|
||||||
|
integrations/notifications \
|
||||||
|
autoexec/pkg-wrappers \
|
||||||
|
logging/pkg-logs \
|
||||||
|
aliases/network \
|
||||||
|
aliases/filesystem
|
||||||
+380
-5
@@ -8,82 +8,175 @@
|
|||||||
# This file contains all the abbreviations for the terminal.
|
# This file contains all the abbreviations for the terminal.
|
||||||
# It is sourced by Fish on startup.
|
# It is sourced by Fish on startup.
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# site abbr-integrations: integrations/terminal-abbrs
|
||||||
|
# site abbr-overrides: overrides/key-bindings
|
||||||
|
|
||||||
|
# Abbreviations only expand in the line editor; a script can never use one.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
# Neovim
|
# Neovim
|
||||||
|
# @category Editors
|
||||||
|
# @desc nvim
|
||||||
abbr -a n nvim
|
abbr -a n nvim
|
||||||
|
# @category Editors
|
||||||
|
# @desc nvim
|
||||||
abbr -a nv nvim
|
abbr -a nv nvim
|
||||||
|
# @category Editors
|
||||||
|
# @desc nvim
|
||||||
abbr -a neovim nvim
|
abbr -a neovim nvim
|
||||||
|
# @category Editors
|
||||||
|
# @desc cd ~/.config/nvim
|
||||||
abbr -a cdnv 'cd ~/.config/nvim # Neovim Config'
|
abbr -a cdnv 'cd ~/.config/nvim # Neovim Config'
|
||||||
|
# @category Editors
|
||||||
|
# @desc cd ~/.config/nvim; nvim
|
||||||
abbr -a cdnvn 'cd ~/.config/nvim;nvim'
|
abbr -a cdnvn 'cd ~/.config/nvim;nvim'
|
||||||
# VSCode
|
# VSCode
|
||||||
|
# @category AI Assistants
|
||||||
|
# @desc antigravity-ide
|
||||||
abbr -a v antigravity-ide
|
abbr -a v antigravity-ide
|
||||||
# Kate
|
# Kate
|
||||||
|
# @category Editors
|
||||||
|
# @desc kate
|
||||||
abbr -a k kate
|
abbr -a k kate
|
||||||
# WezTerm SSH
|
# WezTerm SSH
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category AI Assistants
|
||||||
|
# @desc wezterm ssh (WezTerm only)
|
||||||
abbr -a s wezterm ssh
|
abbr -a s wezterm ssh
|
||||||
end
|
end
|
||||||
# Neovim in a new tab
|
# Neovim in a new tab
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Open new tab with nvim (terminal-aware)
|
||||||
abbr -a editt kitty @ launch --type=tab --cwd=current nvim # Kitty
|
abbr -a editt kitty @ launch --type=tab --cwd=current nvim # Kitty
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Open new tab with nvim (terminal-aware)
|
||||||
abbr -a editt wezterm cli spawn nvim # WezTerm
|
abbr -a editt wezterm cli spawn nvim # WezTerm
|
||||||
end
|
end
|
||||||
# LazyGit
|
# LazyGit
|
||||||
|
# @category Git
|
||||||
|
# @desc lazygit
|
||||||
abbr -a lg lazygit
|
abbr -a lg lazygit
|
||||||
# Sudo shell
|
# Sudo shell
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc sudo -s
|
||||||
abbr -a sudu sudo -s
|
abbr -a sudu sudo -s
|
||||||
# Kitty
|
# Kitty
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc kitty (Kitty only)
|
||||||
abbr -a kt kitty
|
abbr -a kt kitty
|
||||||
end
|
end
|
||||||
# cat
|
# cat
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc cat
|
||||||
abbr -a c cat
|
abbr -a c cat
|
||||||
# chezmoi
|
# chezmoi
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi
|
||||||
abbr -a cm chezmoi
|
abbr -a cm chezmoi
|
||||||
# chezmoi cd
|
# chezmoi cd
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi cd
|
||||||
abbr -a cmcd chezmoi cd
|
abbr -a cmcd chezmoi cd
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi cd
|
||||||
abbr -a czcd chezmoi cd
|
abbr -a czcd chezmoi cd
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi cd
|
||||||
abbr -a cdcm chezmoi cd
|
abbr -a cdcm chezmoi cd
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi cd
|
||||||
abbr -a cdcz chezmoi cd
|
abbr -a cdcz chezmoi cd
|
||||||
# chezmoi edit
|
# chezmoi edit
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi edit
|
||||||
abbr -a cme chezmoi edit
|
abbr -a cme chezmoi edit
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi edit
|
||||||
abbr -a cze chezmoi edit
|
abbr -a cze chezmoi edit
|
||||||
# chezmoi add
|
# chezmoi add
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi add
|
||||||
abbr -a cmad chezmoi add
|
abbr -a cmad chezmoi add
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi add
|
||||||
abbr -a czad chezmoi add
|
abbr -a czad chezmoi add
|
||||||
# chezmoi apply
|
# chezmoi apply
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi apply
|
||||||
abbr -a cmap chezmoi apply
|
abbr -a cmap chezmoi apply
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi apply
|
||||||
abbr -a czap chezmoi apply
|
abbr -a czap chezmoi apply
|
||||||
# chezmoi rm
|
# chezmoi rm
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi forget
|
||||||
abbr -a cmrm chezmoi forget
|
abbr -a cmrm chezmoi forget
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi forget
|
||||||
abbr -a cmf chezmoi forget
|
abbr -a cmf chezmoi forget
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi forget
|
||||||
abbr -a czrm chezmoi forget
|
abbr -a czrm chezmoi forget
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi forget
|
||||||
abbr -a czf chezmoi forget
|
abbr -a czf chezmoi forget
|
||||||
# chezmoi init
|
# chezmoi init
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi init
|
||||||
abbr -a cmi chezmoi init
|
abbr -a cmi chezmoi init
|
||||||
|
# @category Chezmoi
|
||||||
|
# @desc chezmoi init
|
||||||
abbr -a czi chezmoi init
|
abbr -a czi chezmoi init
|
||||||
# Edit
|
# Edit
|
||||||
|
# @category Editors
|
||||||
|
# @desc edit
|
||||||
abbr -a e edit
|
abbr -a e edit
|
||||||
# Sudoedit
|
# Sudoedit
|
||||||
|
# @category Editors
|
||||||
|
# @desc sudoedit
|
||||||
abbr -a se sudoedit
|
abbr -a se sudoedit
|
||||||
# Git
|
# Git
|
||||||
|
# @category Git
|
||||||
|
# @desc git
|
||||||
abbr -a g git
|
abbr -a g git
|
||||||
|
# @category Git
|
||||||
|
# @desc generate .gitignore
|
||||||
abbr -a gitig gi
|
abbr -a gitig gi
|
||||||
|
# @category Git
|
||||||
|
# @desc generate .gitignore
|
||||||
abbr -a git-ignore gi
|
abbr -a git-ignore gi
|
||||||
# Antigravity
|
# Antigravity
|
||||||
abbr -a ag antigravity
|
# @category AI Assistants
|
||||||
abbr -a ag. antigravity .
|
# @desc agy
|
||||||
|
abbr -a ag agy
|
||||||
|
# @category AI Assistants
|
||||||
|
# @desc agy .
|
||||||
|
abbr -a ag. agy .
|
||||||
# Quit
|
# Quit
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc exit
|
||||||
abbr -a /exit exit
|
abbr -a /exit exit
|
||||||
# Window-management abbreviations are opinionated (C4 integrations)
|
# Window-management abbreviations are opinionated (C4 integrations)
|
||||||
if __fish_config_op_enabled __fish_config_op_integrations
|
if __fish_config_op_enabled (status basename) abbr-integrations
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Close current pane/window
|
||||||
abbr -a :q kitty @ close-window # Kitty (Closes the active split/pane)
|
abbr -a :q kitty @ close-window # Kitty (Closes the active split/pane)
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Close current tab
|
||||||
abbr -a :Q kitty @ close-tab # Kitty (Closes the whole tab)
|
abbr -a :Q kitty @ close-tab # Kitty (Closes the whole tab)
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Close current pane/window
|
||||||
abbr -a :q wezterm cli kill-pane # WezTerm
|
abbr -a :q wezterm cli kill-pane # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Close current tab
|
||||||
abbr -a :Q wezterm cli kill-pane # WezTerm
|
abbr -a :Q wezterm cli kill-pane # WezTerm
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -91,236 +184,518 @@ end
|
|||||||
######### Alternates ##########
|
######### Alternates ##########
|
||||||
### ls alternates
|
### ls alternates
|
||||||
# List all files
|
# List all files
|
||||||
|
# @category Navigation and Listing
|
||||||
|
# @desc ls
|
||||||
abbr -a l ls
|
abbr -a l ls
|
||||||
# List all files by size
|
# List all files by size
|
||||||
|
# @category Navigation and Listing
|
||||||
|
# @desc lss (sort by size)
|
||||||
abbr -a lS lss
|
abbr -a lS lss
|
||||||
# List all files by reverse modified time
|
# List all files by reverse modified time
|
||||||
|
# @category Navigation and Listing
|
||||||
|
# @desc lsr (sort by time, oldest first)
|
||||||
abbr -a lsR lsr
|
abbr -a lsR lsr
|
||||||
# List by extension
|
# List by extension
|
||||||
|
# @category Navigation and Listing
|
||||||
|
# @desc lx (sort by extension)
|
||||||
abbr -a lX lx
|
abbr -a lX lx
|
||||||
# Tree listing (depth 2)
|
# Tree listing (depth 2)
|
||||||
|
# @category Navigation and Listing
|
||||||
|
# @desc lt (tree, depth 2)
|
||||||
abbr -a lT lt
|
abbr -a lT lt
|
||||||
# Full tree listing
|
# Full tree listing
|
||||||
|
# @category Navigation and Listing
|
||||||
|
# @desc lstree (full recursive tree)
|
||||||
abbr -a lsT lstree
|
abbr -a lsT lstree
|
||||||
### speed-test alternates
|
### speed-test alternates
|
||||||
# Speedtest using fast.com
|
# Speedtest using fast.com
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc fast-cli
|
||||||
abbr -a speedtest-fast fast-cli
|
abbr -a speedtest-fast fast-cli
|
||||||
|
|
||||||
# Kitty/WezTerm window-management abbreviations are opinionated (C4
|
# Kitty/WezTerm window-management abbreviations are opinionated (C4
|
||||||
# integrations): they assume an active Kitty or WezTerm session.
|
# integrations): they assume an active Kitty or WezTerm session.
|
||||||
if __fish_config_op_enabled __fish_config_op_integrations
|
if __fish_config_op_enabled (status basename) abbr-integrations
|
||||||
# Window Creation (OS Windows)
|
# Window Creation (OS Windows)
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window
|
||||||
abbr -a :w kitty @ launch --type=os-window # Kitty
|
abbr -a :w kitty @ launch --type=os-window # Kitty
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window
|
||||||
abbr -a :w wezterm cli spawn --new-window # WezTerm
|
abbr -a :w wezterm cli spawn --new-window # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Window Splits (Panes)
|
# Window Splits (Panes)
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split pane horizontally (new pane below)
|
||||||
abbr -a :wv kitty @ launch --location=hsplit # Kitty (Horizontal split)
|
abbr -a :wv kitty @ launch --location=hsplit # Kitty (Horizontal split)
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split pane vertically (new pane to the right)
|
||||||
abbr -a :wh kitty @ launch --location=vsplit # Kitty (Vertical split)
|
abbr -a :wh kitty @ launch --location=vsplit # Kitty (Vertical split)
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split pane horizontally (new pane below)
|
||||||
abbr -a :wv wezterm cli split-pane --bottom # WezTerm
|
abbr -a :wv wezterm cli split-pane --bottom # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split pane vertically (new pane to the right)
|
||||||
abbr -a :wh wezterm cli split-pane --right # WezTerm
|
abbr -a :wh wezterm cli split-pane --right # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Window Detach (Move Pane)
|
# Window Detach (Move Pane)
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Detach current window to its own OS window
|
||||||
abbr -a :wo kitty @ detach-window --target-tab=new # Kitty (Moves pane to new tab)
|
abbr -a :wo kitty @ detach-window --target-tab=new # Kitty (Moves pane to new tab)
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Move current pane to a new tab
|
||||||
abbr -a :wot kitty @ detach-window # Kitty (Same as above, default behavior)
|
abbr -a :wot kitty @ detach-window # Kitty (Same as above, default behavior)
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Detach current window to its own OS window
|
||||||
abbr -a :wo wezterm cli move-pane-to-new-tab --new-window # WezTerm
|
abbr -a :wo wezterm cli move-pane-to-new-tab --new-window # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Move current pane to a new tab
|
||||||
abbr -a :wot wezterm cli move-pane-to-new-tab # WezTerm
|
abbr -a :wot wezterm cli move-pane-to-new-tab # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Tab Creation
|
# Tab Creation
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab
|
||||||
abbr -a :t kitty @ launch --type=tab # Kitty
|
abbr -a :t kitty @ launch --type=tab # Kitty
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab
|
||||||
abbr -a :t wezterm cli spawn # WezTerm
|
abbr -a :t wezterm cli spawn # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Rename Tab
|
# Rename Tab
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Set tab title
|
||||||
abbr -a :tl "kitty @ set-tab-title" # Kitty -> Usage: :tl "New Title"
|
abbr -a :tl "kitty @ set-tab-title" # Kitty -> Usage: :tl "New Title"
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Set tab title
|
||||||
abbr -a :tl wezterm cli set-tab-title # WezTerm
|
abbr -a :tl wezterm cli set-tab-title # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Rename Window
|
# Rename Window
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Set window title
|
||||||
abbr -a :tw "kitty @ set-window-title" # Kitty
|
abbr -a :tw "kitty @ set-window-title" # Kitty
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Set window title
|
||||||
abbr -a :tw wezterm cli set-window-title # WezTerm
|
abbr -a :tw wezterm cli set-window-title # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Rename Workspace
|
# Rename Workspace
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Rename workspace (WezTerm only)
|
||||||
abbr -a :twk wezterm cli rename-workspace # WezTerm
|
abbr -a :twk wezterm cli rename-workspace # WezTerm
|
||||||
end
|
end
|
||||||
# Kitty does not have a direct CLI equivalent for renaming a dynamic "workspace" session.
|
# Kitty does not have a direct CLI equivalent for renaming a dynamic "workspace" session.
|
||||||
|
|
||||||
# Tab Navigation
|
# Tab Navigation
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Focus previous tab
|
||||||
abbr -a :tp "kitty @ focus-tab --match neighbor:left" # Kitty
|
abbr -a :tp "kitty @ focus-tab --match neighbor:left" # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Focus next tab
|
||||||
abbr -a :tn "kitty @ focus-tab --match neighbor:right" # Kitty
|
abbr -a :tn "kitty @ focus-tab --match neighbor:right" # Kitty
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Focus previous tab
|
||||||
abbr -a :tp wezterm cli activate-tab --tab-relative -1 # WezTerm
|
abbr -a :tp wezterm cli activate-tab --tab-relative -1 # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Focus next tab
|
||||||
abbr -a :tn wezterm cli activate-tab --tab-relative 1 # WezTerm
|
abbr -a :tn wezterm cli activate-tab --tab-relative 1 # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Specialty Tab Shortcuts (New Tab in specific dir)
|
# Specialty Tab Shortcuts (New Tab in specific dir)
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/kitty
|
||||||
abbr -a :tgk kitty @ launch --type=tab --cwd ~/.config/kitty # Kitty
|
abbr -a :tgk kitty @ launch --type=tab --cwd ~/.config/kitty # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/nvim
|
||||||
abbr -a :tgn kitty @ launch --type=tab --cwd ~/.config/nvim # Kitty
|
abbr -a :tgn kitty @ launch --type=tab --cwd ~/.config/nvim # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/fish
|
||||||
abbr -a :tgf kitty @ launch --type=tab --cwd ~/.config/fish # Kitty
|
abbr -a :tgf kitty @ launch --type=tab --cwd ~/.config/fish # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~
|
||||||
abbr -a :tgh kitty @ launch --type=tab --cwd ~
|
abbr -a :tgh kitty @ launch --type=tab --cwd ~
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.local/share/chezmoi
|
||||||
abbr -a :tgcz kitty @ launch --type=tab --cwd ~/.local/share/chezmoi # Kitty
|
abbr -a :tgcz kitty @ launch --type=tab --cwd ~/.local/share/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/chezmoi
|
||||||
abbr -a :tgcm kitty @ launch --type=tab --cwd ~/.config/chezmoi # Kitty
|
abbr -a :tgcm kitty @ launch --type=tab --cwd ~/.config/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/projects
|
||||||
abbr -a :tgp kitty @ launch --type=tab --cwd ~/projects # Kitty
|
abbr -a :tgp kitty @ launch --type=tab --cwd ~/projects # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at / (root)
|
||||||
abbr -a :tgr kitty @ launch --type=tab -- sudo -i
|
abbr -a :tgr kitty @ launch --type=tab -- sudo -i
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/kitty
|
||||||
abbr -a :tgk wezterm cli spawn --cwd ~/.config/kitty # WezTerm
|
abbr -a :tgk wezterm cli spawn --cwd ~/.config/kitty # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/nvim
|
||||||
abbr -a :tgn wezterm cli spawn --cwd ~/.config/nvim # WezTerm
|
abbr -a :tgn wezterm cli spawn --cwd ~/.config/nvim # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/fish
|
||||||
abbr -a :tgf wezterm cli spawn --cwd ~/.config/fish # WezTerm
|
abbr -a :tgf wezterm cli spawn --cwd ~/.config/fish # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~
|
||||||
abbr -a :tgh wezterm cli spawn --cwd ~ # WezTerm
|
abbr -a :tgh wezterm cli spawn --cwd ~ # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.local/share/chezmoi
|
||||||
abbr -a :tgcz wezterm cli spawn --cwd ~/.local/share/chezmoi # WezTerm
|
abbr -a :tgcz wezterm cli spawn --cwd ~/.local/share/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/.config/chezmoi
|
||||||
abbr -a :tgcm wezterm cli spawn --cwd ~/.config/chezmoi # WezTerm
|
abbr -a :tgcm wezterm cli spawn --cwd ~/.config/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at ~/projects
|
||||||
abbr -a :tgp wezterm cli spawn --cwd ~/projects # WezTerm
|
abbr -a :tgp wezterm cli spawn --cwd ~/projects # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New tab at / (root)
|
||||||
abbr -a :tgr wezterm cli spawn -- sudo -i # WezTerm
|
abbr -a :tgr wezterm cli spawn -- sudo -i # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Specialty Window Shortcuts (New OS Window in specific dir)
|
# Specialty Window Shortcuts (New OS Window in specific dir)
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/kitty
|
||||||
abbr -a :wgk kitty @ launch --type=os-window --cwd ~/.config/kitty # Kitty
|
abbr -a :wgk kitty @ launch --type=os-window --cwd ~/.config/kitty # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/nvim
|
||||||
abbr -a :wgn kitty @ launch --type=os-window --cwd ~/.config/nvim # Kitty
|
abbr -a :wgn kitty @ launch --type=os-window --cwd ~/.config/nvim # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/fish
|
||||||
abbr -a :wgf kitty @ launch --type=os-window --cwd ~/.config/fish # Kitty
|
abbr -a :wgf kitty @ launch --type=os-window --cwd ~/.config/fish # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~
|
||||||
abbr -a :wgh kitty @ launch --type=os-window --cwd ~
|
abbr -a :wgh kitty @ launch --type=os-window --cwd ~
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.local/share/chezmoi
|
||||||
abbr -a :wgzd kitty @ launch --type=os-window --cwd ~/.local/share/chezmoi # Kitty
|
abbr -a :wgzd kitty @ launch --type=os-window --cwd ~/.local/share/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/chezmoi
|
||||||
abbr -a :wgcz kitty @ launch --type=os-window --cwd ~/.config/chezmoi # Kitty
|
abbr -a :wgcz kitty @ launch --type=os-window --cwd ~/.config/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/projects
|
||||||
abbr -a :wgp kitty @ launch --type=os-window --cwd ~/projects # Kitty
|
abbr -a :wgp kitty @ launch --type=os-window --cwd ~/projects # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at / (root)
|
||||||
abbr -a :wgr kitty @ launch --type=os-window -- sudo -i # Kitty
|
abbr -a :wgr kitty @ launch --type=os-window -- sudo -i # Kitty
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/kitty
|
||||||
abbr -a :wgk wezterm cli spawn --new-window --cwd ~/.config/kitty # WezTerm
|
abbr -a :wgk wezterm cli spawn --new-window --cwd ~/.config/kitty # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/nvim
|
||||||
abbr -a :wgn wezterm cli spawn --new-window --cwd ~/.config/nvim # WezTerm
|
abbr -a :wgn wezterm cli spawn --new-window --cwd ~/.config/nvim # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/fish
|
||||||
abbr -a :wgf wezterm cli spawn --new-window --cwd ~/.config/fish # WezTerm
|
abbr -a :wgf wezterm cli spawn --new-window --cwd ~/.config/fish # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~
|
||||||
abbr -a :wgh wezterm cli spawn --new-window --cwd ~ # WezTerm
|
abbr -a :wgh wezterm cli spawn --new-window --cwd ~ # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.local/share/chezmoi
|
||||||
abbr -a :wgzd wezterm cli spawn --new-window --cwd ~/.local/share/chezmoi # WezTerm
|
abbr -a :wgzd wezterm cli spawn --new-window --cwd ~/.local/share/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/.config/chezmoi
|
||||||
abbr -a :wgcz wezterm cli spawn --new-window --cwd ~/.config/chezmoi # WezTerm
|
abbr -a :wgcz wezterm cli spawn --new-window --cwd ~/.config/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at ~/projects
|
||||||
abbr -a :wgp wezterm cli spawn --new-window --cwd ~/projects # WezTerm
|
abbr -a :wgp wezterm cli spawn --new-window --cwd ~/projects # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc New OS window at / (root)
|
||||||
abbr -a :wgr wezterm cli spawn --new-window -- sudo -i # WezTerm
|
abbr -a :wgr wezterm cli spawn --new-window -- sudo -i # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Specialty Window Vertical Shortcuts (Split Bottom)
|
# Specialty Window Vertical Shortcuts (Split Bottom)
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/kitty
|
||||||
abbr -a :wvgk kitty @ launch --location=hsplit --cwd ~/.config/kitty # Kitty
|
abbr -a :wvgk kitty @ launch --location=hsplit --cwd ~/.config/kitty # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/nvim
|
||||||
abbr -a :wvgn kitty @ launch --location=hsplit --cwd ~/.config/nvim # Kitty
|
abbr -a :wvgn kitty @ launch --location=hsplit --cwd ~/.config/nvim # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/fish
|
||||||
abbr -a :wvgf kitty @ launch --location=hsplit --cwd ~/.config/fish # Kitty
|
abbr -a :wvgf kitty @ launch --location=hsplit --cwd ~/.config/fish # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~
|
||||||
abbr -a :wvgh kitty @ launch --location=hsplit --cwd ~ # Kitty
|
abbr -a :wvgh kitty @ launch --location=hsplit --cwd ~ # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.local/share/chezmoi
|
||||||
abbr -a :wvgcz kitty @ launch --location=hsplit --cwd ~/.local/share/chezmoi # Kitty
|
abbr -a :wvgcz kitty @ launch --location=hsplit --cwd ~/.local/share/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/chezmoi
|
||||||
abbr -a :wvgcm kitty @ launch --location=hsplit --cwd ~/.config/chezmoi # Kitty
|
abbr -a :wvgcm kitty @ launch --location=hsplit --cwd ~/.config/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/projects
|
||||||
abbr -a :wvgp kitty @ launch --location=hsplit --cwd ~/projects # Kitty
|
abbr -a :wvgp kitty @ launch --location=hsplit --cwd ~/projects # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at / (root)
|
||||||
abbr -a :wvgr kitty @ launch --location=hsplit -- sudo -i # Kitty
|
abbr -a :wvgr kitty @ launch --location=hsplit -- sudo -i # Kitty
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/kitty
|
||||||
abbr -a :wvgk wezterm cli split-pane --bottom --cwd ~/.config/kitty # WezTerm
|
abbr -a :wvgk wezterm cli split-pane --bottom --cwd ~/.config/kitty # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/nvim
|
||||||
abbr -a :wvgn wezterm cli split-pane --bottom --cwd ~/.config/nvim # WezTerm
|
abbr -a :wvgn wezterm cli split-pane --bottom --cwd ~/.config/nvim # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/fish
|
||||||
abbr -a :wvgf wezterm cli split-pane --bottom --cwd ~/.config/fish # WezTerm
|
abbr -a :wvgf wezterm cli split-pane --bottom --cwd ~/.config/fish # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~
|
||||||
abbr -a :wvgh wezterm cli split-pane --bottom --cwd ~ # WezTerm
|
abbr -a :wvgh wezterm cli split-pane --bottom --cwd ~ # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.local/share/chezmoi
|
||||||
abbr -a :wvgcz wezterm cli split-pane --bottom --cwd ~/.local/share/chezmoi # WezTerm
|
abbr -a :wvgcz wezterm cli split-pane --bottom --cwd ~/.local/share/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/.config/chezmoi
|
||||||
abbr -a :wvgcm wezterm cli split-pane --bottom --cwd ~/.config/chezmoi # WezTerm
|
abbr -a :wvgcm wezterm cli split-pane --bottom --cwd ~/.config/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at ~/projects
|
||||||
abbr -a :wvgp wezterm cli split-pane --bottom --cwd ~/projects # WezTerm
|
abbr -a :wvgp wezterm cli split-pane --bottom --cwd ~/projects # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split bottom at / (root)
|
||||||
abbr -a :wvgr wezterm cli split-pane --bottom -- sudo -i # WezTerm
|
abbr -a :wvgr wezterm cli split-pane --bottom -- sudo -i # WezTerm
|
||||||
end
|
end
|
||||||
|
|
||||||
# Specialty Window Horizontal Shortcuts (Split Right)
|
# Specialty Window Horizontal Shortcuts (Split Right)
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/kitty
|
||||||
abbr -a :whgk kitty @ launch --location=vsplit --cwd ~/.config/kitty # Kitty
|
abbr -a :whgk kitty @ launch --location=vsplit --cwd ~/.config/kitty # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/nvim
|
||||||
abbr -a :whgn kitty @ launch --location=vsplit --cwd ~/.config/nvim # Kitty
|
abbr -a :whgn kitty @ launch --location=vsplit --cwd ~/.config/nvim # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/fish
|
||||||
abbr -a :whgf kitty @ launch --location=vsplit --cwd ~/.config/fish # Kitty
|
abbr -a :whgf kitty @ launch --location=vsplit --cwd ~/.config/fish # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~
|
||||||
abbr -a :whgh kitty @ launch --location=vsplit --cwd ~ # Kitty
|
abbr -a :whgh kitty @ launch --location=vsplit --cwd ~ # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.local/share/chezmoi
|
||||||
abbr -a :whgcz kitty @ launch --location=vsplit --cwd ~/.local/share/chezmoi # Kitty
|
abbr -a :whgcz kitty @ launch --location=vsplit --cwd ~/.local/share/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/chezmoi
|
||||||
abbr -a :whgcm kitty @ launch --location=vsplit --cwd ~/.config/chezmoi # Kitty
|
abbr -a :whgcm kitty @ launch --location=vsplit --cwd ~/.config/chezmoi # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/projects
|
||||||
abbr -a :whgp kitty @ launch --location=vsplit --cwd ~/projects # Kitty
|
abbr -a :whgp kitty @ launch --location=vsplit --cwd ~/projects # Kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at / (root)
|
||||||
abbr -a :whgr kitty @ launch --location=vsplit --cwd current sudo -i # Kitty -> Specialty cd Shortcuts
|
abbr -a :whgr kitty @ launch --location=vsplit --cwd current sudo -i # Kitty -> Specialty cd Shortcuts
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/kitty
|
||||||
abbr -a :cdk 'cd ~/.config/kitty/ # Kitty Config'
|
abbr -a :cdk 'cd ~/.config/kitty/ # Kitty Config'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/kitty; nvim
|
||||||
abbr -a :cdkn 'cd ~/.config/kitty;nvim'
|
abbr -a :cdkn 'cd ~/.config/kitty;nvim'
|
||||||
end
|
end
|
||||||
if test "$TERM_PROGRAM" = WezTerm
|
if test "$TERM_PROGRAM" = WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/kitty
|
||||||
abbr -a :whgk wezterm cli split-pane --bottom --cwd ~/.config/kitty # WezTerm
|
abbr -a :whgk wezterm cli split-pane --bottom --cwd ~/.config/kitty # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/nvim
|
||||||
abbr -a :whgn wezterm cli split-pane --bottom --cwd ~/.config/nvim # WezTerm
|
abbr -a :whgn wezterm cli split-pane --bottom --cwd ~/.config/nvim # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/fish
|
||||||
abbr -a :whgf wezterm cli split-pane --bottom --cwd ~/.config/fish # WezTerm
|
abbr -a :whgf wezterm cli split-pane --bottom --cwd ~/.config/fish # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~
|
||||||
abbr -a :whgh wezterm cli split-pane --bottom --cwd ~ # WezTerm
|
abbr -a :whgh wezterm cli split-pane --bottom --cwd ~ # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.local/share/chezmoi
|
||||||
abbr -a :whgcz wezterm cli split-pane --bottom --cwd ~/.local/share/chezmoi # WezTerm
|
abbr -a :whgcz wezterm cli split-pane --bottom --cwd ~/.local/share/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/.config/chezmoi
|
||||||
abbr -a :whgcm wezterm cli split-pane --bottom --cwd ~/.config/chezmoi # WezTerm
|
abbr -a :whgcm wezterm cli split-pane --bottom --cwd ~/.config/chezmoi # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at ~/projects
|
||||||
abbr -a :whgp wezterm cli split-pane --bottom --cwd ~/projects # WezTerm
|
abbr -a :whgp wezterm cli split-pane --bottom --cwd ~/projects # WezTerm
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Split right at / (root)
|
||||||
abbr -a :whgr wezterm cli split-pane --bottom -- sudo -i # WezTerm
|
abbr -a :whgr wezterm cli split-pane --bottom -- sudo -i # WezTerm
|
||||||
end
|
end
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/nvim
|
||||||
abbr -a :cdn cd '~/.config/nvim/ # Neovim Config'
|
abbr -a :cdn cd '~/.config/nvim/ # Neovim Config'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/nvim; nvim
|
||||||
abbr -a :cdnn 'cd ~/.config/nvim;nvim'
|
abbr -a :cdnn 'cd ~/.config/nvim;nvim'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/fish
|
||||||
abbr -a :cdf 'cd ~/.config/fish/ # Fish Config'
|
abbr -a :cdf 'cd ~/.config/fish/ # Fish Config'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/fish; nvim
|
||||||
abbr -a :cdfn 'cd ~/.config/fish;nvim'
|
abbr -a :cdfn 'cd ~/.config/fish;nvim'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~
|
||||||
abbr -a :cdh 'cd ~ # Home Directory'
|
abbr -a :cdh 'cd ~ # Home Directory'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~; nvim
|
||||||
abbr -a :cdhn 'cd ~;nvim'
|
abbr -a :cdhn 'cd ~;nvim'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.local/share/chezmoi
|
||||||
abbr -a :cdcz cd '~/.local/share/chezmoi/ # Chezmoi Source'
|
abbr -a :cdcz cd '~/.local/share/chezmoi/ # Chezmoi Source'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.local/share/chezmoi; nvim
|
||||||
abbr -a :cdczn 'cd ~/.local/share/chezmoi;nvim'
|
abbr -a :cdczn 'cd ~/.local/share/chezmoi;nvim'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/chezmoi
|
||||||
abbr -a :cdcm 'cd ~/.config/chezmoi/ # Chezmoi Config'
|
abbr -a :cdcm 'cd ~/.config/chezmoi/ # Chezmoi Config'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/chezmoi; nvim
|
||||||
abbr -a :cdcmn 'cd ~/.config/chezmoi;nvim'
|
abbr -a :cdcmn 'cd ~/.config/chezmoi;nvim'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/projects/...
|
||||||
abbr -a :cdp --regex ':cdp' --set-cursor 'cd ~/projects/%'
|
abbr -a :cdp --regex ':cdp' --set-cursor 'cd ~/projects/%'
|
||||||
# abbr -a cdp_slash --position anywhere --regex ':cdp/' --set-cursor 'cd ~/projects/%'
|
# abbr -a cdp_slash --position anywhere --regex ':cdp/' --set-cursor 'cd ~/projects/%'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/projects; nvim
|
||||||
abbr -a :cdpn 'cd ~/projects;nvim'
|
abbr -a :cdpn 'cd ~/projects;nvim'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/wezterm
|
||||||
abbr -a :cdw 'cd ~/.config/wezterm/ # WezTerm Config'
|
abbr -a :cdw 'cd ~/.config/wezterm/ # WezTerm Config'
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc cd ~/.config/wezterm; nvim
|
||||||
abbr -a :cdwn 'cd ~/.config/wezterm;nvim'
|
abbr -a :cdwn 'cd ~/.config/wezterm;nvim'
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc Open new tab with nvim (terminal-aware)
|
||||||
abbr -a editt kitty @ launch --type tab nvim
|
abbr -a editt kitty @ launch --type tab nvim
|
||||||
end
|
end
|
||||||
# Spawn window
|
# Spawn window
|
||||||
if test "$TERM" = xterm-kitty
|
if test "$TERM" = xterm-kitty
|
||||||
|
# @category Terminal Windows, Tabs, and Panes
|
||||||
|
# @desc spwin (spawn new OS window)
|
||||||
abbr -a :sw spwin
|
abbr -a :sw spwin
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
### Docker ###
|
### Docker ###
|
||||||
|
# @category Docker
|
||||||
|
# @desc docker context use default
|
||||||
abbr -a dcl 'docker context use default # Local Host'
|
abbr -a dcl 'docker context use default # Local Host'
|
||||||
|
# @category Docker
|
||||||
|
# @desc ld (lazydocker)
|
||||||
abbr -a lzd ld
|
abbr -a lzd ld
|
||||||
|
# @category Docker
|
||||||
|
# @desc docker context ls
|
||||||
abbr -a dcls 'docker context ls'
|
abbr -a dcls 'docker context ls'
|
||||||
|
|
||||||
### Beads ###
|
### Beads ###
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc bd list
|
||||||
abbr -a bl 'bd list'
|
abbr -a bl 'bd list'
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc bd sync
|
||||||
abbr -a bs 'bd sync'
|
abbr -a bs 'bd sync'
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc bd create --title
|
||||||
abbr -a bC 'bd create --title'
|
abbr -a bC 'bd create --title'
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc bd show
|
||||||
abbr -a bsh 'bd show'
|
abbr -a bsh 'bd show'
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc lazybeads
|
||||||
abbr -a lb lazybeads
|
abbr -a lb lazybeads
|
||||||
|
|
||||||
### Systemctl ###
|
### Systemctl ###
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc systemctl
|
||||||
abbr -a sc systemctl
|
abbr -a sc systemctl
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc sudo systemctl
|
||||||
abbr -a ssc 'sudo systemctl'
|
abbr -a ssc 'sudo systemctl'
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc systemctl --user
|
||||||
abbr -a scu 'systemctl --user'
|
abbr -a scu 'systemctl --user'
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc systemctl status
|
||||||
abbr -a st 'systemctl status'
|
abbr -a st 'systemctl status'
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc systemctl start
|
||||||
abbr -a scs 'systemctl start'
|
abbr -a scs 'systemctl start'
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc systemctl restart
|
||||||
abbr -a scr 'systemctl restart'
|
abbr -a scr 'systemctl restart'
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc sudo systemctl status
|
||||||
abbr -a ssct 'sudo systemctl status'
|
abbr -a ssct 'sudo systemctl status'
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc sudo systemctl start
|
||||||
abbr -a sscs 'sudo systemctl start'
|
abbr -a sscs 'sudo systemctl start'
|
||||||
|
# @category Systemctl
|
||||||
|
# @desc sudo systemctl restart
|
||||||
abbr -a sscr 'sudo systemctl restart'
|
abbr -a sscr 'sudo systemctl restart'
|
||||||
|
|
||||||
|
### Alternate command names ###
|
||||||
|
# Expand to the canonical function name so muscle-memory typos still work,
|
||||||
|
# while surfacing the real command instead of silently forwarding to it.
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc repo-open
|
||||||
|
abbr -a open-repo repo-open
|
||||||
|
# @category Miscellaneous
|
||||||
|
# @desc open-url
|
||||||
|
abbr -a url-open open-url
|
||||||
|
|
||||||
### History Expansions and Substitutions ###
|
### History Expansions and Substitutions ###
|
||||||
# Bash-style history expansion is opinionated (C3 overrides), gated atomically
|
# Bash-style history expansion is opinionated (C3 overrides), gated atomically
|
||||||
# with conf.d/tricks.fish, conf.d/puffer.fish, and functions/expand_*.fish.
|
# with conf.d/tricks.fish, conf.d/puffer.fish, and functions/expand_*.fish.
|
||||||
if __fish_config_op_enabled __fish_config_op_overrides
|
if __fish_config_op_enabled (status basename) abbr-overrides
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !^
|
||||||
|
# @desc Expand to the first argument of the previous command
|
||||||
abbr -a !^ --position anywhere --function expand_bang_caret
|
abbr -a !^ --position anywhere --function expand_bang_caret
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !*
|
||||||
|
# @desc Expand to all arguments of the previous command
|
||||||
abbr -a '!*' --position anywhere --function expand_bang_all
|
abbr -a '!*' --position anywhere --function expand_bang_all
|
||||||
|
# @category History Expansion
|
||||||
|
# @name ^old^new^
|
||||||
|
# @desc Interactive typo substitution (replace 'old' with 'new' in previous command)
|
||||||
abbr -a typo_sub --position anywhere --regex '\^([^^]+)\^([^^]*)' --function expand_typo_sub
|
abbr -a typo_sub --position anywhere --regex '\^([^^]+)\^([^^]*)' --function expand_typo_sub
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !string
|
||||||
|
# @desc Expand to the most recent command starting with 'string'
|
||||||
abbr -a bang_string --position anywhere --regex '![\w.-]+' --function expand_bang_string
|
abbr -a bang_string --position anywhere --regex '![\w.-]+' --function expand_bang_string
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !?string?
|
||||||
|
# @desc Expand to the most recent command containing 'string'
|
||||||
abbr -a bang_search --position anywhere --regex '!\?[\w.-]+\??' --function expand_bang_search
|
abbr -a bang_search --position anywhere --regex '!\?[\w.-]+\??' --function expand_bang_search
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !-n
|
||||||
|
# @desc Expand to the nth-previous command
|
||||||
abbr -a bang_minus_n --position anywhere --regex '!-(\d+)' --function expand_bang_minus_n
|
abbr -a bang_minus_n --position anywhere --regex '!-(\d+)' --function expand_bang_minus_n
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# ╭──────────────────────────────────────────────────────────╮
|
||||||
|
# │ Auto-Pull (C2 — Autoexec) │
|
||||||
|
# ╰──────────────────────────────────────────────────────────╯
|
||||||
|
#
|
||||||
|
# Background, fast-forward-only `git pull` for opted-in repositories. Fires
|
||||||
|
# when the working directory enters the fish-config repo (always covered as a
|
||||||
|
# baseline) or any repository registered via the `auto-pull` command. The
|
||||||
|
# actual sync is delegated to `_auto_pull_sync`, which only ever fast-forwards
|
||||||
|
# a clean repo — see that function for the full safety contract.
|
||||||
|
#
|
||||||
|
# Manage the registry with: auto-pull add / remove / list / status
|
||||||
|
|
||||||
|
# Registers an --on-variable PWD handler that backgrounds a git fetch. In a
|
||||||
|
# script that cd's, that is both wasted work and AGENTS.md Task #4's
|
||||||
|
# credential-prompt hazard fired from a background job.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
|
# C2 guard: when auto-execution is disabled, do not register the handler.
|
||||||
|
__fish_config_op_enabled (status basename); or exit
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# autoexec/sync
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
# __auto_pull_on_pwd (event handler, --on-variable PWD)
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
# On every directory change, checks whether the new $PWD is inside a
|
||||||
|
# registered repository (or the fish-config baseline) and, if so, kicks a
|
||||||
|
# background fast-forward. A throttle global ensures it fires once per
|
||||||
|
# repository entry rather than on every sub-directory change.
|
||||||
|
function __auto_pull_on_pwd --on-variable PWD
|
||||||
|
set -q __fish_config_dir; or set -g __fish_config_dir $XDG_CONFIG_HOME/fish
|
||||||
|
set -q __fish_user_dots_path; or set -l __fish_user_dots_path "$XDG_CONFIG_HOME/.user-dots/fish"
|
||||||
|
set -l list "$__fish_user_dots_path/auto-pull.list"
|
||||||
|
|
||||||
|
# Candidate roots: the fish-config repo plus the user's registry.
|
||||||
|
set -l roots $__fish_config_dir
|
||||||
|
test -r "$list"; and set -a roots (command cat "$list" 2>/dev/null)
|
||||||
|
|
||||||
|
# Find the registered root containing $PWD (exact match or a sub-directory).
|
||||||
|
set -l hit
|
||||||
|
for r in $roots
|
||||||
|
test -n "$r"; or continue
|
||||||
|
if test "$PWD" = "$r"; or string match -q -- "$r/*" "$PWD"
|
||||||
|
set hit "$r"
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Outside every registered repo: clear the throttle so re-entry re-syncs.
|
||||||
|
if test -z "$hit"
|
||||||
|
set -e __auto_pull_last
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
# Already synced for this repo entry — skip until we leave and return.
|
||||||
|
test "$hit" = "$__auto_pull_last"; and return
|
||||||
|
set -g __auto_pull_last "$hit"
|
||||||
|
|
||||||
|
# Background fast-forward. A --no-config child sources just the worker so
|
||||||
|
# it stays fast and free of shell side-effects; real `git`, no shadows.
|
||||||
|
set -l worker "$__fish_config_dir/functions/_auto_pull_sync.fish"
|
||||||
|
test -r "$worker"; or return
|
||||||
|
fish --no-config -c 'source $argv[1]; _auto_pull_sync $argv[2]' -- "$worker" "$hit" &
|
||||||
|
disown 2>/dev/null
|
||||||
|
end
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
status is-interactive || exit
|
status is-interactive || exit
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# overrides/key-bindings
|
||||||
|
|
||||||
# Local modification: opinionated guard (AGENTS.md Task #3). Bracket
|
# Local modification: opinionated guard (AGENTS.md Task #3). Bracket
|
||||||
# auto-pairing intercepts single-character input, classified as C3 overrides.
|
# auto-pairing intercepts single-character input, classified as C3 overrides.
|
||||||
__fish_config_op_enabled __fish_config_op_overrides || exit
|
__fish_config_op_enabled (status basename) || exit
|
||||||
|
|
||||||
set --global autopair_left "(" "[" "{" '"' "'"
|
set --global autopair_left "(" "[" "{" '"' "'"
|
||||||
set --global autopair_right ")" "]" "}" '"' "'"
|
set --global autopair_right ")" "]" "}" '"' "'"
|
||||||
|
|||||||
@@ -0,0 +1,149 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# overrides/key-bindings
|
||||||
|
|
||||||
|
# Provides bash-style history expansion functions for abbreviations.
|
||||||
|
# These functions are gated by the C3 overrides switch.
|
||||||
|
|
||||||
|
# The six expand_* functions are reachable only through abbr --function
|
||||||
|
# (conf.d/abbr.fish:677-697), i.e. only during interactive expansion.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
|
# Execute expand_bang_all
|
||||||
|
function expand_bang_all --description 'Execute expand_bang_all'
|
||||||
|
# Opinionated guard (C3): no expansion when overrides are disabled.
|
||||||
|
__fish_config_op_enabled (status basename); or return 1
|
||||||
|
|
||||||
|
set -l token $argv[1]
|
||||||
|
if test -z "$token"
|
||||||
|
set token (commandline -t)
|
||||||
|
end
|
||||||
|
|
||||||
|
set -l tokens (string split -n " " -- $history[1])
|
||||||
|
if test (count $tokens) -gt 1
|
||||||
|
echo -- (string join " " -- $tokens[2..-1])
|
||||||
|
else
|
||||||
|
echo -- $token
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Execute expand_bang_caret
|
||||||
|
function expand_bang_caret --description 'Execute expand_bang_caret'
|
||||||
|
# Opinionated guard (C3): no expansion when overrides are disabled.
|
||||||
|
__fish_config_op_enabled (status basename); or return 1
|
||||||
|
|
||||||
|
# Split the last history item into a list
|
||||||
|
set -l tokens (string split -n ' ' -- $history[1])
|
||||||
|
# tokens[1] is the command, tokens[2] is the first argument
|
||||||
|
if set -q tokens[2]
|
||||||
|
echo -- $tokens[2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Execute expand_bang_minus_n
|
||||||
|
function expand_bang_minus_n --description 'Execute expand_bang_minus_n'
|
||||||
|
# Opinionated guard (C3): no expansion when overrides are disabled.
|
||||||
|
__fish_config_op_enabled (status basename); or return 1
|
||||||
|
|
||||||
|
set -l token $argv[1]
|
||||||
|
if test -z "$token"
|
||||||
|
set token (commandline -t)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Extract the number from the regex match
|
||||||
|
if string match -qr '!-(\d+)' -- "$token"
|
||||||
|
set -l n (string match -r '!-(\d+)' -- "$token")[2]
|
||||||
|
|
||||||
|
if test (count $history) -ge $n
|
||||||
|
echo -- $history[$n]
|
||||||
|
else
|
||||||
|
echo -- $token
|
||||||
|
end
|
||||||
|
else
|
||||||
|
echo -- $token
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Execute expand_bang_search
|
||||||
|
function expand_bang_search --description 'Execute expand_bang_search'
|
||||||
|
# Opinionated guard (C3): no expansion when overrides are disabled.
|
||||||
|
__fish_config_op_enabled (status basename); or return 1
|
||||||
|
|
||||||
|
set -l token $argv[1]
|
||||||
|
if test -z "$token"
|
||||||
|
set token (commandline -t)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Extract query: looks for text after !? and before an optional ?
|
||||||
|
set -l query (string match -r '!\?([^?]+)' -- $token)[2]
|
||||||
|
|
||||||
|
if test -n "$query"
|
||||||
|
# Search history for a match anywhere in the command
|
||||||
|
set -l match (builtin history search --contains --max=1 -- $query)
|
||||||
|
|
||||||
|
if test -n "$match"
|
||||||
|
echo -- $match
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
echo -- $token
|
||||||
|
end
|
||||||
|
|
||||||
|
# Execute expand_bang_string
|
||||||
|
function expand_bang_string --description 'Execute expand_bang_string'
|
||||||
|
# Opinionated guard (C3): no expansion when overrides are disabled.
|
||||||
|
__fish_config_op_enabled (status basename); or return 1
|
||||||
|
|
||||||
|
# Fish 4.x passes the matched token as argv[1]
|
||||||
|
set -l token $argv[1]
|
||||||
|
if test -z "$token"
|
||||||
|
set token (commandline -t)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Remove the '!' to get the search query
|
||||||
|
set -l query (string sub -s 2 -- $token)
|
||||||
|
|
||||||
|
if test -n "$query"
|
||||||
|
# Search history for a prefix match
|
||||||
|
set -l match (builtin history search --prefix --max=1 -- $query)
|
||||||
|
|
||||||
|
if test -n "$match"
|
||||||
|
echo -- $match
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# If no match or empty query, return the token so it doesn't vanish
|
||||||
|
echo -- $token
|
||||||
|
end
|
||||||
|
|
||||||
|
# Execute expand_typo_sub
|
||||||
|
function expand_typo_sub --description 'Execute expand_typo_sub'
|
||||||
|
# Opinionated guard (C3): no expansion when overrides are disabled.
|
||||||
|
__fish_config_op_enabled (status basename); or return 1
|
||||||
|
|
||||||
|
# In newer Fish, the matched token is often passed as $argv[1]
|
||||||
|
# if the abbr is set up correctly. We'll fallback to commandline just in case.
|
||||||
|
set -l last_cmd $history[1]
|
||||||
|
set -l current_token $argv[1]
|
||||||
|
if test -z "$current_token"
|
||||||
|
set current_token (commandline -t)
|
||||||
|
end
|
||||||
|
|
||||||
|
if string match -qr '\^([^^]+)\^([^^]*)' -- "$current_token"
|
||||||
|
set -l captured (string match -r '\^([^^]+)\^([^^]*)' -- "$current_token")
|
||||||
|
set -l old $captured[2]
|
||||||
|
set -l new $captured[3]
|
||||||
|
|
||||||
|
if test -n "$old"
|
||||||
|
# Using -- to ensure strings starting with '-' aren't treated as flags
|
||||||
|
echo -- (string replace -a -- "$old" "$new" "$last_cmd")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
# Return the token itself so it doesn't vanish
|
||||||
|
echo -- "$current_token"
|
||||||
|
end
|
||||||
|
end
|
||||||
+4
-1
@@ -19,6 +19,9 @@
|
|||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
# SOFTWARE.
|
# SOFTWARE.
|
||||||
|
#
|
||||||
|
# COMPONENT
|
||||||
|
# integrations/notifications
|
||||||
|
|
||||||
if not status is-interactive
|
if not status is-interactive
|
||||||
exit
|
exit
|
||||||
@@ -26,7 +29,7 @@ end
|
|||||||
|
|
||||||
# Local modification: opinionated guard (AGENTS.md Task #3). Desktop
|
# Local modification: opinionated guard (AGENTS.md Task #3). Desktop
|
||||||
# notifications assume a graphical session, classified as C4 integrations.
|
# notifications assume a graphical session, classified as C4 integrations.
|
||||||
__fish_config_op_enabled __fish_config_op_integrations; or exit
|
__fish_config_op_enabled (status basename); or exit
|
||||||
|
|
||||||
set -g __done_version 1.19.1
|
set -g __done_version 1.19.1
|
||||||
|
|
||||||
|
|||||||
+16
-2
@@ -7,6 +7,10 @@
|
|||||||
#
|
#
|
||||||
# Runs exactly once on the first interactive fish session after install.
|
# Runs exactly once on the first interactive fish session after install.
|
||||||
# To reset for testing, run: set -Ue __fish_config_first_run_complete
|
# To reset for testing, run: set -Ue __fish_config_first_run_complete
|
||||||
|
#
|
||||||
|
# COMPONENT
|
||||||
|
# site first-run-greeting: greeting/first-run
|
||||||
|
# site first-run-bootstrap: autoexec/plugin-management
|
||||||
|
|
||||||
# Exit early in non-interactive shells (scripts, completions, subshells)
|
# Exit early in non-interactive shells (scripts, completions, subshells)
|
||||||
if not status is-interactive
|
if not status is-interactive
|
||||||
@@ -22,11 +26,21 @@ end
|
|||||||
# leave the shell in a state that re-triggers everything next session.
|
# leave the shell in a state that re-triggers everything next session.
|
||||||
set -U __fish_config_first_run_complete 1
|
set -U __fish_config_first_run_complete 1
|
||||||
|
|
||||||
|
# ──────────────────────────── Man page symlink ──────────────────────────
|
||||||
|
# Install fish-config.1 into the user man database once, like an install step.
|
||||||
|
# Unconditional: standard enough that no category gate is warranted.
|
||||||
|
set -l _man1 ~/.local/share/man/man1
|
||||||
|
set -l _src ~/.config/fish/docs/fish-config.1
|
||||||
|
if test -f $_src; and not test -L $_man1/fish-config.1
|
||||||
|
mkdir -p $_man1
|
||||||
|
ln -sf $_src $_man1/fish-config.1
|
||||||
|
end
|
||||||
|
|
||||||
# ──────────────────────────── Welcome message ───────────────────────────
|
# ──────────────────────────── Welcome message ───────────────────────────
|
||||||
# Printing a first-run welcome banner is opinionated (C6 greeting). The
|
# Printing a first-run welcome banner is opinionated (C6 greeting). The
|
||||||
# first-run state variable is already set unconditionally above, so
|
# first-run state variable is already set unconditionally above, so
|
||||||
# disabling the greeting never re-triggers this file.
|
# disabling the greeting never re-triggers this file.
|
||||||
if __fish_config_op_enabled __fish_config_op_greeting
|
if __fish_config_op_enabled (status basename) first-run-greeting
|
||||||
echo ""
|
echo ""
|
||||||
echo " Welcome to your fish shell configuration!"
|
echo " Welcome to your fish shell configuration!"
|
||||||
echo " Run 'help config' for offline documentation."
|
echo " Run 'help config' for offline documentation."
|
||||||
@@ -38,7 +52,7 @@ end
|
|||||||
# Startup side-effects below (Fisher curl, fisher update, theme apply) are
|
# Startup side-effects below (Fisher curl, fisher update, theme apply) are
|
||||||
# opinionated (C2 auto-execution). The first-run state variable is already
|
# opinionated (C2 auto-execution). The first-run state variable is already
|
||||||
# set above either way, so disabling auto-exec never re-triggers this file.
|
# set above either way, so disabling auto-exec never re-triggers this file.
|
||||||
if not __fish_config_op_enabled __fish_config_op_autoexec
|
if not __fish_config_op_enabled (status basename) first-run-bootstrap
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
#
|
||||||
|
# ╭──────────────────────────────────────────────────────────╮
|
||||||
|
# │ help config wrapper │
|
||||||
|
# ╰──────────────────────────────────────────────────────────╯
|
||||||
|
#
|
||||||
|
# COMPONENT
|
||||||
|
# aliases/shell-tools
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
# help [topic] [sub-topic...]
|
||||||
|
# help config [section] [-w|--html] [-m|--man] [-h|--help]
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
# Wraps the built-in Fish help command. Intercepts the specific topic
|
||||||
|
# "config" and forwards any subsequent sub-topics/arguments straight to the
|
||||||
|
# custom 'config-help' utility. For all other topics, it forwards the
|
||||||
|
# arguments intact to the original, built-in system help utility.
|
||||||
|
#
|
||||||
|
# When the first argument is "config", the following flags are recognized
|
||||||
|
# and delegated to 'config-help':
|
||||||
|
# -w, --html Open the offline HTML docs in the default browser
|
||||||
|
# -m, --man Open the compiled man page via man -l
|
||||||
|
# -h, --help Print config-help usage reference
|
||||||
|
#
|
||||||
|
# Flags that appear WITHOUT a leading "config" argument — including
|
||||||
|
# -h/--help — are forwarded unchanged to the native Fish help command, so
|
||||||
|
# built-in behavior is never overridden for non-config topics.
|
||||||
|
#
|
||||||
|
# NOTES
|
||||||
|
# To prevent infinite recursion, the wrapper backs up the native help
|
||||||
|
# function as '__original_help' before shadowing it. This MUST happen from
|
||||||
|
# conf.d, not functions/help.fish: as of Fish 4.x the native help is
|
||||||
|
# embedded in the binary (embedded:functions/help.fish) with no on-disk
|
||||||
|
# file to source, and a functions/help.fish autoload shadow makes the name
|
||||||
|
# 'help' resolve to our own wrapper (or nothing, mid-autoload) — so the
|
||||||
|
# backup could never capture the real help. Sourced here at startup, before
|
||||||
|
# any shadow exists, `functions -c help` copies the embedded original.
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
# help config keys # → config-help keys
|
||||||
|
# help config --html # opens the offline HTML docs in the browser
|
||||||
|
# help config keys --man # opens the compiled man page via man -l
|
||||||
|
# help string # forwards to native fish docs for 'string'
|
||||||
|
|
||||||
|
# --- Initialization & Backup ---
|
||||||
|
# Copy the native (embedded) help to __original_help before we shadow it.
|
||||||
|
if not functions -q __original_help
|
||||||
|
functions -c help __original_help
|
||||||
|
end
|
||||||
|
|
||||||
|
# --- Wrapper Definition ---
|
||||||
|
function help --wraps help --description "Custom wrapper to intercept 'help config'"
|
||||||
|
# Opinionated guard (C1): fall back to the native fish help when disabled.
|
||||||
|
if not __fish_config_op_enabled (status current-function)
|
||||||
|
__original_help $argv
|
||||||
|
return $status
|
||||||
|
end
|
||||||
|
|
||||||
|
if test "$argv[1]" = config
|
||||||
|
# All arguments after 'config' — including flags (-w/--html, -m/--man,
|
||||||
|
# -h/--help) and section keywords — are forwarded to config-help.
|
||||||
|
# Flags are only intercepted here when 'config' is the first argument,
|
||||||
|
# so native fish help flags are never shadowed for other topics.
|
||||||
|
config-help $argv[2..]
|
||||||
|
else
|
||||||
|
__original_help $argv
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -8,6 +8,9 @@
|
|||||||
# This file defines custom key bindings for the Fish shell.
|
# This file defines custom key bindings for the Fish shell.
|
||||||
# It is sourced by Fish on startup.
|
# It is sourced by Fish on startup.
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# overrides/key-bindings
|
||||||
|
|
||||||
# ────────────────── Bind Prewious Path Head to Ctrl+G ─────────────────
|
# ────────────────── Bind Prewious Path Head to Ctrl+G ─────────────────
|
||||||
# Bindings to insert the previous path head into the command line
|
# Bindings to insert the previous path head into the command line
|
||||||
# Behaves like `!$:h` does in bash
|
# Behaves like `!$:h` does in bash
|
||||||
@@ -44,11 +47,19 @@
|
|||||||
# This allows for rapid-fire math without leaving the current shell.
|
# This allows for rapid-fire math without leaving the current shell.
|
||||||
# ──────────────────────────────────────────────────────────────────────
|
# ──────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Defines only fish_user_key_bindings, which fish calls from the interactive
|
||||||
|
# reader and nowhere else.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
function fish_user_key_bindings
|
function fish_user_key_bindings
|
||||||
|
|
||||||
# Custom key chords are opinionated (C3 overrides); skip them entirely
|
# Custom key chords are opinionated (C3 overrides); skip them entirely
|
||||||
# when overrides are disabled so stock bindings remain untouched.
|
# when overrides are disabled so stock bindings remain untouched.
|
||||||
__fish_config_op_enabled __fish_config_op_overrides; or return
|
# NOTE: (status basename), not (status current-function) -- this guard
|
||||||
|
# lives inside fish's own reserved fish_user_key_bindings function, whose
|
||||||
|
# name is not this file's identity; the registry key is this file's
|
||||||
|
# bare basename, key_bindings.
|
||||||
|
__fish_config_op_enabled (status basename); or return
|
||||||
|
|
||||||
# ───────────────────────────── Set Bindings ─────────────────────────────
|
# ───────────────────────────── Set Bindings ─────────────────────────────
|
||||||
#
|
#
|
||||||
@@ -58,7 +69,8 @@ function fish_user_key_bindings
|
|||||||
bind ctrl-alt-u _replace_command_token
|
bind ctrl-alt-u _replace_command_token
|
||||||
type -q qalc && bind ctrl-alt-= _qalc_eval
|
type -q qalc && bind ctrl-alt-= _qalc_eval
|
||||||
bind ctrl-enter _smart_execute
|
bind ctrl-enter _smart_execute
|
||||||
bind @@ __fzf_inline_picker
|
bind ctrl-right nextd-or-forward-word
|
||||||
|
bind \e\[1\;5C nextd-or-forward-word
|
||||||
|
|
||||||
# Set bindings for all Vi modes:
|
# Set bindings for all Vi modes:
|
||||||
# 'default' is Vi-Command, 'insert' is Vi-Insert, 'visual' is Vi-Visual
|
# 'default' is Vi-Command, 'insert' is Vi-Insert, 'visual' is Vi-Visual
|
||||||
@@ -68,6 +80,17 @@ function fish_user_key_bindings
|
|||||||
bind --mode $mode ctrl-alt-u _replace_command_token
|
bind --mode $mode ctrl-alt-u _replace_command_token
|
||||||
type -q qalc && bind --mode $mode ctrl-alt-= _qalc_eval
|
type -q qalc && bind --mode $mode ctrl-alt-= _qalc_eval
|
||||||
bind --mode $mode ctrl-enter _smart_execute
|
bind --mode $mode ctrl-enter _smart_execute
|
||||||
bind --mode $mode @@ __fzf_inline_picker
|
bind --mode $mode ctrl-right nextd-or-forward-word
|
||||||
|
bind --mode $mode \e\[1\;5C nextd-or-forward-word
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @ is Emacs/Vi-insert only. Emacs bindings and Vi's "default" (normal)
|
||||||
|
# mode share the same bind_mode name, so a mode-less `bind @` would also
|
||||||
|
# land in Vi normal mode, turning its current no-op @ into a self-insert.
|
||||||
|
# Register the mode-less form only when Vi bindings aren't the active
|
||||||
|
# base, and rely on the explicit insert-mode bind otherwise.
|
||||||
|
if test "$fish_key_bindings" != fish_vi_key_bindings
|
||||||
|
bind @ __fzf_inline_picker
|
||||||
|
end
|
||||||
|
bind --mode insert @ __fzf_inline_picker
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# logging/terminal-capture
|
||||||
|
|
||||||
|
#
|
||||||
|
# C5 — Logging & Capture: a non-blocking, per-session reminder shown inside Kitty
|
||||||
|
# when the fish-config scrollback watcher is not yet set up. It never blocks the
|
||||||
|
# shell; it simply prints how to enable or silence it. The notice stops once the
|
||||||
|
# user runs `kitty-logging install` (a watcher line then exists in kitty.conf) or
|
||||||
|
# `kitty-logging dismiss` (sets the universal variable below).
|
||||||
|
|
||||||
|
status is-interactive; or exit
|
||||||
|
type -q kitty; or exit
|
||||||
|
set -q KITTY_WINDOW_ID; or exit
|
||||||
|
__fish_config_op_enabled (status basename); or exit
|
||||||
|
__fish_variable_check __fish_config_kitty_watcher_dismissed; and exit
|
||||||
|
__kitty_logging_has_watcher; and exit
|
||||||
|
|
||||||
|
set_color --bold yellow
|
||||||
|
echo "Kitty session logging is available but not set up."
|
||||||
|
set_color normal
|
||||||
|
echo " Enable: kitty-logging install"
|
||||||
|
echo " Silence: kitty-logging dismiss"
|
||||||
@@ -13,6 +13,12 @@
|
|||||||
# solely in functions/ are never registered and their --on-variable triggers
|
# solely in functions/ are never registered and their --on-variable triggers
|
||||||
# never fire.
|
# never fire.
|
||||||
|
|
||||||
|
# Calls __fish_config_sync_logging at every shell start, which mkdir+touches
|
||||||
|
# the C5 sentinel on disk. Its only consumers — the Kitty watcher and the
|
||||||
|
# paru/yay wrappers — are interactive-context; every interactive shell still
|
||||||
|
# refreshes it.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
function __fish_config_logging_changed --on-variable __fish_config_op_logging \
|
function __fish_config_logging_changed --on-variable __fish_config_op_logging \
|
||||||
--description 'C5 event handler: sync logging state when __fish_config_op_logging changes'
|
--description 'C5 event handler: sync logging state when __fish_config_op_logging changes'
|
||||||
__fish_config_sync_logging
|
__fish_config_sync_logging
|
||||||
|
|||||||
+40
-12
@@ -2,15 +2,24 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
#
|
#
|
||||||
# Generates ~/.local/bin/paru on first run (and on version bump) when
|
# Generates ~/.local/bin/paru on first run (and on version bump) when
|
||||||
# /usr/bin/paru is installed. The wrapper tees paru output to a
|
# paru is installed. The wrapper runs paru in a PTY so progress
|
||||||
# timestamped log file and prunes old logs, mirroring smart_exit behavior.
|
# bars are preserved, renders the captured animation to a clean static log
|
||||||
|
# (via scripts/clean_progress_log.py), and prunes old logs.
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# site paru-autoexec: autoexec/pkg-wrappers
|
||||||
|
# site paru-logging: logging/pkg-logs
|
||||||
|
|
||||||
|
# Defines nothing; its only effect is generating ~/.local/bin/paru, an
|
||||||
|
# idempotent write every interactive session already performs.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
# Auto-generating a wrapper in ~/.local/bin is opinionated (C2 auto-exec).
|
# Auto-generating a wrapper in ~/.local/bin is opinionated (C2 auto-exec).
|
||||||
# Wrapper generation is also gated by C5 (Logging & Capture).
|
# Wrapper generation is also gated by C5 (Logging & Capture).
|
||||||
__fish_config_op_enabled __fish_config_op_autoexec; or return
|
__fish_config_op_enabled (status basename) paru-autoexec; or return
|
||||||
|
|
||||||
# C5 — Logging & Capture: remove generated wrapper and skip when logging is off
|
# C5 — Logging & Capture: remove generated wrapper and skip when logging is off
|
||||||
if not __fish_config_op_enabled __fish_config_op_logging
|
if not __fish_config_op_enabled (status basename) paru-logging
|
||||||
if test -f "$HOME/.local/bin/paru"
|
if test -f "$HOME/.local/bin/paru"
|
||||||
and grep -q "# paru-wrapper-version:" "$HOME/.local/bin/paru" 2>/dev/null
|
and grep -q "# paru-wrapper-version:" "$HOME/.local/bin/paru" 2>/dev/null
|
||||||
rm -f "$HOME/.local/bin/paru"
|
rm -f "$HOME/.local/bin/paru"
|
||||||
@@ -18,12 +27,13 @@ if not __fish_config_op_enabled __fish_config_op_logging
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
set -l _paru_real /usr/bin/paru
|
# Resolve the real paru binary, skipping our own shim (never /usr/bin-assumed).
|
||||||
|
set -l _paru_real (__fish_real_command paru)
|
||||||
set -l _paru_wrapper "$HOME/.local/bin/paru"
|
set -l _paru_wrapper "$HOME/.local/bin/paru"
|
||||||
set -l _paru_wrapper_version 1
|
set -l _paru_wrapper_version 6
|
||||||
|
|
||||||
# Skip entirely if the real paru binary isn't present
|
# Skip entirely if the real paru binary isn't present
|
||||||
test -x $_paru_real; or return
|
test -x "$_paru_real"; or return
|
||||||
|
|
||||||
# Check if wrapper already exists at the expected version
|
# Check if wrapper already exists at the expected version
|
||||||
if test -f $_paru_wrapper
|
if test -f $_paru_wrapper
|
||||||
@@ -38,22 +48,40 @@ printf '%s\n' \
|
|||||||
'#!/usr/bin/env bash' \
|
'#!/usr/bin/env bash' \
|
||||||
"# paru-wrapper-version: $_paru_wrapper_version" \
|
"# paru-wrapper-version: $_paru_wrapper_version" \
|
||||||
'# Auto-generated by conf.d/paru-wrapper.fish — do not edit by hand.' \
|
'# Auto-generated by conf.d/paru-wrapper.fish — do not edit by hand.' \
|
||||||
'# Tees paru output to a timestamped log file and prunes old ones.' \
|
'# Runs paru in a PTY via script(1) so progress bars are preserved on screen,' \
|
||||||
'set -o pipefail' \
|
'# then renders the captured terminal animation to a clean static log.' \
|
||||||
'' \
|
'' \
|
||||||
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
|
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
|
||||||
'mkdir -p "$log_dir"' \
|
'mkdir -p "$log_dir"' \
|
||||||
'log_file="$log_dir/paru_$(date +%Y-%m-%d_%H-%M-%S).log"' \
|
'log_file="$log_dir/paru_$(date +%Y-%m-%d_%H-%M-%S).log"' \
|
||||||
'' \
|
'' \
|
||||||
'/usr/bin/paru "$@" 2>&1 | tee "$log_file"' \
|
'# Build a safely-quoted command string for script(1).' \
|
||||||
|
'# script(1) allocates a PTY so paru detects a real terminal and shows progress.' \
|
||||||
|
"cmd_str=\"$_paru_real\"" \
|
||||||
|
'for arg in "$@"; do' \
|
||||||
|
' cmd_str+=" $(printf '"'"'%q'"'"' "$arg")"' \
|
||||||
|
done \
|
||||||
|
'script -q -e -c "$cmd_str" "$log_file"' \
|
||||||
|
'exit_code=$?' \
|
||||||
|
'' \
|
||||||
|
'# Render the captured terminal animation (progress bars repaint in place via' \
|
||||||
|
'# cursor moves) down to its final static frame, preserving ANSI color. Falls' \
|
||||||
|
'# back to dropping only the script(1) header/footer when python3 is missing.' \
|
||||||
|
'cleaner="${XDG_CONFIG_HOME:-$HOME/.config}/fish/scripts/clean_progress_log.py"' \
|
||||||
|
'if command -v python3 >/dev/null 2>&1 && [[ -f "$cleaner" ]]; then' \
|
||||||
|
' python3 "$cleaner" < "$log_file" > "${log_file}.tmp" 2>/dev/null && mv "${log_file}.tmp" "$log_file" || rm -f "${log_file}.tmp"' \
|
||||||
|
else \
|
||||||
|
' sed -i "/^Script \(started\|done\) on /d" "$log_file" 2>/dev/null || true' \
|
||||||
|
fi \
|
||||||
'' \
|
'' \
|
||||||
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
|
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
|
||||||
'mapfile -t logs < <(ls -1t "$log_dir"/paru_*.log 2>/dev/null)' \
|
'mapfile -t logs < <(ls -1t "$log_dir"/paru_*.log 2>/dev/null)' \
|
||||||
'excess=$(( ${#logs[@]} - max_files ))' \
|
'excess=$(( ${#logs[@]} - max_files ))' \
|
||||||
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
|
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
|
||||||
' rm -f "${logs[$i]}"' \
|
' rm -f "${logs[$i]}"' \
|
||||||
'done' \
|
done \
|
||||||
> $_paru_wrapper
|
'' \
|
||||||
|
'exit $exit_code' >$_paru_wrapper
|
||||||
|
|
||||||
chmod +x $_paru_wrapper
|
chmod +x $_paru_wrapper
|
||||||
|
|
||||||
|
|||||||
+16
-1
@@ -1,9 +1,12 @@
|
|||||||
status is-interactive || exit
|
status is-interactive || exit
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# overrides/key-bindings
|
||||||
|
|
||||||
# Local modification: opinionated guard (AGENTS.md Task #3). Puffer's key
|
# Local modification: opinionated guard (AGENTS.md Task #3). Puffer's key
|
||||||
# intercepts are part of the bang-bang system, gated atomically under C3
|
# intercepts are part of the bang-bang system, gated atomically under C3
|
||||||
# overrides with conf.d/tricks.fish, conf.d/abbr.fish, and expand_*.fish.
|
# overrides with conf.d/tricks.fish, conf.d/abbr.fish, and expand_*.fish.
|
||||||
__fish_config_op_enabled __fish_config_op_overrides || exit
|
__fish_config_op_enabled (status basename) || exit
|
||||||
|
|
||||||
function _puffer_fish_key_bindings --on-variable fish_key_bindings
|
function _puffer_fish_key_bindings --on-variable fish_key_bindings
|
||||||
set -l modes
|
set -l modes
|
||||||
@@ -13,9 +16,21 @@ function _puffer_fish_key_bindings --on-variable fish_key_bindings
|
|||||||
set modes insert default
|
set modes insert default
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !.
|
||||||
|
# @desc Expand .. to ../.. and so on
|
||||||
bind --mode $modes[1] '.' _puffer_fish_expand_dot
|
bind --mode $modes[1] '.' _puffer_fish_expand_dot
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !!
|
||||||
|
# @desc Expand to the previous command
|
||||||
bind --mode $modes[1] '!' _puffer_fish_expand_bang
|
bind --mode $modes[1] '!' _puffer_fish_expand_bang
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !$
|
||||||
|
# @desc Expand to the last argument of the previous command
|
||||||
bind --mode $modes[1] '$' _puffer_fish_expand_buck
|
bind --mode $modes[1] '$' _puffer_fish_expand_buck
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !*
|
||||||
|
# @desc Expand to all arguments of the previous command
|
||||||
bind --mode $modes[1] '*' _puffer_fish_expand_star
|
bind --mode $modes[1] '*' _puffer_fish_expand_star
|
||||||
bind --mode $modes[2] --erase '.' '!' '$' '*'
|
bind --mode $modes[2] --erase '.' '!' '$' '*'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -95,8 +95,19 @@ function __sponge_register_secret_values --on-event fish_prompt
|
|||||||
|
|
||||||
set -l secret_values
|
set -l secret_values
|
||||||
|
|
||||||
set -l sensitive_vars (set --names --export | string match --regex -- \
|
# Base credential-name tokens, plus any user-supplied extras from
|
||||||
'(?i)(?:TOKEN|PASSWORD|PASSWD|SECRET|API[_-]KEY|PRIVATE[_-]KEY|ACCESS[_-]KEY|AUTH[_-]KEY|CREDENTIAL|KOPIA_PASSWORD)')
|
# __fish_sponge_extra_sensitive (set via config-settings → Sponge page).
|
||||||
|
set -l _sensitive_names \
|
||||||
|
TOKEN PASSWORD PASSWD SECRET 'API[_-]KEY' 'PRIVATE[_-]KEY' \
|
||||||
|
'ACCESS[_-]KEY' 'AUTH[_-]KEY' CREDENTIAL KOPIA_PASSWORD \
|
||||||
|
$__fish_sponge_extra_sensitive
|
||||||
|
set -l _sensitive_alt (string join '|' $_sensitive_names)
|
||||||
|
|
||||||
|
# --entire returns the full matching variable NAME (e.g. GITHUB_TOKEN), not
|
||||||
|
# just the matched token substring (TOKEN) — required so $$var below
|
||||||
|
# dereferences the real variable instead of an unset partial name.
|
||||||
|
set -l sensitive_vars (set --names --export | string match --regex --entire -- \
|
||||||
|
"(?i)(?:$_sensitive_alt)")
|
||||||
|
|
||||||
for var in $sensitive_vars
|
for var in $sensitive_vars
|
||||||
# Take only the first element — array vars yield multiple values.
|
# Take only the first element — array vars yield multiple values.
|
||||||
|
|||||||
@@ -1,12 +1,20 @@
|
|||||||
# Copyright (C) 2026 Rootiest
|
# Copyright (C) 2026 Rootiest
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# overrides/prompt
|
||||||
|
|
||||||
#
|
#
|
||||||
# Defines fish_prompt only when starship is installed.
|
# Defines fish_prompt only when starship is installed.
|
||||||
# Without starship, fish's built-in prompt already emits OSC 133;A
|
# Without starship, fish's built-in prompt already emits OSC 133;A
|
||||||
# on the prompt line itself, so no wrapper is needed.
|
# on the prompt line itself, so no wrapper is needed.
|
||||||
|
|
||||||
|
# Defines fish_prompt; no script renders a prompt. Checked before the
|
||||||
|
# op-guard so the builtin short-circuits ahead of three function autoloads.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
# Replacing the prompt is opinionated (C3 overrides)
|
# Replacing the prompt is opinionated (C3 overrides)
|
||||||
__fish_config_op_enabled __fish_config_op_overrides; or return
|
__fish_config_op_enabled (status basename); or return
|
||||||
|
|
||||||
type -q starship; or return
|
type -q starship; or return
|
||||||
|
|
||||||
|
|||||||
+10
-1
@@ -1,5 +1,9 @@
|
|||||||
# Copyright (C) 2026 Rootiest
|
# Copyright (C) 2026 Rootiest
|
||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# overrides/prompt
|
||||||
|
|
||||||
#
|
#
|
||||||
# ╭──────────────────────────────────────────────────────────╮
|
# ╭──────────────────────────────────────────────────────────╮
|
||||||
# │ Fish Theme │
|
# │ Fish Theme │
|
||||||
@@ -9,13 +13,18 @@
|
|||||||
# Forcing theme colors and $FZF_DEFAULT_OPTS is opinionated (C3 overrides).
|
# Forcing theme colors and $FZF_DEFAULT_OPTS is opinionated (C3 overrides).
|
||||||
# The FZF variable is universal, so clean up our Catppuccin value if it
|
# The FZF variable is universal, so clean up our Catppuccin value if it
|
||||||
# lingers from a session where overrides were still enabled.
|
# lingers from a session where overrides were still enabled.
|
||||||
if not __fish_config_op_enabled __fish_config_op_overrides
|
if not __fish_config_op_enabled (status basename)
|
||||||
if set -q FZF_DEFAULT_OPTS; and string match -q '*#1E1E2E*' -- "$FZF_DEFAULT_OPTS"
|
if set -q FZF_DEFAULT_OPTS; and string match -q '*#1E1E2E*' -- "$FZF_DEFAULT_OPTS"
|
||||||
set --erase FZF_DEFAULT_OPTS
|
set --erase FZF_DEFAULT_OPTS
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Below the cleanup block on purpose: that branch erases a stale universal
|
||||||
|
# FZF_DEFAULT_OPTS and must keep running wherever it runs today. Everything
|
||||||
|
# past here is fish_color_* for the syntax highlighter, interactive-only.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
# ────────────────────── Syntax highlighting colors ──────────────────────
|
# ────────────────────── Syntax highlighting colors ──────────────────────
|
||||||
set --global fish_color_autosuggestion 6c7086
|
set --global fish_color_autosuggestion 6c7086
|
||||||
set --global fish_color_cancel f38ba8
|
set --global fish_color_cancel f38ba8
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# logging/multiplexer-capture
|
||||||
|
|
||||||
|
#
|
||||||
|
# C5 — Logging & Capture: starts a pipe-pane log for the current tmux pane
|
||||||
|
# when fish launches inside a tmux session. Each fish shell gets its own
|
||||||
|
# timestamped log file in SCROLLBACK_HISTORY_DIR (default: ~/.terminal_history).
|
||||||
|
# Naming: tmux_<session>-w<window>-p<pane>_YYYY-MM-DD_HH-MM-SS.log
|
||||||
|
|
||||||
|
__fish_config_op_enabled (status basename); or exit
|
||||||
|
status is-interactive; or exit
|
||||||
|
type -q tmux; or exit
|
||||||
|
set -q TMUX; or exit
|
||||||
|
|
||||||
|
_tmux_pipe_log
|
||||||
+76
-21
@@ -7,32 +7,43 @@
|
|||||||
# │ system aliases, and history/backup utilities │
|
# │ system aliases, and history/backup utilities │
|
||||||
# ╰──────────────────────────────────────────────────────────╯
|
# ╰──────────────────────────────────────────────────────────╯
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# site aliases-tricks: aliases/filesystem
|
||||||
|
# site tricks-manpager: overrides/environment
|
||||||
|
# site tricks-bang: overrides/key-bindings
|
||||||
|
|
||||||
## Environment setup
|
## Environment setup
|
||||||
# Apply .profile: use this to put fish compatible .profile stuff in
|
# Apply .profile: use this to put fish compatible .profile stuff in
|
||||||
if test -f ~/.fish_profile
|
if test -f ~/.fish_profile
|
||||||
source ~/.fish_profile
|
source ~/.fish_profile
|
||||||
end
|
end
|
||||||
|
|
||||||
# Append unique directories to $PATH (fish_add_path handles duplicates automatically)
|
# This file is sourced twice per shell on CachyOS (once by the conf.d
|
||||||
fish_add_path ~/.local/bin
|
# autoload, once forced by config.fish to re-win over the distro's own
|
||||||
fish_add_path ~/Applications/depot_tools
|
# tricks.fish). The PATH/MANPAGER setup below doesn't need to repeat on
|
||||||
|
# the second pass -- only the functions/aliases further down do, since
|
||||||
|
# those are what re-assert over the distro config. Gate the expensive
|
||||||
|
# calls (fish_add_path, type -q bat) behind a once-per-session guard.
|
||||||
|
# ponytail: per-session guard, not per-value; if this file grows more
|
||||||
|
# expensive one-time setup, extend the same guard rather than adding more.
|
||||||
|
if not set -q __fish_config_tricks_env_applied
|
||||||
|
set -g __fish_config_tricks_env_applied 1
|
||||||
|
|
||||||
# Expose user-local man pages and keep fish-config.1 symlink current
|
# Append unique directories to $PATH (fish_add_path handles duplicates automatically)
|
||||||
if not contains ~/.local/share/man $MANPATH
|
fish_add_path ~/.local/bin
|
||||||
set -gx MANPATH ~/.local/share/man $MANPATH
|
fish_add_path ~/Applications/depot_tools
|
||||||
end
|
|
||||||
set -l _man1 ~/.local/share/man/man1
|
|
||||||
set -l _src ~/.config/fish/docs/fish-config.1
|
|
||||||
if test -f $_src; and not test -L $_man1/fish-config.1
|
|
||||||
mkdir -p $_man1
|
|
||||||
ln -sf $_src $_man1/fish-config.1
|
|
||||||
end
|
|
||||||
|
|
||||||
# Format man pages using bat (only if bat is installed)
|
# Expose user-local man pages
|
||||||
# Overriding $MANPAGER is opinionated (C3 overrides)
|
if not contains ~/.local/share/man $MANPATH
|
||||||
if type -q bat; and __fish_config_op_enabled __fish_config_op_overrides
|
set -gx MANPATH ~/.local/share/man $MANPATH
|
||||||
set -gx MANROFFOPT -c
|
end
|
||||||
set -gx MANPAGER "sh -c 'col -bx | bat -l man -p'"
|
|
||||||
|
# Format man pages using bat (only if bat is installed)
|
||||||
|
# Overriding $MANPAGER is opinionated (C3 overrides)
|
||||||
|
if type -q bat; and __fish_config_op_enabled (status basename) tricks-manpager
|
||||||
|
set -gx MANROFFOPT -c
|
||||||
|
set -gx MANPAGER "sh -c 'col -bx | bat -l man -p'"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Set settings for https://github.com/franciscolourenco/done
|
# Set settings for https://github.com/franciscolourenco/done
|
||||||
@@ -43,7 +54,7 @@ set -gx __done_notification_urgency_level low
|
|||||||
# Functions needed for !! and !$ https://github.com/oh-my-fish/plugin-bang-bang
|
# Functions needed for !! and !$ https://github.com/oh-my-fish/plugin-bang-bang
|
||||||
# The bang-bang system is opinionated (C3 overrides) and is gated atomically
|
# The bang-bang system is opinionated (C3 overrides) and is gated atomically
|
||||||
# here, in conf.d/abbr.fish, conf.d/puffer.fish, and functions/expand_*.fish.
|
# here, in conf.d/abbr.fish, conf.d/puffer.fish, and functions/expand_*.fish.
|
||||||
if __fish_config_op_enabled __fish_config_op_overrides
|
if __fish_config_op_enabled (status basename) tricks-bang
|
||||||
function __history_previous_command
|
function __history_previous_command
|
||||||
switch (commandline -t)
|
switch (commandline -t)
|
||||||
case "!"
|
case "!"
|
||||||
@@ -66,10 +77,22 @@ if __fish_config_op_enabled __fish_config_op_overrides
|
|||||||
|
|
||||||
# Apply bang-bang key bindings based on current key binding mode
|
# Apply bang-bang key bindings based on current key binding mode
|
||||||
if [ "$fish_key_bindings" = fish_vi_key_bindings ]
|
if [ "$fish_key_bindings" = fish_vi_key_bindings ]
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !!
|
||||||
|
# @desc Expand to the previous command
|
||||||
bind -Minsert ! __history_previous_command
|
bind -Minsert ! __history_previous_command
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !$
|
||||||
|
# @desc Expand to the last argument of the previous command
|
||||||
bind -Minsert '$' __history_previous_command_arguments
|
bind -Minsert '$' __history_previous_command_arguments
|
||||||
else
|
else
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !!
|
||||||
|
# @desc Expand to the previous command
|
||||||
bind ! __history_previous_command
|
bind ! __history_previous_command
|
||||||
|
# @category History Expansion
|
||||||
|
# @name !$
|
||||||
|
# @desc Expand to the last argument of the previous command
|
||||||
bind '$' __history_previous_command_arguments
|
bind '$' __history_previous_command_arguments
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -77,7 +100,7 @@ end
|
|||||||
# Fish command history override to show timestamps
|
# Fish command history override to show timestamps
|
||||||
# Shadowing the history command is opinionated (C1 aliasing); when disabled,
|
# Shadowing the history command is opinionated (C1 aliasing); when disabled,
|
||||||
# the function is never defined and fish's stock history behavior applies.
|
# the function is never defined and fish's stock history behavior applies.
|
||||||
if __fish_config_op_enabled __fish_config_op_aliases
|
if __fish_config_op_enabled (status basename) aliases-tricks
|
||||||
function history
|
function history
|
||||||
builtin history --show-time='%F %T '
|
builtin history --show-time='%F %T '
|
||||||
end
|
end
|
||||||
@@ -100,23 +123,47 @@ end
|
|||||||
## Useful aliases
|
## Useful aliases
|
||||||
|
|
||||||
# Navigation short-cuts
|
# Navigation short-cuts
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc cd ..
|
||||||
alias ..='cd ..'
|
alias ..='cd ..'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc cd ../..
|
||||||
alias ...='cd ../..'
|
alias ...='cd ../..'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc cd ../../..
|
||||||
alias ....='cd ../../..'
|
alias ....='cd ../../..'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc cd ../../../..
|
||||||
alias .....='cd ../../../..'
|
alias .....='cd ../../../..'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc cd ../../../../..
|
||||||
alias ......='cd ../../../../..'
|
alias ......='cd ../../../../..'
|
||||||
|
|
||||||
# Silent flag injection into POSIX tools is opinionated (C1 aliasing)
|
# Silent flag injection into POSIX tools is opinionated (C1 aliasing)
|
||||||
if __fish_config_op_enabled __fish_config_op_aliases
|
if __fish_config_op_enabled (status basename) aliases-tricks
|
||||||
# Tools & Core command color overrides
|
# Tools & Core command color overrides
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc dir --color=auto
|
||||||
alias dir='dir --color=auto'
|
alias dir='dir --color=auto'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc vdir --color=auto
|
||||||
alias vdir='vdir --color=auto'
|
alias vdir='vdir --color=auto'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc grep --color=auto
|
||||||
alias grep='grep --color=auto'
|
alias grep='grep --color=auto'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc fgrep --color=auto
|
||||||
alias fgrep='fgrep --color=auto'
|
alias fgrep='fgrep --color=auto'
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc egrep --color=auto
|
||||||
alias egrep='egrep --color=auto'
|
alias egrep='egrep --color=auto'
|
||||||
|
|
||||||
# Safety aliases (Confirmation before overwriting/deleting)
|
# Safety aliases (Confirmation before overwriting/deleting)
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc cp -i
|
||||||
alias cp="cp -i"
|
alias cp="cp -i"
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc mv -i
|
||||||
alias mv="mv -i"
|
alias mv="mv -i"
|
||||||
|
|
||||||
# Force wget to resume partial downloads
|
# Force wget to resume partial downloads
|
||||||
@@ -124,9 +171,17 @@ if __fish_config_op_enabled __fish_config_op_aliases
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Archives and networking short-hands
|
# Archives and networking short-hands
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc tar -acf
|
||||||
alias tarnow='tar -acf '
|
alias tarnow='tar -acf '
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc tar -zxvf
|
||||||
alias untar='tar -zxvf '
|
alias untar='tar -zxvf '
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc nc termbin.com 9999
|
||||||
alias tb='nc termbin.com 9999'
|
alias tb='nc termbin.com 9999'
|
||||||
|
|
||||||
# System Logs
|
# System Logs
|
||||||
|
# @category Shell Aliases
|
||||||
|
# @desc journalctl -p 3 -xb
|
||||||
alias jctl="journalctl -p 3 -xb"
|
alias jctl="journalctl -p 3 -xb"
|
||||||
|
|||||||
+37
-28
@@ -5,44 +5,53 @@
|
|||||||
# see: https://github.com/ik11235/wakatime.fish
|
# see: https://github.com/ik11235/wakatime.fish
|
||||||
###
|
###
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# site wakatime-autoexec: autoexec/telemetry
|
||||||
|
# site wakatime-hook: integrations/notifications
|
||||||
|
|
||||||
|
# Registers a fish_postexec handler; that event is emitted only by the
|
||||||
|
# interactive reader, so the handler is dead weight in a script.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
# Local modification: opinionated guard (AGENTS.md Task #3). WakaTime
|
# Local modification: opinionated guard (AGENTS.md Task #3). WakaTime
|
||||||
# reporting is classified under both C2 auto-execution and C4 integrations;
|
# reporting is classified under both C2 auto-execution and C4 integrations;
|
||||||
# disabling either category skips registering the hook.
|
# disabling either category skips registering the hook.
|
||||||
__fish_config_op_enabled __fish_config_op_autoexec; or exit
|
__fish_config_op_enabled (status basename) wakatime-autoexec; or exit
|
||||||
__fish_config_op_enabled __fish_config_op_integrations; or exit
|
__fish_config_op_enabled (status basename) wakatime-hook; or exit
|
||||||
|
|
||||||
function __register_wakatime_fish_before_exec -e fish_postexec
|
function __register_wakatime_fish_before_exec -e fish_postexec
|
||||||
if set -q FISH_WAKATIME_DISABLED
|
if set -q FISH_WAKATIME_DISABLED
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
set -l exec_command_str
|
|
||||||
|
|
||||||
set exec_command_str (string split -f1 ' ' "$argv")
|
set -l exec_command_str
|
||||||
|
|
||||||
if test "$exec_command_str" = 'exit'
|
set exec_command_str (string split -f1 ' ' "$argv")
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
set -l PLUGIN_NAME "ik11235/wakatime.fish"
|
if test "$exec_command_str" = exit
|
||||||
set -l PLUGIN_VERSION "0.0.6"
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
set -l project
|
set -l PLUGIN_NAME "ik11235/wakatime.fish"
|
||||||
set -l wakatime_path
|
set -l PLUGIN_VERSION "0.0.6"
|
||||||
|
|
||||||
if type -p wakatime 2>&1 > /dev/null
|
set -l project
|
||||||
set wakatime_path (type -p wakatime)
|
set -l wakatime_path
|
||||||
else if type -p ~/.wakatime/wakatime-cli 2>&1 > /dev/null
|
|
||||||
set wakatime_path (type -p ~/.wakatime/wakatime-cli)
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
|
|
||||||
if git rev-parse --is-inside-work-tree &> /dev/null
|
if type -p wakatime 2>&1 >/dev/null
|
||||||
set project (basename (git rev-parse --show-toplevel))
|
set wakatime_path (type -p wakatime)
|
||||||
else
|
else if type -p ~/.wakatime/wakatime-cli 2>&1 >/dev/null
|
||||||
set project "Terminal"
|
set wakatime_path (type -p ~/.wakatime/wakatime-cli)
|
||||||
end
|
else
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
|
||||||
$wakatime_path --write --plugin "$PLUGIN_NAME/$PLUGIN_VERSION" --entity-type app --project "$project" --entity "$exec_command_str" &> /dev/null&; disown
|
if git rev-parse --is-inside-work-tree &>/dev/null
|
||||||
|
set project (basename (git rev-parse --show-toplevel))
|
||||||
|
else
|
||||||
|
set project Terminal
|
||||||
|
end
|
||||||
|
|
||||||
|
$wakatime_path --write --plugin "$PLUGIN_NAME/$PLUGIN_VERSION" --entity-type app --project "$project" --entity "$exec_command_str" &>/dev/null &
|
||||||
|
disown
|
||||||
end
|
end
|
||||||
|
|||||||
+40
-12
@@ -2,15 +2,24 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
#
|
#
|
||||||
# Generates ~/.local/bin/yay on first run (and on version bump) when
|
# Generates ~/.local/bin/yay on first run (and on version bump) when
|
||||||
# /usr/bin/yay is installed. The wrapper tees yay output to a
|
# yay is installed. The wrapper runs yay in a PTY so progress
|
||||||
# timestamped log file and prunes old logs, mirroring smart_exit behavior.
|
# bars are preserved, renders the captured animation to a clean static log
|
||||||
|
# (via scripts/clean_progress_log.py), and prunes old logs.
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# site yay-autoexec: autoexec/pkg-wrappers
|
||||||
|
# site yay-logging: logging/pkg-logs
|
||||||
|
|
||||||
|
# Defines nothing; its only effect is generating ~/.local/bin/yay, an
|
||||||
|
# idempotent write every interactive session already performs.
|
||||||
|
status is-interactive; or return
|
||||||
|
|
||||||
# Auto-generating a wrapper in ~/.local/bin is opinionated (C2 auto-exec).
|
# Auto-generating a wrapper in ~/.local/bin is opinionated (C2 auto-exec).
|
||||||
# Wrapper generation is also gated by C5 (Logging & Capture).
|
# Wrapper generation is also gated by C5 (Logging & Capture).
|
||||||
__fish_config_op_enabled __fish_config_op_autoexec; or return
|
__fish_config_op_enabled (status basename) yay-autoexec; or return
|
||||||
|
|
||||||
# C5 — Logging & Capture: remove generated wrapper and skip when logging is off
|
# C5 — Logging & Capture: remove generated wrapper and skip when logging is off
|
||||||
if not __fish_config_op_enabled __fish_config_op_logging
|
if not __fish_config_op_enabled (status basename) yay-logging
|
||||||
if test -f "$HOME/.local/bin/yay"
|
if test -f "$HOME/.local/bin/yay"
|
||||||
and grep -q "# yay-wrapper-version:" "$HOME/.local/bin/yay" 2>/dev/null
|
and grep -q "# yay-wrapper-version:" "$HOME/.local/bin/yay" 2>/dev/null
|
||||||
rm -f "$HOME/.local/bin/yay"
|
rm -f "$HOME/.local/bin/yay"
|
||||||
@@ -18,12 +27,13 @@ if not __fish_config_op_enabled __fish_config_op_logging
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
set -l _yay_real /usr/bin/yay
|
# Resolve the real yay binary, skipping our own shim (never /usr/bin-assumed).
|
||||||
|
set -l _yay_real (__fish_real_command yay)
|
||||||
set -l _yay_wrapper "$HOME/.local/bin/yay"
|
set -l _yay_wrapper "$HOME/.local/bin/yay"
|
||||||
set -l _yay_wrapper_version 1
|
set -l _yay_wrapper_version 6
|
||||||
|
|
||||||
# Skip entirely if the real yay binary isn't present
|
# Skip entirely if the real yay binary isn't present
|
||||||
test -x $_yay_real; or return
|
test -x "$_yay_real"; or return
|
||||||
|
|
||||||
# Check if wrapper already exists at the expected version
|
# Check if wrapper already exists at the expected version
|
||||||
if test -f $_yay_wrapper
|
if test -f $_yay_wrapper
|
||||||
@@ -38,22 +48,40 @@ printf '%s\n' \
|
|||||||
'#!/usr/bin/env bash' \
|
'#!/usr/bin/env bash' \
|
||||||
"# yay-wrapper-version: $_yay_wrapper_version" \
|
"# yay-wrapper-version: $_yay_wrapper_version" \
|
||||||
'# Auto-generated by conf.d/yay-wrapper.fish — do not edit by hand.' \
|
'# Auto-generated by conf.d/yay-wrapper.fish — do not edit by hand.' \
|
||||||
'# Tees yay output to a timestamped log file and prunes old ones.' \
|
'# Runs yay in a PTY via script(1) so progress bars are preserved on screen,' \
|
||||||
'set -o pipefail' \
|
'# then renders the captured terminal animation to a clean static log.' \
|
||||||
'' \
|
'' \
|
||||||
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
|
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
|
||||||
'mkdir -p "$log_dir"' \
|
'mkdir -p "$log_dir"' \
|
||||||
'log_file="$log_dir/yay_$(date +%Y-%m-%d_%H-%M-%S).log"' \
|
'log_file="$log_dir/yay_$(date +%Y-%m-%d_%H-%M-%S).log"' \
|
||||||
'' \
|
'' \
|
||||||
'/usr/bin/yay "$@" 2>&1 | tee "$log_file"' \
|
'# Build a safely-quoted command string for script(1).' \
|
||||||
|
'# script(1) allocates a PTY so yay detects a real terminal and shows progress.' \
|
||||||
|
"cmd_str=\"$_yay_real\"" \
|
||||||
|
'for arg in "$@"; do' \
|
||||||
|
' cmd_str+=" $(printf '"'"'%q'"'"' "$arg")"' \
|
||||||
|
done \
|
||||||
|
'script -q -e -c "$cmd_str" "$log_file"' \
|
||||||
|
'exit_code=$?' \
|
||||||
|
'' \
|
||||||
|
'# Render the captured terminal animation (progress bars repaint in place via' \
|
||||||
|
'# cursor moves) down to its final static frame, preserving ANSI color. Falls' \
|
||||||
|
'# back to dropping only the script(1) header/footer when python3 is missing.' \
|
||||||
|
'cleaner="${XDG_CONFIG_HOME:-$HOME/.config}/fish/scripts/clean_progress_log.py"' \
|
||||||
|
'if command -v python3 >/dev/null 2>&1 && [[ -f "$cleaner" ]]; then' \
|
||||||
|
' python3 "$cleaner" < "$log_file" > "${log_file}.tmp" 2>/dev/null && mv "${log_file}.tmp" "$log_file" || rm -f "${log_file}.tmp"' \
|
||||||
|
else \
|
||||||
|
' sed -i "/^Script \(started\|done\) on /d" "$log_file" 2>/dev/null || true' \
|
||||||
|
fi \
|
||||||
'' \
|
'' \
|
||||||
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
|
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
|
||||||
'mapfile -t logs < <(ls -1t "$log_dir"/yay_*.log 2>/dev/null)' \
|
'mapfile -t logs < <(ls -1t "$log_dir"/yay_*.log 2>/dev/null)' \
|
||||||
'excess=$(( ${#logs[@]} - max_files ))' \
|
'excess=$(( ${#logs[@]} - max_files ))' \
|
||||||
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
|
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
|
||||||
' rm -f "${logs[$i]}"' \
|
' rm -f "${logs[$i]}"' \
|
||||||
'done' \
|
done \
|
||||||
> $_yay_wrapper
|
'' \
|
||||||
|
'exit $exit_code' >$_yay_wrapper
|
||||||
|
|
||||||
chmod +x $_yay_wrapper
|
chmod +x $_yay_wrapper
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
#
|
||||||
|
# C5 — Logging & Capture: registers a fish_exit handler that dumps the current
|
||||||
|
# Zellij pane's scrollback to a log file when the shell exits. Unlike tmux
|
||||||
|
# (streamed live via pipe-pane), Zellij has no continuous-capture facility, so
|
||||||
|
# we snapshot once on exit via `zellij action dump-screen --full`.
|
||||||
|
#
|
||||||
|
# The handler is registered whenever fish runs inside Zellij; the C5 logging
|
||||||
|
# guard is evaluated inside _zellij_dump_log at exit time, so toggling
|
||||||
|
# __fish_config_op_logging takes effect on the next exit without a restart
|
||||||
|
# (no sync_logging coordination needed, since there is no live stream to stop).
|
||||||
|
#
|
||||||
|
# Event-handler functions must be defined at startup (conf.d) so the --on-event
|
||||||
|
# binding is registered; autoloaded functions in functions/ never register.
|
||||||
|
|
||||||
|
status is-interactive; or exit
|
||||||
|
type -q zellij; or exit
|
||||||
|
set -q ZELLIJ; or exit
|
||||||
|
|
||||||
|
function __zellij_dump_on_exit --on-event fish_exit \
|
||||||
|
--description 'C5 event handler: dump Zellij pane scrollback on shell exit'
|
||||||
|
_zellij_dump_log
|
||||||
|
end
|
||||||
+4
-1
@@ -3,6 +3,9 @@
|
|||||||
# Adapted from icezyclon/zoxide.fish (MIT)
|
# Adapted from icezyclon/zoxide.fish (MIT)
|
||||||
# Heavily customized for Fish 4.x compatibility and performance
|
# Heavily customized for Fish 4.x compatibility and performance
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# aliases/filesystem
|
||||||
|
|
||||||
if status is-interactive
|
if status is-interactive
|
||||||
|
|
||||||
if type -q zoxide
|
if type -q zoxide
|
||||||
@@ -65,7 +68,7 @@ if status is-interactive
|
|||||||
|
|
||||||
# Shadowing cd with zoxide is opinionated (C1 aliasing); z and zi
|
# Shadowing cd with zoxide is opinionated (C1 aliasing); z and zi
|
||||||
# remain available either way.
|
# remain available either way.
|
||||||
if __fish_config_op_enabled __fish_config_op_aliases
|
if __fish_config_op_enabled (status basename)
|
||||||
alias cd=z
|
alias cd=z
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+107
-74
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
# ───────────────────── Opinionated component guards ─────────────────────
|
# ───────────────────── Opinionated component guards ─────────────────────
|
||||||
# Opinionated components (AGENTS.md Task #3) are wrapped in
|
# Opinionated components (AGENTS.md Task #3) are wrapped in
|
||||||
# __fish_config_op_enabled <category> guards throughout this file and conf.d/.
|
# __fish_config_op_enabled <identity> [<site>] guards throughout this file and conf.d/.
|
||||||
# The helper always evaluates the master switch __fish_config_opinionated
|
# The helper always evaluates the master switch __fish_config_opinionated
|
||||||
# first (falsy disables everything), then the per-category opt-out variable:
|
# first (falsy disables everything), then the per-category opt-out variable:
|
||||||
# __fish_config_op_aliases C1 — command shadows / flag injection
|
# __fish_config_op_aliases C1 — command shadows / flag injection
|
||||||
@@ -15,15 +15,30 @@
|
|||||||
# __fish_config_op_overrides C3 — key bindings, env, prompt overrides
|
# __fish_config_op_overrides C3 — key bindings, env, prompt overrides
|
||||||
# __fish_config_op_integrations C4 — terminal/tool coupling
|
# __fish_config_op_integrations C4 — terminal/tool coupling
|
||||||
# __fish_config_op_logging C5 — scrollback capture / AUR log wrappers
|
# __fish_config_op_logging C5 — scrollback capture / AUR log wrappers
|
||||||
|
# (opt-in: unset means OFF)
|
||||||
# __fish_config_op_greeting C6 — per-session greeting / first-run welcome
|
# __fish_config_op_greeting C6 — per-session greeting / first-run welcome
|
||||||
# Example: set -U __fish_config_op_aliases off (erase to re-enable)
|
# Example: set -U __fish_config_op_aliases off (erase to re-enable)
|
||||||
|
# C5 is the one exception: it defaults to disabled and needs an explicit
|
||||||
|
# truthy value — set -U __fish_config_op_logging on
|
||||||
|
|
||||||
|
# COMPONENT
|
||||||
|
# site cachyos-tricks: overrides/environment
|
||||||
|
# site cachyos-strip-aliases: aliases/filesystem
|
||||||
|
# site cachyos-strip-overrides: overrides/key-bindings
|
||||||
|
# site privacy: overrides/privacy
|
||||||
|
# site pager-editor-gpg: overrides/environment
|
||||||
|
# site exit-wiring: overrides/key-bindings
|
||||||
|
# site path-setup: overrides/environment
|
||||||
|
# site cdpath: overrides/environment
|
||||||
|
# site vi-mode: overrides/key-bindings
|
||||||
|
# site greeting-stamp: greeting/greeting-message
|
||||||
|
|
||||||
# ──────────────────────── Source CachyOS configs ────────────────────────
|
# ──────────────────────── Source CachyOS configs ────────────────────────
|
||||||
if test -f /usr/share/cachyos-fish-config/cachyos-config.fish
|
if test -f /usr/share/cachyos-fish-config/cachyos-config.fish
|
||||||
source /usr/share/cachyos-fish-config/cachyos-config.fish
|
source /usr/share/cachyos-fish-config/cachyos-config.fish
|
||||||
# Surgically overriding the distro config is opinionated (C3 overrides):
|
# Surgically overriding the distro config is opinionated (C3 overrides):
|
||||||
# skip it entirely when overrides are disabled, keeping CachyOS defaults.
|
# skip it entirely when overrides are disabled, keeping CachyOS defaults.
|
||||||
if __fish_config_op_enabled __fish_config_op_overrides
|
if __fish_config_op_enabled (status basename) cachyos-tricks
|
||||||
# Source our tricks over the cachyOS config
|
# Source our tricks over the cachyOS config
|
||||||
test -f "$__fish_config_dir/conf.d/tricks.fish"
|
test -f "$__fish_config_dir/conf.d/tricks.fish"
|
||||||
and source "$__fish_config_dir/conf.d/tricks.fish"
|
and source "$__fish_config_dir/conf.d/tricks.fish"
|
||||||
@@ -38,7 +53,7 @@ if test -f /usr/share/cachyos-fish-config/cachyos-config.fish
|
|||||||
# The distro config ships opinionated pieces of its own (it is the origin
|
# The distro config ships opinionated pieces of its own (it is the origin
|
||||||
# of tricks.fish); strip them when the matching category is disabled so
|
# of tricks.fish); strip them when the matching category is disabled so
|
||||||
# the guards hold on CachyOS systems too.
|
# the guards hold on CachyOS systems too.
|
||||||
if not __fish_config_op_enabled __fish_config_op_aliases
|
if not __fish_config_op_enabled (status basename) cachyos-strip-aliases
|
||||||
for _fname in grep fgrep egrep dir vdir wget
|
for _fname in grep fgrep egrep dir vdir wget
|
||||||
functions -q $_fname; and functions --erase $_fname
|
functions -q $_fname; and functions --erase $_fname
|
||||||
end
|
end
|
||||||
@@ -50,7 +65,7 @@ if test -f /usr/share/cachyos-fish-config/cachyos-config.fish
|
|||||||
and source $__fish_data_dir/functions/$_fname.fish
|
and source $__fish_data_dir/functions/$_fname.fish
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not __fish_config_op_enabled __fish_config_op_overrides
|
if not __fish_config_op_enabled (status basename) cachyos-strip-overrides
|
||||||
for _fname in __history_previous_command __history_previous_command_arguments
|
for _fname in __history_previous_command __history_previous_command_arguments
|
||||||
functions -q $_fname; and functions --erase $_fname
|
functions -q $_fname; and functions --erase $_fname
|
||||||
end
|
end
|
||||||
@@ -64,66 +79,84 @@ set --erase _fname
|
|||||||
|
|
||||||
# ───────────────────────────── XDG variables ────────────────────────────
|
# ───────────────────────────── XDG variables ────────────────────────────
|
||||||
# XDG Base Directory variables (standard practice)
|
# XDG Base Directory variables (standard practice)
|
||||||
set -gx XDG_CONFIG_HOME $HOME/.config # Sets default config dir to ~/.config
|
# We set these unconditionally to ensure a consistent baseline, but only if
|
||||||
set -gx XDG_CACHE_HOME $HOME/.cache # Sets default cache dir to ~/.cache
|
# they are not already defined by the system/user.
|
||||||
set -gx XDG_DATA_HOME $HOME/.local/share # Sets default data dir to ~/.local/share
|
set -q XDG_CONFIG_HOME; or set -gx XDG_CONFIG_HOME $HOME/.config # Sets default config dir to ~/.config
|
||||||
set -gx XDG_STATE_HOME $HOME/.local/state # Sets default state dir to ~/.local/state
|
set -q XDG_CACHE_HOME; or set -gx XDG_CACHE_HOME $HOME/.cache # Sets default cache dir to ~/.cache
|
||||||
|
set -q XDG_DATA_HOME; or set -gx XDG_DATA_HOME $HOME/.local/share # Sets default data dir to ~/.local/share
|
||||||
|
set -q XDG_STATE_HOME; or set -gx XDG_STATE_HOME $HOME/.local/state # Sets default state dir to ~/.local/state
|
||||||
|
|
||||||
# Attempt to keep various config/cache files out of the home directory root
|
# Attempt to keep various config/cache files out of the home directory root
|
||||||
set -gx RANDFILE "$XDG_STATE_HOME/rnd"
|
set -q RANDFILE; or set -gx RANDFILE "$XDG_STATE_HOME/rnd"
|
||||||
set -gx WGETRC "$XDG_CONFIG_HOME/wget/wgetrc"
|
set -q WGETRC; or set -gx WGETRC "$XDG_CONFIG_HOME/wget/wgetrc"
|
||||||
set -gx WGET_HSTS_FILE "$XDG_CACHE_HOME/wget-hsts"
|
set -q WGET_HSTS_FILE; or set -gx WGET_HSTS_FILE "$XDG_CACHE_HOME/wget-hsts"
|
||||||
set -gx NPM_CONFIG_PREFIX "$XDG_DATA_HOME/npm-global"
|
set -q NPM_CONFIG_PREFIX; or set -gx NPM_CONFIG_PREFIX "$XDG_DATA_HOME/npm-global"
|
||||||
set -gx NPM_CONFIG_USERCONFIG "$XDG_CONFIG_HOME/npm/npmrc"
|
set -q NPM_CONFIG_USERCONFIG; or set -gx NPM_CONFIG_USERCONFIG "$XDG_CONFIG_HOME/npm/npmrc"
|
||||||
set -gx ANDROID_USER_HOME "$XDG_DATA_HOME/android"
|
set -q ANDROID_USER_HOME; or set -gx ANDROID_USER_HOME "$XDG_DATA_HOME/android"
|
||||||
set -gx CARGO_HOME "$XDG_DATA_HOME/cargo"
|
set -q CARGO_HOME; or set -gx CARGO_HOME "$XDG_DATA_HOME/cargo"
|
||||||
set -gx RUSTUP_HOME "$XDG_DATA_HOME/rustup"
|
set -q RUSTUP_HOME; or set -gx RUSTUP_HOME "$XDG_DATA_HOME/rustup"
|
||||||
set -gx GOPATH "$XDG_DATA_HOME/go"
|
set -q GOPATH; or set -gx GOPATH "$XDG_DATA_HOME/go"
|
||||||
set -gx BUN_INSTALL "$XDG_DATA_HOME/bun"
|
set -q BUN_INSTALL; or set -gx BUN_INSTALL "$XDG_DATA_HOME/bun"
|
||||||
set -gx GNUPGHOME "$XDG_CONFIG_HOME/gnupg"
|
set -q GNUPGHOME; or set -gx GNUPGHOME "$XDG_CONFIG_HOME/gnupg"
|
||||||
set -gx WAKATIME_HOME "$XDG_CONFIG_HOME/wakatime"
|
set -q WAKATIME_HOME; or set -gx WAKATIME_HOME "$XDG_CONFIG_HOME/wakatime"
|
||||||
set -gx HISTFILE "$XDG_STATE_HOME/bash_history"
|
set -q HISTFILE; or set -gx HISTFILE "$XDG_STATE_HOME/bash_history"
|
||||||
set -gx EXINIT "set viminfofile=$XDG_STATE_HOME/vim/viminfo | source $MYVIMRC"
|
set -q EXINIT; or set -gx EXINIT "set viminfofile=$XDG_STATE_HOME/vim/viminfo | source $MYVIMRC"
|
||||||
set -gx NVIDIA_SETTINGS_RW_CONFIG_FILE "$XDG_CONFIG_HOME/nvidia/settings"
|
set -q NVIDIA_SETTINGS_RW_CONFIG_FILE; or set -gx NVIDIA_SETTINGS_RW_CONFIG_FILE "$XDG_CONFIG_HOME/nvidia/settings"
|
||||||
set -gx CODEIUM_HOME "$XDG_CONFIG_HOME/codeium"
|
set -q CODEIUM_HOME; or set -gx CODEIUM_HOME "$XDG_CONFIG_HOME/codeium"
|
||||||
set -gx WORDLIST "$XDG_CONFIG_HOME/hunspell_en_US"
|
set -q WORDLIST; or set -gx WORDLIST "$XDG_CONFIG_HOME/hunspell_en_US"
|
||||||
|
|
||||||
|
# ───────────────────────── Privacy variables ────────────────────────────
|
||||||
|
# Global telemetry opt-out variables (C3 overrides: privacy)
|
||||||
|
# Various CLI tools, runtimes, and AI-agent tools respect these variables.
|
||||||
|
if __fish_config_op_enabled (status basename) privacy
|
||||||
|
set -gx DO_NOT_TRACK 1
|
||||||
|
set -gx DISABLE_TELEMETRY 1
|
||||||
|
end
|
||||||
|
|
||||||
# ─────────────────────────── Pager variables ────────────────────────────
|
# ─────────────────────────── Pager variables ────────────────────────────
|
||||||
# Overriding $PAGER is opinionated (C3 overrides)
|
# Overriding $PAGER, $EDITOR, and $GPG_TTY is opinionated (C3 overrides)
|
||||||
if __fish_config_op_enabled __fish_config_op_overrides
|
if __fish_config_op_enabled (status basename) pager-editor-gpg
|
||||||
if type -q ov
|
if type -q ov
|
||||||
set -gx PAGER ov
|
set -gx PAGER ov
|
||||||
else if type -q less
|
else if type -q less
|
||||||
set -gx PAGER less
|
set -gx PAGER less
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
# ─────────────────────────── Editor variables ───────────────────────────
|
# ─────────────────────────── Editor variables ───────────────────────────
|
||||||
# Set Editor variables with fallback to vi if nvim isn't available. This ensures that
|
# Set Editor variables with fallback to vi if nvim isn't available. This ensures that
|
||||||
# tools that rely on these variables (like git commit messages) will work out of the box,
|
# tools that rely on these variables (like git commit messages) will work out of the box,
|
||||||
# while still preferring nvim if it's installed.
|
# while still preferring nvim if it's installed.
|
||||||
if type -q nvim
|
if type -q nvim
|
||||||
set -gx NVIM_APPNAME nvim
|
set -gx NVIM_APPNAME nvim
|
||||||
set -gx EDITOR (command -s nvim)
|
set -gx EDITOR (command -s nvim)
|
||||||
else
|
else
|
||||||
set -gx EDITOR (command -s vi)
|
set -gx EDITOR (command -s vi)
|
||||||
end
|
end
|
||||||
set -gx VISUAL $EDITOR
|
# set -gx VISUAL $EDITOR # <- Use local.fish to set your preferred GUI editor.
|
||||||
set -gx SUDO_EDITOR $EDITOR
|
set -gx SUDO_EDITOR $EDITOR
|
||||||
|
|
||||||
# ──────────────────────────── GPG variables ─────────────────────────────
|
# ──────────────────────────── GPG variables ─────────────────────────────
|
||||||
# Helps ensure that GPG can prompt for passphrases correctly when invoked from the terminal.
|
# Helps ensure that GPG can prompt for passphrases correctly when invoked from the terminal.
|
||||||
set -gx GPG_TTY (tty)
|
set -gx GPG_TTY (tty)
|
||||||
|
end
|
||||||
|
|
||||||
# ────────────────────────── Scrollback History ──────────────────────────
|
# ────────────────────────── Scrollback History ──────────────────────────
|
||||||
# Directory where scrollback history is saved into log files.
|
# Optional fish-style source of truth (set -U via config-settings); exported
|
||||||
|
# for the POSIX wrappers (paru/yay/tmux/zellij/_prune_terminal_logs) that read
|
||||||
|
# them. We export the default unconditionally, then override from the universal
|
||||||
|
# var only if set — deliberately NOT creating a global, which would shadow the
|
||||||
|
# universal and stop live edits (config-settings → Paths) from taking effect.
|
||||||
set -gx SCROLLBACK_HISTORY_DIR "$HOME/.terminal_history"
|
set -gx SCROLLBACK_HISTORY_DIR "$HOME/.terminal_history"
|
||||||
# Maximum number of scrollback history files to keep
|
set -q __fish_scrollback_history_dir
|
||||||
|
and set -gx SCROLLBACK_HISTORY_DIR $__fish_scrollback_history_dir
|
||||||
|
|
||||||
set -gx SCROLLBACK_HISTORY_MAX_FILES 100
|
set -gx SCROLLBACK_HISTORY_MAX_FILES 100
|
||||||
|
set -q __fish_scrollback_history_max_files
|
||||||
|
and set -gx SCROLLBACK_HISTORY_MAX_FILES $__fish_scrollback_history_max_files
|
||||||
# Wire up a clean exit function that won't fire on background subshells
|
# Wire up a clean exit function that won't fire on background subshells
|
||||||
# Replacing the exit builtin is opinionated (C3 overrides); smart_exit also
|
# Replacing the exit builtin is opinionated (C3 overrides); smart_exit also
|
||||||
# guards itself so a live toggle takes effect without restarting the shell.
|
# guards itself so a live toggle takes effect without restarting the shell.
|
||||||
if status is-interactive; and __fish_config_op_enabled __fish_config_op_overrides
|
if status is-interactive; and __fish_config_op_enabled (status basename) exit-wiring
|
||||||
function exit --description 'Safe interactive exit'
|
function exit --description 'Safe interactive exit'
|
||||||
# If the smart_exit file exists in our function path, invoke it explicitly
|
# If the smart_exit file exists in our function path, invoke it explicitly
|
||||||
if functions -q smart_exit
|
if functions -q smart_exit
|
||||||
@@ -139,16 +172,19 @@ end
|
|||||||
# Adds common user bin directories to the PATH. The -mg --move option for cargo ensures that
|
# Adds common user bin directories to the PATH. The -mg --move option for cargo ensures that
|
||||||
# the cargo bin directory is moved to the end of the PATH, which can help avoid conflicts
|
# the cargo bin directory is moved to the end of the PATH, which can help avoid conflicts
|
||||||
# with system-installed Rust tools while still allowing user-installed cargo binaries to be found.
|
# with system-installed Rust tools while still allowing user-installed cargo binaries to be found.
|
||||||
fish_add_path $HOME/.local/bin # Standard user-local executables (XDG spec)
|
# PATH setup is opinionated (C3 overrides)
|
||||||
fish_add_path $HOME/.local/share/../bin # Alternative/legacy path for local user binaries
|
if __fish_config_op_enabled (status basename) path-setup
|
||||||
fish_add_path $HOME/Applications # User-installed applications and standalone apps
|
fish_add_path $HOME/.local/bin # Standard user-local executables (XDG spec)
|
||||||
fish_add_path $HOME/scripts # Custom personal shell scripts and automation
|
fish_add_path $HOME/.local/share/../bin # Alternative/legacy path for local user binaries
|
||||||
fish_add_path -mga $CARGO_HOME/bin # Rust binaries and tools installed via Cargo
|
fish_add_path $HOME/Applications # User-installed applications and standalone apps
|
||||||
fish_add_path $BUN_INSTALL/bin # Bun runtime executables and globally installed packages
|
fish_add_path $HOME/scripts # Custom personal shell scripts and automation
|
||||||
fish_add_path $XDG_DATA_HOME/npm-global/bin # Global Node.js/npm packages (XDG compliant location)
|
fish_add_path -mga $CARGO_HOME/bin # Rust binaries and tools installed via Cargo
|
||||||
fish_add_path $HOME/.lmstudio/bin # LM Studio CLI tools for local LLM management
|
fish_add_path $BUN_INSTALL/bin # Bun runtime executables and globally installed packages
|
||||||
fish_add_path $HOME/.resend/bin # Resend email service CLI tools
|
fish_add_path $XDG_DATA_HOME/npm-global/bin # Global Node.js/npm packages (XDG compliant location)
|
||||||
fish_add_path $HOME/.fzf/bin # Fuzzy Finder (fzf) core binary and helper scripts
|
fish_add_path $HOME/.lmstudio/bin # LM Studio CLI tools for local LLM management
|
||||||
|
fish_add_path $HOME/.resend/bin # Resend email service CLI tools
|
||||||
|
fish_add_path $HOME/.fzf/bin # Fuzzy Finder (fzf) core binary and helper scripts
|
||||||
|
end
|
||||||
|
|
||||||
# ───────────────────────── CDPATH projects dir ──────────────────────────
|
# ───────────────────────── CDPATH projects dir ──────────────────────────
|
||||||
# Allows cd-ing to directories within $HOME/projects or $HOME without needing to specify the full path.
|
# Allows cd-ing to directories within $HOME/projects or $HOME without needing to specify the full path.
|
||||||
@@ -160,7 +196,7 @@ fish_add_path $HOME/.fzf/bin # Fuzzy Finder (fzf) core binary an
|
|||||||
# so if you have a directory named 'myproject' in the current directory,
|
# so if you have a directory named 'myproject' in the current directory,
|
||||||
# running 'cd myproject' will take you there instead of $HOME/projects/myproject.
|
# running 'cd myproject' will take you there instead of $HOME/projects/myproject.
|
||||||
# CDPATH injection is opinionated (C3 overrides)
|
# CDPATH injection is opinionated (C3 overrides)
|
||||||
if __fish_config_op_enabled __fish_config_op_overrides
|
if __fish_config_op_enabled (status basename) cdpath
|
||||||
set -gx CDPATH . $HOME/projects $HOME
|
set -gx CDPATH . $HOME/projects $HOME
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -175,7 +211,7 @@ if status is-interactive
|
|||||||
# This is optional but can improve the user experience for those who prefer Vi-style key bindings.
|
# This is optional but can improve the user experience for those who prefer Vi-style key bindings.
|
||||||
# Global Vi mode is opinionated (C3 overrides); without it fish keeps its
|
# Global Vi mode is opinionated (C3 overrides); without it fish keeps its
|
||||||
# default Emacs-style bindings.
|
# default Emacs-style bindings.
|
||||||
if __fish_config_op_enabled __fish_config_op_overrides
|
if __fish_config_op_enabled (status basename) vi-mode
|
||||||
set -g fish_key_bindings fish_vi_key_bindings
|
set -g fish_key_bindings fish_vi_key_bindings
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -215,30 +251,27 @@ if status is-interactive
|
|||||||
# │ This is useful for machine-specific behavior or configurations. │
|
# │ This is useful for machine-specific behavior or configurations. │
|
||||||
# ╰────────────────────────────── OVERRIDES ─────────────────────────────╯
|
# ╰────────────────────────────── OVERRIDES ─────────────────────────────╯
|
||||||
#
|
#
|
||||||
# Define user-dots path variable for a more legible secrets/local config.
|
# Resolve user-dots path. Customize via: set -U __fish_user_dots_path /your/path
|
||||||
set -l dot_fish "$XDG_CONFIG_HOME/.user-dots/fish"
|
set -q __fish_user_dots_path
|
||||||
# ───────────────────────── Source user secrets ──────────────────────────
|
or set -l __fish_user_dots_path "$XDG_CONFIG_HOME/.user-dots/fish"
|
||||||
# Sources a secrets.fish file if it exists, which can be used to store
|
# ────────────────────── user-dots convenience symlink ───────────────────
|
||||||
# sensitive environment variables and configurations that shouldn't be
|
# Keep $__fish_config_dir/user-dots tracking the resolved path so it can be
|
||||||
# committed to version control.
|
# browsed from the fish config dir. Git-ignored. Controlled by the
|
||||||
# This allows you to keep things like API keys, database credentials,
|
# __fish_user_dots_symlink toggle (config-settings → Paths); creation is a
|
||||||
# and other secrets out of your main config files and safely ignored by git.
|
# C2 side-effect, removal-on-opt-out is honoured regardless. See the helper.
|
||||||
test -f "$dot_fish/secrets.fish"; and source "$dot_fish/secrets.fish"
|
__fish_user_dots_link
|
||||||
|
|
||||||
# ─────────────────────── Source machine-local config ────────────────────
|
# ─────────────────────── Source machine-local config ────────────────────
|
||||||
# Sources a local.fish file if it exists, which can be used for machine-specific
|
# Sources local.fish if it exists. That file handles sourcing its own
|
||||||
# variables and configurations that shouldn't be shared across machines.
|
# secrets.fish companion when needed.
|
||||||
# This allows you to have different settings on different machines without affecting
|
test -f "$__fish_user_dots_path/local.fish"; and source "$__fish_user_dots_path/local.fish"
|
||||||
# your main config or secrets files. For example, you might want different PATH additions,
|
|
||||||
# aliases, or environment variables on your work laptop vs. your home desktop.
|
|
||||||
test -f "$dot_fish/local.fish"; and source "$dot_fish/local.fish"
|
|
||||||
|
|
||||||
# ─────────────────── C6: Greeting & First-Run UI override ───────────────
|
# ─────────────────── C6: Greeting & First-Run UI override ───────────────
|
||||||
# When the greeting category is disabled, stamp out any fish_greeting
|
# When the greeting category is disabled, stamp out any fish_greeting
|
||||||
# function that distro configs set (e.g., CachyOS defines it as fastfetch).
|
# function that distro configs set (e.g., CachyOS defines it as fastfetch).
|
||||||
# This runs last inside the interactive block so our empty definition wins
|
# This runs last inside the interactive block so our empty definition wins
|
||||||
# over whatever cachyos-config.fish or vendor conf.d installed.
|
# over whatever cachyos-config.fish or vendor conf.d installed.
|
||||||
if not __fish_config_op_enabled __fish_config_op_greeting
|
if not __fish_config_op_enabled (status basename) greeting-stamp
|
||||||
function fish_greeting
|
function fish_greeting
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
admiring
|
||||||
|
adoring
|
||||||
|
affectionate
|
||||||
|
agitated
|
||||||
|
amazing
|
||||||
|
angry
|
||||||
|
awesome
|
||||||
|
beautiful
|
||||||
|
blissful
|
||||||
|
bold
|
||||||
|
boring
|
||||||
|
brave
|
||||||
|
busy
|
||||||
|
charming
|
||||||
|
clever
|
||||||
|
compassionate
|
||||||
|
competent
|
||||||
|
condescending
|
||||||
|
confident
|
||||||
|
cool
|
||||||
|
cranky
|
||||||
|
crazy
|
||||||
|
dazzling
|
||||||
|
determined
|
||||||
|
distracted
|
||||||
|
dreamy
|
||||||
|
eager
|
||||||
|
ecstatic
|
||||||
|
elastic
|
||||||
|
elated
|
||||||
|
elegant
|
||||||
|
eloquent
|
||||||
|
epic
|
||||||
|
exciting
|
||||||
|
fervent
|
||||||
|
festive
|
||||||
|
flamboyant
|
||||||
|
focused
|
||||||
|
friendly
|
||||||
|
frosty
|
||||||
|
funny
|
||||||
|
gallant
|
||||||
|
gifted
|
||||||
|
goofy
|
||||||
|
gracious
|
||||||
|
great
|
||||||
|
happy
|
||||||
|
hardcore
|
||||||
|
heuristic
|
||||||
|
hopeful
|
||||||
|
hungry
|
||||||
|
infallible
|
||||||
|
inspiring
|
||||||
|
intelligent
|
||||||
|
interesting
|
||||||
|
jolly
|
||||||
|
jovial
|
||||||
|
keen
|
||||||
|
kind
|
||||||
|
laughing
|
||||||
|
loving
|
||||||
|
lucid
|
||||||
|
magical
|
||||||
|
modest
|
||||||
|
musing
|
||||||
|
mystifying
|
||||||
|
naughty
|
||||||
|
nervous
|
||||||
|
nice
|
||||||
|
nifty
|
||||||
|
nostalgic
|
||||||
|
objective
|
||||||
|
optimistic
|
||||||
|
peaceful
|
||||||
|
pedantic
|
||||||
|
pensive
|
||||||
|
practical
|
||||||
|
priceless
|
||||||
|
quirky
|
||||||
|
quizzical
|
||||||
|
recursing
|
||||||
|
relaxed
|
||||||
|
reverent
|
||||||
|
romantic
|
||||||
|
sad
|
||||||
|
serene
|
||||||
|
sharp
|
||||||
|
silly
|
||||||
|
sleepy
|
||||||
|
stoic
|
||||||
|
strange
|
||||||
|
stupefied
|
||||||
|
suspicious
|
||||||
|
sweet
|
||||||
|
tender
|
||||||
|
thirsty
|
||||||
|
trusting
|
||||||
|
unruffled
|
||||||
|
upbeat
|
||||||
|
vibrant
|
||||||
|
vigilant
|
||||||
|
vigorous
|
||||||
|
wizardly
|
||||||
|
wonderful
|
||||||
|
xenodochial
|
||||||
|
youthful
|
||||||
|
zealous
|
||||||
|
zen
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
aardvark
|
||||||
|
albatross
|
||||||
|
alligator
|
||||||
|
alpaca
|
||||||
|
ant
|
||||||
|
anteater
|
||||||
|
antelope
|
||||||
|
ape
|
||||||
|
armadillo
|
||||||
|
baboon
|
||||||
|
badger
|
||||||
|
barracuda
|
||||||
|
bat
|
||||||
|
bear
|
||||||
|
beaver
|
||||||
|
bee
|
||||||
|
bison
|
||||||
|
boar
|
||||||
|
buffalo
|
||||||
|
butterfly
|
||||||
|
camel
|
||||||
|
capybara
|
||||||
|
caribou
|
||||||
|
cat
|
||||||
|
caterpillar
|
||||||
|
cattle
|
||||||
|
chamois
|
||||||
|
cheetah
|
||||||
|
chicken
|
||||||
|
chimpanzee
|
||||||
|
chinchilla
|
||||||
|
chough
|
||||||
|
clam
|
||||||
|
cobra
|
||||||
|
cockroach
|
||||||
|
cod
|
||||||
|
cormorant
|
||||||
|
coyote
|
||||||
|
crab
|
||||||
|
crane
|
||||||
|
crocodile
|
||||||
|
crow
|
||||||
|
curlew
|
||||||
|
deer
|
||||||
|
dinosaur
|
||||||
|
dog
|
||||||
|
dogfish
|
||||||
|
dolphin
|
||||||
|
donkey
|
||||||
|
dotterel
|
||||||
|
dove
|
||||||
|
dragonfly
|
||||||
|
duck
|
||||||
|
dugong
|
||||||
|
dunlin
|
||||||
|
eagle
|
||||||
|
echidna
|
||||||
|
eel
|
||||||
|
eland
|
||||||
|
elephant
|
||||||
|
elk
|
||||||
|
emu
|
||||||
|
falcon
|
||||||
|
ferret
|
||||||
|
finch
|
||||||
|
fish
|
||||||
|
flamingo
|
||||||
|
fly
|
||||||
|
fox
|
||||||
|
frog
|
||||||
|
gaur
|
||||||
|
gazelle
|
||||||
|
gerbil
|
||||||
|
giraffe
|
||||||
|
gnat
|
||||||
|
gnu
|
||||||
|
goat
|
||||||
|
goldfinch
|
||||||
|
goldfish
|
||||||
|
goose
|
||||||
|
gorilla
|
||||||
|
goshawk
|
||||||
|
grasshopper
|
||||||
|
grouse
|
||||||
|
guanaco
|
||||||
|
gull
|
||||||
|
hamster
|
||||||
|
hare
|
||||||
|
hawk
|
||||||
|
hedgehog
|
||||||
|
heron
|
||||||
|
herring
|
||||||
|
hippopotamus
|
||||||
|
hornet
|
||||||
|
horse
|
||||||
|
human
|
||||||
|
hummingbird
|
||||||
|
hyena
|
||||||
|
ibex
|
||||||
|
ibis
|
||||||
|
jackal
|
||||||
|
jaguar
|
||||||
|
jay
|
||||||
|
jellyfish
|
||||||
|
kangaroo
|
||||||
|
kingfisher
|
||||||
|
koala
|
||||||
|
kookabura
|
||||||
|
kouprey
|
||||||
|
kudu
|
||||||
|
lapwing
|
||||||
|
lark
|
||||||
|
lemur
|
||||||
|
leopard
|
||||||
|
lion
|
||||||
|
llama
|
||||||
|
lobster
|
||||||
|
locust
|
||||||
|
loris
|
||||||
|
louse
|
||||||
|
lyrebird
|
||||||
|
magpie
|
||||||
|
mallard
|
||||||
|
manatee
|
||||||
|
mandrill
|
||||||
|
mantis
|
||||||
|
marten
|
||||||
|
meerkat
|
||||||
|
mink
|
||||||
|
mole
|
||||||
|
mongoose
|
||||||
|
monkey
|
||||||
|
moose
|
||||||
|
mosquito
|
||||||
|
mouse
|
||||||
|
mule
|
||||||
|
narwhal
|
||||||
|
newt
|
||||||
|
nightingale
|
||||||
|
octopus
|
||||||
|
okapi
|
||||||
|
opossum
|
||||||
|
oryx
|
||||||
|
ostrich
|
||||||
|
otter
|
||||||
|
owl
|
||||||
|
oyster
|
||||||
|
panther
|
||||||
|
parrot
|
||||||
|
partridge
|
||||||
|
peafowl
|
||||||
|
pelican
|
||||||
|
penguin
|
||||||
|
pheasant
|
||||||
|
pig
|
||||||
|
pigeon
|
||||||
|
pony
|
||||||
|
porcupine
|
||||||
|
porpoise
|
||||||
|
quail
|
||||||
|
quelea
|
||||||
|
quetzal
|
||||||
|
rabbit
|
||||||
|
raccoon
|
||||||
|
rail
|
||||||
|
ram
|
||||||
|
rat
|
||||||
|
raven
|
||||||
|
red-deer
|
||||||
|
red-panda
|
||||||
|
reindeer
|
||||||
|
rhinoceros
|
||||||
|
rook
|
||||||
|
salamander
|
||||||
|
salmon
|
||||||
|
sand-dollar
|
||||||
|
sandpiper
|
||||||
|
sardine
|
||||||
|
scorpion
|
||||||
|
seahorse
|
||||||
|
seal
|
||||||
|
shark
|
||||||
|
sheep
|
||||||
|
shrew
|
||||||
|
skunk
|
||||||
|
snail
|
||||||
|
snake
|
||||||
|
sparrow
|
||||||
|
spider
|
||||||
|
spoonbill
|
||||||
|
squid
|
||||||
|
squirrel
|
||||||
|
starling
|
||||||
|
stingray
|
||||||
|
stinkbug
|
||||||
|
stork
|
||||||
|
swallow
|
||||||
|
swan
|
||||||
|
tapir
|
||||||
|
tarsier
|
||||||
|
termite
|
||||||
|
tiger
|
||||||
|
toad
|
||||||
|
trout
|
||||||
|
turkey
|
||||||
|
turtle
|
||||||
|
viper
|
||||||
|
vulture
|
||||||
|
wallaby
|
||||||
|
walrus
|
||||||
|
wasp
|
||||||
|
weasel
|
||||||
|
whale
|
||||||
|
wildcat
|
||||||
|
wolf
|
||||||
|
wolverine
|
||||||
|
wombat
|
||||||
|
woodcock
|
||||||
|
woodpecker
|
||||||
|
worm
|
||||||
|
wren
|
||||||
|
yak
|
||||||
|
zebra
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
amber
|
||||||
|
amethyst
|
||||||
|
apricot
|
||||||
|
aqua
|
||||||
|
aquamarine
|
||||||
|
auburn
|
||||||
|
azure
|
||||||
|
beige
|
||||||
|
black
|
||||||
|
blue
|
||||||
|
bronze
|
||||||
|
brown
|
||||||
|
buff
|
||||||
|
carmine
|
||||||
|
celadon
|
||||||
|
cerise
|
||||||
|
cerulean
|
||||||
|
charcoal
|
||||||
|
chartreuse
|
||||||
|
chocolate
|
||||||
|
cinnamon
|
||||||
|
copper
|
||||||
|
coral
|
||||||
|
cream
|
||||||
|
crimson
|
||||||
|
cyan
|
||||||
|
denim
|
||||||
|
emerald
|
||||||
|
fuchsia
|
||||||
|
gold
|
||||||
|
goldenrod
|
||||||
|
gray
|
||||||
|
green
|
||||||
|
grey
|
||||||
|
indigo
|
||||||
|
ivory
|
||||||
|
jade
|
||||||
|
khaki
|
||||||
|
lavender
|
||||||
|
lemon
|
||||||
|
lilac
|
||||||
|
lime
|
||||||
|
magenta
|
||||||
|
mahogany
|
||||||
|
maroon
|
||||||
|
mauve
|
||||||
|
mustard
|
||||||
|
navy
|
||||||
|
ochre
|
||||||
|
olive
|
||||||
|
orange
|
||||||
|
orchid
|
||||||
|
peach
|
||||||
|
pear
|
||||||
|
periwinkle
|
||||||
|
pink
|
||||||
|
plum
|
||||||
|
puce
|
||||||
|
purple
|
||||||
|
quartz
|
||||||
|
red
|
||||||
|
rose
|
||||||
|
ruby
|
||||||
|
rust
|
||||||
|
salmon
|
||||||
|
sapphire
|
||||||
|
scarlet
|
||||||
|
silver
|
||||||
|
slate
|
||||||
|
tan
|
||||||
|
taupe
|
||||||
|
teal
|
||||||
|
tomato
|
||||||
|
topaz
|
||||||
|
turquoise
|
||||||
|
ultramarine
|
||||||
|
umber
|
||||||
|
vanilla
|
||||||
|
violet
|
||||||
|
white
|
||||||
|
yellow
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
agnesi
|
||||||
|
albattani
|
||||||
|
allen
|
||||||
|
almeida
|
||||||
|
antonelli
|
||||||
|
archimedes
|
||||||
|
ardinghelli
|
||||||
|
aryabhata
|
||||||
|
austin
|
||||||
|
babbage
|
||||||
|
banach
|
||||||
|
banzai
|
||||||
|
bardeen
|
||||||
|
bartik
|
||||||
|
bassi
|
||||||
|
beaver
|
||||||
|
bell
|
||||||
|
benz
|
||||||
|
bhabha
|
||||||
|
bhaskara
|
||||||
|
black
|
||||||
|
blackburn
|
||||||
|
blackwell
|
||||||
|
bohr
|
||||||
|
booth
|
||||||
|
borg
|
||||||
|
bose
|
||||||
|
bouman
|
||||||
|
boyd
|
||||||
|
brahmagupta
|
||||||
|
brattain
|
||||||
|
brown
|
||||||
|
buck
|
||||||
|
burnell
|
||||||
|
cannon
|
||||||
|
carson
|
||||||
|
cartwright
|
||||||
|
carver
|
||||||
|
cerf
|
||||||
|
chandrasekhar
|
||||||
|
chaplygin
|
||||||
|
chatelet
|
||||||
|
chatterjee
|
||||||
|
chaum
|
||||||
|
chebyshev
|
||||||
|
clarke
|
||||||
|
cohen
|
||||||
|
colden
|
||||||
|
cori
|
||||||
|
cray
|
||||||
|
curie
|
||||||
|
curran
|
||||||
|
darwin
|
||||||
|
davinci
|
||||||
|
dewdney
|
||||||
|
dhawan
|
||||||
|
diffie
|
||||||
|
dijkstra
|
||||||
|
dirac
|
||||||
|
driscoll
|
||||||
|
dubinsky
|
||||||
|
easley
|
||||||
|
edison
|
||||||
|
einstein
|
||||||
|
elbakyan
|
||||||
|
elgamal
|
||||||
|
elion
|
||||||
|
ellis
|
||||||
|
engelbart
|
||||||
|
euclid
|
||||||
|
euler
|
||||||
|
faraday
|
||||||
|
feistel
|
||||||
|
fermat
|
||||||
|
fermi
|
||||||
|
feynman
|
||||||
|
franklin
|
||||||
|
gagarin
|
||||||
|
galileo
|
||||||
|
galois
|
||||||
|
ganguly
|
||||||
|
gates
|
||||||
|
gauss
|
||||||
|
germain
|
||||||
|
goldberg
|
||||||
|
goldstine
|
||||||
|
goldwasser
|
||||||
|
golick
|
||||||
|
goodall
|
||||||
|
gould
|
||||||
|
greider
|
||||||
|
grothendieck
|
||||||
|
haibt
|
||||||
|
hamilton
|
||||||
|
haslett
|
||||||
|
hawking
|
||||||
|
heisenberg
|
||||||
|
hellman
|
||||||
|
hermann
|
||||||
|
herschel
|
||||||
|
hertz
|
||||||
|
heyrovsky
|
||||||
|
hodgkin
|
||||||
|
hofstadter
|
||||||
|
hoover
|
||||||
|
hopper
|
||||||
|
hugle
|
||||||
|
hypatia
|
||||||
|
ishizaka
|
||||||
|
jackson
|
||||||
|
jang
|
||||||
|
jemison
|
||||||
|
jennings
|
||||||
|
jepsen
|
||||||
|
johnson
|
||||||
|
joliot
|
||||||
|
jones
|
||||||
|
kalam
|
||||||
|
kapitsa
|
||||||
|
kare
|
||||||
|
keldysh
|
||||||
|
keller
|
||||||
|
kepler
|
||||||
|
khayyam
|
||||||
|
khorana
|
||||||
|
kilby
|
||||||
|
kirch
|
||||||
|
knuth
|
||||||
|
kowalevski
|
||||||
|
lalande
|
||||||
|
lamarr
|
||||||
|
lamport
|
||||||
|
leakey
|
||||||
|
leavitt
|
||||||
|
lederberg
|
||||||
|
lehmann
|
||||||
|
lewin
|
||||||
|
lichterman
|
||||||
|
liskov
|
||||||
|
lovelace
|
||||||
|
lumiere
|
||||||
|
mahavira
|
||||||
|
margulis
|
||||||
|
matsumoto
|
||||||
|
maxwell
|
||||||
|
mayer
|
||||||
|
mccarthy
|
||||||
|
mcclintock
|
||||||
|
mclaren
|
||||||
|
mclean
|
||||||
|
mcnulty
|
||||||
|
meitner
|
||||||
|
mendel
|
||||||
|
mendeleev
|
||||||
|
meninsky
|
||||||
|
merkle
|
||||||
|
mestorf
|
||||||
|
mirzakhani
|
||||||
|
montalcini
|
||||||
|
moore
|
||||||
|
morse
|
||||||
|
moser
|
||||||
|
murdock
|
||||||
|
napier
|
||||||
|
nash
|
||||||
|
neumann
|
||||||
|
newton
|
||||||
|
nightingale
|
||||||
|
nobel
|
||||||
|
noether
|
||||||
|
northcutt
|
||||||
|
noyce
|
||||||
|
panini
|
||||||
|
pare
|
||||||
|
pascal
|
||||||
|
pasteur
|
||||||
|
payne
|
||||||
|
perlman
|
||||||
|
pike
|
||||||
|
poincare
|
||||||
|
poitras
|
||||||
|
proskuriakova
|
||||||
|
ptolemy
|
||||||
|
raman
|
||||||
|
ramanujan
|
||||||
|
rhodes
|
||||||
|
ride
|
||||||
|
ritchie
|
||||||
|
robinson
|
||||||
|
roentgen
|
||||||
|
rosalind
|
||||||
|
rubin
|
||||||
|
saha
|
||||||
|
sammet
|
||||||
|
sanderson
|
||||||
|
satoshi
|
||||||
|
shamir
|
||||||
|
shannon
|
||||||
|
shaw
|
||||||
|
shirley
|
||||||
|
shockley
|
||||||
|
shtern
|
||||||
|
sinoussi
|
||||||
|
snyder
|
||||||
|
solomon
|
||||||
|
spence
|
||||||
|
stonebraker
|
||||||
|
sutherland
|
||||||
|
swanson
|
||||||
|
swartz
|
||||||
|
swirles
|
||||||
|
taussig
|
||||||
|
tesla
|
||||||
|
tharp
|
||||||
|
thompson
|
||||||
|
torvalds
|
||||||
|
tu
|
||||||
|
turing
|
||||||
|
varahamihira
|
||||||
|
vaughan
|
||||||
|
villani
|
||||||
|
visvesvaraya
|
||||||
|
volhard
|
||||||
|
wescoff
|
||||||
|
wilbur
|
||||||
|
wiles
|
||||||
|
williams
|
||||||
|
williamson
|
||||||
|
wilson
|
||||||
|
wing
|
||||||
|
wozniak
|
||||||
|
wright
|
||||||
|
wu
|
||||||
|
yalow
|
||||||
|
yonath
|
||||||
|
zhukovsky
|
||||||
+1296
File diff suppressed because it is too large
Load Diff
+1000
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,546 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""Wrap code-shaped tokens in inline code spans for the Starlight site.
|
||||||
|
|
||||||
|
Section 5 is generated from the `functions/*.fish` comment headers, which
|
||||||
|
are read as plain text by `config-help`, by `funcsave`, and by anyone
|
||||||
|
opening the source file. Backticks there would be noise, so the headers
|
||||||
|
are authored without them -- and the site inherited that, rendering
|
||||||
|
`-a/--all` and `__fish_config_op_aliases` as ordinary prose.
|
||||||
|
|
||||||
|
This module closes that gap at render time: it walks the markdown a page
|
||||||
|
is about to be written as, finds the tokens whose shape only ever means
|
||||||
|
"code" (flags, `$vars`, snake_case identifiers, paths, key chords, known
|
||||||
|
command names) and wraps each one in a code span. The SSOT is never
|
||||||
|
touched, so the man page and `config-help` keep the plain-text form.
|
||||||
|
|
||||||
|
Everything here is conservative by construction: leaving a token alone is
|
||||||
|
always safe and wrapping the wrong one is not, so every rule bails out the
|
||||||
|
moment it is unsure. The regions that must never be rewritten -- fenced
|
||||||
|
blocks, indented code blocks, existing code spans, link targets, URLs, JSX
|
||||||
|
attributes, `<FileTree>` bodies, headings -- are recognised first and
|
||||||
|
passed through.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import functools
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
FENCE_RE = re.compile(r"^\s*(```|~~~)")
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Vocabulary
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Commands a reader expects to see typeset as code. This is the *wide* list:
|
||||||
|
# it decides that a table column holds command lines (see _command_columns),
|
||||||
|
# where position already proves the name is a command. Wrapping a bare
|
||||||
|
# mention in running prose is gated on the strict tier below.
|
||||||
|
STANDARD_COMMANDS = frozenset(
|
||||||
|
"""
|
||||||
|
apk apt awk basename bash bat bg bind brew builtin cargo cat cd chmod
|
||||||
|
chown chsh cmp column cp curl cut date dd delta df diff dig dirname dnf
|
||||||
|
docker dpkg du echo emacs emerge env eza exec exit export fastfetch fd
|
||||||
|
fdisk fg fgrep file find fisher flatpak fzf gh git grep gzip head help
|
||||||
|
hexdump host hostname id ifconfig install ip jq jobs journalctl kill
|
||||||
|
killall kitten kitty last less ln locale ls lsblk lsd lsof make man
|
||||||
|
micro mkdir more mount mpv mv nano nc neofetch neovim netstat nix nl
|
||||||
|
nohup npm nproc nvim od open openssl pacman paru paste pgrep ping pip
|
||||||
|
pip3 pkill pr printf ps pwd python python3 readlink realpath rg rm rmdir
|
||||||
|
rpm rsync scp sed seq sh shutdown sleep snap sort source ssh stat
|
||||||
|
strings su sudo sync systemctl tac tail tar tee test time tldr tmux
|
||||||
|
touch tr trash tree type udisksctl umount uname uniq unzip uv vdir vi
|
||||||
|
vim vlc wait wc wezterm wget which who whoami wl-copy wl-paste xargs
|
||||||
|
xbps-install xclip xdg-open xsel yay yum yt-dlp zellij zip zoxide zsh
|
||||||
|
zypper
|
||||||
|
abbr alias and argparse begin block break case command complete contains
|
||||||
|
continue count else emit end eval false for function funcsave functions
|
||||||
|
history if math not or random read return set set_color status string
|
||||||
|
switch true while
|
||||||
|
""".split()
|
||||||
|
)
|
||||||
|
|
||||||
|
# Names that also read as ordinary English (or as this manual's own prose)
|
||||||
|
# often enough that a bare mention is not evidence of a command. They still
|
||||||
|
# take part in command-line and list detection, where position disambiguates
|
||||||
|
# -- they just never get wrapped on their own.
|
||||||
|
AMBIGUOUS_COMMANDS = frozenset(
|
||||||
|
"""
|
||||||
|
abbr alias all and at basename bat begin bg bind block branch break case
|
||||||
|
cat cd cheat cleanup clone column command complete contains continue copy
|
||||||
|
count cut date dd df dir dirname do docker du duf dust echo edit else emit
|
||||||
|
end env eval exec exit export false fc fg file find fish for free function
|
||||||
|
functions git go head help hist history host hostname id if in install ip
|
||||||
|
jobs join key kill last less link list ln lock locale log logs look ls make
|
||||||
|
man math micro more mount mv next no not note od open or ov p page paste
|
||||||
|
pkg poke ports pr ps pwd random read real replay return rm run screen sed
|
||||||
|
search seq set sh show sleep sort source spark split stat status string
|
||||||
|
strings su switch sync tab tac tail tar tee test time top touch tr trash
|
||||||
|
tree true type uniq upgrade view vi wait watch wc which while who write
|
||||||
|
yes zip
|
||||||
|
builtin fast function vdir
|
||||||
|
""".split()
|
||||||
|
)
|
||||||
|
|
||||||
|
# Extensions that make a bare `name.ext` token unambiguously a filename.
|
||||||
|
PATH_EXTENSIONS = (
|
||||||
|
"fish md mdx json jsonc toml yml yaml py sh bash zsh lua conf cfg ini "
|
||||||
|
"txt log list service socket desktop css scss ts js astro nix rasi 1"
|
||||||
|
).split()
|
||||||
|
|
||||||
|
# English function words. A candidate command line containing one is prose.
|
||||||
|
STOPWORDS = frozenset(
|
||||||
|
"""
|
||||||
|
a an the this that these those it its is are was were be been being am
|
||||||
|
to of in into on at by for from with without within about across after
|
||||||
|
before during over under again then than so such as and or but nor if
|
||||||
|
when while where which who whom whose why how all any both each few more
|
||||||
|
most other some only own same too very can will just should now via per
|
||||||
|
also either neither every no not
|
||||||
|
""".split()
|
||||||
|
)
|
||||||
|
|
||||||
|
_CATALOG_ARRAY_RE = re.compile(
|
||||||
|
r"set\s+-g\s+_fdc_(?:bins|cargo|pm)\s+((?:[^\n]*\\\n)*[^\n]*)"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def dependency_names(repo: Path) -> set[str]:
|
||||||
|
"""Every tool name in the `fish-deps` catalog (`_fdc_*` arrays).
|
||||||
|
|
||||||
|
`functions/_fish_deps_catalog.fish` is this repo's dependency database;
|
||||||
|
reading it here means a tool added there starts rendering as code with
|
||||||
|
no second list to keep in sync.
|
||||||
|
"""
|
||||||
|
path = repo / "functions" / "_fish_deps_catalog.fish"
|
||||||
|
if not path.exists():
|
||||||
|
return set()
|
||||||
|
names: set[str] = set()
|
||||||
|
for m in _CATALOG_ARRAY_RE.finditer(path.read_text(encoding="utf-8")):
|
||||||
|
for token in m.group(1).replace("\\\n", " ").split():
|
||||||
|
token = token.strip("\"'")
|
||||||
|
if token and re.fullmatch(r"[\w.@+-]+", token):
|
||||||
|
names.add(token)
|
||||||
|
return names
|
||||||
|
|
||||||
|
|
||||||
|
def function_names(repo: Path) -> set[str]:
|
||||||
|
"""Public function names, from the `functions/` directory listing.
|
||||||
|
|
||||||
|
Underscore-prefixed internals are skipped only because the snake_case
|
||||||
|
rule already covers them, and covers them everywhere -- including the
|
||||||
|
ones that have no file of their own.
|
||||||
|
"""
|
||||||
|
directory = repo / "functions"
|
||||||
|
if not directory.is_dir():
|
||||||
|
return set()
|
||||||
|
return {p.stem for p in directory.glob("*.fish") if not p.stem.startswith("_")}
|
||||||
|
|
||||||
|
|
||||||
|
class Vocabulary:
|
||||||
|
"""The command names the rules recognise, in two tiers.
|
||||||
|
|
||||||
|
`full` is every name we know of, used where position already proves a
|
||||||
|
token is a command (a command-line table cell, an arrow chain, a
|
||||||
|
comma-separated run). `strict` is the subset safe to wrap on sight in
|
||||||
|
running prose: `zoxide` yes, `find` no.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__slots__ = ("full", "strict")
|
||||||
|
|
||||||
|
def __init__(self, names: set[str]):
|
||||||
|
# `and`, `or`, `not`, `if` … are fish builtins, but as vocabulary
|
||||||
|
# entries they turn every conjunction into a command name and break
|
||||||
|
# list and command-line detection. They are never worth wrapping.
|
||||||
|
self.full = frozenset(names) - STOPWORDS
|
||||||
|
self.strict = frozenset(
|
||||||
|
n
|
||||||
|
for n in names
|
||||||
|
if n not in AMBIGUOUS_COMMANDS
|
||||||
|
and (len(n) >= 3 or any(c.isdigit() for c in n))
|
||||||
|
)
|
||||||
|
|
||||||
|
def __eq__(self, other):
|
||||||
|
return (
|
||||||
|
isinstance(other, Vocabulary)
|
||||||
|
and self.full == other.full
|
||||||
|
and self.strict == other.strict
|
||||||
|
)
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash((self.full, self.strict))
|
||||||
|
|
||||||
|
|
||||||
|
def vocabulary(repo: Path) -> Vocabulary:
|
||||||
|
"""Build the command vocabulary from the repo plus the standard list."""
|
||||||
|
return Vocabulary(
|
||||||
|
set(STANDARD_COMMANDS) | dependency_names(repo) | function_names(repo)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
EMPTY_VOCABULARY = Vocabulary(set())
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Token grammar
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# A token may not start inside a word, a path, a code span, a history
|
||||||
|
# expansion, or a hyphenated compound: `` `zoxide` ``-backed must not see
|
||||||
|
# `-backed` as a flag, `and/or` must not see `/or` as a path, and `!-N` must
|
||||||
|
# not see `-N` as one either.
|
||||||
|
BEFORE = r"(?<![\w`$/\\~.=+!-])"
|
||||||
|
# Ruling out a trailing `/` keeps a partially-recognised slash run
|
||||||
|
# (`grep/cp/mv/wget`, where only `grep` is in the vocabulary) from being
|
||||||
|
# wrapped one limb at a time.
|
||||||
|
AFTER = r"(?![\w`/])"
|
||||||
|
|
||||||
|
_SEG = r"[\w.@+-]+"
|
||||||
|
# The last segment of a path may not end in `.`, so a sentence-final full
|
||||||
|
# stop stays outside the span. A segment that is nothing but dots (`..`,
|
||||||
|
# `...`) is the exception: there the dots are the segment.
|
||||||
|
_LAST = r"(?:[\w.@+-]*[\w@+-]|\.+)"
|
||||||
|
_EXT = "|".join(PATH_EXTENSIONS)
|
||||||
|
|
||||||
|
# Key chords: `Ctrl-R`, `Ctrl+Alt+F`. Both separators appear in the manual.
|
||||||
|
_MODIFIER = r"(?:Ctrl|Alt|Shift|Super|Meta|Cmd|Opt)"
|
||||||
|
_KEY = (
|
||||||
|
r"(?:F\d{1,2}|Tab|Enter|Return|Space|Esc|Escape|Backspace|Delete|Insert"
|
||||||
|
r"|Home|End|Up|Down|Left|Right|PgUp|PgDn|[A-Za-z0-9])"
|
||||||
|
)
|
||||||
|
KEYBIND = rf"{_MODIFIER}(?:[+-]{_MODIFIER})*[+-]{_KEY}"
|
||||||
|
|
||||||
|
# `$EDITOR`, `${var}`, `$XDG_CONFIG_HOME/aichat/roles/cli.md`.
|
||||||
|
VAR = rf"\$\{{?[A-Za-z_]\w*\}}?(?:(?:/{_SEG})*/{_LAST})?"
|
||||||
|
|
||||||
|
PATH = (
|
||||||
|
rf"(?:~|\.{{1,2}})/(?:{_SEG}/)*(?:{_LAST})?" # ~/… ./… ../…
|
||||||
|
rf"|/(?:{_SEG}/)+(?:{_LAST})?" # /etc/sudoers.d/nofail-toggle
|
||||||
|
rf"|(?:{_SEG}/)+[\w@+-][\w.@+-]*\.(?:{_EXT})" # conf.d/abbr.fish
|
||||||
|
rf"|[\w@+-][\w.@+-]*\.(?:{_EXT})" # config.fish
|
||||||
|
rf"|(?:{_SEG}\.)+{_SEG}/" # conf.d/
|
||||||
|
)
|
||||||
|
|
||||||
|
# `-a`, `--dry-run`, `--color=auto`. A bare `--` (this manual's ASCII em
|
||||||
|
# dash) never matches: a letter has to follow. A single-hyphen flag is
|
||||||
|
# capped at five characters and may not contain a hyphen, so a hyphenated
|
||||||
|
# compound continued across a conjunction ("filesystem-inspection and
|
||||||
|
# -modification") is not mistaken for one.
|
||||||
|
FLAG = r"--[A-Za-z][\w-]*(?:=[\w.,:/@+-]+)?|-[A-Za-z][A-Za-z0-9]{0,4}(?:=[\w.,:/@+-]+)?"
|
||||||
|
|
||||||
|
# `XDG_CONFIG_HOME`, `NO_TMUX=1`. An underscore is required, so ordinary
|
||||||
|
# acronyms (`URL`, `AGPL`, `TCP`) are never touched.
|
||||||
|
ENVVAR = r"[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)+(?:=[\w.,:/@+-]+)?"
|
||||||
|
|
||||||
|
# snake_case: `__fish_config_op_aliases`, `_fdc_bins`, `fish_greeting`,
|
||||||
|
# `prompt_pwd`, `expand_bang_*`. An internal underscore is required, which
|
||||||
|
# is also what keeps `_emphasised_` markdown out of the match.
|
||||||
|
IDENT = r"_{0,2}[a-z][a-z0-9]*(?:_(?:[a-z0-9]+|\*))+"
|
||||||
|
|
||||||
|
# Regions that are already code, or are markup rather than prose. `url`
|
||||||
|
# also covers `git@host:owner/repo.git` and `ssh://…`, whose scheme would
|
||||||
|
# otherwise be read as a bare command name.
|
||||||
|
PROTECTED = (
|
||||||
|
r"(?P<code>``+.+?``+|`[^`\n]*`)"
|
||||||
|
r"|(?P<link>\[[^\]\n]*\]\([^)\n]*\))"
|
||||||
|
r"|(?P<url>[A-Za-z][\w+.-]*://\S+|[\w.-]+@[\w.-]+(?::\S+)?)"
|
||||||
|
r"|(?P<tag></?[A-Za-z][^>\n]*?/?>)"
|
||||||
|
)
|
||||||
|
|
||||||
|
ARROW = r"(?:->|→|=>)"
|
||||||
|
# Shortest comma run that reads as a list of tools rather than as prose.
|
||||||
|
MIN_RUN_NAMES = 3
|
||||||
|
# `, and` must be tried before a bare `,` so the conjunction is a separator
|
||||||
|
# and not an item.
|
||||||
|
RUN_SPLIT = r",?\s+(?:and|or)\s+|,\s*"
|
||||||
|
RUN_SPLIT_RE = re.compile(RUN_SPLIT)
|
||||||
|
# A command name inside a chain is followed by `->`, so the usual "no
|
||||||
|
# trailing hyphen" guard has to make room for exactly that.
|
||||||
|
_CMD_END = r"(?!\w)(?!-(?!>))"
|
||||||
|
|
||||||
|
|
||||||
|
def _alternation(names) -> str:
|
||||||
|
"""Regex alternation over names, longest first so `rg` can't beat `rga`."""
|
||||||
|
if not names:
|
||||||
|
return r"(?!)"
|
||||||
|
return "|".join(re.escape(n) for n in sorted(names, key=lambda s: (-len(s), s)))
|
||||||
|
|
||||||
|
|
||||||
|
def _atom(vocab: Vocabulary) -> str:
|
||||||
|
cmd = rf"(?:{_alternation(vocab.strict)})(?![\w-])"
|
||||||
|
return rf"(?:{KEYBIND}|{VAR}|{PATH}|{FLAG}|{ENVVAR}|{IDENT}|{cmd})"
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache(maxsize=4)
|
||||||
|
def _scanner(vocab: Vocabulary) -> re.Pattern:
|
||||||
|
"""The single pass over a line: protected regions plus wrappable tokens."""
|
||||||
|
full = rf"(?:{_alternation(vocab.full)})"
|
||||||
|
chain_link = rf"(?:{full}{_CMD_END}|{VAR})"
|
||||||
|
name = rf"{full}(?![\w-])"
|
||||||
|
return re.compile(
|
||||||
|
PROTECTED
|
||||||
|
# `ls->eza, cat->bat`: a shadow chain. Position makes even an
|
||||||
|
# ambiguous name unmistakably a command here.
|
||||||
|
+ rf"|(?P<chain>{BEFORE}{chain_link}(?:\s*{ARROW}\s*{chain_link})+{AFTER})"
|
||||||
|
# `cargo, starship, uv, zoxide`: a run of nothing but tool names.
|
||||||
|
+ rf"|(?P<run>{BEFORE}{name}(?:,\s*{name})+"
|
||||||
|
+ rf"(?:,?\s+(?:and|or)\s+{name})?{AFTER})"
|
||||||
|
# `-a/--all`: slash-joined atoms, each wrapped on its own.
|
||||||
|
+ rf"|(?P<group>{BEFORE}{_atom(vocab)}(?:/{_atom(vocab)})*{AFTER})"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache(maxsize=4)
|
||||||
|
def _atom_re(vocab: Vocabulary) -> re.Pattern:
|
||||||
|
return re.compile(_atom(vocab))
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Table cells that are whole command lines
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# The abbreviation tables' second column is an expansion, not a sentence:
|
||||||
|
# `sudo -s`, `cd ../..`, `journalctl -p 3 -xb`. Wrapping only the flag would
|
||||||
|
# leave a bare `sudo` in front of a code span; the cell wants to be one span.
|
||||||
|
#
|
||||||
|
# Whether a column holds command lines is decided for the column as a whole
|
||||||
|
# -- one cell is far too little evidence, as `zoxide frecency-based
|
||||||
|
# navigation` (prose, in a column of prose) and `docker context ls` (a
|
||||||
|
# command, in a column of commands) open identically.
|
||||||
|
CELL_TOKEN_RE = re.compile(r"^[\w$~./=:;@+*?%'\"-]+$")
|
||||||
|
CELL_NAME_RE = re.compile(r"^[a-z][\w.+-]*$")
|
||||||
|
CELL_OPERATORS = frozenset((r"\|", "|", "&&", "||", ">", ">>", "<", ";"))
|
||||||
|
MAX_CELL_TOKENS = 8
|
||||||
|
COMMAND_COLUMN_RATIO = 0.7
|
||||||
|
MIN_COMMAND_COLUMN_ROWS = 3
|
||||||
|
|
||||||
|
|
||||||
|
def _cell_tokens(cell: str) -> list[str] | None:
|
||||||
|
"""Tokenise a cell that could be a command line, or None if it can't be."""
|
||||||
|
text = cell.strip()
|
||||||
|
if not text or any(c in text for c in "`<([)]"):
|
||||||
|
return None
|
||||||
|
tokens = text.split()
|
||||||
|
if not (1 <= len(tokens) <= MAX_CELL_TOKENS):
|
||||||
|
return None
|
||||||
|
for token in tokens:
|
||||||
|
if token in CELL_OPERATORS:
|
||||||
|
continue
|
||||||
|
if not CELL_TOKEN_RE.match(token):
|
||||||
|
return None
|
||||||
|
if token[:1].isupper() or token.lower() in STOPWORDS:
|
||||||
|
return None
|
||||||
|
return tokens
|
||||||
|
|
||||||
|
|
||||||
|
def _is_command_cell(cell: str, vocab: Vocabulary) -> bool:
|
||||||
|
"""True when a cell in a command column really is one command line."""
|
||||||
|
tokens = _cell_tokens(cell)
|
||||||
|
if tokens is None:
|
||||||
|
return False
|
||||||
|
return tokens[0] in vocab.full or bool(CELL_NAME_RE.match(tokens[0]))
|
||||||
|
|
||||||
|
|
||||||
|
def _opens_with_command(cell: str, vocab: Vocabulary) -> bool:
|
||||||
|
"""The per-cell evidence the column vote is counted from."""
|
||||||
|
tokens = _cell_tokens(cell)
|
||||||
|
return tokens is not None and tokens[0] in vocab.full
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Line classification
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
HEADING_RE = re.compile(r"^\s{0,3}#{1,6}\s")
|
||||||
|
TABLE_ROW_RE = re.compile(r"^\s*\|.*\|\s*$")
|
||||||
|
TABLE_RULE_RE = re.compile(r"^\s*\|[\s:|-]+\|\s*$")
|
||||||
|
IMPORT_RE = re.compile(r"^\s*import\s")
|
||||||
|
FILE_TREE_OPEN = "<FileTree"
|
||||||
|
FILE_TREE_CLOSE = "</FileTree>"
|
||||||
|
CELL_SPLIT_RE = re.compile(r"(?<!\\)\|")
|
||||||
|
|
||||||
|
# A four-space indent is this manual's code block. The site never sees one
|
||||||
|
# -- prettify() has already turned it into a fence by the time this module
|
||||||
|
# runs -- but build_concat() keeps the indented form, because that is what
|
||||||
|
# pandoc and `config-help` want, and its contents are code that must not be
|
||||||
|
# rewritten: the table of contents alone would otherwise have `ov`, `bat`,
|
||||||
|
# `less` and `cat` wrapped inside a code block.
|
||||||
|
INDENTED_CODE = " "
|
||||||
|
|
||||||
|
|
||||||
|
def _skip_line(line: str) -> bool:
|
||||||
|
"""True for a line that must be passed through untouched.
|
||||||
|
|
||||||
|
Headings are excluded because Starlight derives anchors -- and this
|
||||||
|
pipeline derives `LinkCard` hrefs -- from their text. A line opening
|
||||||
|
with `<` is component markup, whose attributes are JSX, not markdown.
|
||||||
|
"""
|
||||||
|
stripped = line.strip()
|
||||||
|
return bool(
|
||||||
|
not stripped
|
||||||
|
or HEADING_RE.match(line)
|
||||||
|
or IMPORT_RE.match(line)
|
||||||
|
or stripped.startswith("<")
|
||||||
|
or TABLE_RULE_RE.match(line)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _row_cells(line: str) -> list[str]:
|
||||||
|
return CELL_SPLIT_RE.split(line)
|
||||||
|
|
||||||
|
|
||||||
|
def _command_columns(rows: list[str], vocab: Vocabulary) -> set[int]:
|
||||||
|
"""Which column indices of one table hold command lines rather than prose."""
|
||||||
|
votes: dict[int, list[int]] = {}
|
||||||
|
for line in rows:
|
||||||
|
if TABLE_RULE_RE.match(line):
|
||||||
|
continue
|
||||||
|
for index, cell in enumerate(_row_cells(line)):
|
||||||
|
if not cell.strip() or "`" in cell:
|
||||||
|
continue
|
||||||
|
votes.setdefault(index, []).append(_opens_with_command(cell, vocab))
|
||||||
|
return {
|
||||||
|
index
|
||||||
|
for index, seen in votes.items()
|
||||||
|
if len(seen) >= MIN_COMMAND_COLUMN_ROWS
|
||||||
|
and sum(seen) / len(seen) >= COMMAND_COLUMN_RATIO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# The pass
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Spans this pass creates are marked, not back-ticked, until the very end:
|
||||||
|
# adjacent ones are merged (`eza` `-l` `-a` -> `eza -l -a`), and only spans
|
||||||
|
# this pass created may take part in that.
|
||||||
|
MARK = "\x01"
|
||||||
|
MERGE_RE = re.compile(rf"{MARK} {MARK}")
|
||||||
|
|
||||||
|
|
||||||
|
def _mark(text: str) -> str:
|
||||||
|
return f"{MARK}{text}{MARK}"
|
||||||
|
|
||||||
|
|
||||||
|
def _wrap_atoms(text: str, atom_re: re.Pattern) -> str:
|
||||||
|
"""Mark each atom of a slash-joined group, keeping the separators.
|
||||||
|
|
||||||
|
Rescanning the group rather than capturing during the first match keeps
|
||||||
|
the grammar readable; the round-trip check makes that shortcut safe --
|
||||||
|
if the rescan disagrees with the original match, nothing is changed.
|
||||||
|
"""
|
||||||
|
wrapped = atom_re.sub(lambda m: _mark(m.group(0)), text)
|
||||||
|
if wrapped.replace(MARK, "") != text:
|
||||||
|
return text
|
||||||
|
return wrapped
|
||||||
|
|
||||||
|
|
||||||
|
def _wrap_split(text: str, separator: str) -> str:
|
||||||
|
"""Mark each item of a separated run, keeping the separators."""
|
||||||
|
parts = re.split(rf"({separator})", text)
|
||||||
|
return "".join(p if i % 2 else _mark(p) for i, p in enumerate(parts))
|
||||||
|
|
||||||
|
|
||||||
|
def _transform(text: str, scanner: re.Pattern, atom_re: re.Pattern, vocab: Vocabulary) -> str:
|
||||||
|
def repl(m: re.Match) -> str:
|
||||||
|
group = m.lastgroup
|
||||||
|
if group == "chain":
|
||||||
|
return _wrap_split(m.group(0), rf"\s*{ARROW}\s*")
|
||||||
|
if group == "run":
|
||||||
|
# A long run anchored by at least one unambiguous tool name is
|
||||||
|
# a list of commands; two names, one of them a word like
|
||||||
|
# `function`, is a sentence.
|
||||||
|
names = RUN_SPLIT_RE.split(m.group(0))
|
||||||
|
if len(names) < MIN_RUN_NAMES or not any(
|
||||||
|
n in vocab.strict for n in names
|
||||||
|
):
|
||||||
|
# Not a list after all -- hand the text back to the
|
||||||
|
# ordinary token rules rather than swallowing it.
|
||||||
|
return _wrap_atoms(m.group(0), atom_re)
|
||||||
|
return _wrap_split(m.group(0), RUN_SPLIT)
|
||||||
|
if group == "group":
|
||||||
|
return _wrap_atoms(m.group(0), atom_re)
|
||||||
|
return m.group(0)
|
||||||
|
|
||||||
|
return scanner.sub(repl, text)
|
||||||
|
|
||||||
|
|
||||||
|
def _transform_line(
|
||||||
|
line: str,
|
||||||
|
scanner: re.Pattern,
|
||||||
|
atom_re: re.Pattern,
|
||||||
|
vocab: Vocabulary,
|
||||||
|
command_columns: set[int],
|
||||||
|
) -> str:
|
||||||
|
if not command_columns:
|
||||||
|
return _transform(line, scanner, atom_re, vocab)
|
||||||
|
|
||||||
|
out = []
|
||||||
|
for index, cell in enumerate(_row_cells(line)):
|
||||||
|
if index in command_columns and _is_command_cell(cell, vocab):
|
||||||
|
body = cell.strip()
|
||||||
|
lead = cell[: len(cell) - len(cell.lstrip())]
|
||||||
|
trail = cell[len(cell.rstrip()) :]
|
||||||
|
out.append(f"{lead}{_mark(body)}{trail}")
|
||||||
|
else:
|
||||||
|
out.append(_transform(cell, scanner, atom_re, vocab))
|
||||||
|
return "|".join(out)
|
||||||
|
|
||||||
|
|
||||||
|
def _finish(line: str) -> str:
|
||||||
|
"""Merge abutting new spans, then turn the marks into backticks."""
|
||||||
|
return MERGE_RE.sub(" ", line).replace(MARK, "`")
|
||||||
|
|
||||||
|
|
||||||
|
def add_code_spans(text: str, vocab: Vocabulary = EMPTY_VOCABULARY) -> str:
|
||||||
|
"""Wrap code-shaped tokens in `text` in inline code spans.
|
||||||
|
|
||||||
|
`text` is a rendered page body (no frontmatter). Fenced blocks,
|
||||||
|
indented code blocks, `<FileTree>` bodies, headings, component markup,
|
||||||
|
existing code spans, link targets and URLs are left exactly as they
|
||||||
|
are.
|
||||||
|
"""
|
||||||
|
scanner = _scanner(vocab)
|
||||||
|
atom_re = _atom_re(vocab)
|
||||||
|
|
||||||
|
lines = text.split("\n")
|
||||||
|
eligible = [False] * len(lines)
|
||||||
|
in_fence = False
|
||||||
|
in_tree = False
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if FENCE_RE.match(line):
|
||||||
|
in_fence = not in_fence
|
||||||
|
continue
|
||||||
|
if in_fence:
|
||||||
|
continue
|
||||||
|
if FILE_TREE_OPEN in line:
|
||||||
|
in_tree = True
|
||||||
|
if in_tree:
|
||||||
|
if FILE_TREE_CLOSE in line:
|
||||||
|
in_tree = False
|
||||||
|
continue
|
||||||
|
if line.startswith(INDENTED_CODE):
|
||||||
|
continue
|
||||||
|
eligible[i] = not _skip_line(line)
|
||||||
|
|
||||||
|
# Command columns are a property of a whole table, so the contiguous
|
||||||
|
# runs of table rows are resolved before any line is rewritten.
|
||||||
|
columns: list[set[int]] = [set() for _ in lines]
|
||||||
|
start = None
|
||||||
|
for i, line in enumerate(lines + [""]):
|
||||||
|
is_row = i < len(lines) and eligible[i] and TABLE_ROW_RE.match(line)
|
||||||
|
if is_row and start is None:
|
||||||
|
start = i
|
||||||
|
elif not is_row and start is not None:
|
||||||
|
found = _command_columns(lines[start:i], vocab)
|
||||||
|
for j in range(start, i):
|
||||||
|
columns[j] = found
|
||||||
|
start = None
|
||||||
|
|
||||||
|
return "\n".join(
|
||||||
|
_finish(_transform_line(line, scanner, atom_re, vocab, columns[i]))
|
||||||
|
if eligible[i]
|
||||||
|
else line
|
||||||
|
for i, line in enumerate(lines)
|
||||||
|
)
|
||||||
+4581
-1010
File diff suppressed because it is too large
Load Diff
+247
-22
@@ -11,6 +11,10 @@ synopsis=# SYNOPSIS
|
|||||||
description=# DESCRIPTION
|
description=# DESCRIPTION
|
||||||
toc=# TABLE OF CONTENTS
|
toc=# TABLE OF CONTENTS
|
||||||
contents=# TABLE OF CONTENTS
|
contents=# TABLE OF CONTENTS
|
||||||
|
autopair=# DESCRIPTION
|
||||||
|
puffer=# DESCRIPTION
|
||||||
|
puffer-fish=# DESCRIPTION
|
||||||
|
logging-events=# DESCRIPTION
|
||||||
|
|
||||||
# ── Section 1: Configuration Variables ───────────────────────
|
# ── Section 1: Configuration Variables ───────────────────────
|
||||||
variables=# 1. CONFIGURATION VARIABLES
|
variables=# 1. CONFIGURATION VARIABLES
|
||||||
@@ -20,6 +24,10 @@ toolhomes=## Tool Homes (XDG-compliant)
|
|||||||
editor=## Editor and Pager
|
editor=## Editor and Pager
|
||||||
pager=## Editor and Pager
|
pager=## Editor and Pager
|
||||||
scrollback=## Scrollback History
|
scrollback=## Scrollback History
|
||||||
|
__fish_scrollback_history_dir=## Scrollback History
|
||||||
|
__fish_scrollback_history_max_files=## Scrollback History
|
||||||
|
scrollback-dir=## Scrollback History
|
||||||
|
misc-vars=## Other
|
||||||
|
|
||||||
# ── Section 2: PATH ───────────────────────────────────────────
|
# ── Section 2: PATH ───────────────────────────────────────────
|
||||||
path=# 2. PATH SETUP
|
path=# 2. PATH SETUP
|
||||||
@@ -27,7 +35,6 @@ path=# 2. PATH SETUP
|
|||||||
# ── Section 3: Key Bindings ───────────────────────────────────
|
# ── Section 3: Key Bindings ───────────────────────────────────
|
||||||
keybindings=# 3. KEY BINDINGS
|
keybindings=# 3. KEY BINDINGS
|
||||||
bindings=# 3. KEY BINDINGS
|
bindings=# 3. KEY BINDINGS
|
||||||
key-bindings=# 3. KEY BINDINGS
|
|
||||||
keys=# 3. KEY BINDINGS
|
keys=# 3. KEY BINDINGS
|
||||||
fzf-bindings=## FZF Bindings (bundled from PatrickF1/fzf.fish)
|
fzf-bindings=## FZF Bindings (bundled from PatrickF1/fzf.fish)
|
||||||
fzf=## FZF Bindings (bundled from PatrickF1/fzf.fish)
|
fzf=## FZF Bindings (bundled from PatrickF1/fzf.fish)
|
||||||
@@ -60,6 +67,8 @@ cat=### cat
|
|||||||
copy=### copy
|
copy=### copy
|
||||||
du=### du
|
du=### du
|
||||||
dusize=### dusize
|
dusize=### dusize
|
||||||
|
dirs=### lD
|
||||||
|
lsdirs=### lD
|
||||||
ls=### ls
|
ls=### ls
|
||||||
lsr=### lsr
|
lsr=### lsr
|
||||||
lss=### lss
|
lss=### lss
|
||||||
@@ -69,8 +78,10 @@ ltr=### ltr
|
|||||||
lx=### lx
|
lx=### lx
|
||||||
mkdir=### mkdir
|
mkdir=### mkdir
|
||||||
mkcd=### mkcd
|
mkcd=### mkcd
|
||||||
|
mv=### mv
|
||||||
poke=### poke
|
poke=### poke
|
||||||
rm=### rm
|
rm=### rm
|
||||||
|
rg=### rg
|
||||||
scrub=### scrub
|
scrub=### scrub
|
||||||
nav-fns=## 5.2 Navigation
|
nav-fns=## 5.2 Navigation
|
||||||
cdi=### cdi
|
cdi=### cdi
|
||||||
@@ -83,6 +94,7 @@ less=### less
|
|||||||
rawfish=### rawfish
|
rawfish=### rawfish
|
||||||
view=### view
|
view=### view
|
||||||
git=## 5.4 Git and Version Control
|
git=## 5.4 Git and Version Control
|
||||||
|
auto-pull=### auto-pull
|
||||||
branch=### branch
|
branch=### branch
|
||||||
gi=### gi
|
gi=### gi
|
||||||
gitignore=### gi
|
gitignore=### gi
|
||||||
@@ -101,6 +113,7 @@ parur=### parur
|
|||||||
deps=## 5.6 Dependency Management
|
deps=## 5.6 Dependency Management
|
||||||
fish-deps=### fish-deps
|
fish-deps=### fish-deps
|
||||||
check-deps=### check_fish_deps
|
check-deps=### check_fish_deps
|
||||||
|
fzf-update=### fzf-update
|
||||||
system=## 5.7 System and Monitoring
|
system=## 5.7 System and Monitoring
|
||||||
top=### top
|
top=### top
|
||||||
swapstat=### swapstat
|
swapstat=### swapstat
|
||||||
@@ -116,36 +129,128 @@ split=### split
|
|||||||
spwin=### spwin
|
spwin=### spwin
|
||||||
detach=### detach
|
detach=### detach
|
||||||
bkg=### bkg
|
bkg=### bkg
|
||||||
|
fish-mode-prompt=### fish_mode_prompt
|
||||||
|
fish-prompt=### fish_prompt
|
||||||
|
fish-right-prompt=### fish_right_prompt
|
||||||
|
right-prompt=### fish_right_prompt
|
||||||
|
jobrunner=### jobrunner
|
||||||
|
jr=### jr
|
||||||
ssh=### ssh
|
ssh=### ssh
|
||||||
clipboard=## 5.9 Clipboard
|
clipboard=## 5.9 Clipboard
|
||||||
copy-fn=### y
|
copy-fn=### y
|
||||||
|
p=### p
|
||||||
paste=### paste
|
paste=### paste
|
||||||
network=## 5.10 Network
|
network=## 5.10 Network
|
||||||
|
fast=### fast
|
||||||
|
fast-cli=### fast-cli
|
||||||
|
speedtest=### fast-cli
|
||||||
gip=### gip
|
gip=### gip
|
||||||
|
gip4=### gip4
|
||||||
|
ipv4=### gip4
|
||||||
|
gip6=### gip6
|
||||||
|
ipv6=### gip6
|
||||||
ping=### ping
|
ping=### ping
|
||||||
qr=### qr
|
qr=### qr
|
||||||
logging=## 5.11 Pager and Logging
|
logging=## 5.11 Pager and Logging
|
||||||
logs=### logs
|
logs=### logs
|
||||||
smart-exit=### smart_exit
|
smart-exit=### smart_exit
|
||||||
|
sponge-filter-secrets=### sponge_filter_secrets
|
||||||
|
secret-filter=### sponge_filter_secrets
|
||||||
ai=## 5.12 AI and Developer Tools
|
ai=## 5.12 AI and Developer Tools
|
||||||
antigravity=### antigravity
|
antigravity-ide=### antigravity-ide
|
||||||
claude=### claude-resume
|
agy=### agy
|
||||||
|
agents-init=### agents-init
|
||||||
|
agents=### agents-init
|
||||||
|
agents-tools=### agents-init
|
||||||
|
version-bump=### agents-init
|
||||||
|
.version=### agents-init
|
||||||
|
structure-version=### agents-init
|
||||||
|
core.hooksPath=### agents-init
|
||||||
|
devlogs=### agents-init
|
||||||
|
claude-cli=### claude
|
||||||
claude-docs=### claude-docs
|
claude-docs=### claude-docs
|
||||||
claude-pr=### claude-pr
|
claude-pr=### claude-pr
|
||||||
code-resume=### code-resume
|
dops=### dops
|
||||||
|
docker-ps=### dops
|
||||||
|
qc=### qc
|
||||||
|
quick-chat=### qc
|
||||||
|
aichat=### qc
|
||||||
superpowers=### superpowers
|
superpowers=### superpowers
|
||||||
media=## 5.13 Media and Utilities
|
media=## 5.13 Media and Utilities
|
||||||
dng2avif=### dng2avif
|
dng2avif=### dng2avif
|
||||||
|
play-media=### play-media
|
||||||
|
video=### play-media
|
||||||
|
audio=### play-media
|
||||||
|
mpv=### play-media
|
||||||
|
vlc=### play-media
|
||||||
spark=### spark
|
spark=### spark
|
||||||
|
steam-dl=### steam-dl
|
||||||
|
steam=### steam-dl
|
||||||
|
yt-dlp=### yt-dlp
|
||||||
miscfns=## 5.14 Miscellaneous
|
miscfns=## 5.14 Miscellaneous
|
||||||
bash=### bash
|
bash=### bash
|
||||||
|
bd-pull=### bd-pull
|
||||||
|
beads=### bd-pull
|
||||||
|
cffetch=### cffetch
|
||||||
|
fastfetch=### ffetch
|
||||||
|
neofetch=### cffetch
|
||||||
|
sysinfo=### cffetch
|
||||||
cheat=### cheat
|
cheat=### cheat
|
||||||
|
config-help=### config-help
|
||||||
|
config-update=### config-update
|
||||||
|
config-settings=### config-settings
|
||||||
|
config-toggle=### config-toggle
|
||||||
|
toggle=### config-settings
|
||||||
dockup=### dockup
|
dockup=### dockup
|
||||||
|
fetch=### cffetch
|
||||||
|
ffetch=### ffetch
|
||||||
|
fzf_configure_bindings=### fzf_configure_bindings
|
||||||
joplin=### joplin
|
joplin=### joplin
|
||||||
|
ld=### ld
|
||||||
|
lazydocker=### ld
|
||||||
|
open-url=### open-url
|
||||||
|
url-open=### open-url
|
||||||
|
repo-open=### repo-open
|
||||||
|
open-repo=### repo-open
|
||||||
|
rand_string=### rand_string
|
||||||
|
random=### rand_string
|
||||||
|
password=### rand_string
|
||||||
|
randomword=### rand_string
|
||||||
replay=### replay
|
replay=### replay
|
||||||
tmux=### tmux-clean
|
tmux=### tmux-clean
|
||||||
wake-lock=### wake-lock
|
wake-lock=### wake-lock
|
||||||
zellij=### zellij
|
|
||||||
|
# ── Tool-name synonyms (replacement → shadowed command) ──────
|
||||||
|
# These tools don't appear in any heading, so the fallback scan can't
|
||||||
|
# find them; map each to the function that wraps it.
|
||||||
|
eza=### ls
|
||||||
|
exa=### ls
|
||||||
|
lsd=### ls
|
||||||
|
trash=### rm
|
||||||
|
btop=### top
|
||||||
|
prettyping=### ping
|
||||||
|
duf=### du
|
||||||
|
dust=### du
|
||||||
|
kitten=### ssh
|
||||||
|
bat=### cat
|
||||||
|
|
||||||
|
# ── Tool integrations (Section: Integrations) ────────────────
|
||||||
|
zoxide=### Zoxide
|
||||||
|
z=### Zoxide
|
||||||
|
direnv=### DirEnv
|
||||||
|
venv=### Auto Python Venv
|
||||||
|
virtualenv=### Auto Python Venv
|
||||||
|
python=### Auto Python Venv
|
||||||
|
wakatime=### WakaTime
|
||||||
|
tailscale=### Tailscale
|
||||||
|
done=### Done Notifications
|
||||||
|
notifications=### Done Notifications
|
||||||
|
notify=### Done Notifications
|
||||||
|
pager-hierarchy=## Pager Hierarchy
|
||||||
|
shell-aliases=## 4.11 Shell Aliases
|
||||||
|
kitty-logging=### kitty-logging
|
||||||
|
watcher=### kitty-logging
|
||||||
|
kitty-scrollback=### Scrollback History
|
||||||
|
|
||||||
# ── Section 6: Dependency Catalog ────────────────────────────
|
# ── Section 6: Dependency Catalog ────────────────────────────
|
||||||
catalog=# 6. DEPENDENCY CATALOG
|
catalog=# 6. DEPENDENCY CATALOG
|
||||||
@@ -153,12 +258,16 @@ deps-catalog=# 6. DEPENDENCY CATALOG
|
|||||||
required=## Required
|
required=## Required
|
||||||
integrations=## Integrations
|
integrations=## Integrations
|
||||||
recommended=## Recommended
|
recommended=## Recommended
|
||||||
|
optional-deps=## Optional
|
||||||
|
terminal-emulators=## Terminal Emulators
|
||||||
install-methods=## Install Methods
|
install-methods=## Install Methods
|
||||||
|
|
||||||
# ── Section 7: Customization ──────────────────────────────────
|
# ── Section 7: Customization ──────────────────────────────────
|
||||||
customization=# 7. CUSTOMIZATION
|
customization=# 7. CUSTOMIZATION
|
||||||
customize=# 7. CUSTOMIZATION
|
customize=# 7. CUSTOMIZATION
|
||||||
local=## Machine-local Configuration
|
local=## Machine-local Configuration
|
||||||
|
user-dots=## Machine-local Configuration
|
||||||
|
dots-link=## Machine-local Configuration
|
||||||
secrets=## Secrets and API Keys
|
secrets=## Secrets and API Keys
|
||||||
overrides=## Overriding Configuration Variables
|
overrides=## Overriding Configuration Variables
|
||||||
universal=## Fish Universal Variables
|
universal=## Fish Universal Variables
|
||||||
@@ -167,34 +276,150 @@ minimal=## Opinionated Components (Minimal Mode)
|
|||||||
minimal-mode=## Opinionated Components (Minimal Mode)
|
minimal-mode=## Opinionated Components (Minimal Mode)
|
||||||
opt-out=## Opinionated Components (Minimal Mode)
|
opt-out=## Opinionated Components (Minimal Mode)
|
||||||
toggles=## Opinionated Components (Minimal Mode)
|
toggles=## Opinionated Components (Minimal Mode)
|
||||||
|
agent-vault=## Agent Memory Vault
|
||||||
|
__fish_agent_vault_dir=## Agent Memory Vault
|
||||||
|
__fish_agent_vault_autopush=## Agent Memory Vault
|
||||||
|
component-reference=# 8. COMPONENTS REFERENCE
|
||||||
|
components=# 8. COMPONENTS REFERENCE
|
||||||
|
c0=## Per-function overrides: `C0`/`always`
|
||||||
|
always-tag=## Per-function overrides: `C0`/`always`
|
||||||
|
c1=## C1 — Command Shadows
|
||||||
|
command-shadows=## C1 — Command Shadows
|
||||||
|
aliases-detail=## C1 — Command Shadows
|
||||||
|
filesystem=### filesystem
|
||||||
|
network-shadow=### network
|
||||||
|
monitor=### monitor
|
||||||
|
shell-tools=### shell-tools
|
||||||
|
dev-tools=### dev-tools
|
||||||
|
c2=## C2 — Startup Side-Effects
|
||||||
|
autoexec=## C2 — Startup Side-Effects
|
||||||
|
startup=## C2 — Startup Side-Effects
|
||||||
|
plugin-management=### plugin-management
|
||||||
|
pkg-wrappers=### pkg-wrappers
|
||||||
|
venv-toggle=### venv
|
||||||
|
telemetry=### telemetry
|
||||||
|
sync=### sync
|
||||||
|
c3=## C3 — Key and Environment Overrides
|
||||||
|
overrides-detail=## C3 — Key and Environment Overrides
|
||||||
|
bang-bang=## C3 — Key and Environment Overrides
|
||||||
|
bindings-toggle=### key-bindings
|
||||||
|
environment=### environment
|
||||||
|
prompt-toggle=### prompt
|
||||||
|
privacy=### privacy
|
||||||
|
privacy-toggle=### privacy
|
||||||
|
do-not-track=### privacy
|
||||||
|
disable-telemetry=### privacy
|
||||||
|
c4=## C4 — Terminal and Tool Integration
|
||||||
|
integrations-detail=## C4 — Terminal and Tool Integration
|
||||||
|
terminal-abbrs=### terminal-abbrs
|
||||||
|
window-mgmt=### window-mgmt
|
||||||
|
window-management=### window-mgmt
|
||||||
|
notifications-toggle=### notifications
|
||||||
|
history-logs=### history-logs
|
||||||
|
pkg-upgrade=### pkg-upgrade
|
||||||
|
c5=## C5 — Logging and Capture
|
||||||
|
logging-detail=## C5 — Logging and Capture
|
||||||
|
logging-sentinel=## C5 — Logging and Capture
|
||||||
|
zellij=## C5 — Logging and Capture
|
||||||
|
zellij-logging=## C5 — Logging and Capture
|
||||||
|
tmux-logging=## C5 — Logging and Capture
|
||||||
|
pipe-pane=## C5 — Logging and Capture
|
||||||
|
dump-screen=## C5 — Logging and Capture
|
||||||
|
terminal-capture=### terminal-capture
|
||||||
|
multiplexer-capture=### multiplexer-capture
|
||||||
|
pkg-logs=### pkg-logs
|
||||||
|
c6=## C6 — Greeting and First-Run UI
|
||||||
|
greeting=## C6 — Greeting and First-Run UI
|
||||||
|
first-run=### first-run
|
||||||
|
greeting-message=### greeting-message
|
||||||
|
|
||||||
# ── Section 8: Fisher Plugins ─────────────────────────────────
|
# ── Prompt and Theme ──────────────────────────────────────────
|
||||||
plugins=# 8. FISHER PLUGINS
|
prompt-theme=## Prompt and Theme
|
||||||
fisher=# 8. FISHER PLUGINS
|
prompt=## Prompt and Theme
|
||||||
|
starship=### Starship
|
||||||
|
fallback-prompt=### Catppuccin Fallback Prompt
|
||||||
|
catppuccin-prompt=### Catppuccin Fallback Prompt
|
||||||
|
nim-prompt=### Catppuccin Fallback Prompt
|
||||||
|
fzf-theme=### FZF
|
||||||
|
catppuccin-theme=### Catppuccin Mocha Syntax Highlighting
|
||||||
|
|
||||||
|
# ── Section 9: Fisher Plugins ─────────────────────────────────
|
||||||
|
plugins=# 9. FISHER PLUGINS
|
||||||
|
fisher=# 9. FISHER PLUGINS
|
||||||
fisher-managed=## Fisher-Managed Plugins
|
fisher-managed=## Fisher-Managed Plugins
|
||||||
sponge=## Fisher-Managed Plugins
|
sponge=## Fisher-Managed Plugins
|
||||||
sponge-filtering=## Sponge History Filtering
|
sponge-filtering=## Sponge History Filtering
|
||||||
history-filtering=## Sponge History Filtering
|
history-filtering=## Sponge History Filtering
|
||||||
privacy=## Sponge History Filtering
|
privacy=## Sponge History Filtering
|
||||||
|
__fish_sponge_extra_sensitive=## Sponge History Filtering
|
||||||
|
extra-sensitive=## Sponge History Filtering
|
||||||
|
sponge-settings=### config-settings
|
||||||
bundled-plugins=## Bundled Plugin Functionality
|
bundled-plugins=## Bundled Plugin Functionality
|
||||||
fish-plugins-manifest=## fish_plugins Manifest
|
fish-plugins-manifest=## fish_plugins Manifest
|
||||||
|
|
||||||
# ── Section 9: Installation ────────────────────────────────────
|
# ── Section 10: Installation ────────────────────────────────────
|
||||||
installation=# 9. INSTALLATION
|
installation=# 10. INSTALLATION
|
||||||
install=# 9. INSTALLATION
|
install=# 10. INSTALLATION
|
||||||
sentinel=## Return Sentinel
|
sentinel=## Return Sentinel
|
||||||
updating=## Updating
|
updating=## Updating
|
||||||
|
|
||||||
# ── Section 10: Personalization ───────────────────────────────
|
# ── Section 11: Personalization ───────────────────────────────
|
||||||
personalization=# 10. PERSONALIZATION
|
personalization=# 11. PERSONALIZATION
|
||||||
personalize=# 10. PERSONALIZATION
|
personalize=# 11. PERSONALIZATION
|
||||||
secrets=## secrets.fish
|
secrets-file=## secrets.fish
|
||||||
local-config=## local.fish
|
local-config=## local.fish
|
||||||
|
|
||||||
# ── Section 11: Viewing This Manual ──────────────────────────
|
# ── Section 12: Troubleshooting ──────────────────────────────
|
||||||
viewing=# 11. VIEWING THIS MANUAL
|
troubleshooting=# 12. TROUBLESHOOTING
|
||||||
manual=# 11. VIEWING THIS MANUAL
|
troubleshoot=# 12. TROUBLESHOOTING
|
||||||
ov=## With ov (recommended)
|
faq=# 12. TROUBLESHOOTING
|
||||||
man-page=## As a man page (if compiled)
|
uninstall=## Uninstalling and Reverting to Backup
|
||||||
manpage=## As a man page (if compiled)
|
revert=## Uninstalling and Reverting to Backup
|
||||||
jump=## Jumping to a section
|
fish-version=## Fish Version Requirement
|
||||||
|
version-req=## Fish Version Requirement
|
||||||
|
disable-logging=## Enable or Disable Session Logging
|
||||||
|
enable-logging=## Enable or Disable Session Logging
|
||||||
|
disable-greeting=## Change or Disable the Greeting
|
||||||
|
change-greeting=## Change or Disable the Greeting
|
||||||
|
secrets-trouble=## Secrets and Machine-Local Configuration
|
||||||
|
local-trouble=## Secrets and Machine-Local Configuration
|
||||||
|
return-sentinel=## Tool Init Does Nothing (Return Sentinel)
|
||||||
|
tool-init=## Tool Init Does Nothing (Return Sentinel)
|
||||||
|
missing-deps=## Missing Dependencies
|
||||||
|
vi-mode=## Vi Mode Keybindings
|
||||||
|
vi-trouble=## Vi Mode Keybindings
|
||||||
|
emacs-mode=## Vi Mode Keybindings
|
||||||
|
minimal-trouble=## What's with the C1-C6 stuff?
|
||||||
|
|
||||||
|
# ── Section 13: Viewing This Manual ──────────────────────────
|
||||||
|
viewing=# 13. VIEWING THIS MANUAL
|
||||||
|
manual=# 13. VIEWING THIS MANUAL
|
||||||
|
ov=## In the terminal
|
||||||
|
manpage=## As a man page
|
||||||
|
jump=## In the terminal
|
||||||
|
html=## The documentation website
|
||||||
|
browser=## The documentation website
|
||||||
|
site=## The documentation website
|
||||||
|
source=## Reading the source directly
|
||||||
|
raw-source=## Reading the source directly
|
||||||
|
|
||||||
|
# ── Section 14: Testing ───────────────────────────────────────
|
||||||
|
testing=# 14. TESTING
|
||||||
|
tests=# 14. TESTING
|
||||||
|
|
||||||
|
# ── Section 15: Contributing ──────────────────────────────────
|
||||||
|
contributing=# 15. CONTRIBUTING
|
||||||
|
contribute=# 15. CONTRIBUTING
|
||||||
|
forge=# 15. CONTRIBUTING
|
||||||
|
|
||||||
|
# ── Section 16: Attribution ───────────────────────────────────
|
||||||
|
attribution=# 16. ATTRIBUTION
|
||||||
|
credits=# 16. ATTRIBUTION
|
||||||
|
|
||||||
|
# ── Section 17: License ───────────────────────────────────────
|
||||||
|
license=# 17. LICENSE
|
||||||
|
licensing=# 17. LICENSE
|
||||||
|
agpl=# 17. LICENSE
|
||||||
|
copyright=# 17. LICENSE
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3627
-813
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,127 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
"""Generate the committed opinionated-component registry.
|
||||||
|
|
||||||
|
Walks every `# COMPONENT` header in functions/*.fish, conf.d/*.fish, and
|
||||||
|
config.fish and writes conf.d/__fish_config_op_registry.fish, the fish
|
||||||
|
data file __fish_config_op_registry_lookup reads at shell startup.
|
||||||
|
|
||||||
|
Run manually (via __fish_config_op_registry_rebuild) after editing a
|
||||||
|
# COMPONENT header, and automatically as a pre-step in build-manual.py
|
||||||
|
before the manual is built.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import manualtools as mt
|
||||||
|
|
||||||
|
DOCS = Path(__file__).parent
|
||||||
|
REPO = DOCS.parent
|
||||||
|
OUTPUT = REPO / "conf.d" / "__fish_config_op_registry.fish"
|
||||||
|
|
||||||
|
|
||||||
|
def collect_components() -> dict[str, list[str]]:
|
||||||
|
"""Gather every `# COMPONENT` header across the whole repo.
|
||||||
|
|
||||||
|
Concatenates raw component lines when the same identity appears in
|
||||||
|
more than one source (e.g. functions/auto-pull.fish and
|
||||||
|
conf.d/auto-pull.fish both self-identify as "auto-pull" at runtime,
|
||||||
|
since the guard can only ever look up the bare status
|
||||||
|
current-function/basename string) rather than letting one silently
|
||||||
|
overwrite the other.
|
||||||
|
"""
|
||||||
|
out: dict[str, list[str]] = {}
|
||||||
|
for source in (
|
||||||
|
mt.parse_components(REPO / "functions"),
|
||||||
|
mt.parse_components(REPO / "conf.d"),
|
||||||
|
mt.parse_component_file(REPO / "config.fish"),
|
||||||
|
):
|
||||||
|
for identity, lines in source.items():
|
||||||
|
out.setdefault(identity, []).extend(lines)
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def build_registry(components: dict[str, list[str]]) -> tuple[dict[str, list[str]], list[str]]:
|
||||||
|
"""Turn {identity: [raw COMPONENT lines]} into ({"identity:site": [tags]}, warnings).
|
||||||
|
|
||||||
|
A site with both always/on and always/off tagged is a contradiction:
|
||||||
|
both are stripped and a warning is emitted, but generation continues
|
||||||
|
-- any other real tag on that same site survives. A site whose
|
||||||
|
effective tag set is empty after stripping produces no registry entry
|
||||||
|
at all, which __fish_config_op_enabled already treats as always/on
|
||||||
|
(fail-open) at guard time -- see spec §4.5.
|
||||||
|
"""
|
||||||
|
registry: dict[str, list[str]] = {}
|
||||||
|
warnings: list[str] = []
|
||||||
|
for identity, raw_lines in components.items():
|
||||||
|
by_site: dict[str, list[str]] = {}
|
||||||
|
for site, tag in mt.parse_component_lines(raw_lines):
|
||||||
|
by_site.setdefault(site, []).append(tag)
|
||||||
|
for site, tags in by_site.items():
|
||||||
|
if "always/on" in tags and "always/off" in tags:
|
||||||
|
label = identity if not site else f"{identity}:{site}"
|
||||||
|
warnings.append(
|
||||||
|
f"{label}: both always/on and always/off tagged; ignoring both"
|
||||||
|
)
|
||||||
|
tags = [t for t in tags if t not in ("always/on", "always/off")]
|
||||||
|
if tags:
|
||||||
|
registry[f"{identity}:{site}"] = list(dict.fromkeys(tags))
|
||||||
|
return registry, warnings
|
||||||
|
|
||||||
|
|
||||||
|
def render(registry: dict[str, list[str]]) -> str:
|
||||||
|
keys = sorted(registry)
|
||||||
|
lines = [
|
||||||
|
"# Copyright (C) 2026 Rootiest",
|
||||||
|
"# SPDX-License-Identifier: AGPL-3.0-or-later",
|
||||||
|
"#",
|
||||||
|
"# GENERATED FILE --- do not edit by hand.",
|
||||||
|
"# Regenerate with __fish_config_op_registry_rebuild after editing a",
|
||||||
|
"# # COMPONENT header, or automatically via docs/build-manual.py.",
|
||||||
|
"# Source: docs/generate_component_registry.py",
|
||||||
|
"#",
|
||||||
|
"# This file must be sourced before any other conf.d/*.fish file that",
|
||||||
|
"# calls the opinionated guard. That currently holds only because fish's",
|
||||||
|
"# glob-based conf.d loading happens to sort this filename first",
|
||||||
|
"# alphabetically among the guard-calling files -- do not rename it",
|
||||||
|
"# without preserving that ordering.",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
if not keys:
|
||||||
|
lines.append("set -g __fish_config_op_registry_keys")
|
||||||
|
lines.append("set -g __fish_config_op_registry_values")
|
||||||
|
return "\n".join(lines) + "\n"
|
||||||
|
|
||||||
|
quoted_keys = [f'"{k}"' for k in keys]
|
||||||
|
lines.append("set -g __fish_config_op_registry_keys \\")
|
||||||
|
lines += [f" {k} \\" for k in quoted_keys[:-1]] + [f" {quoted_keys[-1]}"]
|
||||||
|
lines.append("")
|
||||||
|
|
||||||
|
values = [
|
||||||
|
(
|
||||||
|
'"' + " ".join(registry[k]) + '"'
|
||||||
|
if any(c in " ".join(registry[k]) for c in ' \t*?[]"\'\\$')
|
||||||
|
else " ".join(registry[k])
|
||||||
|
)
|
||||||
|
for k in keys
|
||||||
|
]
|
||||||
|
lines.append("set -g __fish_config_op_registry_values \\")
|
||||||
|
lines += [f" {v} \\" for v in values[:-1]] + [f" {values[-1]}"]
|
||||||
|
return "\n".join(lines) + "\n"
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
components = collect_components()
|
||||||
|
registry, warnings = build_registry(components)
|
||||||
|
for w in warnings:
|
||||||
|
print(f" WARN {w}", file=sys.stderr)
|
||||||
|
OUTPUT.write_text(render(registry))
|
||||||
|
print(f"wrote {OUTPUT} ({len(registry)} entries)", file=sys.stderr)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.path.insert(0, str(Path(__file__).parent))
|
||||||
|
raise SystemExit(main())
|
||||||
@@ -1,301 +0,0 @@
|
|||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@@ -1,495 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>NAME</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="2-synopsis.html" accesskey="n" rel="next">SYNOPSIS</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="index.html" accesskey="p" rel="previous">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="1" id="name">NAME</h1>
|
|
||||||
<p>fish-config - personal fish shell configuration for Fish 4.x with
|
|
||||||
modern CLI tool integration</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,534 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>6. DEPENDENCY CATALOG</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="11-7-customization.html" accesskey="n" rel="next">7. CUSTOMIZATION</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="9-5-functions-reference.html" accesskey="p" rel="previous">5. FUNCTIONS REFERENCE</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="10" id="6-dependency-catalog">6. DEPENDENCY
|
|
||||||
CATALOG</h1>
|
|
||||||
<p>fish-deps manages these tools. Run <code>fish-deps</code> to check
|
|
||||||
status, or <code>fish-deps install</code> to install missing ones.</p>
|
|
||||||
<h2 data-number="10.1" id="required">Required</h2>
|
|
||||||
<pre><code>uv Python package manager (Astral)
|
|
||||||
cargo Rust toolchain (via rustup)
|
|
||||||
fish Fish shell >= 4.0
|
|
||||||
fisher Fish plugin manager
|
|
||||||
starship Cross-shell prompt
|
|
||||||
fzf Fuzzy finder
|
|
||||||
zoxide Smart cd with frecency
|
|
||||||
direnv Per-directory environment loading
|
|
||||||
paru AUR helper (Arch only; preferred)
|
|
||||||
yay AUR helper (Arch only; fallback)</code></pre>
|
|
||||||
<h2 data-number="10.2" id="integrations-1">Integrations</h2>
|
|
||||||
<pre><code>wakatime Developer time tracking
|
|
||||||
tailscale Mesh VPN client</code></pre>
|
|
||||||
<h2 data-number="10.3" id="recommended">Recommended</h2>
|
|
||||||
<pre><code>eza Modern ls replacement
|
|
||||||
lsd ls replacement (fallback to eza)
|
|
||||||
bat Syntax-highlighted cat
|
|
||||||
btop Modern resource monitor
|
|
||||||
dust Disk usage tree (Rust)
|
|
||||||
duf Disk usage/free overview
|
|
||||||
prettyping Colorized ping wrapper
|
|
||||||
ov Modern pager (replaces less)
|
|
||||||
ripgrep Fast line search
|
|
||||||
lazygit Terminal git UI
|
|
||||||
lazydocker Terminal docker UI
|
|
||||||
trash Safe delete (trash-cli)
|
|
||||||
kitty GPU-accelerated terminal (primary)
|
|
||||||
wezterm GPU-accelerated terminal (alternative)</code></pre>
|
|
||||||
<h2 data-number="10.4" id="install-methods">Install Methods</h2>
|
|
||||||
<p>The install priority for each tool:</p>
|
|
||||||
<pre><code>cargo Rust tools (eza, lsd, bat, dust, ov, ripgrep, trashy, zoxide,
|
|
||||||
starship) — always gets the latest crate version
|
|
||||||
system PM paru / apt / brew / dnf / etc. — for tools without a crate
|
|
||||||
git clone fzf — installed from GitHub to ~/.fzf/
|
|
||||||
curl starship installer, fisher bootstrap, uv installer
|
|
||||||
pipx Python-based tools</code></pre>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,609 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>7. CUSTOMIZATION</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="12-8-fisher-plugins.html" accesskey="n" rel="next">8. FISHER PLUGINS</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="10-6-dependency-catalog.html" accesskey="p" rel="previous">6. DEPENDENCY CATALOG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="11" id="7-customization">7. CUSTOMIZATION</h1>
|
|
||||||
<h2 data-number="11.1" id="machine-local-configuration">Machine-local
|
|
||||||
Configuration</h2>
|
|
||||||
<p>Place machine-specific settings that should not be committed to git
|
|
||||||
in:</p>
|
|
||||||
<pre><code>~/.config/.user-dots/fish/local.fish</code></pre>
|
|
||||||
<p>Typical uses: additional PATH entries, local aliases,
|
|
||||||
hostname-specific env vars, work-specific tool configs.</p>
|
|
||||||
<h2 data-number="11.2" id="secrets-and-api-keys">Secrets and API
|
|
||||||
Keys</h2>
|
|
||||||
<pre><code>~/.config/.user-dots/fish/secrets.fish</code></pre>
|
|
||||||
<p>Store API tokens, GPG keys, private credentials here. This file is
|
|
||||||
never committed.</p>
|
|
||||||
<p>Both files are sourced at the end of config.fish on every interactive
|
|
||||||
session, so they can override anything set earlier.</p>
|
|
||||||
<h2 data-number="11.3"
|
|
||||||
id="overriding-configuration-variables">Overriding Configuration
|
|
||||||
Variables</h2>
|
|
||||||
<p>Any variable set in local.fish after the main config loads takes
|
|
||||||
effect. Example: to increase the scrollback history limit:</p>
|
|
||||||
<pre><code># in local.fish
|
|
||||||
set -gx SCROLLBACK_HISTORY_MAX_FILES 200</code></pre>
|
|
||||||
<h2 data-number="11.4" id="fish-universal-variables">Fish Universal
|
|
||||||
Variables</h2>
|
|
||||||
<p>Some settings (fzf colors, theme) are stored in fish_variables via
|
|
||||||
<code>set -U</code>. These are machine-local and git-ignored. Do not
|
|
||||||
commit fish_variables.</p>
|
|
||||||
<h2 data-number="11.5"
|
|
||||||
id="opinionated-components-minimal-mode">Opinionated Components (Minimal
|
|
||||||
Mode)</h2>
|
|
||||||
<p>Every opinionated piece of this config is active by default but can
|
|
||||||
be switched off through six category opt-out variables, each evaluated
|
|
||||||
via __fish_variable_check. Set a variable to any falsy value (0, false,
|
|
||||||
no, off, n) to disable its category; erase it or set a truthy value (1,
|
|
||||||
true, yes, on, y) to re-enable. Unset means enabled.</p>
|
|
||||||
<pre><code>Variable Disables
|
|
||||||
------------------------------ ------------------------------------
|
|
||||||
__fish_config_op_aliases Command shadows and flag injection:
|
|
||||||
ls->eza, cat->bat, cd->zoxide,
|
|
||||||
rm->trash, less->ov, top->btop,
|
|
||||||
ping->prettyping, ssh->kitten,
|
|
||||||
du->duf/dust, mkdir/bash wrappers,
|
|
||||||
history timestamps, grep/cp/mv/wget
|
|
||||||
flag injection, help intercept
|
|
||||||
__fish_config_op_autoexec Startup side-effects: Fisher
|
|
||||||
bootstrap, theme apply, paru/yay
|
|
||||||
wrapper generation, auto venv
|
|
||||||
activation, WakaTime hook
|
|
||||||
__fish_config_op_overrides Key and env overrides: Vi mode,
|
|
||||||
exit->smart_exit, PAGER/MANPAGER,
|
|
||||||
CDPATH, bang-bang system, autopair,
|
|
||||||
puffer, starship prompt, theme
|
|
||||||
colors, FZF_DEFAULT_OPTS, right
|
|
||||||
prompt
|
|
||||||
__fish_config_op_integrations Terminal/tool coupling: Kitty/
|
|
||||||
WezTerm window abbreviations, done
|
|
||||||
notifications, spwin/tab/split,
|
|
||||||
hist, logs, upgrade, WakaTime
|
|
||||||
__fish_config_op_logging Logging & capture: scrollback
|
|
||||||
capture on exit, paru/yay AUR log
|
|
||||||
wrappers, Kitty watcher capture;
|
|
||||||
sentinel file coordinates
|
|
||||||
cross-process state
|
|
||||||
__fish_config_op_greeting Greeting & first-run UI: per-session
|
|
||||||
fish_greeting override (defines empty
|
|
||||||
function late in config.fish to
|
|
||||||
suppress distro greetings such as
|
|
||||||
CachyOS fastfetch); first-run welcome
|
|
||||||
banner in conf.d/first_run.fish</code></pre>
|
|
||||||
<p>Examples:</p>
|
|
||||||
<pre><code># Disable command shadows only (rm becomes plain rm again):
|
|
||||||
set -U __fish_config_op_aliases off
|
|
||||||
|
|
||||||
# Full minimal mode — disable all six categories at once:
|
|
||||||
set -U __fish_config_opinionated 0
|
|
||||||
|
|
||||||
# Re-enable everything:
|
|
||||||
set -Ue __fish_config_opinionated</code></pre>
|
|
||||||
<p>Notes:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Command shadows (rm, cat, ls, ...) react immediately; conf.d-level
|
|
||||||
components (bindings, prompt, abbreviations, hooks) take effect in new
|
|
||||||
shells.</li>
|
|
||||||
<li>With aliases disabled, rm falls back to bare <code>command rm</code>
|
|
||||||
— files are deleted permanently, not trashed.</li>
|
|
||||||
<li>Disabled integration commands (spwin, tab, split, hist, logs,
|
|
||||||
upgrade) print an error naming the variable that disabled them.</li>
|
|
||||||
<li>On CachyOS, the distro fish config's own aliases, history override,
|
|
||||||
and bang-bang bindings are stripped per category as well.</li>
|
|
||||||
</ul>
|
|
||||||
<h2 data-number="11.6" id="prompt-and-theme">Prompt and Theme</h2>
|
|
||||||
<h3 data-number="11.6.1" id="starship">Starship</h3>
|
|
||||||
<p>The primary prompt is Starship, initialized by conf.d/starship.fish.
|
|
||||||
Configure it via ~/.config/starship.toml.</p>
|
|
||||||
<p>conf.d/starship.fish defines a fish_prompt wrapper that only
|
|
||||||
activates when starship is in PATH. It emits OSC 133;A (prompt start)
|
|
||||||
immediately before Starship renders and OSC 133;B (input start)
|
|
||||||
immediately after, placing both markers on the prompt line itself. This
|
|
||||||
allows ov to use them as sticky section headers when browsing scrollback
|
|
||||||
logs. Without Starship, fish's built-in prompt handles these markers
|
|
||||||
automatically.</p>
|
|
||||||
<h3 data-number="11.6.2" id="fzf">FZF</h3>
|
|
||||||
<p>FZF is themed to Catppuccin Mocha via FZF_DEFAULT_OPTS set in
|
|
||||||
integrations/fzf.fish. The colors applied:</p>
|
|
||||||
<pre><code>Background: #1E1E2E (base) #313244 (surface0)
|
|
||||||
Foreground: #CDD6F4 (text)
|
|
||||||
Highlights: #F38BA8 (red) #CBA6F7 (mauve) #B4BEFE (lavender)</code></pre>
|
|
||||||
<p>To customize, override FZF_DEFAULT_OPTS in local.fish.</p>
|
|
||||||
<h3 data-number="11.6.3"
|
|
||||||
id="catppuccin-mocha-syntax-highlighting">Catppuccin Mocha Syntax
|
|
||||||
Highlighting</h3>
|
|
||||||
<p>The Catppuccin Mocha theme ships with this config in themes/ and is
|
|
||||||
applied on first run via <code>conf.d/first_run.fish</code>. Colors are
|
|
||||||
stored in fish_variables (universal). To switch variants, install a
|
|
||||||
different theme from themes/:</p>
|
|
||||||
<pre><code>fish_config theme save "Catppuccin Latte"</code></pre>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,561 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>8. FISHER PLUGINS</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="13-9-installation.html" accesskey="n" rel="next">9. INSTALLATION</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="11-7-customization.html" accesskey="p" rel="previous">7. CUSTOMIZATION</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="12" id="8-fisher-plugins">8. FISHER PLUGINS</h1>
|
|
||||||
<p>Fisher is bootstrapped automatically on the <strong>first interactive
|
|
||||||
session</strong> via <code>conf.d/first_run.fish</code>. This also
|
|
||||||
applies the Catppuccin Mocha theme and prints a one-time welcome message
|
|
||||||
(gated by __fish_config_op_greeting; set it to 0 to suppress).
|
|
||||||
Subsequent sessions skip all first-run logic with zero overhead.</p>
|
|
||||||
<p>To re-trigger first-run initialization (e.g., after a fresh install
|
|
||||||
or for testing), run:</p>
|
|
||||||
<pre><code>set -Ue __fish_config_first_run_complete</code></pre>
|
|
||||||
<p>Then open a new shell.</p>
|
|
||||||
<h2 data-number="12.1" id="fisher-managed-plugins">Fisher-Managed
|
|
||||||
Plugins</h2>
|
|
||||||
<p>The following plugins are fully managed by Fisher. Their files are
|
|
||||||
installed into the repo directory by Fisher and are listed in
|
|
||||||
<code>.gitignore</code> — do not commit them. Fisher installs and
|
|
||||||
updates them automatically.</p>
|
|
||||||
<pre><code>jorgebucaran/fisher Plugin manager itself
|
|
||||||
meaningful-ooo/sponge Remove failed commands from history</code></pre>
|
|
||||||
<h2 data-number="12.2" id="sponge-history-filtering">Sponge History
|
|
||||||
Filtering</h2>
|
|
||||||
<p>Sponge removes failed commands from history and, via
|
|
||||||
conf.d/sponge_privacy.fish, also filters privacy-sensitive commands
|
|
||||||
through three layers:</p>
|
|
||||||
<p>Layer 1 — Static patterns (universal, persistent across sessions):
|
|
||||||
Commands matching any of these structural signatures are never
|
|
||||||
recorded:</p>
|
|
||||||
<pre><code>--password / --token / --passphrase / --api-key flags with values
|
|
||||||
Inline env assignments: GITHUB_TOKEN=xxx, MY_API_KEY=abc
|
|
||||||
Fish set with sensitive names: set -gx GITHUB_TOKEN xxx
|
|
||||||
URLs with embedded credentials: https://user:pass@host
|
|
||||||
HTTP Authorization headers: curl -H "Authorization: ..."
|
|
||||||
Basic auth flags: curl -u user:pass
|
|
||||||
sshpass, docker login -p, openssl -passin/-passout</code></pre>
|
|
||||||
<p>Layer 2 — Dynamic secret values (session globals, refreshed each
|
|
||||||
login): On the first prompt, after secrets.fish has loaded, the literal
|
|
||||||
values of all exported variables whose names suggest credentials (TOKEN,
|
|
||||||
PASSWORD, SECRET, API_KEY, etc.) are collected, regex-escaped, and added
|
|
||||||
as a session-scoped overlay. Because globals shadow universals in Fish,
|
|
||||||
the combined list is what sponge sees. Rotating a token takes effect on
|
|
||||||
the next login automatically.</p>
|
|
||||||
<p>Layer 3 — Per-command filter (sponge_filter_secrets): Catches
|
|
||||||
credentials in variables exported after login, such as tokens sourced
|
|
||||||
from a project .env file mid-session.</p>
|
|
||||||
<p>To add your own persistent patterns:</p>
|
|
||||||
<pre><code>set -U -a sponge_regex_patterns 'your-regex-here'</code></pre>
|
|
||||||
<h2 data-number="12.3" id="bundled-plugin-functionality">Bundled Plugin
|
|
||||||
Functionality</h2>
|
|
||||||
<p>The remaining plugin functionality is bundled directly with this
|
|
||||||
config rather than managed through Fisher. The bundled versions include
|
|
||||||
customizations for Fish 4.x compatibility and improved behavior that
|
|
||||||
differ from their upstream releases. Installing them through Fisher
|
|
||||||
would overwrite these customizations.</p>
|
|
||||||
<p>Bundled components and their upstream origins:</p>
|
|
||||||
<pre><code>catppuccin/fish → themes/ + conf.d/theme.fish
|
|
||||||
PatrickF1/fzf.fish → functions/_fzf_*.fish + conf.d/fzf.fish
|
|
||||||
franciscolourenco/done → conf.d/done.fish
|
|
||||||
jorgebucaran/autopair.fish → functions/_autopair_*.fish + conf.d/autopair.fish
|
|
||||||
nickeb96/puffer-fish → functions/_puffer_fish_*.fish + conf.d/puffer.fish</code></pre>
|
|
||||||
<p>Do not run <code>fisher install</code> for these — it will overwrite
|
|
||||||
the customized versions. To update their behavior, edit the relevant
|
|
||||||
bundled files directly.</p>
|
|
||||||
<h2 data-number="12.4" id="fish_plugins-manifest">fish_plugins
|
|
||||||
Manifest</h2>
|
|
||||||
<p>The <code>fish_plugins</code> file at the config root:</p>
|
|
||||||
<pre><code>jorgebucaran/fisher Plugin manager itself
|
|
||||||
meaningful-ooo/sponge Remove failed commands from history</code></pre>
|
|
||||||
<p>To update all Fisher-managed plugins, run <code>fisher update</code>
|
|
||||||
or <code>fish-deps update</code> which calls it as its first step.</p>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,521 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>9. INSTALLATION</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="14-10-personalization.html" accesskey="n" rel="next">10. PERSONALIZATION</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="12-8-fisher-plugins.html" accesskey="p" rel="previous">8. FISHER PLUGINS</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="13" id="9-installation">9. INSTALLATION</h1>
|
|
||||||
<p>This configuration is managed as a git repository. To deploy on a new
|
|
||||||
machine:</p>
|
|
||||||
<pre><code>mv ~/.config/fish ~/.config/fish.bak # back up any existing config
|
|
||||||
git clone https://git.rootiest.dev/rootiest/fish-config.git ~/.config/fish</code></pre>
|
|
||||||
<p>Then open a new Fish shell. Fisher installs automatically on first
|
|
||||||
launch and the Catppuccin Mocha theme is applied. All other plugin
|
|
||||||
functionality is bundled directly with this config and requires no
|
|
||||||
additional installation.</p>
|
|
||||||
<h2 data-number="13.1" id="return-sentinel">Return Sentinel</h2>
|
|
||||||
<p>config.fish ends with a return sentinel guard. Any lines appended
|
|
||||||
after it by a tool's setup command (starship init fish | source, zoxide
|
|
||||||
init fish | source, etc.) will have no effect. All integrations are
|
|
||||||
managed via conf.d/ files.</p>
|
|
||||||
<p>If a new tool's shell integration appears to do nothing, check
|
|
||||||
whether its setup command appended an init line below the sentinel and
|
|
||||||
create a dedicated conf.d/<tool>.fish instead.</p>
|
|
||||||
<h2 data-number="13.2" id="updating">Updating</h2>
|
|
||||||
<p>Pull the latest changes from the upstream repository without needing
|
|
||||||
a configured git remote:</p>
|
|
||||||
<pre><code>config-update Fetch and apply the latest commits from upstream
|
|
||||||
config-update --dry-run Preview available changes without applying them
|
|
||||||
config-update --force Stash local changes, pull, then restore the stash</code></pre>
|
|
||||||
<p>The remote URL (<a
|
|
||||||
href="https://git.rootiest.dev/rootiest/fish-config.git">https://git.rootiest.dev/rootiest/fish-config.git</a>)
|
|
||||||
is hard-coded, so this works on a fresh clone with no origin configured.
|
|
||||||
All git output is suppressed. Run exec fish after a successful update to
|
|
||||||
reload.</p>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,532 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>10. PERSONALIZATION</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="15-11-viewing-this-manual.html" accesskey="n" rel="next">11. VIEWING THIS MANUAL</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="13-9-installation.html" accesskey="p" rel="previous">9. INSTALLATION</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="14" id="10-personalization">10. PERSONALIZATION</h1>
|
|
||||||
<p>Sensitive credentials and machine-specific settings are kept out of
|
|
||||||
version control in a private directory at ~/.config/.user-dots/fish/.
|
|
||||||
Two files are sourced automatically by config.fish if they exist:</p>
|
|
||||||
<pre><code>~/.config/.user-dots/fish/
|
|
||||||
├── secrets.fish API keys, tokens, passwords, personal identifiers
|
|
||||||
└── local.fish Machine-specific paths and environment variables</code></pre>
|
|
||||||
<p>fish_variables (auto-managed by fish) is excluded from this repo via
|
|
||||||
.gitignore. Do not commit it.</p>
|
|
||||||
<h2 data-number="14.1" id="secretsfish">secrets.fish</h2>
|
|
||||||
<p>Store anything you would not commit to a public repo: API keys, auth
|
|
||||||
tokens, passwords, and personal identifiers.</p>
|
|
||||||
<pre><code>set -gx MY_NAME "Your Name"
|
|
||||||
set -gx MY_EMAIL "you@example.com"
|
|
||||||
set -gx GPG_RECIPIENT "you@example.com"
|
|
||||||
set -gx GITHUB_TOKEN ghp_yourTokenHere
|
|
||||||
set -gx OPENAI_API_KEY sk-proj-yourKeyHere
|
|
||||||
set -gx GITEA_TOKEN yourGiteaTokenHere
|
|
||||||
set -gx GITEA_CHOSEN_LOGIN your.gitea.instance
|
|
||||||
set -gx KOPIA_PASSWORD yourKopiaPassword</code></pre>
|
|
||||||
<h2 data-number="14.2" id="localfish">local.fish</h2>
|
|
||||||
<p>Store paths and variables specific to one machine — things that would
|
|
||||||
be wrong on any other system.</p>
|
|
||||||
<pre><code># CDPATH — directories searched by cd
|
|
||||||
set -gx CDPATH . /home/youruser/projects /home/youruser
|
|
||||||
|
|
||||||
# Path to your shared .gitignore boilerplate
|
|
||||||
set -gx GITIGNORE_BOILERPLATE ~/.config/git/gitignore_boilerplate
|
|
||||||
|
|
||||||
# SSH shortcuts
|
|
||||||
abbr -a sshr 'ssh you@your-server.local'
|
|
||||||
abbr -a sshw 'ssh you@work-server.example.com'
|
|
||||||
|
|
||||||
# Docker context shortcuts
|
|
||||||
abbr -a dcr 'docker context use my-remote-server'
|
|
||||||
abbr -a dcw 'docker context use work-server'</code></pre>
|
|
||||||
<p>Both files are sourced at the end of config.fish with an existence
|
|
||||||
check so the public config works cleanly on any machine without the
|
|
||||||
private repo.</p>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,545 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>11. VIEWING THIS MANUAL</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="14-10-personalization.html" accesskey="p" rel="previous">10. PERSONALIZATION</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="15" id="11-viewing-this-manual">11. VIEWING THIS
|
|
||||||
MANUAL</h1>
|
|
||||||
<h2 data-number="15.1" id="with-ov-recommended">With ov
|
|
||||||
(recommended)</h2>
|
|
||||||
<pre><code>help config</code></pre>
|
|
||||||
<p>ov renders the Markdown with syntax highlighting and section-based
|
|
||||||
navigation.</p>
|
|
||||||
<pre><code>Space next section
|
|
||||||
^ previous section
|
|
||||||
Alt+u toggle section list sidebar
|
|
||||||
/ search forward
|
|
||||||
n / N next / previous search match
|
|
||||||
g go to line number
|
|
||||||
j interactive jump target (line, %, or 'section')
|
|
||||||
q quit</code></pre>
|
|
||||||
<h2 data-number="15.2" id="with-bat">With bat</h2>
|
|
||||||
<pre><code>bat --language=markdown --paging=always ~/.config/fish/docs/fish-config.md</code></pre>
|
|
||||||
<h2 data-number="15.3" id="as-a-man-page">As a man page</h2>
|
|
||||||
<pre><code>help config --man
|
|
||||||
help config pkg --man</code></pre>
|
|
||||||
<p>Opens the compiled docs/fish-config.1 directly via man -l, bypassing
|
|
||||||
the pager fallback chain. If a section keyword is given, the pager opens
|
|
||||||
at the nearest matching heading. The symlink and MANPATH are also
|
|
||||||
configured automatically on shell start for the standard invocation:</p>
|
|
||||||
<pre><code>man fish-config</code></pre>
|
|
||||||
<p>NOTE: fish-config (hyphen) is this config's man page. fish_config
|
|
||||||
(underscore) is fish's built-in browser-based configuration tool — a
|
|
||||||
completely separate command. Do not mix them up.</p>
|
|
||||||
<h2 data-number="15.4" id="in-the-browser-html">In the browser
|
|
||||||
(HTML)</h2>
|
|
||||||
<pre><code>help config --html
|
|
||||||
help config pkg --html</code></pre>
|
|
||||||
<p>Opens docs/html/index.html in the default web browser. If a section
|
|
||||||
keyword is given, the browser opens directly at the matching anchor
|
|
||||||
(resolved via docs/html/sitemap.json). Browser detection queries the
|
|
||||||
system's x-scheme-handler/https MIME entry (via xdg-mime) to find the
|
|
||||||
real browser binary, then falls back through known browser binaries
|
|
||||||
(firefox, chromium, vivaldi, etc.), and finally xdg-open as a last
|
|
||||||
resort. Set $fish_help_browser or $BROWSER to override.</p>
|
|
||||||
<h2 data-number="15.5" id="as-a-wiki">As a wiki</h2>
|
|
||||||
<p>The generated Markdown wiki lives in docs/wiki/. index.md provides
|
|
||||||
the project overview and a full table of contents. Each section page has
|
|
||||||
a navigation bar at the top linking to every other section.</p>
|
|
||||||
<p>The wiki is auto-generated from this file by the CI pipeline on every
|
|
||||||
push to main that changes docs/fish-config.md.</p>
|
|
||||||
<h2 data-number="15.6" id="jumping-to-a-section">Jumping to a
|
|
||||||
section</h2>
|
|
||||||
<pre><code>help config keybindings
|
|
||||||
help config abbreviations
|
|
||||||
help config pkg
|
|
||||||
help config logs
|
|
||||||
help config fish-deps</code></pre>
|
|
||||||
<p>The keyword is matched case-insensitively against section
|
|
||||||
headings.</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,503 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>SYNOPSIS</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="3-description.html" accesskey="n" rel="next">DESCRIPTION</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="1-name.html" accesskey="p" rel="previous">NAME</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="2" id="synopsis">SYNOPSIS</h1>
|
|
||||||
<pre><code>help config [SECTION]</code></pre>
|
|
||||||
<p>Open this manual in the best available pager. Optionally jump to a
|
|
||||||
section by keyword:</p>
|
|
||||||
<pre><code>help config keybindings
|
|
||||||
help config pkg
|
|
||||||
help config abbreviations
|
|
||||||
help config logs</code></pre>
|
|
||||||
<p>The <code>help config</code> syntax integrates with fish's built-in
|
|
||||||
help command. The underlying <code>config-help</code> function is also
|
|
||||||
available directly.</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,535 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>DESCRIPTION</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="4-table-of-contents.html" accesskey="n" rel="next">TABLE OF CONTENTS</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="2-synopsis.html" accesskey="p" rel="previous">SYNOPSIS</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="3" id="description">DESCRIPTION</h1>
|
|
||||||
<p>A production-grade Fish shell configuration targeting Fish 4.x. It
|
|
||||||
provides:</p>
|
|
||||||
<ul>
|
|
||||||
<li>Drop-in replacements for common Unix tools (ls, cat, rm, du, ping,
|
|
||||||
less)</li>
|
|
||||||
<li>Deep Kitty and WezTerm terminal integration: tab/window/pane
|
|
||||||
management from the command line</li>
|
|
||||||
<li>Scrollback history snapshots saved to ~/.terminal_history on session
|
|
||||||
exit</li>
|
|
||||||
<li>Automatic Python virtualenv activation on directory change</li>
|
|
||||||
<li>Cross-platform package management via pkg and fish-deps</li>
|
|
||||||
<li>AI session helpers for Claude Code and Antigravity</li>
|
|
||||||
<li>Catppuccin Mocha color theme throughout</li>
|
|
||||||
</ul>
|
|
||||||
<p>The configuration is split across:</p>
|
|
||||||
<pre><code>config.fish Main entry point; sets env vars and PATH
|
|
||||||
conf.d/
|
|
||||||
abbr.fish All abbreviations
|
|
||||||
cheat.fish cheat.sh completions
|
|
||||||
done.fish Desktop notifications for long commands
|
|
||||||
first_run.fish One-time init: Fisher bootstrap, theme, welcome
|
|
||||||
key_bindings.fish Custom key bindings and Vi mode
|
|
||||||
paru-wrapper.fish Auto-generates ~/.local/bin/paru logging wrapper
|
|
||||||
starship.fish fish_prompt with OSC 133 shell-integration markers
|
|
||||||
tailscale.fish Tailscale CLI tab completions
|
|
||||||
theme.fish Catppuccin syntax highlight colors
|
|
||||||
sponge_privacy.fish Sponge privacy patterns; filters credentials from history
|
|
||||||
tricks.fish PATH, bang-bang helpers, bat man pages, aliases
|
|
||||||
wakatime.fish WakaTime shell hook
|
|
||||||
yay-wrapper.fish Auto-generates ~/.local/bin/yay logging wrapper
|
|
||||||
zoxide.fish Zoxide z/zi integration; overrides cd
|
|
||||||
functions/ Custom functions, one per file, autoloaded
|
|
||||||
completions/ Tab completion scripts
|
|
||||||
integrations/
|
|
||||||
fzf.fish FZF Catppuccin theme and key binding config
|
|
||||||
docs/ Offline documentation and compiled man page
|
|
||||||
fish-config.md Primary source manual (terminal-readable)
|
|
||||||
fish-config.1 Compiled man page (auto-generated by CI)
|
|
||||||
fish-config.index Section index for help config navigation
|
|
||||||
html/ Chunked HTML docs (auto-generated by CI)
|
|
||||||
wiki/ Markdown wiki (auto-generated by CI)</code></pre>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,530 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>TABLE OF CONTENTS</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="5-1-configuration-variables.html" accesskey="n" rel="next">1. CONFIGURATION VARIABLES</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="3-description.html" accesskey="p" rel="previous">DESCRIPTION</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="4" id="table-of-contents">TABLE OF CONTENTS</h1>
|
|
||||||
<pre><code>1. Configuration Variables
|
|
||||||
2. PATH Setup
|
|
||||||
3. Key Bindings
|
|
||||||
4. Abbreviations
|
|
||||||
4.1 Editors
|
|
||||||
4.2 Navigation and Listing
|
|
||||||
4.3 Git
|
|
||||||
4.4 Terminal Windows, Tabs, and Panes
|
|
||||||
4.5 Chezmoi
|
|
||||||
4.6 Docker
|
|
||||||
4.7 Systemctl
|
|
||||||
4.8 AI Assistants
|
|
||||||
4.9 History Expansion
|
|
||||||
4.10 Miscellaneous
|
|
||||||
4.11 Shell Aliases
|
|
||||||
5. Functions Reference
|
|
||||||
5.1 File and Directory
|
|
||||||
5.2 Navigation
|
|
||||||
5.3 Editors and Viewers
|
|
||||||
5.4 Git and Version Control
|
|
||||||
5.5 Package Management
|
|
||||||
5.6 Dependency Management
|
|
||||||
5.7 System and Monitoring
|
|
||||||
5.8 Terminal Management
|
|
||||||
5.9 Clipboard
|
|
||||||
5.10 Network
|
|
||||||
5.11 Pager and Logging
|
|
||||||
5.12 AI and Developer Tools
|
|
||||||
5.13 Media and Utilities
|
|
||||||
5.14 Miscellaneous
|
|
||||||
6. Dependency Catalog
|
|
||||||
7. Customization
|
|
||||||
8. Fisher Plugins
|
|
||||||
9. Installation
|
|
||||||
10. Personalization
|
|
||||||
11. Viewing This Manual</code></pre>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,583 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>1. CONFIGURATION VARIABLES</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="6-2-path-setup.html" accesskey="n" rel="next">2. PATH SETUP</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="4-table-of-contents.html" accesskey="p" rel="previous">TABLE OF CONTENTS</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="5" id="1-configuration-variables">1. CONFIGURATION
|
|
||||||
VARIABLES</h1>
|
|
||||||
<p>These variables are exported from config.fish on every interactive
|
|
||||||
session. Override them in ~/.config/.user-dots/fish/local.fish.</p>
|
|
||||||
<h2 data-number="5.1" id="environment-directories-xdg">Environment
|
|
||||||
Directories (XDG)</h2>
|
|
||||||
<pre><code>XDG_CONFIG_HOME ~/.config
|
|
||||||
XDG_CACHE_HOME ~/.cache
|
|
||||||
XDG_DATA_HOME ~/.local/share
|
|
||||||
XDG_STATE_HOME ~/.local/state</code></pre>
|
|
||||||
<p>Tools that respect XDG are directed to these paths rather than
|
|
||||||
polluting $HOME.</p>
|
|
||||||
<h2 data-number="5.2" id="tool-homes-xdg-compliant">Tool Homes
|
|
||||||
(XDG-compliant)</h2>
|
|
||||||
<pre><code>CARGO_HOME $XDG_DATA_HOME/cargo
|
|
||||||
RUSTUP_HOME $XDG_DATA_HOME/rustup
|
|
||||||
GOPATH $XDG_DATA_HOME/go
|
|
||||||
BUN_INSTALL $XDG_DATA_HOME/bun
|
|
||||||
NPM_CONFIG_PREFIX $XDG_DATA_HOME/npm-global
|
|
||||||
GNUPGHOME $XDG_CONFIG_HOME/gnupg
|
|
||||||
WAKATIME_HOME $XDG_CONFIG_HOME/wakatime</code></pre>
|
|
||||||
<h2 data-number="5.3" id="editor-and-pager">Editor and Pager</h2>
|
|
||||||
<pre><code>EDITOR nvim (falls back to vi if nvim is absent)
|
|
||||||
VISUAL same as EDITOR
|
|
||||||
SUDO_EDITOR same as EDITOR
|
|
||||||
PAGER ov (falls back to less)</code></pre>
|
|
||||||
<h2 data-number="5.4" id="scrollback-history">Scrollback History</h2>
|
|
||||||
<pre><code>SCROLLBACK_HISTORY_DIR ~/.terminal_history
|
|
||||||
SCROLLBACK_HISTORY_MAX_FILES 100</code></pre>
|
|
||||||
<p>Scrollback logs accumulate in SCROLLBACK_HISTORY_DIR as timestamped
|
|
||||||
files. When the count exceeds SCROLLBACK_HISTORY_MAX_FILES the oldest
|
|
||||||
are pruned automatically on exit. Use <code>logs</code> to browse them
|
|
||||||
interactively.</p>
|
|
||||||
<h2 data-number="5.5" id="other">Other</h2>
|
|
||||||
<pre><code>GPG_TTY $(tty) — ensures GPG passphrase prompts work
|
|
||||||
CLAUDE_CODE_NO_FLICKER 1 — suppress terminal flicker in Claude Code
|
|
||||||
CDPATH . ~/projects ~</code></pre>
|
|
||||||
<p>Opinionated defaults (CDPATH, PAGER/MANPAGER, Vi mode, command
|
|
||||||
shadows, terminal integrations) can be switched off per category with
|
|
||||||
universal variables — see Section 7, "Opinionated Components (Minimal
|
|
||||||
Mode)".</p>
|
|
||||||
<h2 data-number="5.6" id="pager-hierarchy">Pager Hierarchy</h2>
|
|
||||||
<p>$PAGER is set to ov when available, falling back to less. The less
|
|
||||||
wrapper function extends this into a full chain so anything that calls
|
|
||||||
less directly also benefits:</p>
|
|
||||||
<pre><code>$PAGER → ov → less → more → cat</code></pre>
|
|
||||||
<p>When bat is installed, man pages are rendered with syntax
|
|
||||||
highlighting:</p>
|
|
||||||
<pre><code>MANROFFOPT -c
|
|
||||||
MANPAGER sh -c 'col -bx | bat -l man -p'</code></pre>
|
|
||||||
<h2 data-number="5.7" id="integrations">Integrations</h2>
|
|
||||||
<h3 data-number="5.7.1" id="zoxide">Zoxide</h3>
|
|
||||||
<p>cd, z, and cdi/zi are all mapped to zoxide-backed navigation. Tab
|
|
||||||
completions for cd and z blend standard directory entries (CWD and
|
|
||||||
CDPATH) with frecency results so both familiar and frequently-visited
|
|
||||||
paths appear in one list.</p>
|
|
||||||
<h3 data-number="5.7.2" id="direnv">DirEnv</h3>
|
|
||||||
<p>Automatically loads .envrc files on directory change. Takes priority
|
|
||||||
over the auto-venv logic — if a directory is managed by direnv, the
|
|
||||||
auto-venv activation is skipped entirely.</p>
|
|
||||||
<h3 data-number="5.7.3" id="auto-python-venv">Auto Python Venv</h3>
|
|
||||||
<p>When entering a directory that contains a .venv/, the virtualenv is
|
|
||||||
activated automatically and deactivated when you leave the project
|
|
||||||
tree.</p>
|
|
||||||
<h3 data-number="5.7.4" id="wakatime">WakaTime</h3>
|
|
||||||
<p>Every shell command is reported to WakaTime for time-tracking. Set
|
|
||||||
FISH_WAKATIME_DISABLED=1 to disable without removing the plugin.</p>
|
|
||||||
<h3 data-number="5.7.5" id="tailscale">Tailscale</h3>
|
|
||||||
<p>Full tab completion for the tailscale CLI is provided via
|
|
||||||
conf.d/tailscale.fish.</p>
|
|
||||||
<h3 data-number="5.7.6" id="done-notifications">Done Notifications</h3>
|
|
||||||
<p>Desktop notifications fire when a command takes longer than 10
|
|
||||||
seconds and the terminal window is not focused. Configured via fish
|
|
||||||
universal variables:</p>
|
|
||||||
<pre><code>__done_min_cmd_duration 10000 ms
|
|
||||||
__done_notification_urgency_level low</code></pre>
|
|
||||||
<h3 data-number="5.7.7" id="scrollback-history-1">Scrollback
|
|
||||||
History</h3>
|
|
||||||
<p>When running inside Kitty, closing a shell session via exit saves a
|
|
||||||
timestamped scrollback snapshot to SCROLLBACK_HISTORY_DIR. Files are
|
|
||||||
named:</p>
|
|
||||||
<pre><code>scrollback_YYYY-MM-DD_HH-MM-SS.log</code></pre>
|
|
||||||
<p>The paru and yay wrappers (auto-generated in ~/.local/bin/) tee all
|
|
||||||
output to:</p>
|
|
||||||
<pre><code>paru_YYYY-MM-DD_HH-MM-SS.log
|
|
||||||
yay_YYYY-MM-DD_HH-MM-SS.log</code></pre>
|
|
||||||
<p>Before pruning, _scrollback_prune_junk silently removes empty files,
|
|
||||||
files with only a single meaningful line (e.g. bare [exited] captures),
|
|
||||||
and Kitty tab-rename prompt captures. Use exit --no-log (or exit -n) to
|
|
||||||
skip capture.</p>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,506 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>2. PATH SETUP</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="7-3-key-bindings.html" accesskey="n" rel="next">3. KEY BINDINGS</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="5-1-configuration-variables.html" accesskey="p" rel="previous">1. CONFIGURATION VARIABLES</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="6" id="2-path-setup">2. PATH SETUP</h1>
|
|
||||||
<p>Directories prepended to PATH in this order (first wins):</p>
|
|
||||||
<pre><code>~/.local/bin Standard user-local executables
|
|
||||||
~/Applications User-installed standalone apps
|
|
||||||
~/scripts Personal shell scripts
|
|
||||||
~/bin Cargo binaries (appended — lowest priority)
|
|
||||||
$BUN_INSTALL/bin Bun runtime and global packages
|
|
||||||
$NPM_CONFIG_PREFIX/bin Global npm packages
|
|
||||||
~/.lmstudio/bin LM Studio CLI
|
|
||||||
~/.resend/bin Resend CLI
|
|
||||||
~/.fzf/bin fzf binary (git-installed)</code></pre>
|
|
||||||
<p>Cargo binaries are intentionally appended (lowest priority) to avoid
|
|
||||||
shadowing system-installed Rust tools.</p>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,538 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>3. KEY BINDINGS</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="8-4-abbreviations.html" accesskey="n" rel="next">4. ABBREVIATIONS</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="6-2-path-setup.html" accesskey="p" rel="previous">2. PATH SETUP</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="7" id="3-key-bindings">3. KEY BINDINGS</h1>
|
|
||||||
<p>The shell uses Vi key bindings (fish_vi_key_bindings). All custom
|
|
||||||
bindings are active in Insert, Normal, and Visual modes unless
|
|
||||||
noted.</p>
|
|
||||||
<pre><code>Binding Action
|
|
||||||
─────────────────────────────────────────────────────────────────────
|
|
||||||
Ctrl+G Insert the head of the previous command's last path
|
|
||||||
argument. Equivalent to !$:h in Bash.
|
|
||||||
Example: previous = "cd /usr/local/bin"
|
|
||||||
Ctrl+G inserts "/usr/local"
|
|
||||||
|
|
||||||
Ctrl+F Interactive history substitution. Type old/new then
|
|
||||||
press Ctrl+F to apply s/old/new/ to the previous
|
|
||||||
command. Equivalent to !!:s/old/new/ in Bash.
|
|
||||||
Example: previous = "echo this is a test"
|
|
||||||
type "this is/that was", press Ctrl+F
|
|
||||||
result = "echo that was a test"
|
|
||||||
|
|
||||||
Ctrl+Alt+U Strip the first token of the current command line,
|
|
||||||
leaving arguments in place with the cursor at the
|
|
||||||
start. Useful for quickly retyping the command.
|
|
||||||
Example: "mkdir new_folder" -> " new_folder"
|
|
||||||
|
|
||||||
Ctrl+Alt+= Evaluate the current command line buffer with
|
|
||||||
Qalculate! (qalc) and print the result inline.
|
|
||||||
Requires qalc to be installed.
|
|
||||||
Example: type "150 * 1.08", press Ctrl+Alt+=
|
|
||||||
prints 162
|
|
||||||
|
|
||||||
Ctrl+Enter Smart execute: runs commands instantly without
|
|
||||||
pressing Enter a second time for certain fast-path
|
|
||||||
commands (speedtest-fast, etc.).
|
|
||||||
|
|
||||||
@@ FZF inline picker. Type @@ anywhere on the command
|
|
||||||
line to open an fzf picker and insert a selection
|
|
||||||
at the cursor position.</code></pre>
|
|
||||||
<h2 data-number="7.1"
|
|
||||||
id="fzf-bindings-bundled-from-patrickf1fzffish">FZF Bindings (bundled
|
|
||||||
from PatrickF1/fzf.fish)</h2>
|
|
||||||
<pre><code>Ctrl+R Search command history
|
|
||||||
Ctrl+Alt+F Search git-tracked files
|
|
||||||
Ctrl+Alt+L Search git log
|
|
||||||
Ctrl+Alt+S Search git status
|
|
||||||
Ctrl+V Search shell variables
|
|
||||||
Ctrl+Alt+P Search running processes</code></pre>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,641 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>4. ABBREVIATIONS</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Up:</span> <a href="index.html" accesskey="u" rel="up">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Top:</span> <a href="index.html" accesskey="t" rel="top">FISH-CONFIG</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="9-5-functions-reference.html" accesskey="n" rel="next">5. FUNCTIONS REFERENCE</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Previous:</span> <a href="7-3-key-bindings.html" accesskey="p" rel="previous">3. KEY BINDINGS</a>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<h1 data-number="8" id="4-abbreviations">4. ABBREVIATIONS</h1>
|
|
||||||
<p>Abbreviations expand when you press Space or Enter. They are
|
|
||||||
terminal-aware: some expand differently in Kitty vs WezTerm vs other
|
|
||||||
terminals.</p>
|
|
||||||
<h2 data-number="8.1" id="41-editors">4.1 Editors</h2>
|
|
||||||
<pre><code>n / nv / neovim nvim
|
|
||||||
e edit
|
|
||||||
se sudoedit
|
|
||||||
k kate
|
|
||||||
editt Open new tab with nvim (terminal-aware)
|
|
||||||
cdnv cd ~/.config/nvim
|
|
||||||
cdnvn cd ~/.config/nvim; nvim</code></pre>
|
|
||||||
<h2 data-number="8.2" id="42-navigation-and-listing">4.2 Navigation and
|
|
||||||
Listing</h2>
|
|
||||||
<pre><code>l ls
|
|
||||||
lS lss (sort by size)
|
|
||||||
lsR lsr (sort by time, oldest first)
|
|
||||||
lX lx (sort by extension)
|
|
||||||
lT lt (tree, depth 2)
|
|
||||||
lsT lstree (full recursive tree)
|
|
||||||
lzd ld (lazydocker)
|
|
||||||
cdi zi (interactive zoxide picker)</code></pre>
|
|
||||||
<h2 data-number="8.3" id="43-git">4.3 Git</h2>
|
|
||||||
<pre><code>g git
|
|
||||||
lg lazygit
|
|
||||||
gitig / git-ignore gi (generate .gitignore)</code></pre>
|
|
||||||
<h2 data-number="8.4" id="44-terminal-windows-tabs-and-panes">4.4
|
|
||||||
Terminal Windows, Tabs, and Panes</h2>
|
|
||||||
<p>These abbreviations control the terminal emulator. Each has a Kitty
|
|
||||||
variant and a WezTerm variant; the correct one is inserted based on
|
|
||||||
$TERM or $TERM_PROGRAM.</p>
|
|
||||||
<pre><code>:w New OS window
|
|
||||||
:wv Split pane horizontally (new pane below)
|
|
||||||
:wh Split pane vertically (new pane to the right)
|
|
||||||
:wo Detach current window to its own OS window
|
|
||||||
:wot Move current pane to a new tab
|
|
||||||
:t New tab
|
|
||||||
:tl Set tab title
|
|
||||||
:tw Set window title
|
|
||||||
:twk Rename workspace (WezTerm only)
|
|
||||||
:tp Focus previous tab
|
|
||||||
:tn Focus next tab
|
|
||||||
:q Close current pane/window
|
|
||||||
:Q Close current tab
|
|
||||||
:sw spwin (spawn new OS window)</code></pre>
|
|
||||||
<p>Quick-navigate shortcuts open windows/tabs/panes with preset working
|
|
||||||
dirs:</p>
|
|
||||||
<pre><code>:tgk New tab at ~/.config/kitty
|
|
||||||
:tgn New tab at ~/.config/nvim
|
|
||||||
:tgf New tab at ~/.config/fish
|
|
||||||
:tgh New tab at ~
|
|
||||||
:tgcz New tab at chezmoi source dir
|
|
||||||
:tgcm New tab at chezmoi source dir
|
|
||||||
:tgp New tab at ~/projects
|
|
||||||
:tgr New tab at / (root)</code></pre>
|
|
||||||
<p>Prefixes :wg* and :wvg* / :whg* open OS windows or splits to the same
|
|
||||||
set of dirs, respectively.</p>
|
|
||||||
<p>Prefixes :cd* open tabs with a quick cd shortcut:</p>
|
|
||||||
<pre><code>:cdn cd ~/.config/nvim
|
|
||||||
:cdf cd ~/.config/fish
|
|
||||||
:cdh cd ~
|
|
||||||
:cdcz cd to chezmoi source
|
|
||||||
:cdp cd ~/projects</code></pre>
|
|
||||||
<p>Appending n to any :cd* abbreviation also runs nvim after changing
|
|
||||||
dir.</p>
|
|
||||||
<h2 data-number="8.5" id="45-chezmoi">4.5 Chezmoi</h2>
|
|
||||||
<pre><code>cm / cme / cmi / cmap / cmad / cmrm / cmcd /
|
|
||||||
cz / cze / czi / czap / czad / czrm / czcd
|
|
||||||
|
|
||||||
cm / cz chezmoi
|
|
||||||
cmcd / czcd chezmoi cd
|
|
||||||
cme / cze chezmoi edit
|
|
||||||
cmad / czad chezmoi add
|
|
||||||
cmap / czap chezmoi apply
|
|
||||||
cmrm / cmf / czrm / czf chezmoi forget
|
|
||||||
cmi / czi chezmoi init</code></pre>
|
|
||||||
<h2 data-number="8.6" id="46-docker">4.6 Docker</h2>
|
|
||||||
<pre><code>dcl docker context use default
|
|
||||||
dcls docker context ls
|
|
||||||
lzd ld (lazydocker)</code></pre>
|
|
||||||
<h2 data-number="8.7" id="47-systemctl">4.7 Systemctl</h2>
|
|
||||||
<pre><code>sc systemctl
|
|
||||||
ssc sudo systemctl
|
|
||||||
scu systemctl --user
|
|
||||||
st systemctl status
|
|
||||||
scs sudo systemctl start
|
|
||||||
scr sudo systemctl restart
|
|
||||||
ssct sudo systemctl start
|
|
||||||
sscs sudo systemctl stop
|
|
||||||
sscr sudo systemctl restart</code></pre>
|
|
||||||
<h2 data-number="8.8" id="48-ai-assistants">4.8 AI Assistants</h2>
|
|
||||||
<pre><code>ag antigravity
|
|
||||||
ag. antigravity .
|
|
||||||
v antigravity-ide
|
|
||||||
s wezterm ssh (WezTerm only)</code></pre>
|
|
||||||
<h2 data-number="8.9" id="49-history-expansion">4.9 History
|
|
||||||
Expansion</h2>
|
|
||||||
<p>These are implemented as keybinding helpers, but can also be
|
|
||||||
typed:</p>
|
|
||||||
<pre><code>!^ Expand to first argument of previous command
|
|
||||||
!* Expand to all arguments of previous command
|
|
||||||
typo_sub Interactive typo substitution (Ctrl+F)
|
|
||||||
bang_string !string expansion
|
|
||||||
bang_search !?string search
|
|
||||||
bang_minus_n !-n (nth-previous command)</code></pre>
|
|
||||||
<h2 data-number="8.10" id="410-miscellaneous">4.10 Miscellaneous</h2>
|
|
||||||
<pre><code>/exit exit
|
|
||||||
:q Close pane (alias for terminal close)
|
|
||||||
:Q Close tab
|
|
||||||
sudu sudo -s
|
|
||||||
kt kitty (Kitty only)
|
|
||||||
c cat
|
|
||||||
speedtest-fast fast-cli
|
|
||||||
bl bd list
|
|
||||||
bs bd sync
|
|
||||||
bC bd create --title
|
|
||||||
bsh bd show
|
|
||||||
lb lazybeads</code></pre>
|
|
||||||
<h2 data-number="8.11" id="411-shell-aliases">4.11 Shell Aliases</h2>
|
|
||||||
<p>These aliases are defined in conf.d/tricks.fish via alias (which
|
|
||||||
creates Fish functions). They are active in all interactive
|
|
||||||
sessions.</p>
|
|
||||||
<h3 data-number="8.11.1" id="navigation">Navigation</h3>
|
|
||||||
<pre><code>.. cd ..
|
|
||||||
... cd ../..
|
|
||||||
.... cd ../../..
|
|
||||||
..... cd ../../../..
|
|
||||||
...... cd ../../../../..</code></pre>
|
|
||||||
<h3 data-number="8.11.2" id="color-overrides">Color Overrides</h3>
|
|
||||||
<p>Force color output for common tools:</p>
|
|
||||||
<pre><code>grep grep --color=auto
|
|
||||||
fgrep fgrep --color=auto
|
|
||||||
egrep egrep --color=auto
|
|
||||||
dir dir --color=auto
|
|
||||||
vdir vdir --color=auto</code></pre>
|
|
||||||
<h3 data-number="8.11.3" id="safety-wrappers">Safety Wrappers</h3>
|
|
||||||
<p>Add -i (interactive confirmation) to destructive commands:</p>
|
|
||||||
<pre><code>cp cp -i
|
|
||||||
mv mv -i</code></pre>
|
|
||||||
<h3 data-number="8.11.4" id="archives-and-networking">Archives and
|
|
||||||
Networking</h3>
|
|
||||||
<pre><code>tarnow tar -acf Create compressed archive (auto-detects format)
|
|
||||||
untar tar -zxvf Extract a gzip-compressed archive
|
|
||||||
wget wget -c Resume interrupted downloads by default
|
|
||||||
tb nc termbin.com 9999 Pipe content to termbin.com for quick sharing</code></pre>
|
|
||||||
<h3 data-number="8.11.5" id="system-logs">System Logs</h3>
|
|
||||||
<pre><code>jctl journalctl -p 3 -xb Show priority-3 (error) journal entries
|
|
||||||
from the current boot</code></pre>
|
|
||||||
<hr />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,886 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="generator" content="pandoc" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
||||||
<meta name="author" content="Rootiest" />
|
|
||||||
<title>FISH-CONFIG</title>
|
|
||||||
<style>
|
|
||||||
div.sitenav { display: flex; flex-direction: row; flex-wrap: wrap; }
|
|
||||||
span.navlink { flex: 1; }
|
|
||||||
span.navlink-label { display: inline-block; min-width: 4em; }
|
|
||||||
html {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0 auto;
|
|
||||||
max-width: 36em;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-right: 50px;
|
|
||||||
padding-top: 50px;
|
|
||||||
padding-bottom: 50px;
|
|
||||||
hyphens: auto;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
text-rendering: optimizeLegibility;
|
|
||||||
font-kerning: normal;
|
|
||||||
}
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
body {
|
|
||||||
font-size: 0.9em;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media print {
|
|
||||||
html {
|
|
||||||
background-color: white;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
background-color: transparent;
|
|
||||||
color: black;
|
|
||||||
font-size: 12pt;
|
|
||||||
}
|
|
||||||
p, h2, h3 {
|
|
||||||
orphans: 3;
|
|
||||||
widows: 3;
|
|
||||||
}
|
|
||||||
h2, h3, h4 {
|
|
||||||
page-break-after: avoid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #1a1a1a;
|
|
||||||
}
|
|
||||||
img {
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 1.4em;
|
|
||||||
}
|
|
||||||
h5, h6 {
|
|
||||||
font-size: 1em;
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
h6 {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
ol, ul {
|
|
||||||
padding-left: 1.7em;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
li > ol, li > ul {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
blockquote {
|
|
||||||
margin: 1em 0 1em 1.7em;
|
|
||||||
padding-left: 1em;
|
|
||||||
border-left: 2px solid #e6e6e6;
|
|
||||||
color: #606060;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
|
|
||||||
font-size: 85%;
|
|
||||||
margin: 0;
|
|
||||||
hyphens: manual;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
margin: 1em 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
padding: 0;
|
|
||||||
overflow: visible;
|
|
||||||
overflow-wrap: normal;
|
|
||||||
}
|
|
||||||
.sourceCode {
|
|
||||||
background-color: transparent;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
hr {
|
|
||||||
background-color: #1a1a1a;
|
|
||||||
border: none;
|
|
||||||
height: 1px;
|
|
||||||
margin: 1em 0;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
margin: 1em 0;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
overflow-x: auto;
|
|
||||||
display: block;
|
|
||||||
font-variant-numeric: lining-nums tabular-nums;
|
|
||||||
}
|
|
||||||
table caption {
|
|
||||||
margin-bottom: 0.75em;
|
|
||||||
}
|
|
||||||
tbody {
|
|
||||||
margin-top: 0.5em;
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
border-bottom: 1px solid #1a1a1a;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
border-top: 1px solid #1a1a1a;
|
|
||||||
padding: 0.25em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding: 0.125em 0.5em 0.25em 0.5em;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
margin-bottom: 4em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#TOC li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
#TOC ul {
|
|
||||||
padding-left: 1.3em;
|
|
||||||
}
|
|
||||||
#TOC > ul {
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
#TOC a:not(:hover) {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
code{white-space: pre-wrap;}
|
|
||||||
span.smallcaps{font-variant: small-caps;}
|
|
||||||
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
||||||
div.column{flex: auto; overflow-x: auto;}
|
|
||||||
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
||||||
/* The extra [class] is a hack that increases specificity enough to
|
|
||||||
override a similar rule in reveal.js */
|
|
||||||
ul.task-list[class]{list-style: none;}
|
|
||||||
ul.task-list li input[type="checkbox"] {
|
|
||||||
font-size: inherit;
|
|
||||||
width: 0.8em;
|
|
||||||
margin: 0 0.8em 0.2em -1.6em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
/* ── Catppuccin Latte (light) / Mocha (dark) ─────────────────── */
|
|
||||||
:root {
|
|
||||||
color-scheme: light dark;
|
|
||||||
--bg: #eff1f5;
|
|
||||||
--surface: #e6e9ef;
|
|
||||||
--overlay: #ccd0da;
|
|
||||||
--text: #4c4f69;
|
|
||||||
--sub1: #6c6f85;
|
|
||||||
--sub0: #8c8fa1;
|
|
||||||
--blue: #1e66f5;
|
|
||||||
--lavender: #7287fd;
|
|
||||||
--sapphire: #209fb5;
|
|
||||||
--green: #40a02b;
|
|
||||||
--yellow: #df8e1d;
|
|
||||||
--peach: #fe640b;
|
|
||||||
--mauve: #8839ef;
|
|
||||||
--code-bg: #dce0e8;
|
|
||||||
--border: #bcc0cc;
|
|
||||||
--glow1: rgba(30, 102, 245, 0.05);
|
|
||||||
--glow2: rgba(136, 57, 239, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
|
||||||
:root {
|
|
||||||
--bg: #1e1e2e;
|
|
||||||
--surface: #313244;
|
|
||||||
--overlay: #45475a;
|
|
||||||
--text: #cdd6f4;
|
|
||||||
--sub1: #bac2de;
|
|
||||||
--sub0: #a6adc8;
|
|
||||||
--blue: #89b4fa;
|
|
||||||
--lavender: #b4befe;
|
|
||||||
--sapphire: #74c7ec;
|
|
||||||
--green: #a6e3a1;
|
|
||||||
--yellow: #f9e2af;
|
|
||||||
--peach: #fab387;
|
|
||||||
--mauve: #cba6f7;
|
|
||||||
--code-bg: #181825;
|
|
||||||
--border: #45475a;
|
|
||||||
--glow1: rgba(137, 180, 250, 0.06);
|
|
||||||
--glow2: rgba(203, 166, 247, 0.05);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*, *::before, *::after { box-sizing: border-box; }
|
|
||||||
|
|
||||||
html {
|
|
||||||
background-color: var(--bg);
|
|
||||||
background-image:
|
|
||||||
radial-gradient(ellipse 55% 40% at 10% 5%, var(--glow1) 0%, transparent 100%),
|
|
||||||
radial-gradient(ellipse 45% 45% at 90% 95%, var(--glow2) 0%, transparent 100%);
|
|
||||||
min-height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
color: var(--text);
|
|
||||||
font-family: system-ui, -apple-system, "Segoe UI", Helvetica, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 1.75;
|
|
||||||
max-width: 880px;
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 2rem 2.5rem 5rem;
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Links ─────────────────────────────────────────────────── */
|
|
||||||
a { color: var(--blue); text-decoration: none; }
|
|
||||||
a:hover { color: var(--lavender); text-decoration: underline; }
|
|
||||||
a:visited { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Headings ──────────────────────────────────────────────── */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
color: var(--lavender);
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-top: 2em;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
font-size: 1.9rem;
|
|
||||||
color: var(--text);
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.4em;
|
|
||||||
margin-top: 1.2em;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
font-size: 1.35rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
padding-bottom: 0.2em;
|
|
||||||
}
|
|
||||||
h3 { font-size: 1.1rem; color: var(--sapphire); }
|
|
||||||
h4 { font-size: 0.95rem; color: var(--sub1); }
|
|
||||||
|
|
||||||
p { margin: 0.8em 0; }
|
|
||||||
|
|
||||||
/* ── Title block (pandoc-generated cover) ──────────────────── */
|
|
||||||
#title-block-header {
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5rem 0 2rem;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid var(--border);
|
|
||||||
}
|
|
||||||
#title-block-header .title {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 2.6rem;
|
|
||||||
letter-spacing: 0.12em;
|
|
||||||
color: var(--lavender);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.75rem;
|
|
||||||
}
|
|
||||||
#title-block-header .author,
|
|
||||||
#title-block-header .date {
|
|
||||||
color: var(--sub0);
|
|
||||||
font-size: 0.875rem;
|
|
||||||
margin: 0.2rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Inline code ───────────────────────────────────────────── */
|
|
||||||
code {
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
background: var(--code-bg);
|
|
||||||
color: var(--peach);
|
|
||||||
padding: 0.15em 0.4em;
|
|
||||||
border-radius: 4px;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Code blocks ───────────────────────────────────────────── */
|
|
||||||
pre {
|
|
||||||
background: var(--code-bg);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--sapphire);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.1em 1.4em;
|
|
||||||
overflow-x: auto;
|
|
||||||
line-height: 1.55;
|
|
||||||
margin: 1.2em 0;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
background: none;
|
|
||||||
color: var(--text);
|
|
||||||
padding: 0;
|
|
||||||
font-size: 0.88em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Blockquotes ───────────────────────────────────────────── */
|
|
||||||
blockquote {
|
|
||||||
border-left: 3px solid var(--yellow);
|
|
||||||
margin: 1.5em 0;
|
|
||||||
padding: 0.75em 1.25em;
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--sub1);
|
|
||||||
border-radius: 0 6px 6px 0;
|
|
||||||
}
|
|
||||||
blockquote p { margin: 0.3em 0; }
|
|
||||||
|
|
||||||
/* ── Tables ────────────────────────────────────────────────── */
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 1.4em 0;
|
|
||||||
font-size: 0.93em;
|
|
||||||
}
|
|
||||||
th, td {
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
padding: 0.55em 0.9em;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background: var(--surface);
|
|
||||||
color: var(--lavender);
|
|
||||||
font-weight: 600;
|
|
||||||
font-family: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
|
|
||||||
font-size: 0.82em;
|
|
||||||
letter-spacing: 0.06em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
tr:nth-child(even) { background: var(--surface); }
|
|
||||||
tr:hover { background: var(--overlay); }
|
|
||||||
|
|
||||||
/* ── HR ────────────────────────────────────────────────────── */
|
|
||||||
hr { border: none; border-top: 1px solid var(--border); margin: 2.5em 0; }
|
|
||||||
|
|
||||||
/* ── Lists ─────────────────────────────────────────────────── */
|
|
||||||
ul, ol { padding-left: 1.6em; }
|
|
||||||
li { margin: 0.35em 0; }
|
|
||||||
|
|
||||||
/* ── Chunk navigation bar (prev / up / next) ───────────────── */
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) {
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
font-size: 0.875em;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
nav:not(#TOC):not([role="doc-toc"]) p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.65em 1.2em;
|
|
||||||
display: flex;
|
|
||||||
gap: 0.4em 1.75em;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
/* JS wraps each "Label: <a>" pair in .nav-item so they flex as a unit */
|
|
||||||
.nav-item {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.3em;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.nav-item a { color: var(--blue); }
|
|
||||||
.nav-item a:hover { color: var(--lavender); }
|
|
||||||
|
|
||||||
/* ── Table of contents panel ───────────────────────────────── */
|
|
||||||
nav#TOC, nav[role="doc-toc"] {
|
|
||||||
display: block;
|
|
||||||
background: var(--surface);
|
|
||||||
border: 1px solid var(--border);
|
|
||||||
border-left: 3px solid var(--lavender);
|
|
||||||
border-radius: 0 8px 8px 0;
|
|
||||||
padding: 1.2em 1.5em;
|
|
||||||
margin: 1.5em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > h2,
|
|
||||||
nav[role="doc-toc"] > h2 {
|
|
||||||
font-size: 0.7rem;
|
|
||||||
letter-spacing: 0.14em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: var(--sub0);
|
|
||||||
border: none;
|
|
||||||
margin: 0 0 0.9em;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
nav#TOC ul, nav[role="doc-toc"] ul {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 1em;
|
|
||||||
margin: 0.25em 0;
|
|
||||||
}
|
|
||||||
nav#TOC > ul, nav[role="doc-toc"] > ul { padding-left: 0; }
|
|
||||||
nav#TOC li, nav[role="doc-toc"] li {
|
|
||||||
margin: 0.3em 0;
|
|
||||||
padding-left: 0.75em;
|
|
||||||
border-left: 1px solid transparent;
|
|
||||||
transition: border-color 0.12s;
|
|
||||||
}
|
|
||||||
nav#TOC li:hover, nav[role="doc-toc"] li:hover {
|
|
||||||
border-left-color: var(--lavender);
|
|
||||||
}
|
|
||||||
nav#TOC a, nav[role="doc-toc"] a {
|
|
||||||
color: var(--sub1);
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
nav#TOC a:hover, nav[role="doc-toc"] a:hover {
|
|
||||||
color: var(--lavender);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
|
||||||
/* ── Hide ToC on every page except index.html ───────────── */
|
|
||||||
var path = location.pathname;
|
|
||||||
var onIndex = path === '/' || path === '' || /\/index\.html(\?.*)?$/.test(path);
|
|
||||||
if (!onIndex) {
|
|
||||||
var toc = document.getElementById('TOC') ||
|
|
||||||
document.querySelector('[role="doc-toc"]');
|
|
||||||
if (toc) toc.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Wrap each "Label: <a>" pair in a .nav-item span ───────
|
|
||||||
Pandoc emits label text nodes and anchors as siblings;
|
|
||||||
flex sees them as separate items, causing labels to split
|
|
||||||
from their links when wrapping. Grouping them in a span
|
|
||||||
keeps each label+link as a single flex unit. */
|
|
||||||
document.querySelectorAll('nav:not(#TOC):not([role="doc-toc"])').forEach(function (nav) {
|
|
||||||
var p = nav.querySelector('p');
|
|
||||||
if (!p) return;
|
|
||||||
var children = Array.from(p.childNodes);
|
|
||||||
var pairs = [];
|
|
||||||
for (var i = 0; i + 1 < children.length; i++) {
|
|
||||||
var cur = children[i];
|
|
||||||
var nxt = children[i + 1];
|
|
||||||
if (cur.nodeType === Node.TEXT_NODE &&
|
|
||||||
/[A-Z][a-z]*:\s*/.test(cur.textContent) &&
|
|
||||||
nxt.nodeType === Node.ELEMENT_NODE &&
|
|
||||||
nxt.tagName === 'A') {
|
|
||||||
pairs.push([cur, nxt]);
|
|
||||||
i++; // skip the anchor on the next iteration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pairs.forEach(function (pair) {
|
|
||||||
var span = document.createElement('span');
|
|
||||||
span.className = 'nav-item';
|
|
||||||
p.insertBefore(span, pair[0]);
|
|
||||||
span.appendChild(pair[0]);
|
|
||||||
span.appendChild(pair[1]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<nav id="sitenav">
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="sitenav">
|
|
||||||
<span class="navlink">
|
|
||||||
<span class="navlink-label">Next:</span> <a href="1-name.html" accesskey="n" rel="next">NAME</a>
|
|
||||||
</span>
|
|
||||||
<span class="navlink">
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<header id="title-block-header">
|
|
||||||
<h1 class="title">FISH-CONFIG</h1>
|
|
||||||
<p class="author">Rootiest</p>
|
|
||||||
<p class="date">June 2026</p>
|
|
||||||
</header>
|
|
||||||
<nav id="TOC" role="doc-toc">
|
|
||||||
<ul>
|
|
||||||
<li><a href="1-name.html" id="toc-name">NAME</a></li>
|
|
||||||
<li><a href="2-synopsis.html" id="toc-synopsis">SYNOPSIS</a></li>
|
|
||||||
<li><a href="3-description.html"
|
|
||||||
id="toc-description">DESCRIPTION</a></li>
|
|
||||||
<li><a href="4-table-of-contents.html" id="toc-table-of-contents">TABLE
|
|
||||||
OF CONTENTS</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html"
|
|
||||||
id="toc-1-configuration-variables">1. CONFIGURATION VARIABLES</a>
|
|
||||||
<ul>
|
|
||||||
<li><a
|
|
||||||
href="5-1-configuration-variables.html#environment-directories-xdg"
|
|
||||||
id="toc-environment-directories-xdg">Environment Directories
|
|
||||||
(XDG)</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#tool-homes-xdg-compliant"
|
|
||||||
id="toc-tool-homes-xdg-compliant">Tool Homes (XDG-compliant)</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#editor-and-pager"
|
|
||||||
id="toc-editor-and-pager">Editor and Pager</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#scrollback-history"
|
|
||||||
id="toc-scrollback-history">Scrollback History</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#other"
|
|
||||||
id="toc-other">Other</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#pager-hierarchy"
|
|
||||||
id="toc-pager-hierarchy">Pager Hierarchy</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#integrations"
|
|
||||||
id="toc-integrations">Integrations</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="5-1-configuration-variables.html#zoxide"
|
|
||||||
id="toc-zoxide">Zoxide</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#direnv"
|
|
||||||
id="toc-direnv">DirEnv</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#auto-python-venv"
|
|
||||||
id="toc-auto-python-venv">Auto Python Venv</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#wakatime"
|
|
||||||
id="toc-wakatime">WakaTime</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#tailscale"
|
|
||||||
id="toc-tailscale">Tailscale</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#done-notifications"
|
|
||||||
id="toc-done-notifications">Done Notifications</a></li>
|
|
||||||
<li><a href="5-1-configuration-variables.html#scrollback-history-1"
|
|
||||||
id="toc-scrollback-history-1">Scrollback History</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="6-2-path-setup.html" id="toc-2-path-setup">2. PATH
|
|
||||||
SETUP</a></li>
|
|
||||||
<li><a href="7-3-key-bindings.html" id="toc-3-key-bindings">3. KEY
|
|
||||||
BINDINGS</a>
|
|
||||||
<ul>
|
|
||||||
<li><a
|
|
||||||
href="7-3-key-bindings.html#fzf-bindings-bundled-from-patrickf1fzffish"
|
|
||||||
id="toc-fzf-bindings-bundled-from-patrickf1fzffish">FZF Bindings
|
|
||||||
(bundled from PatrickF1/fzf.fish)</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="8-4-abbreviations.html" id="toc-4-abbreviations">4.
|
|
||||||
ABBREVIATIONS</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="8-4-abbreviations.html#41-editors" id="toc-41-editors">4.1
|
|
||||||
Editors</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#42-navigation-and-listing"
|
|
||||||
id="toc-42-navigation-and-listing">4.2 Navigation and Listing</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#43-git" id="toc-43-git">4.3
|
|
||||||
Git</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#44-terminal-windows-tabs-and-panes"
|
|
||||||
id="toc-44-terminal-windows-tabs-and-panes">4.4 Terminal Windows, Tabs,
|
|
||||||
and Panes</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#45-chezmoi" id="toc-45-chezmoi">4.5
|
|
||||||
Chezmoi</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#46-docker" id="toc-46-docker">4.6
|
|
||||||
Docker</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#47-systemctl"
|
|
||||||
id="toc-47-systemctl">4.7 Systemctl</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#48-ai-assistants"
|
|
||||||
id="toc-48-ai-assistants">4.8 AI Assistants</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#49-history-expansion"
|
|
||||||
id="toc-49-history-expansion">4.9 History Expansion</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#410-miscellaneous"
|
|
||||||
id="toc-410-miscellaneous">4.10 Miscellaneous</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#411-shell-aliases"
|
|
||||||
id="toc-411-shell-aliases">4.11 Shell Aliases</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="8-4-abbreviations.html#navigation"
|
|
||||||
id="toc-navigation">Navigation</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#color-overrides"
|
|
||||||
id="toc-color-overrides">Color Overrides</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#safety-wrappers"
|
|
||||||
id="toc-safety-wrappers">Safety Wrappers</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#archives-and-networking"
|
|
||||||
id="toc-archives-and-networking">Archives and Networking</a></li>
|
|
||||||
<li><a href="8-4-abbreviations.html#system-logs"
|
|
||||||
id="toc-system-logs">System Logs</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html"
|
|
||||||
id="toc-5-functions-reference">5. FUNCTIONS REFERENCE</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#51-file-and-directory"
|
|
||||||
id="toc-51-file-and-directory">5.1 File and Directory</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#cat" id="toc-cat">cat</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#copy"
|
|
||||||
id="toc-copy">copy</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#du" id="toc-du">du</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#dusize"
|
|
||||||
id="toc-dusize">dusize</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#ld" id="toc-ld">lD</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#ls" id="toc-ls">ls</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#lsr" id="toc-lsr">lsr</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#lss" id="toc-lss">lss</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#lstree"
|
|
||||||
id="toc-lstree">lstree</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#lt" id="toc-lt">lt</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#ltr" id="toc-ltr">ltr</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#lx" id="toc-lx">lx</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#mkdir"
|
|
||||||
id="toc-mkdir">mkdir</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#mkcd"
|
|
||||||
id="toc-mkcd">mkcd</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#poke"
|
|
||||||
id="toc-poke">poke</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#rm" id="toc-rm">rm</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#scrub"
|
|
||||||
id="toc-scrub">scrub</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#52-navigation"
|
|
||||||
id="toc-52-navigation">5.2 Navigation</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#cdi" id="toc-cdi">cdi</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#clone"
|
|
||||||
id="toc-clone">clone</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#clonet"
|
|
||||||
id="toc-clonet">clonet</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#53-editors-and-viewers"
|
|
||||||
id="toc-53-editors-and-viewers">5.3 Editors and Viewers</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#edit"
|
|
||||||
id="toc-edit">edit</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#fc" id="toc-fc">fc</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#less"
|
|
||||||
id="toc-less">less</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#rawfish"
|
|
||||||
id="toc-rawfish">rawfish</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#view"
|
|
||||||
id="toc-view">view</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#54-git-and-version-control"
|
|
||||||
id="toc-54-git-and-version-control">5.4 Git and Version Control</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#branch"
|
|
||||||
id="toc-branch">branch</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#gi" id="toc-gi">gi</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#git-clean"
|
|
||||||
id="toc-git-clean">git-clean</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#gitup"
|
|
||||||
id="toc-gitup">gitup</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#gitui"
|
|
||||||
id="toc-gitui">gitui</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#hist"
|
|
||||||
id="toc-hist">hist</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#55-package-management"
|
|
||||||
id="toc-55-package-management">5.5 Package Management</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#pkg" id="toc-pkg">pkg</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#search"
|
|
||||||
id="toc-search">search</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#upgrade"
|
|
||||||
id="toc-upgrade">upgrade</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#cleanup"
|
|
||||||
id="toc-cleanup">cleanup</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#parur"
|
|
||||||
id="toc-parur">parur</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#56-dependency-management"
|
|
||||||
id="toc-56-dependency-management">5.6 Dependency Management</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#fish-deps"
|
|
||||||
id="toc-fish-deps">fish-deps</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#check_fish_deps"
|
|
||||||
id="toc-check_fish_deps">check_fish_deps</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#57-system-and-monitoring"
|
|
||||||
id="toc-57-system-and-monitoring">5.7 System and Monitoring</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#top" id="toc-top">top</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#swapstat"
|
|
||||||
id="toc-swapstat">swapstat</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#sbver"
|
|
||||||
id="toc-sbver">sbver</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#ports"
|
|
||||||
id="toc-ports">ports</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#screensleep"
|
|
||||||
id="toc-screensleep">screensleep</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#lock"
|
|
||||||
id="toc-lock">lock</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#sudo-toggle"
|
|
||||||
id="toc-sudo-toggle">sudo-toggle</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#limine-edit"
|
|
||||||
id="toc-limine-edit">limine-edit</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#58-terminal-management"
|
|
||||||
id="toc-58-terminal-management">5.8 Terminal Management</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#tab" id="toc-tab">tab</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#split"
|
|
||||||
id="toc-split">split</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#spwin"
|
|
||||||
id="toc-spwin">spwin</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#detach"
|
|
||||||
id="toc-detach">detach</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#bkg" id="toc-bkg">bkg</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#ssh" id="toc-ssh">ssh</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#59-clipboard"
|
|
||||||
id="toc-59-clipboard">5.9 Clipboard</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#y" id="toc-y">y</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#p" id="toc-p">p</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#paste"
|
|
||||||
id="toc-paste">paste</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#510-network"
|
|
||||||
id="toc-510-network">5.10 Network</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#gip" id="toc-gip">gip</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#gip4"
|
|
||||||
id="toc-gip4">gip4</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#gip6"
|
|
||||||
id="toc-gip6">gip6</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#ping"
|
|
||||||
id="toc-ping">ping</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#qr" id="toc-qr">qr</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#511-pager-and-logging"
|
|
||||||
id="toc-511-pager-and-logging">5.11 Pager and Logging</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#logs"
|
|
||||||
id="toc-logs">logs</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#smart_exit"
|
|
||||||
id="toc-smart_exit">smart_exit</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#512-ai-and-developer-tools"
|
|
||||||
id="toc-512-ai-and-developer-tools">5.12 AI and Developer Tools</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#antigravity"
|
|
||||||
id="toc-antigravity">antigravity</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#antigravity-ide"
|
|
||||||
id="toc-antigravity-ide">antigravity-ide</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#antigravity-resume"
|
|
||||||
id="toc-antigravity-resume">antigravity-resume</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#claude-resume"
|
|
||||||
id="toc-claude-resume">claude-resume</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#claude-docs"
|
|
||||||
id="toc-claude-docs">claude-docs</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#claude-pr"
|
|
||||||
id="toc-claude-pr">claude-pr</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#code-resume"
|
|
||||||
id="toc-code-resume">code-resume</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#superpowers"
|
|
||||||
id="toc-superpowers">superpowers</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#513-media-and-utilities"
|
|
||||||
id="toc-513-media-and-utilities">5.13 Media and Utilities</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#dng2avif"
|
|
||||||
id="toc-dng2avif">dng2avif</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#steam-dl"
|
|
||||||
id="toc-steam-dl">steam-dl</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#spark"
|
|
||||||
id="toc-spark">spark</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#514-miscellaneous"
|
|
||||||
id="toc-514-miscellaneous">5.14 Miscellaneous</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="9-5-functions-reference.html#config-help"
|
|
||||||
id="toc-config-help">config-help</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#config-update"
|
|
||||||
id="toc-config-update">config-update</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#bash"
|
|
||||||
id="toc-bash">bash</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#bd-pull"
|
|
||||||
id="toc-bd-pull">bd-pull</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#cheat"
|
|
||||||
id="toc-cheat">cheat</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#cffetch--ffetch"
|
|
||||||
id="toc-cffetch--ffetch">cffetch / ffetch</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#dockup"
|
|
||||||
id="toc-dockup">dockup</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#joplin"
|
|
||||||
id="toc-joplin">joplin</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#ld-1"
|
|
||||||
id="toc-ld-1">ld</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#replay"
|
|
||||||
id="toc-replay">replay</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#tmux-clean"
|
|
||||||
id="toc-tmux-clean">tmux-clean</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#wake-lock"
|
|
||||||
id="toc-wake-lock">wake-lock</a></li>
|
|
||||||
<li><a href="9-5-functions-reference.html#zellij"
|
|
||||||
id="toc-zellij">zellij</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="10-6-dependency-catalog.html"
|
|
||||||
id="toc-6-dependency-catalog">6. DEPENDENCY CATALOG</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="10-6-dependency-catalog.html#required"
|
|
||||||
id="toc-required">Required</a></li>
|
|
||||||
<li><a href="10-6-dependency-catalog.html#integrations-1"
|
|
||||||
id="toc-integrations-1">Integrations</a></li>
|
|
||||||
<li><a href="10-6-dependency-catalog.html#recommended"
|
|
||||||
id="toc-recommended">Recommended</a></li>
|
|
||||||
<li><a href="10-6-dependency-catalog.html#install-methods"
|
|
||||||
id="toc-install-methods">Install Methods</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="11-7-customization.html" id="toc-7-customization">7.
|
|
||||||
CUSTOMIZATION</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="11-7-customization.html#machine-local-configuration"
|
|
||||||
id="toc-machine-local-configuration">Machine-local
|
|
||||||
Configuration</a></li>
|
|
||||||
<li><a href="11-7-customization.html#secrets-and-api-keys"
|
|
||||||
id="toc-secrets-and-api-keys">Secrets and API Keys</a></li>
|
|
||||||
<li><a href="11-7-customization.html#overriding-configuration-variables"
|
|
||||||
id="toc-overriding-configuration-variables">Overriding Configuration
|
|
||||||
Variables</a></li>
|
|
||||||
<li><a href="11-7-customization.html#fish-universal-variables"
|
|
||||||
id="toc-fish-universal-variables">Fish Universal Variables</a></li>
|
|
||||||
<li><a
|
|
||||||
href="11-7-customization.html#opinionated-components-minimal-mode"
|
|
||||||
id="toc-opinionated-components-minimal-mode">Opinionated Components
|
|
||||||
(Minimal Mode)</a></li>
|
|
||||||
<li><a href="11-7-customization.html#prompt-and-theme"
|
|
||||||
id="toc-prompt-and-theme">Prompt and Theme</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="11-7-customization.html#starship"
|
|
||||||
id="toc-starship">Starship</a></li>
|
|
||||||
<li><a href="11-7-customization.html#fzf" id="toc-fzf">FZF</a></li>
|
|
||||||
<li><a
|
|
||||||
href="11-7-customization.html#catppuccin-mocha-syntax-highlighting"
|
|
||||||
id="toc-catppuccin-mocha-syntax-highlighting">Catppuccin Mocha Syntax
|
|
||||||
Highlighting</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="12-8-fisher-plugins.html" id="toc-8-fisher-plugins">8.
|
|
||||||
FISHER PLUGINS</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="12-8-fisher-plugins.html#fisher-managed-plugins"
|
|
||||||
id="toc-fisher-managed-plugins">Fisher-Managed Plugins</a></li>
|
|
||||||
<li><a href="12-8-fisher-plugins.html#sponge-history-filtering"
|
|
||||||
id="toc-sponge-history-filtering">Sponge History Filtering</a></li>
|
|
||||||
<li><a href="12-8-fisher-plugins.html#bundled-plugin-functionality"
|
|
||||||
id="toc-bundled-plugin-functionality">Bundled Plugin
|
|
||||||
Functionality</a></li>
|
|
||||||
<li><a href="12-8-fisher-plugins.html#fish_plugins-manifest"
|
|
||||||
id="toc-fish_plugins-manifest">fish_plugins Manifest</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="13-9-installation.html" id="toc-9-installation">9.
|
|
||||||
INSTALLATION</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="13-9-installation.html#return-sentinel"
|
|
||||||
id="toc-return-sentinel">Return Sentinel</a></li>
|
|
||||||
<li><a href="13-9-installation.html#updating"
|
|
||||||
id="toc-updating">Updating</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="14-10-personalization.html" id="toc-10-personalization">10.
|
|
||||||
PERSONALIZATION</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="14-10-personalization.html#secretsfish"
|
|
||||||
id="toc-secretsfish">secrets.fish</a></li>
|
|
||||||
<li><a href="14-10-personalization.html#localfish"
|
|
||||||
id="toc-localfish">local.fish</a></li>
|
|
||||||
</ul></li>
|
|
||||||
<li><a href="15-11-viewing-this-manual.html"
|
|
||||||
id="toc-11-viewing-this-manual">11. VIEWING THIS MANUAL</a>
|
|
||||||
<ul>
|
|
||||||
<li><a href="15-11-viewing-this-manual.html#with-ov-recommended"
|
|
||||||
id="toc-with-ov-recommended">With ov (recommended)</a></li>
|
|
||||||
<li><a href="15-11-viewing-this-manual.html#with-bat"
|
|
||||||
id="toc-with-bat">With bat</a></li>
|
|
||||||
<li><a href="15-11-viewing-this-manual.html#as-a-man-page"
|
|
||||||
id="toc-as-a-man-page">As a man page</a></li>
|
|
||||||
<li><a href="15-11-viewing-this-manual.html#in-the-browser-html"
|
|
||||||
id="toc-in-the-browser-html">In the browser (HTML)</a></li>
|
|
||||||
<li><a href="15-11-viewing-this-manual.html#as-a-wiki"
|
|
||||||
id="toc-as-a-wiki">As a wiki</a></li>
|
|
||||||
<li><a href="15-11-viewing-this-manual.html#jumping-to-a-section"
|
|
||||||
id="toc-jumping-to-a-section">Jumping to a section</a></li>
|
|
||||||
</ul></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Name
|
||||||
|
manTitle: NAME
|
||||||
|
man: true
|
||||||
|
site: false
|
||||||
|
sidebar:
|
||||||
|
order: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
fish-config - personal fish shell configuration for Fish 4.x with modern CLI tool integration
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: Synopsis
|
||||||
|
manTitle: SYNOPSIS
|
||||||
|
man: true
|
||||||
|
site: false
|
||||||
|
sidebar:
|
||||||
|
order: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
help config [SECTION]
|
||||||
|
|
||||||
|
Open this manual in the best available pager. Optionally jump to a section
|
||||||
|
by keyword:
|
||||||
|
|
||||||
|
help config keybindings
|
||||||
|
help config pkg
|
||||||
|
help config abbreviations
|
||||||
|
help config logs
|
||||||
|
|
||||||
|
The `help config` syntax integrates with fish's built-in help command.
|
||||||
|
The underlying `config-help` function is also available directly.
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: Table Of Contents
|
||||||
|
manTitle: TABLE OF CONTENTS
|
||||||
|
man: true
|
||||||
|
site: false
|
||||||
|
sidebar:
|
||||||
|
order: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: toc -->
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
---
|
||||||
|
title: Configuration Variables
|
||||||
|
manTitle: 1. CONFIGURATION VARIABLES
|
||||||
|
sidebar:
|
||||||
|
order: 5
|
||||||
|
helpKeywords:
|
||||||
|
- variables
|
||||||
|
- config
|
||||||
|
---
|
||||||
|
|
||||||
|
These variables are exported from config.fish on every interactive session.
|
||||||
|
Override them in local.fish (see Section 10, Personalization).
|
||||||
|
|
||||||
|
## Environment Directories (XDG)
|
||||||
|
|
||||||
|
| Variable | Value |
|
||||||
|
|---|---|
|
||||||
|
| `XDG_CONFIG_HOME` | `~/.config` |
|
||||||
|
| `XDG_CACHE_HOME` | `~/.cache` |
|
||||||
|
| `XDG_DATA_HOME` | `~/.local/share` |
|
||||||
|
| `XDG_STATE_HOME` | `~/.local/state` |
|
||||||
|
|
||||||
|
Tools that respect XDG are directed to these paths rather than polluting `$HOME`.
|
||||||
|
|
||||||
|
## Tool Homes (XDG-compliant)
|
||||||
|
|
||||||
|
| Variable | Value |
|
||||||
|
|---|---|
|
||||||
|
| `CARGO_HOME` | `$XDG_DATA_HOME/cargo` |
|
||||||
|
| `RUSTUP_HOME` | `$XDG_DATA_HOME/rustup` |
|
||||||
|
| `GOPATH` | `$XDG_DATA_HOME/go` |
|
||||||
|
| `BUN_INSTALL` | `$XDG_DATA_HOME/bun` |
|
||||||
|
| `NPM_CONFIG_PREFIX` | `$XDG_DATA_HOME/npm-global` |
|
||||||
|
| `GNUPGHOME` | `$XDG_CONFIG_HOME/gnupg` |
|
||||||
|
| `WAKATIME_HOME` | `$XDG_CONFIG_HOME/wakatime` |
|
||||||
|
|
||||||
|
## Editor and Pager
|
||||||
|
|
||||||
|
| Variable | Value / Notes |
|
||||||
|
|---|---|
|
||||||
|
| `EDITOR` | `nvim` (falls back to `vi` if `nvim` is absent) |
|
||||||
|
| `VISUAL` | unset by default; set a GUI editor via `local.fish` (the `edit` function falls back to a GUI chain when `VISUAL` is empty) |
|
||||||
|
| `SUDO_EDITOR` | same as `EDITOR` |
|
||||||
|
| `PAGER` | `ov` (falls back to `less`) |
|
||||||
|
|
||||||
|
## Scrollback History
|
||||||
|
|
||||||
|
| Variable | Value / Notes |
|
||||||
|
|---|---|
|
||||||
|
| `__fish_scrollback_history_dir` | (unset → `~/.terminal_history`) |
|
||||||
|
| `__fish_scrollback_history_max_files` | (unset → `100`) |
|
||||||
|
| `SCROLLBACK_HISTORY_DIR` | `~/.terminal_history` (exported mirror) |
|
||||||
|
| `SCROLLBACK_HISTORY_MAX_FILES` | `100` (exported mirror) |
|
||||||
|
|
||||||
|
The `__fish_scrollback_history_*` universal variables are the fish-style source
|
||||||
|
of truth — set them via `config-settings` → Paths, or `set -U` directly.
|
||||||
|
`config.fish` exports the `SCROLLBACK_HISTORY_*` mirrors from them, because the
|
||||||
|
POSIX wrapper scripts (`paru`/`yay`/`tmux`/`zellij` logging and `_prune_terminal_logs`)
|
||||||
|
read the exported names from the environment. When the `__fish_` vars are unset,
|
||||||
|
the documented defaults are exported. `config.fish` deliberately does not create
|
||||||
|
a global source var, which would shadow the universal and stop live edits from
|
||||||
|
taking effect.
|
||||||
|
|
||||||
|
Scrollback logs accumulate in `SCROLLBACK_HISTORY_DIR` as timestamped files.
|
||||||
|
When the count exceeds `SCROLLBACK_HISTORY_MAX_FILES` the oldest are pruned
|
||||||
|
automatically on exit. Use `logs` to browse them interactively.
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
| Variable | Value | Notes |
|
||||||
|
|---|---|---|
|
||||||
|
| `GPG_TTY` | `$(tty)` | ensures GPG passphrase prompts work |
|
||||||
|
| `CLAUDE_CODE_NO_FLICKER` | `1` | suppress terminal flicker in Claude Code |
|
||||||
|
| `CDPATH` | `. ~/projects ~` | |
|
||||||
|
|
||||||
|
Opinionated defaults (`CDPATH`, `PAGER`/`MANPAGER`, Vi mode, command shadows,
|
||||||
|
terminal integrations) can be switched off per category with universal
|
||||||
|
variables — see Section 7, "Opinionated Components (Minimal Mode)".
|
||||||
|
|
||||||
|
## Pager Hierarchy
|
||||||
|
|
||||||
|
`$PAGER` is set to `ov` when available, falling back to `less`. The `less` wrapper
|
||||||
|
function extends this into a full chain so anything that calls `less` directly
|
||||||
|
also benefits:
|
||||||
|
|
||||||
|
`$PAGER` → `ov` → `less` → `more` → `cat`
|
||||||
|
|
||||||
|
When `bat` is installed, man pages are rendered with syntax highlighting:
|
||||||
|
|
||||||
|
| Variable | Value |
|
||||||
|
|---|---|
|
||||||
|
| `MANROFFOPT` | `-c` |
|
||||||
|
| `MANPAGER` | `sh -c 'col -bx \| bat -l man -p'` |
|
||||||
|
|
||||||
|
## Integrations
|
||||||
|
|
||||||
|
### Zoxide
|
||||||
|
|
||||||
|
`cd`, `z`, and `cdi`/`zi` are all mapped to `zoxide`-backed navigation. Tab completions
|
||||||
|
for `cd` and `z` blend standard directory entries (CWD and `CDPATH`) with frecency
|
||||||
|
results so both familiar and frequently-visited paths appear in one list.
|
||||||
|
|
||||||
|
### DirEnv
|
||||||
|
|
||||||
|
Automatically loads `.envrc` files on directory change. Takes priority over
|
||||||
|
the auto-venv logic — if a directory is managed by `direnv`, the auto-venv
|
||||||
|
activation is skipped entirely.
|
||||||
|
|
||||||
|
### Auto Python Venv
|
||||||
|
|
||||||
|
When entering a directory that contains a `.venv/`, the virtualenv is activated
|
||||||
|
automatically and deactivated when you leave the project tree.
|
||||||
|
|
||||||
|
### WakaTime
|
||||||
|
|
||||||
|
Every shell command is reported to WakaTime for time-tracking. Set
|
||||||
|
`FISH_WAKATIME_DISABLED=1` to disable without removing the plugin.
|
||||||
|
|
||||||
|
### Tailscale
|
||||||
|
|
||||||
|
Full tab completion for the `tailscale` CLI is provided via
|
||||||
|
`completions/tailscale.fish`, autoloaded on the first `tailscale<TAB>`.
|
||||||
|
|
||||||
|
### Done Notifications
|
||||||
|
|
||||||
|
Desktop notifications fire when a command takes longer than 10 seconds and
|
||||||
|
the terminal window is not focused. Configured via fish universal variables:
|
||||||
|
|
||||||
|
| Variable | Value |
|
||||||
|
|---|---|
|
||||||
|
| `__done_min_cmd_duration` | `10000` ms |
|
||||||
|
| `__done_notification_urgency_level` | `low` |
|
||||||
|
|
||||||
|
### Scrollback History
|
||||||
|
|
||||||
|
When running inside Kitty, closing a shell session via `exit` saves a timestamped
|
||||||
|
scrollback snapshot to `SCROLLBACK_HISTORY_DIR`. Files are named:
|
||||||
|
|
||||||
|
`scrollback_YYYY-MM-DD_HH-MM-SS.log`
|
||||||
|
|
||||||
|
The `paru` and `yay` wrappers (auto-generated in `~/.local/bin/`) run the command
|
||||||
|
inside a PTY via `script(1)` so download progress bars are preserved on screen,
|
||||||
|
then render the captured terminal animation down to a clean static log via
|
||||||
|
`scripts/clean_progress_log.py` (a small terminal-screen emulator that replays
|
||||||
|
cursor movements, collapses repainted progress frames to their final state,
|
||||||
|
and preserves ANSI color). If `python3` is unavailable the wrapper falls back to
|
||||||
|
dropping only the `script(1)` header/footer. Output is saved to:
|
||||||
|
|
||||||
|
- `paru_YYYY-MM-DD_HH-MM-SS.log`
|
||||||
|
- `yay_YYYY-MM-DD_HH-MM-SS.log`
|
||||||
|
|
||||||
|
Before pruning, `_scrollback_prune_junk` silently removes empty files, files
|
||||||
|
with only a single meaningful line (e.g. bare `[exited]` captures), and Kitty
|
||||||
|
tab-rename prompt captures. Use `exit --no-log` (or `exit -n`) to skip capture.
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
title: PATH Setup
|
||||||
|
manTitle: 2. PATH SETUP
|
||||||
|
sidebar:
|
||||||
|
order: 6
|
||||||
|
helpKeywords:
|
||||||
|
- path
|
||||||
|
---
|
||||||
|
|
||||||
|
Directories prepended to PATH in this order (first wins):
|
||||||
|
|
||||||
|
| Directory | Purpose |
|
||||||
|
|---|---|
|
||||||
|
| `~/.local/bin` | Standard user-local executables |
|
||||||
|
| `~/Applications` | User-installed standalone apps |
|
||||||
|
| `~/scripts` | Personal shell scripts |
|
||||||
|
| `~/bin` | Cargo binaries (appended — lowest priority) |
|
||||||
|
| `$BUN_INSTALL/bin` | Bun runtime and global packages |
|
||||||
|
| `$NPM_CONFIG_PREFIX/bin` | Global npm packages |
|
||||||
|
| `~/.lmstudio/bin` | LM Studio CLI |
|
||||||
|
| `~/.resend/bin` | Resend CLI |
|
||||||
|
| `~/.fzf/bin` | `fzf` binary (git-installed) |
|
||||||
|
|
||||||
|
Cargo binaries are intentionally appended (lowest priority) to avoid
|
||||||
|
shadowing system-installed Rust tools.
|
||||||
|
|
||||||
|
NOTE: While these directories are merged with your system's existing `$PATH` values, any executables in the prepended directories above will override (shadow) system binaries of the same name.
|
||||||
|
|
||||||
|
TIP: This standard PATH setup is gated behind the opinionated component overrides toggle. If you prefer to manage your PATH completely manually, you can disable it by setting `__fish_config_op_overrides` to `0` (or toggle it off in the `config-settings` menu).
|
||||||
|
|
||||||
|
---
|
||||||
@@ -1,7 +1,13 @@
|
|||||||
# 3. KEY BINDINGS
|
---
|
||||||
|
title: Key Bindings
|
||||||
**Sections:** [Index](index.md) | [1. Configuration Variables](1-configuration-variables.md) | [2. Path Setup](2-path-setup.md) | **3. Key Bindings** | [4. Abbreviations](4-abbreviations.md) | [5. Functions Reference](5-functions-reference.md) | [6. Dependency Catalog](6-dependency-catalog.md) | [7. Customization](7-customization.md) | [8. Fisher Plugins](8-fisher-plugins.md) | [9. Installation](9-installation.md) | [10. Personalization](10-personalization.md) | [11. Viewing This Manual](11-viewing-this-manual.md)
|
manTitle: 3. KEY BINDINGS
|
||||||
|
sidebar:
|
||||||
|
order: 7
|
||||||
|
helpKeywords:
|
||||||
|
- keybindings
|
||||||
|
- bindings
|
||||||
|
- key-bindings
|
||||||
|
- keys
|
||||||
---
|
---
|
||||||
|
|
||||||
The shell uses Vi key bindings (fish_vi_key_bindings). All custom bindings
|
The shell uses Vi key bindings (fish_vi_key_bindings). All custom bindings
|
||||||
@@ -36,9 +42,15 @@ are active in Insert, Normal, and Visual modes unless noted.
|
|||||||
pressing Enter a second time for certain fast-path
|
pressing Enter a second time for certain fast-path
|
||||||
commands (speedtest-fast, etc.).
|
commands (speedtest-fast, etc.).
|
||||||
|
|
||||||
@@ FZF inline picker. Type @@ anywhere on the command
|
@@ FZF inline picker. Type @ twice anywhere on the
|
||||||
line to open an fzf picker and insert a selection
|
command line to open an fzf picker and replace the
|
||||||
at the cursor position.
|
@@ with the selection. The @@ must be typed as its
|
||||||
|
own token: "cat @@" triggers it, but "cat@@" does
|
||||||
|
not.
|
||||||
|
|
||||||
|
Ctrl+Right Accept autosuggestion one word/directory segment
|
||||||
|
at a time. (Restores Fish 3.x behavior by binding
|
||||||
|
to nextd-or-forward-word).
|
||||||
|
|
||||||
## FZF Bindings (bundled from PatrickF1/fzf.fish)
|
## FZF Bindings (bundled from PatrickF1/fzf.fish)
|
||||||
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: Editors
|
||||||
|
manTitle: 4.1 Editors
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: Editors -->
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: Navigation and Listing
|
||||||
|
manTitle: 4.2 Navigation and Listing
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: Navigation and Listing -->
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: Git
|
||||||
|
manTitle: 4.3 Git
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: Git -->
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Terminal Windows, Tabs, and Panes
|
||||||
|
manTitle: 4.4 Terminal Windows, Tabs, and Panes
|
||||||
|
---
|
||||||
|
|
||||||
|
These abbreviations control the terminal emulator. Each has a Kitty
|
||||||
|
variant and a WezTerm variant; the correct one is inserted based on
|
||||||
|
`$TERM` or `$TERM_PROGRAM`.
|
||||||
|
|
||||||
|
<!-- GENERATED: Terminal Windows, Tabs, and Panes -->
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: Chezmoi
|
||||||
|
manTitle: 4.5 Chezmoi
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: Chezmoi -->
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: Docker
|
||||||
|
manTitle: 4.6 Docker
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: Docker -->
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: Systemctl
|
||||||
|
manTitle: 4.7 Systemctl
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: Systemctl -->
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: AI Assistants
|
||||||
|
manTitle: 4.8 AI Assistants
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: AI Assistants -->
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: History Expansion
|
||||||
|
manTitle: 4.9 History Expansion
|
||||||
|
---
|
||||||
|
|
||||||
|
Bash-style history expansions trigger on Space or Enter. Some are implemented
|
||||||
|
as abbreviations (e.g. `!*`), while others (`!!`, `!$`, `!.`) are implemented
|
||||||
|
as keybindings, but they all serve the same purpose.
|
||||||
|
|
||||||
|
<!-- GENERATED: History Expansion -->
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: Miscellaneous
|
||||||
|
manTitle: 4.10 Miscellaneous
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- GENERATED: Miscellaneous -->
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
title: Shell Aliases
|
||||||
|
manTitle: 4.11 Shell Aliases
|
||||||
|
---
|
||||||
|
|
||||||
|
These aliases are defined in conf.d/tricks.fish via alias (which creates Fish
|
||||||
|
functions). They are active in all interactive sessions.
|
||||||
|
|
||||||
|
<!-- GENERATED: Shell Aliases -->
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
title: Abbreviations
|
||||||
|
manTitle: 4. ABBREVIATIONS
|
||||||
|
sidebar:
|
||||||
|
order: 8
|
||||||
|
helpKeywords:
|
||||||
|
- abbreviations
|
||||||
|
- abbr
|
||||||
|
- abbrs
|
||||||
|
---
|
||||||
|
|
||||||
|
Abbreviations expand when you press Space or Enter. They are terminal-aware:
|
||||||
|
some expand differently in Kitty vs WezTerm vs other terminals.
|
||||||
|
|
||||||
|
<CardGrid>
|
||||||
|
<LinkCard title="Editors" href="/04-abbreviations/01-editors/" />
|
||||||
|
<LinkCard title="Navigation and Listing" href="/04-abbreviations/02-navigation-and-listing/" />
|
||||||
|
<LinkCard title="Git" href="/04-abbreviations/03-git/" />
|
||||||
|
<LinkCard title="Terminal Windows, Tabs, and Panes" href="/04-abbreviations/04-terminal-windows-tabs-and-panes/" />
|
||||||
|
<LinkCard title="Chezmoi" href="/04-abbreviations/05-chezmoi/" />
|
||||||
|
<LinkCard title="Docker" href="/04-abbreviations/06-docker/" />
|
||||||
|
<LinkCard title="Systemctl" href="/04-abbreviations/07-systemctl/" />
|
||||||
|
<LinkCard title="AI Assistants" href="/04-abbreviations/08-ai-assistants/" />
|
||||||
|
<LinkCard title="History Expansion" href="/04-abbreviations/09-history-expansion/" />
|
||||||
|
<LinkCard title="Miscellaneous" href="/04-abbreviations/10-miscellaneous/" />
|
||||||
|
<LinkCard title="Shell Aliases" href="/04-abbreviations/11-shell-aliases/" />
|
||||||
|
</CardGrid>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: File and Directory
|
||||||
|
manTitle: 5.1 File and Directory
|
||||||
|
sidebar:
|
||||||
|
order: 1
|
||||||
|
helpKeywords:
|
||||||
|
- files
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Navigation
|
||||||
|
manTitle: 5.2 Navigation
|
||||||
|
sidebar:
|
||||||
|
order: 2
|
||||||
|
helpKeywords:
|
||||||
|
- nav-fns
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Editors and Viewers
|
||||||
|
manTitle: 5.3 Editors and Viewers
|
||||||
|
sidebar:
|
||||||
|
order: 3
|
||||||
|
helpKeywords:
|
||||||
|
- editors
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Git and Version Control
|
||||||
|
manTitle: 5.4 Git and Version Control
|
||||||
|
sidebar:
|
||||||
|
order: 4
|
||||||
|
helpKeywords:
|
||||||
|
- git
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: Package Management
|
||||||
|
manTitle: 5.5 Package Management
|
||||||
|
sidebar:
|
||||||
|
order: 5
|
||||||
|
helpKeywords:
|
||||||
|
- package-manager
|
||||||
|
- packages
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: Dependency Management
|
||||||
|
manTitle: 5.6 Dependency Management
|
||||||
|
sidebar:
|
||||||
|
order: 6
|
||||||
|
helpKeywords:
|
||||||
|
- deps
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user