mirror of
https://github.com/ryan4yin/nix-config.git
synced 2026-05-28 18:39:31 +02:00
Compare commits
161 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bc941d9e2 | |||
| 7f6c061041 | |||
| b8e45b28e1 | |||
| 21555a4148 | |||
| 0f4387800f | |||
| 1095d8fa53 | |||
| 98e2e7196d | |||
| 0a764cfdf3 | |||
| 54e4dfcec0 | |||
| f37588df64 | |||
| 9adf87aaf5 | |||
| 82dccbdeca | |||
| af88851772 | |||
| b3d7d0d2a3 | |||
| b0fcf9d9e7 | |||
| 7bd264fee9 | |||
| 2a841a5a32 | |||
| e97e61c8d2 | |||
| c65018f450 | |||
| 218ff4c1da | |||
| e26c20a29b | |||
| 13751a4b66 | |||
| f4d91b6827 | |||
| 4f780f3f61 | |||
| a626458b8e | |||
| 87c041f8b4 | |||
| ace653e9d6 | |||
| bb913b181d | |||
| bec52f9d60 | |||
| de891782cb | |||
| 5abbd63284 | |||
| 14dabdcee5 | |||
| 5583f1ffe9 | |||
| 6b016a2432 | |||
| cad8cf325d | |||
| 9a0e41429a | |||
| 44ce90bf68 | |||
| 9fe6ef9165 | |||
| 4b2035a0dc | |||
| 21d85d41ef | |||
| 7fd3baca0f | |||
| ce645e7935 | |||
| 9631334088 | |||
| a9bb04c37d | |||
| ddad742023 | |||
| 21c9e572af | |||
| 6b2168b925 | |||
| 309469fa85 | |||
| 0e31ec94ce | |||
| fb6ca6b12d | |||
| a1d827a34e | |||
| efc524466c | |||
| fd62548dc0 | |||
| 9a45cc6448 | |||
| ac844a6a3d | |||
| c5dcc7e24d | |||
| a593435947 | |||
| 2d5a0c6783 | |||
| 0b9574d693 | |||
| 93c423a75b | |||
| 2b75504a22 | |||
| c0c9ed21ea | |||
| 33b3f33781 | |||
| 24248b3536 | |||
| 5b2d09d0e7 | |||
| 869aafd25b | |||
| b8797d5394 | |||
| 0bf035ba1a | |||
| 0b7d6428e0 | |||
| e6f6042c3c | |||
| b8ce5573f5 | |||
| 8c464a9aee | |||
| c78184a6bf | |||
| 487d410e70 | |||
| bbb678af00 | |||
| 11a4e368d5 | |||
| f831061889 | |||
| 468480b4e7 | |||
| 0e31885540 | |||
| e789e5aff3 | |||
| a9e3dd0c53 | |||
| 75202fb46c | |||
| ed5328c8de | |||
| 80c0ab327f | |||
| 4dc50e7e8c | |||
| 3bf5ff65de | |||
| 4775cc2742 | |||
| 34e7e9b2cd | |||
| 7396ee0201 | |||
| 0082e1ae54 | |||
| f5f27bff96 | |||
| 347ae9d4b1 | |||
| 74b948a722 | |||
| 81b3cd30cc | |||
| 5c69d6c22a | |||
| 33f690388d | |||
| 2047104704 | |||
| c628eaa6c8 | |||
| 7486e75016 | |||
| 8bc96ba0e8 | |||
| 68629e929c | |||
| 87797d1252 | |||
| 7ef943a7b5 | |||
| 4061d65d60 | |||
| bf6bc4bee2 | |||
| 4da995fa88 | |||
| 56015780e0 | |||
| ce8b029108 | |||
| 95c64ff276 | |||
| d9c804acca | |||
| e85712ca53 | |||
| 6ae98566ed | |||
| 27959277d3 | |||
| 69fafe0c7c | |||
| 8d845f6fd0 | |||
| ae07e142d7 | |||
| bdfd583b65 | |||
| 565f5c260a | |||
| 35c6e1cd5d | |||
| 304d9ec92a | |||
| e37e478a3a | |||
| b8c5210998 | |||
| 20224f0e0a | |||
| 1ea6062ead | |||
| 63ec4d7d65 | |||
| 50783093c5 | |||
| 53d3901e9a | |||
| 9a01f34197 | |||
| f3ef22c58f | |||
| cfc71fc279 | |||
| d70eaa0b33 | |||
| e5606b6619 | |||
| 55d0c4f87c | |||
| 7d577713bb | |||
| 9dbee2c787 | |||
| 6f8f8894e5 | |||
| 5524422e6c | |||
| f150f05af1 | |||
| 2319300f48 | |||
| c258b3b1c8 | |||
| 84c21ccd34 | |||
| a3c6532376 | |||
| 2d3818a998 | |||
| 8e8bcb64a5 | |||
| c5aa8cd0be | |||
| 4b918e51d2 | |||
| a697ebec17 | |||
| d94f482c23 | |||
| 7d5a04fd38 | |||
| fbd13d6f00 | |||
| bd555d7e76 | |||
| ea70cd9aea | |||
| 26ee648569 | |||
| 9f04e1b382 | |||
| 0eb83b22f0 | |||
| 1e38f7bb09 | |||
| 9d4b8ef027 | |||
| d5ea3f0edf | |||
| d3efa55237 | |||
| 88e2c240a6 | |||
| dab163bf23 |
+2
-1
@@ -1,2 +1,3 @@
|
|||||||
|
github: ryan4yin
|
||||||
patreon: ryan4yin
|
patreon: ryan4yin
|
||||||
custom: ['https://buymeacoffee.com/ryan4yin', 'https://afdian.net/a/ryan4yin']
|
custom: ["https://buymeacoffee.com/ryan4yin", "https://afdian.net/a/ryan4yin"]
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ on:
|
|||||||
- "scripts/**"
|
- "scripts/**"
|
||||||
- "**.md"
|
- "**.md"
|
||||||
- "**.nu"
|
- "**.nu"
|
||||||
- 'Justfile'
|
- "Justfile"
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
@@ -16,7 +16,7 @@ on:
|
|||||||
- "scripts/**"
|
- "scripts/**"
|
||||||
- "**.md"
|
- "**.md"
|
||||||
- "**.nu"
|
- "**.nu"
|
||||||
- 'Justfile'
|
- "Justfile"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
checks:
|
checks:
|
||||||
@@ -37,4 +37,6 @@ jobs:
|
|||||||
- name: Run Nix Flake Eval Tests
|
- name: Run Nix Flake Eval Tests
|
||||||
run: |
|
run: |
|
||||||
echo 'Flake Eval Tests'
|
echo 'Flake Eval Tests'
|
||||||
|
# stack overflow...
|
||||||
|
# nix eval .#checks --show-trace --print-build-logs --verbose
|
||||||
nix eval .#evalTests --show-trace --print-build-logs --verbose
|
nix eval .#evalTests --show-trace --print-build-logs --verbose
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
tags:
|
tags:
|
||||||
- '*'
|
- "*"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
mirror:
|
mirror:
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
LICENSE.md
|
||||||
|
dist
|
||||||
|
pnpm-lock.yaml
|
||||||
|
flake.lock
|
||||||
|
vercel.json
|
||||||
|
cache
|
||||||
|
temp
|
||||||
|
.temp
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# https://prettier.io/docs/en/options
|
||||||
|
semi: false
|
||||||
|
singleQuote: false
|
||||||
|
printWidth: 100
|
||||||
|
proseWrap: always # always change wrapping in markdown text
|
||||||
|
trailingComma: es5
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
[files]
|
||||||
|
ignore-dot = true
|
||||||
|
ignore-files = true
|
||||||
|
extend-exclude = ["themes/", "data/", "static-surprises/", "resources/"]
|
||||||
|
|
||||||
|
[default]
|
||||||
|
binary = false
|
||||||
|
# ignore some special identifiers(sha256, mac address, crypto keys, etc)
|
||||||
|
extend-ignore-re = [
|
||||||
|
"iterm2",
|
||||||
|
"iHgEIBYKACAWIQSizQe9ljFEyyclWmtVhZllwnQrSwUCZZ1T9wIdAAAKCRBVhZll", # crypto keys
|
||||||
|
"noice", # noice.nvim
|
||||||
|
]
|
||||||
@@ -5,116 +5,172 @@ set shell := ["nu", "-c"]
|
|||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
# Nix commands related to the local machine
|
# Common commands(suitable for all machines)
|
||||||
#
|
#
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
i3 mode="default":
|
# Remote deployment via colmena
|
||||||
|
col tag:
|
||||||
|
colmena apply --on '@{{tag}}' --verbose --show-trace
|
||||||
|
|
||||||
|
local name mode="default":
|
||||||
use utils.nu *; \
|
use utils.nu *; \
|
||||||
nixos-switch ai-i3 {{mode}}
|
nixos-switch {{name}} {{mode}}
|
||||||
|
|
||||||
hypr mode="default":
|
|
||||||
use utils.nu *; \
|
|
||||||
nixos-switch ai-hyprland {{mode}}
|
|
||||||
|
|
||||||
|
|
||||||
s-i3 mode="default":
|
|
||||||
use utils.nu *; \
|
|
||||||
nixos-switch shoukei-i3 {{mode}}
|
|
||||||
|
|
||||||
|
|
||||||
s-hypr mode="default":
|
|
||||||
use utils.nu *; \
|
|
||||||
nixos-switch shoukei-hyprland {{mode}}
|
|
||||||
|
|
||||||
|
# Run eval tests
|
||||||
|
test:
|
||||||
|
nix eval .#evalTests --show-trace --print-build-logs --verbose
|
||||||
|
|
||||||
|
# update all the flake inputs
|
||||||
up:
|
up:
|
||||||
nix flake update
|
nix flake update
|
||||||
|
|
||||||
# Update specific input
|
# Update specific input
|
||||||
# Usage: just upp nixpkgs
|
# Usage: just upp nixpkgs
|
||||||
upp input:
|
upp input:
|
||||||
nix flake lock --update-input {{input}}
|
nix flake update {{input}}
|
||||||
|
|
||||||
|
# List all generations of the system profile
|
||||||
history:
|
history:
|
||||||
nix profile history --profile /nix/var/nix/profiles/system
|
nix profile history --profile /nix/var/nix/profiles/system
|
||||||
|
|
||||||
|
# Open a nix shell with the flake
|
||||||
repl:
|
repl:
|
||||||
nix repl -f flake:nixpkgs
|
nix repl -f flake:nixpkgs
|
||||||
|
|
||||||
|
# remove all generations older than 7 days
|
||||||
clean:
|
clean:
|
||||||
# remove all generations older than 7 days
|
|
||||||
sudo nix profile wipe-history --profile /nix/var/nix/profiles/system --older-than 7d
|
sudo nix profile wipe-history --profile /nix/var/nix/profiles/system --older-than 7d
|
||||||
|
|
||||||
|
# Garbage collect all unused nix store entries
|
||||||
gc:
|
gc:
|
||||||
# garbage collect all unused nix store entries
|
# garbage collect all unused nix store entries
|
||||||
sudo nix store gc --debug
|
sudo nix store gc --debug
|
||||||
sudo nix-collect-garbage --delete-old
|
sudo nix-collect-garbage --delete-old
|
||||||
|
|
||||||
|
# Remove all reflog entries and prune unreachable objects
|
||||||
gitgc:
|
gitgc:
|
||||||
git reflog expire --expire-unreachable=now --all
|
git reflog expire --expire-unreachable=now --all
|
||||||
git gc --prune=now
|
git gc --prune=now
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# NixOS Desktop related commands
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
i3 mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch ai-i3 {{mode}}
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
hypr mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch ai-hyprland {{mode}}
|
||||||
|
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
s-i3 mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch shoukei-i3 {{mode}}
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
s-hypr mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch shoukei-hyprland {{mode}}
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
# Darwin related commands, harmonica is my macbook pro's hostname
|
# Darwin related commands, harmonica is my macbook pro's hostname
|
||||||
#
|
#
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
|
[macos]
|
||||||
darwin-set-proxy:
|
darwin-set-proxy:
|
||||||
sudo python3 scripts/darwin_set_proxy.py
|
sudo python3 scripts/darwin_set_proxy.py
|
||||||
sleep 1sec
|
sleep 1sec
|
||||||
|
|
||||||
|
[macos]
|
||||||
darwin-rollback:
|
darwin-rollback:
|
||||||
use utils.nu *; \
|
use utils.nu *; \
|
||||||
darwin-rollback
|
darwin-rollback
|
||||||
|
|
||||||
|
# Deploy to harmonica(macOS host)
|
||||||
|
[macos]
|
||||||
ha mode="default":
|
ha mode="default":
|
||||||
use utils.nu *; \
|
use utils.nu *; \
|
||||||
darwin-build "harmonica" {{mode}}; \
|
darwin-build "harmonica" {{mode}}; \
|
||||||
darwin-switch "harmonica" {{mode}}
|
darwin-switch "harmonica" {{mode}}
|
||||||
|
|
||||||
|
# Depoly to fern(macOS host)
|
||||||
|
[macos]
|
||||||
fe mode="default": darwin-set-proxy
|
fe mode="default": darwin-set-proxy
|
||||||
use utils.nu *; \
|
use utils.nu *; \
|
||||||
darwin-build "fern" {{mode}}; \
|
darwin-build "fern" {{mode}}; \
|
||||||
darwin-switch "fern" {{mode}}
|
darwin-switch "fern" {{mode}}
|
||||||
|
|
||||||
|
# Reload yabai and skhd(macOS)
|
||||||
|
[macos]
|
||||||
yabai-reload:
|
yabai-reload:
|
||||||
launchctl kickstart -k "gui/502/org.nixos.yabai";
|
launchctl kickstart -k "gui/502/org.nixos.yabai";
|
||||||
launchctl kickstart -k "gui/502/org.nixos.skhd";
|
launchctl kickstart -k "gui/502/org.nixos.skhd";
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
# Homelab - NixOS servers running on bare metal
|
# Homelab - Kubevirt Cluster related commands
|
||||||
#
|
#
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
virt:
|
# Build and upload a vm image
|
||||||
|
upload-vm name mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
upload-vm {{name}} {{mode}}
|
||||||
|
|
||||||
|
# Deploy all the KubeVirt nodes(Physical machines running KubeVirt)
|
||||||
|
lab:
|
||||||
colmena apply --on '@virt-*' --verbose --show-trace
|
colmena apply --on '@virt-*' --verbose --show-trace
|
||||||
|
|
||||||
shoryu:
|
shoryu:
|
||||||
colmena apply --on '@shoryu' --verbose --show-trace
|
colmena apply --on '@kubevirt-shoryu' --verbose --show-trace
|
||||||
|
|
||||||
|
shoryu-local mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch kubevirt-shoryu {{mode}}
|
||||||
|
|
||||||
shushou:
|
shushou:
|
||||||
colmena apply --on '@shushou' --verbose --show-trace
|
colmena apply --on '@kubevirt-shushou' --verbose --show-trace
|
||||||
|
|
||||||
|
shushou-local mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch kubevirt-shushou {{mode}}
|
||||||
|
|
||||||
youko:
|
youko:
|
||||||
colmena apply --on '@youko' --verbose --show-trace
|
colmena apply --on '@kubevirt-youko' --verbose --show-trace
|
||||||
|
|
||||||
|
youko-local mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch kubevirt-youko {{mode}}
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
# Homelab - Virtual Machines running on Kubevirt
|
# Commands for other Virtual Machines
|
||||||
#
|
#
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
lab:
|
# Build and upload a vm image
|
||||||
colmena apply --on '@homelab-*' --verbose --show-trace
|
upload-idols mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
upload-vm aquamarine {{mode}}
|
||||||
|
upload-vm ruby {{mode}}
|
||||||
|
upload-vm kana {{mode}}
|
||||||
|
|
||||||
aqua:
|
aqua:
|
||||||
colmena apply --on '@aqua' --verbose --show-trace
|
colmena apply --on '@aqua' --verbose --show-trace
|
||||||
# some config changes require a restart of the dae service
|
|
||||||
ssh root@aquamarine "sudo systemctl stop dae; sleep 1; sudo systemctl start dae"
|
aqua-local mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch aquamarine {{mode}}
|
||||||
|
|
||||||
ruby:
|
ruby:
|
||||||
colmena apply --on '@ruby' --verbose --show-trace
|
colmena apply --on '@ruby' --verbose --show-trace
|
||||||
@@ -126,25 +182,9 @@ ruby-local mode="default":
|
|||||||
kana:
|
kana:
|
||||||
colmena apply --on '@kana' --verbose --show-trace
|
colmena apply --on '@kana' --verbose --show-trace
|
||||||
|
|
||||||
tailscale:
|
kana-local mode="default":
|
||||||
colmena apply --on '@tailscale-gw' --verbose --show-trace
|
use utils.nu *; \
|
||||||
|
nixos-switch kana {{mode}}
|
||||||
# pve-aqua:
|
|
||||||
# nom build .#aquamarine
|
|
||||||
# rsync -avz --progress --copy-links result root@um560:/var/lib/vz/dump/vzdump-qemu-aquamarine.vma.zst
|
|
||||||
#
|
|
||||||
# pve-ruby:
|
|
||||||
# nom build .#ruby
|
|
||||||
# rsync -avz --progress --copy-links result root@um560:/var/lib/vz/dump/vzdump-qemu-ruby.vma.zst
|
|
||||||
#
|
|
||||||
# pve-kana:
|
|
||||||
# nom build .#kana
|
|
||||||
# rsync -avz --progress --copy-links result root@gtr5:/var/lib/vz/dump/vzdump-qemu-kana.vma.zst
|
|
||||||
#
|
|
||||||
# pve-tsgw:
|
|
||||||
# nom build .#tailscale-gw
|
|
||||||
# rsync -avz --progress --copy-links result root@um560:/var/lib/vz/dump/vzdump-qemu-tailscale-gw.vma.zst
|
|
||||||
#
|
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
@@ -152,6 +192,22 @@ tailscale:
|
|||||||
#
|
#
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
|
# Build and upload a vm image
|
||||||
|
upload-k3s mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
upload-vm k3s-prod-1-master-1 {{mode}}; \
|
||||||
|
upload-vm k3s-prod-1-master-2 {{mode}}; \
|
||||||
|
upload-vm k3s-prod-1-master-3 {{mode}}; \
|
||||||
|
upload-vm k3s-prod-1-worker-1 {{mode}}; \
|
||||||
|
upload-vm k3s-prod-1-worker-2 {{mode}}; \
|
||||||
|
upload-vm k3s-prod-1-worker-3 {{mode}};
|
||||||
|
|
||||||
|
upload-k3s-test mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
upload-vm k3s-test-1-master-1 {{mode}}; \
|
||||||
|
upload-vm k3s-test-1-master-2 {{mode}}; \
|
||||||
|
upload-vm k3s-test-1-master-3 {{mode}};
|
||||||
|
|
||||||
k3s:
|
k3s:
|
||||||
colmena apply --on '@k3s-*' --verbose --show-trace
|
colmena apply --on '@k3s-*' --verbose --show-trace
|
||||||
|
|
||||||
@@ -161,25 +217,8 @@ master:
|
|||||||
worker:
|
worker:
|
||||||
colmena apply --on '@k3s-prod-1-worker-*' --verbose --show-trace
|
colmena apply --on '@k3s-prod-1-worker-*' --verbose --show-trace
|
||||||
|
|
||||||
# pve-k8s:
|
k3s-test:
|
||||||
# nom build .#k3s-prod-1-master-1
|
colmena apply --on '@k3s-test-*' --verbose --show-trace
|
||||||
# rsync -avz --progress --copy-links result root@um560:/var/lib/vz/dump/vzdump-qemu-k3s-prod-1-master-1.vma.zst
|
|
||||||
#
|
|
||||||
# nom build .#k3s-prod-1-master-2
|
|
||||||
# rsync -avz --progress --copy-links result root@gtr5:/var/lib/vz/dump/vzdump-qemu-k3s-prod-1-master-2.vma.zst
|
|
||||||
#
|
|
||||||
# nom build .#k3s-prod-1-master-3
|
|
||||||
# rsync -avz --progress --copy-links result root@s500plus:/var/lib/vz/dump/vzdump-qemu-k3s-prod-1-master-3.vma.zst
|
|
||||||
#
|
|
||||||
# nom build .#k3s-prod-1-worker-1
|
|
||||||
# rsync -avz --progress --copy-links result root@gtr5:/var/lib/vz/dump/vzdump-qemu-k3s-prod-1-worker-1.vma.zst
|
|
||||||
#
|
|
||||||
# nom build .#k3s-prod-1-worker-2
|
|
||||||
# rsync -avz --progress --copy-links result root@s500plus:/var/lib/vz/dump/vzdump-qemu-k3s-prod-1-worker-2.vma.zst
|
|
||||||
#
|
|
||||||
# nom build .#k3s-prod-1-worker-3
|
|
||||||
# rsync -avz --progress --copy-links result root@s500plus:/var/lib/vz/dump/vzdump-qemu-k3s-prod-1-worker-3.vma.zst
|
|
||||||
#
|
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
@@ -202,16 +241,6 @@ yukina:
|
|||||||
#
|
#
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
aarch:
|
|
||||||
colmena apply --on '@aarch' --verbose --show-trace
|
|
||||||
|
|
||||||
suzu:
|
|
||||||
colmena apply --on '@suzu' --build-on-target --verbose --show-trace
|
|
||||||
|
|
||||||
suzu-local mode="default":
|
|
||||||
use utils.nu *; \
|
|
||||||
nixos-switch suzu {{mode}}
|
|
||||||
|
|
||||||
rakushun:
|
rakushun:
|
||||||
colmena apply --on '@rakushun' --build-on-target --verbose --show-trace
|
colmena apply --on '@rakushun' --build-on-target --verbose --show-trace
|
||||||
|
|
||||||
@@ -219,6 +248,18 @@ rakushun-local mode="default":
|
|||||||
use utils.nu *; \
|
use utils.nu *; \
|
||||||
nixos-switch rakushun {{mode}}
|
nixos-switch rakushun {{mode}}
|
||||||
|
|
||||||
|
suzu-set-proxy:
|
||||||
|
ip route del default via 192.168.5.1
|
||||||
|
ip route add default via 192.168.5.178
|
||||||
|
|
||||||
|
suzu-unset-proxy:
|
||||||
|
ip route del default via 192.168.5.178
|
||||||
|
ip route add default via 192.168.5.1
|
||||||
|
|
||||||
|
suzu-local mode="default":
|
||||||
|
use utils.nu *; \
|
||||||
|
nixos-switch suzu {{mode}}
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
#
|
#
|
||||||
# Misc, other useful commands
|
# Misc, other useful commands
|
||||||
@@ -233,11 +274,11 @@ path:
|
|||||||
$env.PATH | split row ":"
|
$env.PATH | split row ":"
|
||||||
|
|
||||||
nvim-test:
|
nvim-test:
|
||||||
rm -rf $"($env.HOME)/.config/astronvim/lua/user"
|
rm -rf $"($env.HOME)/.config/nvim"
|
||||||
rsync -avz --copy-links --chmod=D2755,F744 home/base/desktop/editors/neovim/astronvim_user/ $"($env.HOME)/.config/astronvim/lua/user"
|
rsync -avz --copy-links --chmod=D2755,F744 home/base/tui/editors/neovim/nvim/ $"($env.HOME)/.config/nvim/"
|
||||||
|
|
||||||
nvim-clean:
|
nvim-clean:
|
||||||
rm -rf $"($env.HOME)/.config/astronvim/lua/user"
|
rm -rf $"($env.HOME)/.config/nvim"
|
||||||
|
|
||||||
# =================================================
|
# =================================================
|
||||||
# Emacs related commands
|
# Emacs related commands
|
||||||
@@ -259,7 +300,7 @@ reload-emacs-cmd := if os() == "macos" {
|
|||||||
|
|
||||||
emacs-test:
|
emacs-test:
|
||||||
rm -rf $"($env.HOME)/.config/doom"
|
rm -rf $"($env.HOME)/.config/doom"
|
||||||
rsync -avz --copy-links --chmod=D2755,F744 home/base/desktop/editors/emacs/doom/ $"($env.HOME)/.config/doom"
|
rsync -avz --copy-links --chmod=D2755,F744 home/base/tui/editors/emacs/doom/ $"($env.HOME)/.config/doom/"
|
||||||
doom clean
|
doom clean
|
||||||
doom sync
|
doom sync
|
||||||
|
|
||||||
|
|||||||
@@ -8,58 +8,72 @@
|
|||||||
<a href="https://github.com/ryan4yin/nix-config/stargazers">
|
<a href="https://github.com/ryan4yin/nix-config/stargazers">
|
||||||
<img alt="Stargazers" src="https://img.shields.io/github/stars/ryan4yin/nix-config?style=for-the-badge&logo=starship&color=C9CBFF&logoColor=D9E0EE&labelColor=302D41"></a>
|
<img alt="Stargazers" src="https://img.shields.io/github/stars/ryan4yin/nix-config?style=for-the-badge&logo=starship&color=C9CBFF&logoColor=D9E0EE&labelColor=302D41"></a>
|
||||||
<a href="https://nixos.org/">
|
<a href="https://nixos.org/">
|
||||||
<img src="https://img.shields.io/badge/NixOS-23.11-informational.svg?style=for-the-badge&logo=nixos&color=F2CDCD&logoColor=D9E0EE&labelColor=302D41"></a>
|
<img src="https://img.shields.io/badge/NixOS-24.05-informational.svg?style=for-the-badge&logo=nixos&color=F2CDCD&logoColor=D9E0EE&labelColor=302D41"></a>
|
||||||
<a href="https://github.com/ryan4yin/nixos-and-flakes-book">
|
<a href="https://github.com/ryan4yin/nixos-and-flakes-book">
|
||||||
<img src="https://img.shields.io/static/v1?label=Nix Flakes&message=learning&style=for-the-badge&logo=nixos&color=DDB6F2&logoColor=D9E0EE&labelColor=302D41"></a>
|
<img src="https://img.shields.io/static/v1?label=Nix Flakes&message=learning&style=for-the-badge&logo=nixos&color=DDB6F2&logoColor=D9E0EE&labelColor=302D41"></a>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
> My configuration is becoming more and more complex, and it may be difficult for beginners to read it.
|
> My configuration is becoming more and more complex, and it will be difficult for beginners to
|
||||||
> If you are new to NixOS and want to know how I use NixOS, I would recommend you to take a look at the [ryan4yin/nix-config/releases](https://github.com/ryan4yin/nix-config/releases) first, **checkout to some simpler older versions**, which will be much easier to understand.
|
> read. If you are new to NixOS and want to know how I use NixOS, I would recommend you to take a
|
||||||
|
> look at the [ryan4yin/nix-config/releases](https://github.com/ryan4yin/nix-config/releases) first,
|
||||||
|
> **checkout to some simpler older versions, such as
|
||||||
|
> [i3-kickstarter](https://github.com/ryan4yin/nix-config/tree/i3-kickstarter), which will be much
|
||||||
|
> easier to understand**.
|
||||||
|
|
||||||
This repository is home to the nix code that builds my systems:
|
This repository is home to the nix code that builds my systems:
|
||||||
|
|
||||||
1. NixOS Desktops: NixOS with home-manager, i3, hyprland, agenix, etc.
|
1. NixOS Desktops: NixOS with home-manager, i3, hyprland, agenix, etc.
|
||||||
2. macOS Desktops: nix-darwin with home-manager, share the same home-manager configuration with NixOS Desktops.
|
2. macOS Desktops: nix-darwin with home-manager, share the same home-manager configuration with
|
||||||
3. NixOS Servers: virtual machines running on Proxmox, with various services, such as kubernetes, homepage, prometheus, grafana, etc.
|
NixOS Desktops.
|
||||||
|
3. NixOS Servers: virtual machines running on Proxmox/KubeVirt, with various services, such as
|
||||||
|
kubernetes, homepage, prometheus, grafana, etc.
|
||||||
|
|
||||||
See [./hosts](./hosts) for details of each host.
|
See [./hosts](./hosts) for details of each host.
|
||||||
|
|
||||||
## Why NixOS & Flakes?
|
## Why NixOS & Flakes?
|
||||||
|
|
||||||
Nix allows for easy-to-manage, collaborative, reproducible deployments. This means that once something is setup and configured once, it works (almost) forever. If someone else shares their configuration, anyone else can just use it (if you really understand what you're copying/refering now).
|
Nix allows for easy-to-manage, collaborative, reproducible deployments. This means that once
|
||||||
|
something is setup and configured once, it works (almost) forever. If someone else shares their
|
||||||
|
configuration, anyone else can just use it (if you really understand what you're copying/refering
|
||||||
|
now).
|
||||||
|
|
||||||
As for Flakes, refer to [Introduction to Flakes - NixOS & Nix Flakes Book](https://nixos-and-flakes.thiscute.world/nixos-with-flakes/introduction-to-flakes)
|
As for Flakes, refer to
|
||||||
|
[Introduction to Flakes - NixOS & Nix Flakes Book](https://nixos-and-flakes.thiscute.world/nixos-with-flakes/introduction-to-flakes)
|
||||||
|
|
||||||
**Want to know NixOS & Flaks in detail? Looking for a beginner-friendly tutorial or best practices? You don't have to go through the pain I've experienced again! Check out my [NixOS & Nix Flakes Book - 🛠️ ❤️ An unofficial & opinionated :book: for beginners](https://github.com/ryan4yin/nixos-and-flakes-book)!**
|
**Want to know NixOS & Flaks in detail? Looking for a beginner-friendly tutorial or best practices?
|
||||||
|
You don't have to go through the pain I've experienced again! Check out my
|
||||||
|
[NixOS & Nix Flakes Book - 🛠️ ❤️ An unofficial & opinionated :book: for beginners](https://github.com/ryan4yin/nixos-and-flakes-book)!**
|
||||||
|
|
||||||
> If you're using macOS, check out [ryan4yin/nix-darwin-kickstarter](https://github.com/ryan4yin/nix-darwin-kickstarter) for a quick start.
|
> If you're using macOS, check out
|
||||||
|
> [ryan4yin/nix-darwin-kickstarter](https://github.com/ryan4yin/nix-darwin-kickstarter) for a quick
|
||||||
|
> start.
|
||||||
|
|
||||||
## Components
|
## Components
|
||||||
|
|
||||||
| | NixOS(Wayland) | NixOS(Xorg) |
|
| | NixOS(Wayland) | NixOS(Xorg) |
|
||||||
| --------------------------- | :---------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------- |
|
| --------------------------- | :------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------ |
|
||||||
| **Window Manager** | [Hyprland][Hyprland] | [i3][i3] |
|
| **Window Manager** | [Hyprland][Hyprland] | [i3][i3] |
|
||||||
| **Terminal Emulator** | [Zellij][Zellij] + [Kitty][Kitty] | [Zellij][Zellij] + [Kitty][Kitty] |
|
| **Terminal Emulator** | [Zellij][Zellij] + [Kitty][Kitty] | [Zellij][Zellij] + [Kitty][Kitty] |
|
||||||
| **Bar** | [Waybar][Waybar] | [polybar][polybar] |
|
| **Bar** | [Waybar][Waybar] | [polybar][polybar] |
|
||||||
| **Application Launcher** | [anyrun][anyrun] | [rofi][rofi] |
|
| **Application Launcher** | [anyrun][anyrun] | [rofi][rofi] |
|
||||||
| **Notification Daemon** | [Mako][Mako] | [Dunst][Dunst] |
|
| **Notification Daemon** | [Mako][Mako] | [Dunst][Dunst] |
|
||||||
| **Display Manager** | [GDM][GDM] | [GDM][GDM] |
|
| **Display Manager** | [GDM][GDM] | [GDM][GDM] |
|
||||||
| **Color Scheme** | [Catppuccin][Catppuccin] | [Catppuccin][Catppuccin] |
|
| **Color Scheme** | [Catppuccin][Catppuccin] | [Catppuccin][Catppuccin] |
|
||||||
| **network management tool** | [NetworkManager][NetworkManager] | [NetworkManager][NetworkManager] |
|
| **network management tool** | [NetworkManager][NetworkManager] | [NetworkManager][NetworkManager] |
|
||||||
| **Input method framework** | [Fcitx5][Fcitx5] | [Fcitx5][Fcitx5] |
|
| **Input method framework** | [Fcitx5][Fcitx5] | [Fcitx5][Fcitx5] |
|
||||||
| **System resource monitor** | [Btop][Btop] | [Btop][Btop] |
|
| **System resource monitor** | [Btop][Btop] | [Btop][Btop] |
|
||||||
| **File Manager** | [Yazi][Yazi] + [thunar][thunar] | [Yazi][Yazi] + [thunar][thunar] |
|
| **File Manager** | [Yazi][Yazi] + [thunar][thunar] | [Yazi][Yazi] + [thunar][thunar] |
|
||||||
| **Shell** | [Nushell][Nushell] + [Starship][Starship] | [Nushell][Nushell] + [Starship][Starship] |
|
| **Shell** | [Nushell][Nushell] + [Starship][Starship] | [Nushell][Nushell] + [Starship][Starship] |
|
||||||
| **Music Player** | [mpd][mpd], [ncmpcpp][ncmpcpp], [mpc][mpc], [Netease-cloud-music-gtk][netease-cloud-music-gtk] | [Netease-cloud-music-gtk][netease-cloud-music-gtk] |
|
| **Music Player** | [mpd][mpd], [ncmpcpp][ncmpcpp], [mpc][mpc], [Netease-cloud-music-gtk][netease-cloud-music-gtk] | [Netease-cloud-music-gtk][netease-cloud-music-gtk] |
|
||||||
| **Media Player** | [mpv][mpv] | [mpv][mpv] |
|
| **Media Player** | [mpv][mpv] | [mpv][mpv] |
|
||||||
| **Text Editor** | [Neovim][Neovim] + [DoomEmacs][DoomEmacs] | [Neovim][Neovim] + [DoomEmacs][DoomEmacs] |
|
| **Text Editor** | [Neovim][Neovim] + [DoomEmacs][DoomEmacs] | [Neovim][Neovim] + [DoomEmacs][DoomEmacs] |
|
||||||
| **Fonts** | [Nerd fonts][Nerd fonts] | [Nerd fonts][Nerd fonts] |
|
| **Fonts** | [Nerd fonts][Nerd fonts] | [Nerd fonts][Nerd fonts] |
|
||||||
| **Image Viewer** | [imv][imv] | [imv][imv] |
|
| **Image Viewer** | [imv][imv] | [imv][imv] |
|
||||||
| **Screenshot Software** | [flameshot][flameshot] + [grim][grim] | [flameshot][flameshot] |
|
| **Screenshot Software** | [flameshot][flameshot] + [grim][grim] | [flameshot][flameshot] |
|
||||||
| **Screen Recording** | [OBS][OBS] | [OBS][OBS] |
|
| **Screen Recording** | [OBS][OBS] | [OBS][OBS] |
|
||||||
| **Filesystem & Encryption** | tmpfs on `/`, [Btrfs][Btrfs] subvolumes on a [LUKS][LUKS] crypted partition for persistent, unlock via passphrase | tmpfs on `/`, [Btrfs][Btrfs] subvolumes on a [LUKS][LUKS] crypted partition for persistent, unlock via passphrase |
|
| **Filesystem & Encryption** | tmpfs on `/`, [Btrfs][Btrfs] subvolumes on a [LUKS][LUKS] encrypted partition for persistent, unlock via passphrase | tmpfs on `/`, [Btrfs][Btrfs] subvolumes on a [LUKS][LUKS] encrypted partition for persistent, unlock via passphrase |
|
||||||
| **Secure Boot** | [lanzaboote][lanzaboote] | [lanzaboote][lanzaboote] |
|
| **Secure Boot** | [lanzaboote][lanzaboote] | [lanzaboote][lanzaboote] |
|
||||||
|
|
||||||
Wallpapers: https://github.com/ryan4yin/wallpapers
|
Wallpapers: https://github.com/ryan4yin/wallpapers
|
||||||
|
|
||||||
@@ -73,16 +87,15 @@ Wallpapers: https://github.com/ryan4yin/wallpapers
|
|||||||
|
|
||||||
## I3 + AstroNvim
|
## I3 + AstroNvim
|
||||||
|
|
||||||

|
 
|
||||||

|
|
||||||
|
|
||||||
## Neovim
|
## Neovim
|
||||||
|
|
||||||
See [./home/base/desktop/editors/neovim/](./home/base/desktop/editors/neovim/) for details.
|
See [./home/base/tui/editors/neovim/](./home/base/tui/editors/neovim/) for details.
|
||||||
|
|
||||||
## Emacs
|
## Emacs
|
||||||
|
|
||||||
See [./home/base/desktop/editors/emacs/](./home/base/desktop/editors/emacs/) for details.
|
See [./home/base/tui/editors/emacs/](./home/base/tui/editors/emacs/) for details.
|
||||||
|
|
||||||
## Secrets Management
|
## Secrets Management
|
||||||
|
|
||||||
@@ -90,29 +103,33 @@ See [./secrets](./secrets) for details.
|
|||||||
|
|
||||||
## How to Deploy this Flake?
|
## How to Deploy this Flake?
|
||||||
|
|
||||||
> :red_circle: **IMPORTANT**: **You should NOT deploy this flake directly on your machine :exclamation: It will not succeed.**
|
> :red_circle: **IMPORTANT**: **You should NOT deploy this flake directly on your machine
|
||||||
> This flake contains my hardware configuration(such as [hardware-configuration.nix](hosts/idols-ai/hardware-configuration.nix), [cifs-mount.nix](https://github.com/ryan4yin/nix-config/blob/v0.1.1/hosts/idols_ai/cifs-mount.nix), [Nvidia Support](https://github.com/ryan4yin/nix-config/blob/v0.1.1/hosts/idols-ai/default.nix#L77-L91), etc.) which is not suitable for your hardwares,
|
> :exclamation: It will not succeed.** This flake contains my hardware configuration(such as
|
||||||
> and requires my private secrets repository [ryan4yin/nix-secrets](https://github.com/ryan4yin/nix-config/tree/main/secrets) to deploy.
|
> [hardware-configuration.nix](hosts/idols-ai/hardware-configuration.nix),
|
||||||
> You may use this repo as a reference to build your own configuration.
|
> [Nvidia Support](https://github.com/ryan4yin/nix-config/blob/v0.1.1/hosts/idols-ai/default.nix#L77-L91),
|
||||||
|
> etc.) which is not suitable for your hardwares, and requires my private secrets repository
|
||||||
|
> [ryan4yin/nix-secrets](https://github.com/ryan4yin/nix-config/tree/main/secrets) to deploy. You
|
||||||
|
> may use this repo as a reference to build your own configuration.
|
||||||
|
|
||||||
For NixOS:
|
For NixOS:
|
||||||
|
|
||||||
> To deploy this flake from NixOS's official ISO image(purest installation method), please refer to [./nixos-installer/](./nixos-installer/)
|
> To deploy this flake from NixOS's official ISO image(purest installation method), please refer to
|
||||||
|
> [./nixos-installer/](./nixos-installer/)
|
||||||
|
|
||||||
> Need to restart the machine when switching between `wayland` and `xorg`.
|
> Need to restart the machine when switching between `wayland` and `xorg`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# deploy one of the configuration based on the hostname
|
# deploy one of the configuration based on the hostname
|
||||||
sudo nixos-rebuild switch --flake .#ai_i3
|
# sudo nixos-rebuild switch --flake .#ai_i3
|
||||||
# sudo nixos-rebuild switch --flake .#ai-hyprland
|
sudo nixos-rebuild switch --flake .#ai-hyprland
|
||||||
|
|
||||||
# deploy via `just`(a command runner with similar syntax to make) & Justfile
|
# deploy via `just`(a command runner with similar syntax to make) & Justfile
|
||||||
just i3 # deploy my pc with i3 window manager
|
# just i3 # deploy my pc with i3 window manager
|
||||||
# just hypr # deploy my pc with hyprland compositor
|
just hypr # deploy my pc with hyprland compositor
|
||||||
|
|
||||||
# or we can deploy with details
|
# or we can deploy with details
|
||||||
just i3 debug
|
# just i3 debug
|
||||||
# just hypr-debug
|
just hypr debug
|
||||||
```
|
```
|
||||||
|
|
||||||
For macOS:
|
For macOS:
|
||||||
@@ -136,35 +153,8 @@ just ha debug
|
|||||||
# just fe debug
|
# just fe debug
|
||||||
```
|
```
|
||||||
|
|
||||||
> [What y'all will need when Nix drives you to drink.](https://www.youtube.com/watch?v=Eni9PPPPBpg) (copy from hlissner's dotfiles, it really matches my feelings when I first started using NixOS...)
|
> [What y'all will need when Nix drives you to drink.](https://www.youtube.com/watch?v=Eni9PPPPBpg)
|
||||||
|
> (copy from hlissner's dotfiles, it really matches my feelings when I first started using NixOS...)
|
||||||
## How to create & managage VM from this flake?
|
|
||||||
|
|
||||||
use `aquamarine` as an example, we can create a virtual machine with the following command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# 1. generate a proxmox vma image file
|
|
||||||
nom build .#aquamarine # `nom`(nix-output-monitor) can be replaced by the standard command `nix`
|
|
||||||
|
|
||||||
# 2. upload the genereated image to proxmox server's backup directory `/var/lib/vz/dump`
|
|
||||||
# please replace the vma file name with the one you generated in step 1.
|
|
||||||
rsync -avz --progress --copy-links result root@um560:/var/lib/vz/dump/vzdump-qemu-aquamarine.vma.zst
|
|
||||||
|
|
||||||
# 3. the image we uploaded will be listed in proxmox web ui's this page: [storage 'local'] -> [backups], we can restore a vm from it via the web ui now.
|
|
||||||
```
|
|
||||||
|
|
||||||
Once the virtual machine `aquamarine` is created, we can deploy updates to it with the following commands:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# 1. add the ssh key to ssh-agent
|
|
||||||
ssh-add /etc/agenix/ssh-key-romantic
|
|
||||||
|
|
||||||
# 2. deploy the configuration to all the remote host with tag `@dist-build`
|
|
||||||
# using the ssh key we added in step 1
|
|
||||||
colmena apply --on '@dist-build' --show-trace
|
|
||||||
```
|
|
||||||
|
|
||||||
If you're not familiar with remote deployment, please read this tutorial first: [Remote Deployment - NixOS & Flakes Book](https://nixos-and-flakes.thiscute.world/best-practices/remote-deployment)
|
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
@@ -179,17 +169,22 @@ Other dotfiles that inspired me:
|
|||||||
- [davidtwco/veritas](https://github.com/davidtwco/veritas)
|
- [davidtwco/veritas](https://github.com/davidtwco/veritas)
|
||||||
- [gvolpe/nix-config](https://github.com/gvolpe/nix-config)
|
- [gvolpe/nix-config](https://github.com/gvolpe/nix-config)
|
||||||
- [Ruixi-rebirth/flakes](https://github.com/Ruixi-rebirth/flakes)
|
- [Ruixi-rebirth/flakes](https://github.com/Ruixi-rebirth/flakes)
|
||||||
- [fufexan/dotfiles](https://github.com/fufexan/dotfiles): gtk theme, xdg, git, media, anyrun, etc.
|
- [fufexan/dotfiles](https://github.com/fufexan/dotfiles): gtk theme, xdg, git, media, anyrun,
|
||||||
- [nix-community/srvos](https://github.com/nix-community/srvos): a collection of opinionated and sharable NixOS configurations for servers
|
etc.
|
||||||
|
- [nix-community/srvos](https://github.com/nix-community/srvos): a collection of opinionated and
|
||||||
|
sharable NixOS configurations for servers
|
||||||
- Modularized NixOS Configuration
|
- Modularized NixOS Configuration
|
||||||
- [hlissner/dotfiles](https://github.com/hlissner/dotfiles)
|
- [hlissner/dotfiles](https://github.com/hlissner/dotfiles)
|
||||||
- [viperML/dotfiles](https://github.com/viperML/dotfiles)
|
- [viperML/dotfiles](https://github.com/viperML/dotfiles)
|
||||||
- Hyprland(wayland)
|
- Hyprland(wayland)
|
||||||
- [notwidow/hyprland](https://github.com/notwidow/hyprland): This is where I start my hyprland journey.
|
- [notwidow/hyprland](https://github.com/notwidow/hyprland): This is where I start my hyprland
|
||||||
- [HeinzDev/Hyprland-dotfiles](https://github.com/HeinzDev/Hyprland-dotfiles): Refer to the waybar configuration here.
|
journey.
|
||||||
|
- [HeinzDev/Hyprland-dotfiles](https://github.com/HeinzDev/Hyprland-dotfiles): Refer to the waybar
|
||||||
|
configuration here.
|
||||||
- [linuxmobile/kaku](https://github.com/linuxmobile/kaku)
|
- [linuxmobile/kaku](https://github.com/linuxmobile/kaku)
|
||||||
- I3 Window Manager
|
- I3 Window Manager
|
||||||
- [endeavouros-i3wm-setup](https://github.com/endeavouros-team/endeavouros-i3wm-setup): I started using i3 here, and my i3 configuration is also based on it, but made a lot of changes.
|
- [endeavouros-i3wm-setup](https://github.com/endeavouros-team/endeavouros-i3wm-setup): I started
|
||||||
|
using i3 here, and my i3 configuration is also based on it, but made a lot of changes.
|
||||||
- [denisse-dev/dotfiles](https://github.com/denisse-dev/dotfiles)
|
- [denisse-dev/dotfiles](https://github.com/denisse-dev/dotfiles)
|
||||||
- Neovim/AstroNvim
|
- Neovim/AstroNvim
|
||||||
- [maxbrunet/dotfiles](https://github.com/maxbrunet/dotfiles): astronvim with nix flakes.
|
- [maxbrunet/dotfiles](https://github.com/maxbrunet/dotfiles): astronvim with nix flakes.
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
## How to create & managage KubeVirt's Virtual Machine from this flake?
|
||||||
|
|
||||||
|
Use `aquamarine` as an example, we can create a virtual machine with the following command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
just upload-vm aquamarine
|
||||||
|
```
|
||||||
|
|
||||||
|
Then create the virtual machine by creating a yaml file at
|
||||||
|
[ryan4yin/k8s-gitops](https://github.com/ryan4yin/k8s-gitops/tree/main/vms)
|
||||||
|
|
||||||
|
Once the virtual machine `aquamarine` is created, we can deploy updates to it with the following
|
||||||
|
commands:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
just col aquamarine
|
||||||
|
just col kubevirt-shoryu
|
||||||
|
just col k3s-test-1-master-1
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're not familiar with remote deployment, please read this tutorial first:
|
||||||
|
[Remote Deployment - NixOS & Flakes Book](https://nixos-and-flakes.thiscute.world/best-practices/remote-deployment)
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 116 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 981 KiB |
@@ -0,0 +1,2 @@
|
|||||||
|
*.key
|
||||||
|
*.csr
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# My Private PKI / CA
|
||||||
|
|
||||||
|
This is my private Private Key Infrastructure (PKI) / Certificate Authority (CA) for my personal
|
||||||
|
use. It is used to issue certificates for my own servers and services.
|
||||||
|
|
||||||
|
All the private keys are ignored by git, and will be stored in my private secrets repo
|
||||||
|
[../secrets](../secrets/)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIBajCB8QIJAIwL98is2nQPMAoGCCqGSM49BAMEMB8xHTAbBgNVBAMMFFJ5YW40
|
||||||
|
WWluJ3MgUm9vdCBDQSAxMB4XDTI0MDQwMzA4NDgzM1oXDTM0MDQwMTA4NDgzM1ow
|
||||||
|
HzEdMBsGA1UEAwwUUnlhbjRZaW4ncyBSb290IENBIDEwdjAQBgcqhkjOPQIBBgUr
|
||||||
|
gQQAIgNiAAQ6ixMbsGZ/u/ZnwzOZ49naVL7rQxm9C74SboGytKcYBH03JjC7tgZ3
|
||||||
|
DylirxSLcTYHHtCz9ajdamP6+sgiGVpUODtfGSO+WmS+gAbLjCS37T41bkUhkx88
|
||||||
|
JU4NsGhjPXcwCgYIKoZIzj0EAwQDaAAwZQIwDrGLSdO+p/1uywkzqzdM/OnZs8bp
|
||||||
|
n60uBhUI7EZzDmrouOFeGx+dXYI5yy5AD/qDAjEA7fTQx+jccyOj4dimq1iU9+71
|
||||||
|
e/gWYg0rexfy/+9dQY6kvwMzv8Lnm6URaRMbE1Q/
|
||||||
|
-----END CERTIFICATE-----
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
C050420A8E5A3C1E
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
[ req ]
|
||||||
|
prompt = no
|
||||||
|
req_extensions = v3_ext
|
||||||
|
distinguished_name = req_distinguished_name
|
||||||
|
|
||||||
|
[ req_distinguished_name ]
|
||||||
|
countryName = US
|
||||||
|
stateOrProvinceName = NYK
|
||||||
|
localityName = NYK
|
||||||
|
organizationName = Ryan4Yin
|
||||||
|
organizationalUnitName = Ryan4Yin
|
||||||
|
commonName = writefor.fun # deprecated, use subjectAltName(SAN) instead
|
||||||
|
emailAddress = rayn4yin@linux.com
|
||||||
|
|
||||||
|
[ alt_names ]
|
||||||
|
DNS.1 = writefor.fun
|
||||||
|
DNS.2 = *.writefor.fun
|
||||||
|
|
||||||
|
[ v3_ext ]
|
||||||
|
subjectAltName=@alt_names
|
||||||
|
basicConstraints = CA:false
|
||||||
|
extendedKeyUsage = serverAuth
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICKTCCAa6gAwIBAgIJAMBQQgqOWjweMAoGCCqGSM49BAMEMB8xHTAbBgNVBAMM
|
||||||
|
FFJ5YW40WWluJ3MgUm9vdCBDQSAxMB4XDTI0MDQwMzA4NDgzM1oXDTM0MDQwMTA4
|
||||||
|
NDgzM1owgYkxCzAJBgNVBAYTAlVTMQwwCgYDVQQIDANOWUsxDDAKBgNVBAcMA05Z
|
||||||
|
SzERMA8GA1UECgwIUnlhbjRZaW4xETAPBgNVBAsMCFJ5YW40WWluMRUwEwYDVQQD
|
||||||
|
DAx3cml0ZWZvci5mdW4xITAfBgkqhkiG9w0BCQEWEnJheW40eWluQGxpbnV4LmNv
|
||||||
|
bTB2MBAGByqGSM49AgEGBSuBBAAiA2IABCNTYKDq/I99NltQR5eKrrovQXp9BbLV
|
||||||
|
iuUdYmzFrAh+NC9ikiIqTfDwP+c+7QvDyI3KXu3KI2qPSPdxktZKDUPHK4p2Y2kZ
|
||||||
|
xKOI2IFTgTqV3uBciyx7ayWPTwBYxsTDmqNLMEkwJwYDVR0RBCAwHoIMd3JpdGVm
|
||||||
|
b3IuZnVugg4qLndyaXRlZm9yLmZ1bjAJBgNVHRMEAjAAMBMGA1UdJQQMMAoGCCsG
|
||||||
|
AQUFBwMBMAoGCCqGSM49BAMEA2kAMGYCMQCHw9YkDo15P9mqEObvxSUak8tQmhBB
|
||||||
|
9wB81Qg4c+JsMCZA1rMUB7GkNJj1Dr9rWLoCMQDSituLzmo/yPLEOrbNV83bj3/I
|
||||||
|
ikKgobSie3pMXm5ZG7krOXaunyFRR/bIkih2V2Q=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# 1. Generate the private key for Root CA
|
||||||
|
openssl ecparam -genkey -name secp384r1 -out ecc-ca.key
|
||||||
|
# 2. Generate the certificate for Root CA with the validity period of 10 years
|
||||||
|
# using the private key and some basic information
|
||||||
|
# NOTE: we specify sha512 as the signature algorithm, which is the key point
|
||||||
|
openssl req -x509 -new -SHA512 -key ecc-ca.key -subj "/CN=Ryan4Yin's Root CA 1" -days 3650 -out ecc-ca.crt
|
||||||
|
|
||||||
|
# 3. Generate the private key for web server
|
||||||
|
openssl ecparam -genkey -name secp384r1 -out ecc-server.key
|
||||||
|
# 4. Generate the certificate signing request (CSR) for the server certificate
|
||||||
|
# using the private key and the configuration file ecc-csr.conf
|
||||||
|
openssl req -new -SHA512 -key ecc-server.key -out ecc-server.csr -config ecc-csr.conf
|
||||||
|
# 5. Sign the server certificate with the Root CA's certificate and private key
|
||||||
|
# NOTE: we specify sha512 as the signature algorithm, which is the key point
|
||||||
|
openssl x509 -req -SHA512 -in ecc-server.csr -CA ecc-ca.crt -CAkey ecc-ca.key \
|
||||||
|
-CAcreateserial -out ecc-server.crt -days 3650 \
|
||||||
|
-extensions v3_ext -extfile ecc-csr.conf
|
||||||
|
|
||||||
|
# 6. Display the information of the certificates
|
||||||
|
openssl x509 -noout -text -in ecc-ca.crt
|
||||||
|
openssl x509 -noout -text -in ecc-server.crt
|
||||||
|
|
||||||
Generated
+559
-317
File diff suppressed because it is too large
Load Diff
@@ -36,12 +36,12 @@
|
|||||||
# which represents the GitHub repository URL + branch/commit-id/tag.
|
# which represents the GitHub repository URL + branch/commit-id/tag.
|
||||||
|
|
||||||
# Official NixOS package source, using nixos's unstable branch by default
|
# Official NixOS package source, using nixos's unstable branch by default
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
|
||||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable-small";
|
||||||
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-23.11";
|
# nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05";
|
||||||
|
|
||||||
# for macos
|
# for macos
|
||||||
nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-23.11-darwin";
|
nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-24.05-darwin";
|
||||||
nix-darwin = {
|
nix-darwin = {
|
||||||
url = "github:lnl7/nix-darwin";
|
url = "github:lnl7/nix-darwin";
|
||||||
inputs.nixpkgs.follows = "nixpkgs-darwin";
|
inputs.nixpkgs.follows = "nixpkgs-darwin";
|
||||||
@@ -50,8 +50,8 @@
|
|||||||
|
|
||||||
# home-manager, used for managing user configuration
|
# home-manager, used for managing user configuration
|
||||||
home-manager = {
|
home-manager = {
|
||||||
# url = "github:nix-community/home-manager/release-23.11";
|
url = "github:nix-community/home-manager/release-24.05";
|
||||||
url = "github:nix-community/home-manager/master";
|
# url = "github:nix-community/home-manager/master";
|
||||||
|
|
||||||
# The `follows` keyword in inputs is used for inheritance.
|
# The `follows` keyword in inputs is used for inheritance.
|
||||||
# Here, `inputs.nixpkgs` of home-manager is kept consistent with the `inputs.nixpkgs` of the current flake,
|
# Here, `inputs.nixpkgs` of home-manager is kept consistent with the `inputs.nixpkgs` of the current flake,
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
impermanence.url = "github:nix-community/impermanence";
|
impermanence.url = "github:nix-community/impermanence";
|
||||||
|
|
||||||
hyprland = {
|
hyprland = {
|
||||||
url = "github:hyprwm/Hyprland/v0.33.1";
|
url = "github:hyprwm/Hyprland/v0.39.1";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,16 +87,16 @@
|
|||||||
# secrets management
|
# secrets management
|
||||||
agenix = {
|
agenix = {
|
||||||
# lock with git commit at 0.15.0
|
# lock with git commit at 0.15.0
|
||||||
url = "github:ryantm/agenix/564595d0ad4be7277e07fa63b5a991b3c645655d";
|
# url = "github:ryantm/agenix/564595d0ad4be7277e07fa63b5a991b3c645655d";
|
||||||
# replaced with a type-safe reimplementation to get a better error message and less bugs.
|
# replaced with a type-safe reimplementation to get a better error message and less bugs.
|
||||||
# url = "github:ryan4yin/ragenix";
|
url = "github:ryan4yin/ragenix";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
nix-gaming.url = "github:fufexan/nix-gaming";
|
nix-gaming.url = "github:fufexan/nix-gaming";
|
||||||
|
|
||||||
disko = {
|
disko = {
|
||||||
url = "github:nix-community/disko";
|
url = "github:nix-community/disko/v1.6.1";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -108,23 +108,21 @@
|
|||||||
|
|
||||||
nuenv.url = "github:DeterminateSystems/nuenv";
|
nuenv.url = "github:DeterminateSystems/nuenv";
|
||||||
|
|
||||||
# daeuniverse.url = "github:daeuniverse/flake.nix/unstable";
|
daeuniverse.url = "github:daeuniverse/flake.nix";
|
||||||
daeuniverse.url = "github:daeuniverse/flake.nix/exp";
|
# daeuniverse.url = "github:daeuniverse/flake.nix/exp";
|
||||||
|
|
||||||
attic.url = "github:zhaofengli/attic";
|
|
||||||
|
|
||||||
haumea = {
|
haumea = {
|
||||||
url = "github:nix-community/haumea/v0.2.2";
|
url = "github:nix-community/haumea/v0.2.2";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
microvm = {
|
||||||
|
url = "github:astro/microvm.nix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
######################## Some non-flake repositories #########################################
|
######################## Some non-flake repositories #########################################
|
||||||
|
|
||||||
# AstroNvim is an aesthetic and feature-rich neovim config.
|
|
||||||
astronvim = {
|
|
||||||
url = "github:AstroNvim/AstroNvim/v3.41.2";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
# doom-emacs is a configuration framework for GNU Emacs.
|
# doom-emacs is a configuration framework for GNU Emacs.
|
||||||
doomemacs = {
|
doomemacs = {
|
||||||
url = "github:doomemacs/doomemacs";
|
url = "github:doomemacs/doomemacs";
|
||||||
|
|||||||
@@ -3,4 +3,3 @@
|
|||||||
1. `base`: The base module that is suitable for both Linux and macOS.
|
1. `base`: The base module that is suitable for both Linux and macOS.
|
||||||
2. `linux`: Linux-specific configuration.
|
2. `linux`: Linux-specific configuration.
|
||||||
3. `darwin`: macOS-specific configuration.
|
3. `darwin`: macOS-specific configuration.
|
||||||
|
|
||||||
|
|||||||
@@ -3,4 +3,3 @@
|
|||||||
1. `server`: Configuration which is suitable for both servers and desktops.
|
1. `server`: Configuration which is suitable for both servers and desktops.
|
||||||
1. `desktop`: Configuration for desktop environments, such as Hyprland, I3, etc.
|
1. `desktop`: Configuration for desktop environments, such as Hyprland, I3, etc.
|
||||||
1. `core.nix`: Minimal home-manager's config
|
1. `core.nix`: Minimal home-manager's config
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
attic,
|
|
||||||
nur-ryan4yin,
|
nur-ryan4yin,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
@@ -25,7 +24,7 @@
|
|||||||
ast-grep
|
ast-grep
|
||||||
|
|
||||||
sad # CLI search and replace, just like sed, but with diff preview.
|
sad # CLI search and replace, just like sed, but with diff preview.
|
||||||
yq-go # yaml processer https://github.com/mikefarah/yq
|
yq-go # yaml processor https://github.com/mikefarah/yq
|
||||||
just # a command runner like make, but simpler
|
just # a command runner like make, but simpler
|
||||||
delta # A viewer for git and diff output
|
delta # A viewer for git and diff output
|
||||||
lazygit # Git terminal UI.
|
lazygit # Git terminal UI.
|
||||||
@@ -52,8 +51,6 @@
|
|||||||
# productivity
|
# productivity
|
||||||
caddy # A webserver with automatic HTTPS via Let's Encrypt(replacement of nginx)
|
caddy # A webserver with automatic HTTPS via Let's Encrypt(replacement of nginx)
|
||||||
croc # File transfer between computers securely and easily
|
croc # File transfer between computers securely and easily
|
||||||
# self-hosted nix cache server
|
|
||||||
attic.packages.${pkgs.system}.attic-client
|
|
||||||
ncdu # analyzer your disk usage Interactively, via TUI(replacement of `du`)
|
ncdu # analyzer your disk usage Interactively, via TUI(replacement of `du`)
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -62,7 +59,8 @@
|
|||||||
# useful in bash/zsh prompt, not in nushell.
|
# useful in bash/zsh prompt, not in nushell.
|
||||||
eza = {
|
eza = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableAliases = false; # do not enable aliases in nushell!
|
# do not enable aliases in nushell!
|
||||||
|
enableNushellIntegration = false;
|
||||||
git = true;
|
git = true;
|
||||||
icons = true;
|
icons = true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
# Editors
|
# Editors
|
||||||
|
|
||||||
See [desktop/editors/](../../desktop/editors/) for more details.
|
See [desktop/editors/](../../desktop/editors/) for more details.
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
includes = [
|
includes = [
|
||||||
{
|
{
|
||||||
# use diffrent email & name for work
|
# use different email & name for work
|
||||||
path = "~/work/.gitconfig";
|
path = "~/work/.gitconfig";
|
||||||
condition = "gitdir:~/work/";
|
condition = "gitdir:~/work/";
|
||||||
}
|
}
|
||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
init.defaultBranch = "main";
|
init.defaultBranch = "main";
|
||||||
|
trim.bases = "develop,master,main"; # for git-trim
|
||||||
push.autoSetupRemote = true;
|
push.autoSetupRemote = true;
|
||||||
pull.rebase = true;
|
pull.rebase = true;
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,7 @@
|
|||||||
package = pkgs-unstable.yazi;
|
package = pkgs-unstable.yazi;
|
||||||
# Changing working directory when exiting Yazi
|
# Changing working directory when exiting Yazi
|
||||||
enableBashIntegration = true;
|
enableBashIntegration = true;
|
||||||
# TODO: nushellIntegration is broken on release-23.11, wait for master's fix to be released
|
enableNushellIntegration = true;
|
||||||
enableNushellIntegration = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
xdg.configFile."yazi/theme.toml".source = "${nur-ryan4yin.packages.${pkgs.system}.catppuccin-yazi}/mocha.toml";
|
xdg.configFile."yazi/theme.toml".source = "${nur-ryan4yin.packages.${pkgs.system}.catppuccin-yazi}/mocha.toml";
|
||||||
|
|||||||
@@ -1,14 +1,7 @@
|
|||||||
{
|
{pkgs, ...}: {
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
# db related
|
|
||||||
dbeaver
|
|
||||||
|
|
||||||
mitmproxy # http/https proxy tool
|
mitmproxy # http/https proxy tool
|
||||||
insomnia # REST client
|
insomnia # REST client
|
||||||
wireshark # network analyzer
|
wireshark # network analyzer
|
||||||
ventoy # create bootable usb
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,25 @@
|
|||||||
# Termianl Emulators
|
# Terminal Emulators
|
||||||
|
|
||||||
I used to spend a lot of time on terminal emulators, to make them match my taste,
|
I used to spend a lot of time on terminal emulators, to make them match my taste, but now I found
|
||||||
but now I found that it's not worth it, **Zellij can provide a user-friendly and unified user experience for all terminal emulators! without any pain**!
|
that it's not worth it, **Zellij can provide a user-friendly and unified user experience for all
|
||||||
|
terminal emulators! without any pain**!
|
||||||
|
|
||||||
Currently, I only use the most basic features of terminal emulators, such as true color, graphics protocol, etc.
|
Currently, I only use the most basic features of terminal emulators, such as true color, graphics
|
||||||
Other features such as tabs, scrollback buffer, select/search/copy, etc, are all provided by zellij!
|
protocol, etc. Other features such as tabs, scrollback buffer, select/search/copy, etc, are all
|
||||||
|
provided by zellij!
|
||||||
|
|
||||||
My current terminal emulators are:
|
My current terminal emulators are:
|
||||||
|
|
||||||
1. kitty: My main terminal emulator.
|
1. kitty: My main terminal emulator.
|
||||||
1. to select/copy a large mount of text, We should do some tricks via kitty's `scrollback_pager` with neovim, it's really painful: <https://github.com/kovidgoyal/kitty/issues/719>
|
1. to select/copy a large mount of text, We should do some tricks via kitty's `scrollback_pager`
|
||||||
|
with neovim, it's really painful: <https://github.com/kovidgoyal/kitty/issues/719>
|
||||||
2. wezterm: My secondary terminal emulator.
|
2. wezterm: My secondary terminal emulator.
|
||||||
1. its search ability is very basic, and it's not easy to use.
|
1. its search ability is very basic, and it's not easy to use.
|
||||||
1. its scrollback buffer's copy mode is very like vim, which is nice, but zellij's even better, it can use neovim as its default scrollback buffer's editor without any pain!
|
1. its scrollback buffer's copy mode is very like vim, which is nice, but zellij's even better,
|
||||||
|
it can use neovim as its default scrollback buffer's editor without any pain!
|
||||||
3. foot: a fast, lightweight and minimalistic Wayland terminal emulator.
|
3. foot: a fast, lightweight and minimalistic Wayland terminal emulator.
|
||||||
1. foot only do the things a terminal emulator should do, no more, no less.
|
1. foot only do the things a terminal emulator should do, no more, no less.
|
||||||
1. It's really suitable for tiling window manager or zellij users!
|
1. It's really suitable for tiling window manager or zellij users!
|
||||||
|
|
||||||
## 'xterm-kitty': unknown terminal type when `ssh` into a remote host or `sudo xxx`
|
## 'xterm-kitty': unknown terminal type when `ssh` into a remote host or `sudo xxx`
|
||||||
|
|
||||||
@@ -23,45 +27,55 @@ My current terminal emulators are:
|
|||||||
|
|
||||||
> https://wezfurlong.org/wezterm/config/lua/config/term.html
|
> https://wezfurlong.org/wezterm/config/lua/config/term.html
|
||||||
|
|
||||||
kitty set `TERM` to `xterm-kitty` by default, and TUI apps like `viu`, `yazi`, `curses` will try to search in the host's [terminfo(terminal capability data base)](https://linux.die.net/man/5/terminfo) for value of `TERM` to determine the capabilities of the terminal.
|
kitty set `TERM` to `xterm-kitty` by default, and TUI apps like `viu`, `yazi`, `curses` will try to
|
||||||
|
search in the host's [terminfo(terminal capability data base)](https://linux.die.net/man/5/terminfo)
|
||||||
|
for value of `TERM` to determine the capabilities of the terminal.
|
||||||
|
|
||||||
But when you `ssh` into a remote host, the remote host is very likely to not have `xterm-kitty` in its terminfo, so you will get this error:
|
But when you `ssh` into a remote host, the remote host is very likely to not have `xterm-kitty` in
|
||||||
|
its terminfo, so you will get this error:
|
||||||
|
|
||||||
```
|
```
|
||||||
'xterm-kitty': unknown terminal type
|
'xterm-kitty': unknown terminal type
|
||||||
```
|
```
|
||||||
|
|
||||||
Or when you `sudo xxx`, `sudo` won't preserve the `TERM` variable, it will be reset to root's default `TERM` value, which is `xterm` or `xterm-256color` in most linux distributions, so you will get this error:
|
Or when you `sudo xxx`, `sudo` won't preserve the `TERM` variable, it will be reset to root's
|
||||||
|
default `TERM` value, which is `xterm` or `xterm-256color` in most linux distributions, so you will
|
||||||
|
get this error:
|
||||||
|
|
||||||
```
|
```
|
||||||
'xterm-256color': unknown terminal type
|
'xterm-256color': unknown terminal type
|
||||||
```
|
```
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
```
|
```
|
||||||
Error opening terminal: xterm-kitty.
|
Error opening terminal: xterm-kitty.
|
||||||
```
|
```
|
||||||
|
|
||||||
NixOS preserve the `TERMINFO` and `TERMINFO_DIRS` environment variables, for `root` and the `wheel` group: [nixpkgs/nixos/modules/config/terminfo.nix](https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/config/terminfo.nix#L18)
|
NixOS preserve the `TERMINFO` and `TERMINFO_DIRS` environment variables, for `root` and the `wheel`
|
||||||
|
group:
|
||||||
|
[nixpkgs/nixos/modules/config/terminfo.nix](https://github.com/NixOS/nixpkgs/blob/nixos-24.05/nixos/modules/config/terminfo.nix#L18)
|
||||||
|
|
||||||
For nix-darwin, take a look at <https://github.com/LnL7/nix-darwin/wiki/Terminfo-issues>
|
For nix-darwin, take a look at <https://github.com/LnL7/nix-darwin/wiki/Terminfo-issues>
|
||||||
|
|
||||||
### Solutions
|
### Solutions
|
||||||
|
|
||||||
Simplest solution, it will automatically copy over the terminfo files and also magically enable shell integration on the remote machine:
|
Simplest solution, it will automatically copy over the terminfo files and also magically enable
|
||||||
|
shell integration on the remote machine:
|
||||||
|
|
||||||
```
|
```
|
||||||
kitten ssh user@host
|
kitten ssh user@host
|
||||||
```
|
```
|
||||||
|
|
||||||
Or if you do not care about kitty's features(such as true color & graphics protocol), you can simply set `TERM` to `xterm-256color`, which is built-in in most linux distributions:
|
Or if you do not care about kitty's features(such as true color & graphics protocol), you can simply
|
||||||
|
set `TERM` to `xterm-256color`, which is built-in in most linux distributions:
|
||||||
|
|
||||||
```
|
```
|
||||||
export TERM=xterm-256color
|
export TERM=xterm-256color
|
||||||
```
|
```
|
||||||
|
|
||||||
If you need kitty's features, but do not like the magic of `kitten`, you can manually install kitty's terminfo on the remote host:
|
If you need kitty's features, but do not like the magic of `kitten`, you can manually install
|
||||||
|
kitty's terminfo on the remote host:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# install on ubuntu / debian
|
# install on ubuntu / debian
|
||||||
@@ -70,4 +84,3 @@ sudo apt-get install kitty-terminfo
|
|||||||
# or copy from local machine
|
# or copy from local machine
|
||||||
infocmp -a xterm-kitty | ssh myserver tic -x -o \~/.terminfo /dev/stdin
|
infocmp -a xterm-kitty | ssh myserver tic -x -o \~/.terminfo /dev/stdin
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@
|
|||||||
# You can update Home Manager without changing this value. See
|
# You can update Home Manager without changing this value. See
|
||||||
# the Home Manager release notes for a list of state version
|
# the Home Manager release notes for a list of state version
|
||||||
# changes in each release.
|
# changes in each release.
|
||||||
stateVersion = "23.11";
|
stateVersion = "24.05";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Let Home Manager install and manage itself.
|
# Let Home Manager install and manage itself.
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
colmena # nixos's remote deployment tool
|
colmena # nixos's remote deployment tool
|
||||||
|
|
||||||
# db related
|
# db related
|
||||||
mycli
|
pkgs-unstable.mycli
|
||||||
pgcli
|
pkgs-unstable.pgcli
|
||||||
mongosh
|
mongosh
|
||||||
sqlite
|
sqlite
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
minicom
|
minicom
|
||||||
|
|
||||||
# ai related
|
# ai related
|
||||||
python311Packages.huggingface-hub # huggingface-cli
|
pkgs-unstable.python312Packages.huggingface-hub # huggingface-cli
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
pkgs-unstable.devbox
|
pkgs-unstable.devbox
|
||||||
|
|||||||
@@ -6,7 +6,9 @@
|
|||||||
|
|
||||||
> https://langserver.org/
|
> https://langserver.org/
|
||||||
|
|
||||||
The Language Server Protocol (LSP) is an open, JSON-RPC-based protocol for use between source code editors or integrated development environments (IDEs) and servers that provide programming language-specific features like:
|
The Language Server Protocol (LSP) is an open, JSON-RPC-based protocol for use between source code
|
||||||
|
editors or integrated development environments (IDEs) and servers that provide programming
|
||||||
|
language-specific features like:
|
||||||
|
|
||||||
- motions such as go-to-definition, find-references, hover.
|
- motions such as go-to-definition, find-references, hover.
|
||||||
- **code completion**
|
- **code completion**
|
||||||
@@ -15,10 +17,11 @@ The Language Server Protocol (LSP) is an open, JSON-RPC-based protocol for use b
|
|||||||
- syntax highlighting (use Tree-sitter instead)
|
- syntax highlighting (use Tree-sitter instead)
|
||||||
- code formatting (use a dedicated formatter instead)
|
- code formatting (use a dedicated formatter instead)
|
||||||
|
|
||||||
The goal of the protocol is to allow programming language support to be implemented and distributed independently of any given editor or IDE.
|
The goal of the protocol is to allow programming language support to be implemented and distributed
|
||||||
|
independently of any given editor or IDE.
|
||||||
|
|
||||||
LSP was originally developed for Microsoft Visual Studio Code and is now an open standard.
|
LSP was originally developed for Microsoft Visual Studio Code and is now an open standard. In the
|
||||||
In the early 2020s LSP quickly became a "norm" for language intelligence tools providers.
|
early 2020s LSP quickly became a "norm" for language intelligence tools providers.
|
||||||
|
|
||||||
### Tree-sitter
|
### Tree-sitter
|
||||||
|
|
||||||
@@ -26,7 +29,9 @@ In the early 2020s LSP quickly became a "norm" for language intelligence tools p
|
|||||||
|
|
||||||
> https://www.reddit.com/r/neovim/comments/1109wgr/treesitter_vs_lsp_differences_ans_overlap/
|
> https://www.reddit.com/r/neovim/comments/1109wgr/treesitter_vs_lsp_differences_ans_overlap/
|
||||||
|
|
||||||
Tree-sitter is a parser generator tool and an **incremental parsing** library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited.
|
Tree-sitter is a parser generator tool and an **incremental parsing** library. It can build a
|
||||||
|
concrete syntax tree for a source file and efficiently update the syntax tree as the source file is
|
||||||
|
edited.
|
||||||
|
|
||||||
It is used by many editors and IDEs to provide:
|
It is used by many editors and IDEs to provide:
|
||||||
|
|
||||||
@@ -38,17 +43,22 @@ It is used by many editors and IDEs to provide:
|
|||||||
- such as join/split lines, structural editing, cursor motion, etc.
|
- such as join/split lines, structural editing, cursor motion, etc.
|
||||||
|
|
||||||
**Treesitter process each file independently**, and it is not aware of the semantics of your code.
|
**Treesitter process each file independently**, and it is not aware of the semantics of your code.
|
||||||
For example, it does not know does a function/variable really exist, or what is the type/return-type of a variable. This is where LSP comes in.
|
For example, it does not know does a function/variable really exist, or what is the type/return-type
|
||||||
|
of a variable. This is where LSP comes in.
|
||||||
|
|
||||||
The LSP server parses the code much more deeply and it **not only parses a single file but your whole project**.
|
The LSP server parses the code much more deeply and it **not only parses a single file but your
|
||||||
So, the LSP server will know whether a function/variable does exist with the same type/return-type. If it does not, it will mark it as an error.
|
whole project**. So, the LSP server will know whether a function/variable does exist with the same
|
||||||
|
type/return-type. If it does not, it will mark it as an error.
|
||||||
|
|
||||||
**LSP does understand the code semantically, while Treesitter only cares about correct syntax**.
|
**LSP does understand the code semantically, while Treesitter only cares about correct syntax**.
|
||||||
|
|
||||||
#### LSP vs Tree-sitter
|
#### LSP vs Tree-sitter
|
||||||
|
|
||||||
- Tree-sitter: lightweight, fast, but limited knowledge of your code. mainly used for **syntax highlighting, indentation, and folding/refactoring in a single file**.
|
- Tree-sitter: lightweight, fast, but limited knowledge of your code. mainly used for **syntax
|
||||||
- LSP: heavy and slow on large projects, but it has a deep understanding of your code. mainly used for **code completion, refactoring in the projects, errors/warnings, and other semantic-aware features**.
|
highlighting, indentation, and folding/refactoring in a single file**.
|
||||||
|
- LSP: heavy and slow on large projects, but it has a deep understanding of your code. mainly used
|
||||||
|
for **code completion, refactoring in the projects, errors/warnings, and other semantic-aware
|
||||||
|
features**.
|
||||||
|
|
||||||
### Formatter vs Linter
|
### Formatter vs Linter
|
||||||
|
|
||||||
@@ -56,7 +66,10 @@ Linting is distinct from Formatting because:
|
|||||||
|
|
||||||
1. **formatting** only restructures how code appears.
|
1. **formatting** only restructures how code appears.
|
||||||
1. `prettier` is a popular formatter.
|
1. `prettier` is a popular formatter.
|
||||||
1. **linting** analyzes how the code runs and detects errors, it may also suggest improvements such as replace `var` with `let` or `const`.
|
1. **linting** analyzes how the code runs and detects errors, it may also suggest improvements such
|
||||||
|
as replace `var` with `let` or `const`.
|
||||||
|
|
||||||
Formatters and Linters process each file independently, they do not need to know about other files in the project.
|
Formatters and Linters process each file independently, they do not need to know about other files
|
||||||
* [ ]
|
in the project.
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|||||||
@@ -10,15 +10,18 @@ And `Zellij` for a smooth and stable terminal experience.
|
|||||||
|
|
||||||
## Tips
|
## Tips
|
||||||
|
|
||||||
1. Many useful keys are already provided by vim, check vim/neovim's docs before you install a new plugin / reinvent the wheel.
|
1. Many useful keys are already provided by vim, check vim/neovim's docs before you install a new
|
||||||
1. After using Emacs/Neovim more skillfully, I strongly recommend that you read the official documentation of Neovim/vim:
|
plugin / reinvent the wheel.
|
||||||
|
1. After using Emacs/Neovim more skillfully, I strongly recommend that you read the official
|
||||||
|
documentation of Neovim/vim:
|
||||||
1. <https://vimhelp.org/>: The official vim documentation.
|
1. <https://vimhelp.org/>: The official vim documentation.
|
||||||
1. <https://neovim.io/doc/user/>: Neovim's official user documentation.
|
1. <https://neovim.io/doc/user/>: Neovim's official user documentation.
|
||||||
1. Use Zellij for terminal related operations, and use Neovim/Helix for editing.
|
1. Use Zellij for terminal related operations, and use Neovim/Helix for editing.
|
||||||
1. As for Emacs, Use its GUI version & terminal emulator `vterm` for terminal related operations.
|
1. As for Emacs, Use its GUI version & terminal emulator `vterm` for terminal related operations.
|
||||||
1. Two powerful file search & jump tools:
|
1. Two powerful file search & jump tools:
|
||||||
1. Tree-view plugins are beginner-friendly and intuitive, but they're not very efficient.
|
1. Tree-view plugins are beginner-friendly and intuitive, but they're not very efficient.
|
||||||
1. **Search by the file path**: Useful when you're familiar with the project structure, especially on a large project.
|
1. **Search by the file path**: Useful when you're familiar with the project structure, especially
|
||||||
|
on a large project.
|
||||||
1. **Search by the content**: Useful when you're familiar with the code.
|
1. **Search by the content**: Useful when you're familiar with the code.
|
||||||
|
|
||||||
## Tutorial
|
## Tutorial
|
||||||
@@ -27,13 +30,16 @@ Type `:tutor`(`:Tutor` in Neovim) to learn the basics usage of vim/neovim.
|
|||||||
|
|
||||||
## VIM's Cheetsheet
|
## VIM's Cheetsheet
|
||||||
|
|
||||||
> Here only record my commonly used keys, to see **a more comprehensive cheetsheet**: <https://vimhelp.org/quickref.txt.html>
|
> Here only record my commonly used keys, to see **a more comprehensive cheetsheet**:
|
||||||
|
> <https://vimhelp.org/quickref.txt.html>
|
||||||
|
|
||||||
Both Emacs-Evil & Neovim are compatible with vim, sothe key-bindings described here are common in both Emacs-Evil, Neovim & vim.
|
Both Emacs-Evil & Neovim are compatible with vim, sothe key-bindings described here are common in
|
||||||
|
both Emacs-Evil, Neovim & vim.
|
||||||
|
|
||||||
### Terminal Related
|
### Terminal Related
|
||||||
|
|
||||||
I mainly use Zellij for terminal related operations, here is its terminal shortcuts I use frequently now:
|
I mainly use Zellij for terminal related operations, here is its terminal shortcuts I use frequently
|
||||||
|
now:
|
||||||
|
|
||||||
| Action | Zellij's Shortcut |
|
| Action | Zellij's Shortcut |
|
||||||
| ------------------------- | ----------------- |
|
| ------------------------- | ----------------- |
|
||||||
@@ -76,10 +82,12 @@ I mainly use Zellij for terminal related operations, here is its terminal shortc
|
|||||||
|
|
||||||
Text Objects:
|
Text Objects:
|
||||||
|
|
||||||
- **sentence**: text ending at a '.', '!' or '?' followed by either the end of a line, or by a space or tab.
|
- **sentence**: text ending at a '.', '!' or '?' followed by either the end of a line, or by a space
|
||||||
|
or tab.
|
||||||
- **paragraph**: text ending at a blank line.
|
- **paragraph**: text ending at a blank line.
|
||||||
- **section**: text starting with a section header and ending at the start of the next section header (or at the end of the file). - The "`]]`" and "`[[`" commands stop at the '`{`' in the first column. This is
|
- **section**: text starting with a section header and ending at the start of the next section
|
||||||
useful to find the start of a function in a C/Go/Java/... program.
|
header (or at the end of the file). - The "`]]`" and "`[[`" commands stop at the '`{`' in the
|
||||||
|
first column. This is useful to find the start of a function in a C/Go/Java/... program.
|
||||||
|
|
||||||
### Text Manipulation
|
### Text Manipulation
|
||||||
|
|
||||||
@@ -99,7 +107,7 @@ Basics:
|
|||||||
| Toggle text's case | `~` |
|
| Toggle text's case | `~` |
|
||||||
| Convert to uppercase | `U` (visual mode) |
|
| Convert to uppercase | `U` (visual mode) |
|
||||||
| Convert to lowercase | `u` (visual mode) |
|
| Convert to lowercase | `u` (visual mode) |
|
||||||
| Align the selected conent | `:center`/`:left`/`:right` |
|
| Align the selected content | `:center`/`:left`/`:right` |
|
||||||
|
|
||||||
Misc:
|
Misc:
|
||||||
|
|
||||||
@@ -116,7 +124,7 @@ Misc:
|
|||||||
|
|
||||||
| Action | |
|
| Action | |
|
||||||
| ------------------------------------------------------------------------- | -------------- |
|
| ------------------------------------------------------------------------- | -------------- |
|
||||||
| Sort tye selected lines | `:sort` |
|
| Sort the selected lines | `:sort` |
|
||||||
| Join Selection of Lines With Space | `:join` or `J` |
|
| Join Selection of Lines With Space | `:join` or `J` |
|
||||||
| Join without spaces | `:join!` |
|
| Join without spaces | `:join!` |
|
||||||
| Enter Insert mode at the start/end of the line | `I` / `A` |
|
| Enter Insert mode at the start/end of the line | `I` / `A` |
|
||||||
@@ -161,7 +169,8 @@ Advance Techs:
|
|||||||
| Replace all the lines | `:% s/old/new/g` |
|
| Replace all the lines | `:% s/old/new/g` |
|
||||||
| Replace all the lines with regex | `:% s@\vhttp://(\w+)@https://\1@gc` |
|
| Replace all the lines with regex | `:% s@\vhttp://(\w+)@https://\1@gc` |
|
||||||
|
|
||||||
1. `\v` means means that in the regex pattern after it can be used without backslash escaping(similar to python's raw string).
|
1. `\v` means means that in the regex pattern after it can be used without backslash
|
||||||
|
escaping(similar to python's raw string).
|
||||||
2. `\1` means the first matched group in the pattern.
|
2. `\1` means the first matched group in the pattern.
|
||||||
|
|
||||||
### Replace in the specific lines
|
### Replace in the specific lines
|
||||||
@@ -196,7 +205,7 @@ The postfix(flags) in the above commands:
|
|||||||
| Show all buffers | `:ls` |
|
| Show all buffers | `:ls` |
|
||||||
| show next/previous buffer | `]b`/`[b` or `:bn[ext]` / `bp[rev]` |
|
| show next/previous buffer | `]b`/`[b` or `:bn[ext]` / `bp[rev]` |
|
||||||
| New Tab(New Workspace in DoomEmacs) | `:tabnew` |
|
| New Tab(New Workspace in DoomEmacs) | `:tabnew` |
|
||||||
| Next/Previews Tab | `gt`/`gT` |
|
| Next/Previews Tab | `gt`/`gy` |
|
||||||
|
|
||||||
### History
|
### History
|
||||||
|
|
||||||
|
|||||||
@@ -2,23 +2,24 @@
|
|||||||
|
|
||||||
## S-expression data(Lisp)
|
## S-expression data(Lisp)
|
||||||
|
|
||||||
- paredit/[lispy](https://github.com/doomemacs/doomemacs/tree/master/modules/editor/lispy): too complex.
|
- paredit/[lispy](https://github.com/doomemacs/doomemacs/tree/master/modules/editor/lispy): too
|
||||||
|
complex.
|
||||||
- [evil-cleverparens](https://github.com/emacs-evil/evil-cleverparens): simple and useful.
|
- [evil-cleverparens](https://github.com/emacs-evil/evil-cleverparens): simple and useful.
|
||||||
- [parinfer(par-in-fer)](https://shaunlebron.github.io/parinfer/): morden, simple, elegant and useful, but works not well with some other completion plugins...
|
- [parinfer(par-in-fer)](https://shaunlebron.github.io/parinfer/): morden, simple, elegant and
|
||||||
- to make parinfer works, you should disable sexp & smartparens in any lisp mode.
|
useful, but works not well with some other completion plugins...
|
||||||
|
- to make parinfer works, you should disable sexp & smartparens in any lisp mode.
|
||||||
|
|
||||||
Some plugins:
|
Some plugins:
|
||||||
|
|
||||||
- Emacs
|
- Emacs
|
||||||
- [parinfer-rusT-mode](https://github.com/justinbarclay/parinfer-rust-mode)
|
- [parinfer-rusT-mode](https://github.com/justinbarclay/parinfer-rust-mode)
|
||||||
- Neovim
|
- Neovim
|
||||||
- [parinfer-rust](https://github.com/eraserhd/parinfer-rust)
|
- [parinfer-rust](https://github.com/eraserhd/parinfer-rust)
|
||||||
- <https://github.com/Olical/conjure>
|
- <https://github.com/Olical/conjure>
|
||||||
- Helix
|
- Helix
|
||||||
- [parinfer #4090 - Helix](https://github.com/helix-editor/helix/discussions/4090)
|
- [parinfer #4090 - Helix](https://github.com/helix-editor/helix/discussions/4090)
|
||||||
|
|
||||||
## Other Languages
|
## Other Languages
|
||||||
|
|
||||||
1. treesitter
|
1. treesitter
|
||||||
1. ...
|
1. ...
|
||||||
|
|
||||||
|
|||||||
@@ -6,17 +6,19 @@
|
|||||||
2. Org Mode
|
2. Org Mode
|
||||||
3. Lisp Coding
|
3. Lisp Coding
|
||||||
4. A top-level tutorial for Emacs(Chinese): <https://nyk.ma/tags/emacs/>
|
4. A top-level tutorial for Emacs(Chinese): <https://nyk.ma/tags/emacs/>
|
||||||
5. A Beginner's Guide to Emacs(Chinese): <https://github.com/emacs-tw/emacs-101-beginner-survival-guide>
|
5. A Beginner's Guide to Emacs(Chinese):
|
||||||
|
<https://github.com/emacs-tw/emacs-101-beginner-survival-guide>
|
||||||
|
|
||||||
## Screenshot
|
## Screenshot
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Usefull Links
|
## Useful Links
|
||||||
|
|
||||||
- Framework: <https://github.com/doomemacs/doomemacs>
|
- Framework: <https://github.com/doomemacs/doomemacs>
|
||||||
- key bindings:
|
- key bindings:
|
||||||
- source code: <https://github.com/doomemacs/doomemacs/blob/master/modules/config/default/%2Bevil-bindings.el>
|
- source code:
|
||||||
|
<https://github.com/doomemacs/doomemacs/blob/master/modules/config/default/%2Bevil-bindings.el>
|
||||||
- docs: <https://github.com/doomemacs/doomemacs/blob/master/modules/editor/evil/README.org>
|
- docs: <https://github.com/doomemacs/doomemacs/blob/master/modules/editor/evil/README.org>
|
||||||
- module index: <https://github.com/doomemacs/doomemacs/blob/master/docs/modules.org>
|
- module index: <https://github.com/doomemacs/doomemacs/blob/master/docs/modules.org>
|
||||||
- LSP Client: <https://github.com/manateelazycat/lsp-bridge>
|
- LSP Client: <https://github.com/manateelazycat/lsp-bridge>
|
||||||
@@ -44,7 +46,7 @@ when in doubt, run `doom sync`!
|
|||||||
```bash
|
```bash
|
||||||
# testing
|
# testing
|
||||||
just emacs-test
|
just emacs-test
|
||||||
jsut emacs-purge
|
just emacs-purge
|
||||||
just emacs-reload
|
just emacs-reload
|
||||||
|
|
||||||
# clear test data
|
# clear test data
|
||||||
@@ -59,14 +61,16 @@ just emacs-clean
|
|||||||
- So vim/neovim is still the best choice for servers.
|
- So vim/neovim is still the best choice for servers.
|
||||||
- Emacs's markdown-mode works not well with tables, see:
|
- Emacs's markdown-mode works not well with tables, see:
|
||||||
- https://github.com/jrblevin/markdown-mode/issues/380
|
- https://github.com/jrblevin/markdown-mode/issues/380
|
||||||
- I use git command frequently, but doomemacs only autoupdates status of git diff / treemacs when using magit.
|
- I use git command frequently, but doomemacs only autoupdates status of git diff / treemacs when
|
||||||
|
using magit.
|
||||||
- I have to learn magit to avoid this issue...
|
- I have to learn magit to avoid this issue...
|
||||||
- GitHub's orgmode support is not well, Markdown is better for GitHub.
|
- GitHub's orgmode support is not well, Markdown is better for GitHub.
|
||||||
- Use markdown for repo's README.md, and use orgmode for my personal notes and docs only.
|
- Use markdown for repo's README.md, and use orgmode for my personal notes and docs only.
|
||||||
|
|
||||||
## Cheetsheet
|
## Cheetsheet
|
||||||
|
|
||||||
Here is the cheetsheet related to my DoomEmacs configs. Please read vim's common cheetsheet at [../README.md](../README.md) before reading the following.
|
Here is the cheetsheet related to my DoomEmacs configs. Please read vim's common cheetsheet at
|
||||||
|
[../README.md](../README.md) before reading the following.
|
||||||
|
|
||||||
### Basics
|
### Basics
|
||||||
|
|
||||||
@@ -98,7 +102,8 @@ Here is the cheetsheet related to my DoomEmacs configs. Please read vim's common
|
|||||||
### File Tree
|
### File Tree
|
||||||
|
|
||||||
- treemacs: <https://github.com/Alexander-Miller/treemacs/blob/master/src/elisp/treemacs-mode.el>
|
- treemacs: <https://github.com/Alexander-Miller/treemacs/blob/master/src/elisp/treemacs-mode.el>
|
||||||
- treemacs-evil: <https://github.com/Alexander-Miller/treemacs/blob/master/src/extra/treemacs-evil.el>
|
- treemacs-evil:
|
||||||
|
<https://github.com/Alexander-Miller/treemacs/blob/master/src/extra/treemacs-evil.el>
|
||||||
|
|
||||||
| Action | Shortcut |
|
| Action | Shortcut |
|
||||||
| ------------------------------------- | --------- |
|
| ------------------------------------- | --------- |
|
||||||
@@ -199,8 +204,9 @@ Magit is a powerful tool that make git operations easy and intuitive.
|
|||||||
|
|
||||||
Shortcuts in magit's pane:
|
Shortcuts in magit's pane:
|
||||||
|
|
||||||
> When run `git commit` / `git add` / `git push` /... via magit, multiple Arguments can be set.
|
> When run `git commit` / `git add` / `git push` /... via magit, multiple Arguments can be set. Set
|
||||||
> Set arguments won't trigger a git command immediately. Magit will try to run a git command only after an Action key is pressed.
|
> arguments won't trigger a git command immediately. Magit will try to run a git command only after
|
||||||
|
> an Action key is pressed.
|
||||||
|
|
||||||
| Action | Shortcut |
|
| Action | Shortcut |
|
||||||
| -------------------------------------------------- | --------------------------------------------- |
|
| -------------------------------------------------- | --------------------------------------------- |
|
||||||
@@ -220,4 +226,5 @@ Shortcuts in magit's pane:
|
|||||||
| Fold/Unfold | `TAB` |
|
| Fold/Unfold | `TAB` |
|
||||||
| Show details of the current unit(commit/stage/...) | `<ENTER>` |
|
| Show details of the current unit(commit/stage/...) | `<ENTER>` |
|
||||||
|
|
||||||
KeyBinding full list: <https://github.com/emacs-evil/evil-collection/tree/master/modes/magit#key-bindings>
|
KeyBinding full list:
|
||||||
|
<https://github.com/emacs-evil/evil-collection/tree/master/modes/magit#key-bindings>
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
# Helix Editor
|
# Helix Editor
|
||||||
|
|
||||||
Neovim is really powerful, and have a very active community. I use it as my main editor, and I'm very happy with it. I use it for everything, from writing code to writing this document.
|
Neovim is really powerful, and have a very active community. I use it as my main editor, and I'm
|
||||||
|
very happy with it. I use it for everything, from writing code to writing this document.
|
||||||
|
|
||||||
But its configuration is a bit complex, and finding the right plugins, writing configurations, and keeping everything up to date is not easy.
|
But its configuration is a bit complex, and finding the right plugins, writing configurations, and
|
||||||
|
keeping everything up to date is not easy.
|
||||||
|
|
||||||
That's why I'm interested in Helix, Helix is similar to Neovim, but it's more opinionated, and it's batteries included.
|
That's why I'm interested in Helix, Helix is similar to Neovim, but it's more opinionated, and it's
|
||||||
Whether I'll switch my main editor to Helix or not, it gives me a lot of ideas on how to improve my Neovim workflow.
|
batteries included. Whether I'll switch my main editor to Helix or not, it gives me a lot of ideas
|
||||||
|
on how to improve my Neovim workflow.
|
||||||
|
|
||||||
## Tutorial
|
## Tutorial
|
||||||
|
|
||||||
@@ -14,30 +17,48 @@ Use `:tutor` in helix to start the tutorial.
|
|||||||
## Differences between Neovim and Helixer
|
## Differences between Neovim and Helixer
|
||||||
|
|
||||||
1. Selecting first, then action.
|
1. Selecting first, then action.
|
||||||
1. Helix: delete 2 word: `2w` then `x`. You can always see what you're selecting before you apply the action.
|
1. Helix: delete 2 word: `2w` then `x`. You can always see what you're selecting before you apply
|
||||||
2. Neovim: delete 2 word: `d`. then `2w`. No visual feedback before you apply the action.
|
the action.
|
||||||
1. Helix - Morden builtin features: LSP, tree-sitter, fuzzy finder, multi cursors, surround and more.
|
2. Neovim: delete 2 word: `d`. then `2w`. No visual feedback before you apply the action.
|
||||||
1. They're all available in Neovim too, but you need to find and use the right plugins manually, which takes time and effort.
|
1. Helix - Morden builtin features: LSP, tree-sitter, fuzzy finder, multi cursors, surround and
|
||||||
1. Helix is built in Rust from scratch. The result is a much smaller codebase and a modern set of defaults. No VimScript. No Lua.
|
more.
|
||||||
1. Neovim contains a lot of VimScript, and lua is too dynamic, it's hard to debug.
|
1. They're all available in Neovim too, but you need to find and use the right plugins manually,
|
||||||
1. Personally I'm glad to take a look at a Rust codebase, but not a VimScript/Lua codebase.
|
which takes time and effort.
|
||||||
1. Neovim have a very activate plugin ecosystem, and it's easy to find plugins for almost everything.
|
1. Helix is built in Rust from scratch. The result is a much smaller codebase and a modern set of
|
||||||
1. Helix is still new, and it even do have a stable plugin system yet. A PR to add a plugin system is still envolving: <https://github.com/helix-editor/helix/pull/8675>
|
defaults. No VimScript. No Lua.
|
||||||
2. Neovim has intergrated terminal, and it's very powerful. It's quite similar to VSCode's intergrated terminal. I use it a lot.
|
1. Neovim contains a lot of VimScript, and lua is too dynamic, it's hard to debug.
|
||||||
1. Helix doesn't have a intergrated terminal yet, as it's complicated to implement. Users are recommended to use tmux/Zellij or Wezterm/Kitty to implement this feature instead.
|
1. Personally I'm glad to take a look at a Rust codebase, but not a VimScript/Lua codebase.
|
||||||
1. <https://github.com/helix-editor/helix/issues/1976#issuecomment-1091074719>
|
1. Neovim have a very activate plugin ecosystem, and it's easy to find plugins for almost
|
||||||
1. <https://github.com/helix-editor/helix/pull/4649>
|
everything.
|
||||||
1. **My Neovim often gets stuck when I switch to [toggleterm.nvim](https://github.com/akinsho/toggleterm.nvim), this Helix issue made me consider to switch from this Neovim plugin to Zellij**.
|
1. Helix is still new, and it even do have a stable plugin system yet. A PR to add a plugin
|
||||||
1. Helix do not have a tree-view panel, it's recommended to use Yazi/ranger/Broot instead, and open Helix in them.
|
system is still envolving: <https://github.com/helix-editor/helix/pull/8675>
|
||||||
1. a tree-view plugin may be added after the plugin system is stable, but no one knows when it will be.
|
1. Neovim has integrated terminal, and it's very powerful. It's quite similar to VSCode's integrated
|
||||||
2. and some Helix users stated that they don't need a tree-view plugin, Helix's file picker is useful and good enough.
|
terminal. I use it a lot.
|
||||||
1. It seems Helix lacks a global substitution command, you should run it in another window(via wm or Zellij).
|
1. Helix doesn't have a integrated terminal yet, as it's complicated to implement. Users are
|
||||||
1. <https://github.com/helix-editor/helix/issues/196>
|
recommended to use tmux/Zellij or Wezterm/Kitty to implement this feature instead.
|
||||||
1. Neovim's substitution command allow you to preview the changes before you apply it, and it's very useful. if I switch to Helix, I'll need to find some other tools with similar feature(such as https://github.com/ms-jpq/sad).
|
1. <https://github.com/helix-editor/helix/issues/1976#issuecomment-1091074719>
|
||||||
1. Complexity and Maintenance Costs vs Batteries Included: <https://github.com/helix-editor/helix/discussions/6356>
|
1. <https://github.com/helix-editor/helix/pull/4649>
|
||||||
|
1. **My Neovim often gets stuck when I switch to
|
||||||
|
[toggleterm.nvim](https://github.com/akinsho/toggleterm.nvim), this Helix issue made me
|
||||||
|
consider to switch from this Neovim plugin to Zellij**.
|
||||||
|
1. Helix do not have a tree-view panel, it's recommended to use Yazi/ranger/Broot instead, and open
|
||||||
|
Helix in them.
|
||||||
|
1. a tree-view plugin may be added after the plugin system is stable, but no one knows when it
|
||||||
|
will be.
|
||||||
|
2. and some Helix users stated that they don't need a tree-view plugin, Helix's file picker is
|
||||||
|
useful and good enough.
|
||||||
|
1. It seems Helix lacks a global substitution command, you should run it in another window(via wm or
|
||||||
|
Zellij).
|
||||||
|
1. <https://github.com/helix-editor/helix/issues/196>
|
||||||
|
1. Neovim's substitution command allow you to preview the changes before you apply it, and it's
|
||||||
|
very useful. if I switch to Helix, I'll need to find some other tools with similar
|
||||||
|
feature(such as https://github.com/ms-jpq/sad).
|
||||||
|
1. Complexity and Maintenance Costs vs Batteries Included:
|
||||||
|
<https://github.com/helix-editor/helix/discussions/6356>
|
||||||
|
|
||||||
|
I think Use Helix/Neovim within a terminal file manager(Yazi/ranger/Broot) and Zellij is a good
|
||||||
|
idea. It's quite different from the workflow I migrated from VSCode/JetBrains before, I'm very
|
||||||
|
interested in it.
|
||||||
|
|
||||||
I think Use Helix/Neovim within a terminal file manager(Yazi/ranger/Broot) and Zellij is a good idea.
|
In Neovim I can make the workflow similar to VSCode/JetBrains by using some plugins, but Helix
|
||||||
It's quite different from the workflow I migrated from VSCode/JetBrains before, I'm very interested in it.
|
forces me to get out of my comfort zone, and try something new.
|
||||||
|
|
||||||
In Neovim I can make the workflow similar to VSCode/JetBrains by using some plugins, but Helix forces me to get out of my comfort zone, and try something new.
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
# Neovim Editor
|
# Neovim Editor
|
||||||
|
|
||||||
My Neovim config based on [AstroNvim](https://github.com/AstroNvim/AstroNvim).
|
My Neovim config based on [AstroNvim](https://github.com/AstroNvim/AstroNvim). For more details,
|
||||||
For more details, visit the [AstroNvim website](https://astronvim.com/).
|
visit the [AstroNvim website](https://astronvim.com/).
|
||||||
|
|
||||||
This document outlines neovim's configuration structure and various shortcuts/commands for efficient usage.
|
This document outlines neovim's configuration structure and various shortcuts/commands for efficient
|
||||||
|
usage.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||

|
 
|
||||||

|
|
||||||
|
|
||||||
## Configuration Structure
|
## Configuration Structure
|
||||||
|
|
||||||
@@ -47,7 +47,8 @@ just nvim-clear
|
|||||||
|
|
||||||
## Cheetsheet
|
## Cheetsheet
|
||||||
|
|
||||||
Here is the cheetsheet related to my Neovim configs. Please read vim's common cheetsheet at [../README.md](../README.md) before reading the following.
|
Here is the cheetsheet related to my Neovim configs. Please read vim's common cheetsheet at
|
||||||
|
[../README.md](../README.md) before reading the following.
|
||||||
|
|
||||||
### Incremental Selection
|
### Incremental Selection
|
||||||
|
|
||||||
@@ -62,15 +63,16 @@ Provided by nvim-treesitter.
|
|||||||
|
|
||||||
### Search and Jump
|
### Search and Jump
|
||||||
|
|
||||||
Provided by [flash.nvim](https://github.com/folke/flash.nvim), it's a intelligent search and jump plugin.
|
Provided by [flash.nvim](https://github.com/folke/flash.nvim), it's a intelligent search and jump
|
||||||
|
plugin.
|
||||||
|
|
||||||
1. It enhaces the default search and jump behavior of neovim.(search with prefix `/`)
|
1. It enhances the default search and jump behavior of neovim.(search with prefix `/`)
|
||||||
|
|
||||||
| Action | Shortcut |
|
| Action | Shortcut |
|
||||||
| ----------------- | ------------------------------------------------------------------------------------------------------------- |
|
| ----------------- | ------------------------------------------------------------------------------------------------------------ |
|
||||||
| Search | `/`(normal search), `s`(disable all code highlight, only highlight matches) |
|
| Search | `/`(normal search), `s`(disable all code highlight, only highlight matches) |
|
||||||
| Treesitter Search | `yR`,`dR`, `cR`, `vR`, `ctrl+v+R`(arround your matches, all the surrounding Treesitter nodes will be labeled) |
|
| Treesitter Search | `yR`,`dR`, `cR`, `vR`, `ctrl+v+R`(around your matches, all the surrounding Treesitter nodes will be labeled) |
|
||||||
| Remote Flash | `yr`, `dr`, `cr`, (arround your matches, all the surrounding Treesitter nodes will be labeled) |
|
| Remote Flash | `yr`, `dr`, `cr`, (around your matches, all the surrounding Treesitter nodes will be labeled) |
|
||||||
|
|
||||||
### Commands & Shortcuts
|
### Commands & Shortcuts
|
||||||
|
|
||||||
@@ -92,12 +94,8 @@ Provided by [flash.nvim](https://github.com/folke/flash.nvim), it's a intelligen
|
|||||||
|
|
||||||
### Splitting and Buffers
|
### Splitting and Buffers
|
||||||
|
|
||||||
|
|
| | Action | Shortcut | | --------------------- | ------------- | | Horizontal Split | `\` | |
|
||||||
| Action | Shortcut |
|
Vertical Split | `\|` | | Close Buffer | `<Space> + c` |
|
||||||
| --------------------- | ------------- |
|
|
||||||
| Horizontal Split | `\` |
|
|
||||||
| Vertical Split | `\|` |
|
|
||||||
| Close Buffer | `<Space> + c` |
|
|
||||||
|
|
||||||
### Editing and Formatting
|
### Editing and Formatting
|
||||||
|
|
||||||
@@ -129,9 +127,9 @@ Press `<Space> + D` to view available bindings and options.
|
|||||||
|
|
||||||
### Search and Replace Globally
|
### Search and Replace Globally
|
||||||
|
|
||||||
| Description | Shortcut |
|
| Description | Shortcut |
|
||||||
| ------------------------------------------------------------ | ---------------------------------------------------------------- |
|
| ------------------------------------------ | -------------- |
|
||||||
| Open spectre.nvim search and replace panel | `<Space> + ss` |
|
| Open spectre.nvim search and replace panel | `<Space> + ss` |
|
||||||
|
|
||||||
Search and replace via cli(fd + sad + delta):
|
Search and replace via cli(fd + sad + delta):
|
||||||
|
|
||||||
@@ -139,7 +137,6 @@ Search and replace via cli(fd + sad + delta):
|
|||||||
fd "\\.nix$" . | sad '<pattern>' '<replacement>' | delta
|
fd "\\.nix$" . | sad '<pattern>' '<replacement>' | delta
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Surrounding Characters
|
### Surrounding Characters
|
||||||
|
|
||||||
Provided by mini.surround plugin.
|
Provided by mini.surround plugin.
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
.clj-kondo/
|
|
||||||
.nrepl-port
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{:source-file-patterns ["*.fnl" "**/*.fnl"]}
|
|
||||||
@@ -1,579 +0,0 @@
|
|||||||
return {
|
|
||||||
colorscheme = "catppuccin",
|
|
||||||
|
|
||||||
options = {
|
|
||||||
opt = {
|
|
||||||
relativenumber = true, -- Show relative numberline
|
|
||||||
signcolumn = "auto", -- Show sign column when used only
|
|
||||||
spell = false, -- Spell checking
|
|
||||||
swapfile = false, -- Swapfile
|
|
||||||
smartindent = false, -- fix https://github.com/ryan4yin/nix-config/issues/4
|
|
||||||
title = true, -- Set the title of window to `filename [+=-] (path) - NVIM`
|
|
||||||
-- The percentage of 'columns' to use for the title
|
|
||||||
-- When the title is longer, only the end of the path name is shown.
|
|
||||||
titlelen = 20,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
plugins = {
|
|
||||||
"AstroNvim/astrocommunity",
|
|
||||||
-- Motion
|
|
||||||
{ import = "astrocommunity.motion.mini-surround" },
|
|
||||||
-- https://github.com/echasnovski/mini.ai
|
|
||||||
{ import = "astrocommunity.motion.mini-ai" },
|
|
||||||
{ import = "astrocommunity.motion.flash-nvim" },
|
|
||||||
-- diable toggleterm.nvim, zellij's terminal is far better than neovim's one
|
|
||||||
{ "akinsho/toggleterm.nvim", enabled = false },
|
|
||||||
{ "folke/flash.nvim", vscode = false },
|
|
||||||
-- Highly experimental plugin that completely replaces
|
|
||||||
-- the UI for messages, cmdline and the popupmenu.
|
|
||||||
-- { import = "astrocommunity.utility.noice-nvim" },
|
|
||||||
-- Fully featured & enhanced replacement for copilot.vim
|
|
||||||
-- <Tab> work with both auto completion in cmp and copilot
|
|
||||||
{ import = "astrocommunity.media.vim-wakatime" },
|
|
||||||
{ import = "astrocommunity.motion.leap-nvim" },
|
|
||||||
{ import = "astrocommunity.motion.flit-nvim" },
|
|
||||||
{ import = "astrocommunity.scrolling.nvim-scrollbar" },
|
|
||||||
{ import = "astrocommunity.editing-support.todo-comments-nvim" },
|
|
||||||
-- Language Support
|
|
||||||
---- Frontend & NodeJS
|
|
||||||
{ import = "astrocommunity.pack.typescript-all-in-one" },
|
|
||||||
{ import = "astrocommunity.pack.tailwindcss" },
|
|
||||||
{ import = "astrocommunity.pack.html-css" },
|
|
||||||
{ import = "astrocommunity.pack.prisma" },
|
|
||||||
{ import = "astrocommunity.pack.vue" },
|
|
||||||
---- Configuration Language
|
|
||||||
{ import = "astrocommunity.pack.markdown" },
|
|
||||||
{ import = "astrocommunity.pack.json" },
|
|
||||||
{ import = "astrocommunity.pack.yaml" },
|
|
||||||
{ import = "astrocommunity.pack.toml" },
|
|
||||||
---- Backend / System
|
|
||||||
{ import = "astrocommunity.pack.lua" },
|
|
||||||
{ import = "astrocommunity.pack.go" },
|
|
||||||
{ import = "astrocommunity.pack.rust" },
|
|
||||||
{ import = "astrocommunity.pack.python" },
|
|
||||||
{ import = "astrocommunity.pack.java" },
|
|
||||||
{ import = "astrocommunity.pack.cmake" },
|
|
||||||
{ import = "astrocommunity.pack.cpp" },
|
|
||||||
-- { import = "astrocommunity.pack.nix" }, -- manually add config for nix, comment this one.
|
|
||||||
{ import = "astrocommunity.pack.proto" },
|
|
||||||
|
|
||||||
---- Operation & Cloud Native
|
|
||||||
{ import = "astrocommunity.pack.terraform" },
|
|
||||||
{ import = "astrocommunity.pack.bash" },
|
|
||||||
{ import = "astrocommunity.pack.docker" },
|
|
||||||
{ import = "astrocommunity.pack.helm" },
|
|
||||||
|
|
||||||
-- colorscheme
|
|
||||||
{ import = "astrocommunity.colorscheme.catppuccin" },
|
|
||||||
{
|
|
||||||
"catppuccin/nvim",
|
|
||||||
name = "catppuccin",
|
|
||||||
opts = function(_, opts)
|
|
||||||
opts.flavour = "mocha" -- latte, frappe, macchiato, mocha
|
|
||||||
opts.transparent_background = true -- setting the background color.
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
-- Language Parser for syntax highlighting / indentation / folding / Incremental selection
|
|
||||||
{
|
|
||||||
"nvim-treesitter/nvim-treesitter",
|
|
||||||
opts = function(_, opts)
|
|
||||||
local utils = require("astronvim.utils")
|
|
||||||
opts.incremental_selection = {
|
|
||||||
enable = true,
|
|
||||||
keymaps = {
|
|
||||||
init_selection = "<C-space>", -- Ctrl + Space
|
|
||||||
node_incremental = "<C-space>",
|
|
||||||
scope_incremental = "<A-space>", -- Alt + Space
|
|
||||||
node_decremental = "<bs>", -- Backspace
|
|
||||||
},
|
|
||||||
}
|
|
||||||
opts.ignore_install = { "gotmpl" }
|
|
||||||
opts.ensure_installed = utils.list_insert_unique(opts.ensure_installed, {
|
|
||||||
-- neovim
|
|
||||||
"vim",
|
|
||||||
"lua",
|
|
||||||
-- operation & cloud native
|
|
||||||
"dockerfile",
|
|
||||||
"hcl",
|
|
||||||
"jsonnet",
|
|
||||||
"regex",
|
|
||||||
"terraform",
|
|
||||||
"nix",
|
|
||||||
"csv",
|
|
||||||
-- other programming language
|
|
||||||
"diff",
|
|
||||||
"gitignore",
|
|
||||||
"gitcommit",
|
|
||||||
"latex",
|
|
||||||
"sql",
|
|
||||||
-- Lisp like
|
|
||||||
"fennel",
|
|
||||||
"clojure",
|
|
||||||
"commonlisp",
|
|
||||||
-- customized languages:
|
|
||||||
"scheme",
|
|
||||||
})
|
|
||||||
|
|
||||||
-- add support for scheme
|
|
||||||
local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
|
|
||||||
parser_config.scheme = {
|
|
||||||
install_info = {
|
|
||||||
url = "https://github.com/6cdh/tree-sitter-scheme", -- local path or git repo
|
|
||||||
files = { "src/parser.c" },
|
|
||||||
-- optional entries:
|
|
||||||
branch = "main", -- default branch in case of git repo if different from master
|
|
||||||
generate_requires_npm = false, -- if stand-alone parser without npm dependencies
|
|
||||||
requires_generate_from_grammar = false, -- if folder contains pre-generated src/parser.c
|
|
||||||
},
|
|
||||||
}
|
|
||||||
-- use scheme parser for filetypes: scm
|
|
||||||
vim.treesitter.language.register("scheme", "scm")
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"eraserhd/parinfer-rust",
|
|
||||||
build = "cargo build --release",
|
|
||||||
ft = { "scm", "scheme" },
|
|
||||||
},
|
|
||||||
{ "Olical/nfnl", ft = "fennel" },
|
|
||||||
{
|
|
||||||
"Olical/conjure",
|
|
||||||
ft = { "clojure", "fennel", "python", "scheme" }, -- etc
|
|
||||||
-- [Optional] cmp-conjure for cmp
|
|
||||||
dependencies = {
|
|
||||||
{
|
|
||||||
"PaterJason/cmp-conjure",
|
|
||||||
config = function()
|
|
||||||
local cmp = require("cmp")
|
|
||||||
local config = cmp.get_config()
|
|
||||||
table.insert(config.sources, {
|
|
||||||
name = "buffer",
|
|
||||||
option = {
|
|
||||||
sources = {
|
|
||||||
{ name = "conjure" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
cmp.setup(config)
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
config = function(_, opts)
|
|
||||||
require("conjure.main").main()
|
|
||||||
require("conjure.mapping")["on-filetype"]()
|
|
||||||
end,
|
|
||||||
init = function()
|
|
||||||
-- Set configuration options here
|
|
||||||
vim.g["conjure#debug"] = true
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nvim-orgmode/orgmode",
|
|
||||||
dependencies = {
|
|
||||||
{ "nvim-treesitter/nvim-treesitter", lazy = true },
|
|
||||||
},
|
|
||||||
event = "VeryLazy",
|
|
||||||
config = function()
|
|
||||||
-- Load treesitter grammar for org
|
|
||||||
require("orgmode").setup_ts_grammar()
|
|
||||||
|
|
||||||
-- Setup treesitter
|
|
||||||
require("nvim-treesitter.configs").setup({
|
|
||||||
highlight = {
|
|
||||||
enable = true,
|
|
||||||
additional_vim_regex_highlighting = { "org" },
|
|
||||||
},
|
|
||||||
ensure_installed = { "org" },
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Setup orgmode
|
|
||||||
require("orgmode").setup({
|
|
||||||
org_agenda_files = "~/org/**/*",
|
|
||||||
org_default_notes_file = "~/org/refile.org",
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Lua implementation of CamelCaseMotion, with extra consideration of punctuation.
|
|
||||||
{ import = "astrocommunity.motion.nvim-spider" },
|
|
||||||
-- AI Assistant
|
|
||||||
{ import = "astrocommunity.completion.copilot-lua-cmp" },
|
|
||||||
-- Custom copilot-lua to enable filtypes: markdown
|
|
||||||
{
|
|
||||||
"zbirenbaum/copilot.lua",
|
|
||||||
opts = function(_, opts)
|
|
||||||
opts.filetypes = {
|
|
||||||
yaml = true,
|
|
||||||
markdown = true,
|
|
||||||
}
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"0x00-ketsu/autosave.nvim",
|
|
||||||
-- lazy-loading on events
|
|
||||||
event = { "InsertLeave", "TextChanged" },
|
|
||||||
opts = function(_, opts)
|
|
||||||
opts.prompt_style = "stdout" -- notify or stdout
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- markdown preview
|
|
||||||
{
|
|
||||||
"0x00-ketsu/markdown-preview.nvim",
|
|
||||||
ft = { "md", "markdown", "mkd", "mkdn", "mdwn", "mdown", "mdtxt", "mdtext", "rmd", "wiki" },
|
|
||||||
config = function()
|
|
||||||
require("markdown-preview").setup({
|
|
||||||
-- your configuration comes here
|
|
||||||
-- or leave it empty to use the default settings
|
|
||||||
-- refer to the setup section below
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- clipboard manager
|
|
||||||
{
|
|
||||||
"gbprod/yanky.nvim",
|
|
||||||
opts = function()
|
|
||||||
local mapping = require("yanky.telescope.mapping")
|
|
||||||
local mappings = mapping.get_defaults()
|
|
||||||
mappings.i["<c-p>"] = nil
|
|
||||||
return {
|
|
||||||
highlight = { timer = 200 },
|
|
||||||
picker = {
|
|
||||||
telescope = {
|
|
||||||
use_default_mappings = false,
|
|
||||||
mappings = mappings,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
end,
|
|
||||||
keys = {
|
|
||||||
{
|
|
||||||
"y",
|
|
||||||
"<Plug>(YankyYank)",
|
|
||||||
mode = { "n", "x" },
|
|
||||||
desc = "Yank text",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"p",
|
|
||||||
"<Plug>(YankyPutAfter)",
|
|
||||||
mode = { "n", "x" },
|
|
||||||
desc = "Put yanked text after cursor",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"P",
|
|
||||||
"<Plug>(YankyPutBefore)",
|
|
||||||
mode = { "n", "x" },
|
|
||||||
desc = "Put yanked text before cursor",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"gp",
|
|
||||||
"<Plug>(YankyGPutAfter)",
|
|
||||||
mode = { "n", "x" },
|
|
||||||
desc = "Put yanked text after selection",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"gP",
|
|
||||||
"<Plug>(YankyGPutBefore)",
|
|
||||||
mode = { "n", "x" },
|
|
||||||
desc = "Put yanked text before selection",
|
|
||||||
},
|
|
||||||
{ "[y", "<Plug>(YankyCycleForward)", desc = "Cycle forward through yank history" },
|
|
||||||
{ "]y", "<Plug>(YankyCycleBackward)", desc = "Cycle backward through yank history" },
|
|
||||||
{ "]p", "<Plug>(YankyPutIndentAfterLinewise)", desc = "Put indented after cursor (linewise)" },
|
|
||||||
{ "[p", "<Plug>(YankyPutIndentBeforeLinewise)", desc = "Put indented before cursor (linewise)" },
|
|
||||||
{ "]P", "<Plug>(YankyPutIndentAfterLinewise)", desc = "Put indented after cursor (linewise)" },
|
|
||||||
{ "[P", "<Plug>(YankyPutIndentBeforeLinewise)", desc = "Put indented before cursor (linewise)" },
|
|
||||||
{ ">p", "<Plug>(YankyPutIndentAfterShiftRight)", desc = "Put and indent right" },
|
|
||||||
{ "<p", "<Plug>(YankyPutIndentAfterShiftLeft)", desc = "Put and indent left" },
|
|
||||||
{ ">P", "<Plug>(YankyPutIndentBeforeShiftRight)", desc = "Put before and indent right" },
|
|
||||||
{ "<P", "<Plug>(YankyPutIndentBeforeShiftLeft)", desc = "Put before and indent left" },
|
|
||||||
{ "=p", "<Plug>(YankyPutAfterFilter)", desc = "Put after applying a filter" },
|
|
||||||
{ "=P", "<Plug>(YankyPutBeforeFilter)", desc = "Put before applying a filter" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Enhanced matchparen.vim plugin for Neovim to highlight the outer pair.
|
|
||||||
{
|
|
||||||
"utilyre/sentiment.nvim",
|
|
||||||
version = "*",
|
|
||||||
event = "VeryLazy", -- keep for lazy loading
|
|
||||||
opts = {
|
|
||||||
-- config
|
|
||||||
},
|
|
||||||
init = function()
|
|
||||||
-- `matchparen.vim` needs to be disabled manually in case of lazy loading
|
|
||||||
vim.g.loaded_matchparen = 1
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- joining blocks of code into oneline, or splitting one line into multiple lines.
|
|
||||||
{
|
|
||||||
"Wansmer/treesj",
|
|
||||||
keys = { "<space>m", "<space>j", "<space>s" },
|
|
||||||
dependencies = { "nvim-treesitter/nvim-treesitter" },
|
|
||||||
config = function()
|
|
||||||
require("treesj").setup({ --[[ your config ]]
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- File explorer(Custom configs)
|
|
||||||
{
|
|
||||||
"nvim-neo-tree/neo-tree.nvim",
|
|
||||||
opts = {
|
|
||||||
filesystem = {
|
|
||||||
filtered_items = {
|
|
||||||
visible = true, -- visible by default
|
|
||||||
hide_dotfiles = false,
|
|
||||||
hide_gitignored = false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
-- The plugin offers the alibity to refactor code.
|
|
||||||
{
|
|
||||||
"ThePrimeagen/refactoring.nvim",
|
|
||||||
dependencies = {
|
|
||||||
{ "nvim-lua/plenary.nvim" },
|
|
||||||
{ "nvim-treesitter/nvim-treesitter" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
-- The plugin offers the abilibty to search and replace.
|
|
||||||
{
|
|
||||||
"nvim-pack/nvim-spectre",
|
|
||||||
dependencies = {
|
|
||||||
{ "nvim-lua/plenary.nvim" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
-- full signature help, docs and completion for the nvim lua API.
|
|
||||||
{ "folke/neodev.nvim", opts = {} },
|
|
||||||
-- automatically highlighting other uses of the word under the cursor using either LSP, Tree-sitter, or regex matching.
|
|
||||||
{ "RRethy/vim-illuminate", config = function() end },
|
|
||||||
-- implementation/definition preview
|
|
||||||
{
|
|
||||||
"rmagatti/goto-preview",
|
|
||||||
config = function()
|
|
||||||
require("goto-preview").setup({})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Undo tree
|
|
||||||
{ "debugloop/telescope-undo.nvim" },
|
|
||||||
|
|
||||||
-- Install lsp, formmatter and others via home manager instead of Mason.nvim
|
|
||||||
-- LSP installations
|
|
||||||
{
|
|
||||||
"williamboman/mason-lspconfig.nvim",
|
|
||||||
-- mason is unusable on NixOS, disable it.
|
|
||||||
-- ensure_installed nothing
|
|
||||||
opts = function(_, opts)
|
|
||||||
opts.ensure_installed = nil
|
|
||||||
opts.automatic_installation = false
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
-- Formatters/Linter installation
|
|
||||||
{
|
|
||||||
"jay-babu/mason-null-ls.nvim",
|
|
||||||
-- mason is unusable on NixOS, disable it.
|
|
||||||
-- ensure_installed nothing
|
|
||||||
opts = function(_, opts)
|
|
||||||
opts.ensure_installed = nil
|
|
||||||
opts.automatic_installation = false
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
-- Debugger installation
|
|
||||||
{
|
|
||||||
"jay-babu/mason-nvim-dap.nvim",
|
|
||||||
-- mason is unusable on NixOS, disable it.
|
|
||||||
-- ensure_installed nothing
|
|
||||||
opts = function(_, opts)
|
|
||||||
opts.ensure_installed = nil
|
|
||||||
opts.automatic_installation = false
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"jose-elias-alvarez/null-ls.nvim",
|
|
||||||
opts = function(_, opts)
|
|
||||||
local null_ls = require("null-ls")
|
|
||||||
local code_actions = null_ls.builtins.code_actions
|
|
||||||
local diagnostics = null_ls.builtins.diagnostics
|
|
||||||
local formatting = null_ls.builtins.formatting
|
|
||||||
local hover = null_ls.builtins.hover
|
|
||||||
local completion = null_ls.builtins.completion
|
|
||||||
-- https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md
|
|
||||||
if type(opts.sources) == "table" then
|
|
||||||
vim.list_extend(opts.sources, {
|
|
||||||
-- Common Code Actions
|
|
||||||
code_actions.gitsigns,
|
|
||||||
-- common refactoring actions based off the Refactoring book by Martin Fowler
|
|
||||||
code_actions.refactoring,
|
|
||||||
code_actions.gomodifytags, -- Go - modify struct field tags
|
|
||||||
code_actions.impl, -- Go - generate interface method stubs
|
|
||||||
code_actions.shellcheck,
|
|
||||||
code_actions.proselint, -- English prose linter
|
|
||||||
code_actions.statix, -- Lints and suggestions for Nix.
|
|
||||||
|
|
||||||
-- Diagnostic
|
|
||||||
diagnostics.actionlint, -- GitHub Actions workflow syntax checking
|
|
||||||
diagnostics.buf, -- check text in current buffer
|
|
||||||
diagnostics.checkmake, -- check Makefiles
|
|
||||||
diagnostics.deadnix, -- Scan Nix files for dead code.
|
|
||||||
|
|
||||||
-- Formatting
|
|
||||||
formatting.prettier, -- js/ts/vue/css/html/json/... formatter
|
|
||||||
diagnostics.hadolint, -- Dockerfile linter
|
|
||||||
formatting.black, -- Python formatter
|
|
||||||
formatting.ruff, -- extremely fast Python linter
|
|
||||||
formatting.goimports, -- Go formatter
|
|
||||||
formatting.shfmt, -- Shell formatter
|
|
||||||
formatting.rustfmt, -- Rust formatter
|
|
||||||
formatting.taplo, -- TOML formatteautoindentr
|
|
||||||
formatting.terraform_fmt, -- Terraform formatter
|
|
||||||
formatting.stylua, -- Lua formatter
|
|
||||||
formatting.alejandra, -- Nix formatter
|
|
||||||
formatting.sqlfluff.with({ -- SQL formatter
|
|
||||||
extra_args = { "--dialect", "postgres" }, -- change to your dialect
|
|
||||||
}),
|
|
||||||
formatting.nginx_beautifier, -- Nginx formatter
|
|
||||||
formatting.verible_verilog_format, -- Verilog formatter
|
|
||||||
formatting.emacs_scheme_mode, -- using emacs in batch mode to format scheme files.
|
|
||||||
formatting.fnlfmt, -- Format Fennel code
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"nvim-telescope/telescope.nvim",
|
|
||||||
branch = "0.1.x",
|
|
||||||
dependencies = { "nvim-lua/plenary.nvim" },
|
|
||||||
init = function()
|
|
||||||
-- 1. Disable highlighting for certain filetypes
|
|
||||||
-- 2. Ignore files larger than a certain filesize
|
|
||||||
local previewers = require("telescope.previewers")
|
|
||||||
|
|
||||||
local _bad = { ".*%.csv", ".*%.min.js" } -- Put all filetypes that slow you down in this array
|
|
||||||
local filesize_threshold = 300 * 1024 -- 300KB
|
|
||||||
local bad_files = function(filepath)
|
|
||||||
for _, v in ipairs(_bad) do
|
|
||||||
if filepath:match(v) then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
local new_maker = function(filepath, bufnr, opts)
|
|
||||||
opts = opts or {}
|
|
||||||
if opts.use_ft_detect == nil then
|
|
||||||
opts.use_ft_detect = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- 1. Check if the file is in the bad_files array, and if so, don't highlight it
|
|
||||||
opts.use_ft_detect = opts.use_ft_detect == false and false or bad_files(filepath)
|
|
||||||
|
|
||||||
-- 2. Check the file size, and ignore it if it's too big(preview nothing).
|
|
||||||
filepath = vim.fn.expand(filepath)
|
|
||||||
vim.loop.fs_stat(filepath, function(_, stat)
|
|
||||||
if not stat then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if stat.size > filesize_threshold then
|
|
||||||
return
|
|
||||||
else
|
|
||||||
previewers.buffer_previewer_maker(filepath, bufnr, opts)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
require("telescope").setup({
|
|
||||||
defaults = {
|
|
||||||
buffer_previewer_maker = new_maker,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Configure require("lazy").setup() options
|
|
||||||
lazy = {
|
|
||||||
defaults = { lazy = true },
|
|
||||||
performance = {
|
|
||||||
rtp = {
|
|
||||||
-- customize default disabled vim plugins
|
|
||||||
disabled_plugins = {},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
-- https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
|
|
||||||
lsp = {
|
|
||||||
config = {
|
|
||||||
-- the offset_enconding of clangd will confilicts whit null-ls
|
|
||||||
-- so we need to manually set it to utf-8
|
|
||||||
clangd = {
|
|
||||||
capabilities = {
|
|
||||||
offsetEncoding = "utf-8",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
scheme_langserver = {
|
|
||||||
filetypes = { "scheme", "scm" },
|
|
||||||
single_file_support = true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
-- enable servers that installed by home-manager instead of mason
|
|
||||||
servers = {
|
|
||||||
---- Frontend & NodeJS
|
|
||||||
"tsserver", -- typescript/javascript language server
|
|
||||||
"tailwindcss", -- tailwindcss language server
|
|
||||||
"html", -- html language server
|
|
||||||
"cssls", -- css language server
|
|
||||||
"prismals", -- prisma language server
|
|
||||||
"volar", -- vue language server
|
|
||||||
---- Configuration Language
|
|
||||||
"marksman", -- markdown ls
|
|
||||||
"jsonls", -- json language server
|
|
||||||
"yamlls", -- yaml language server
|
|
||||||
"taplo", -- toml language server
|
|
||||||
---- Backend
|
|
||||||
"lua_ls", -- lua
|
|
||||||
"gopls", -- go
|
|
||||||
"rust_analyzer", -- rust
|
|
||||||
"pyright", -- python
|
|
||||||
"ruff_lsp", -- extremely fast Python linter and code transformation
|
|
||||||
"jdtls", -- java
|
|
||||||
"nil_ls", -- nix language server
|
|
||||||
"bufls", -- protocol buffer language server
|
|
||||||
"zls", -- zig language server
|
|
||||||
---- HDL
|
|
||||||
"verible", -- verilog language server
|
|
||||||
---- Operation & Cloud Nativautoindente
|
|
||||||
"bashls", -- bash
|
|
||||||
"cmake", -- cmake language server
|
|
||||||
"clangd", -- c/c++
|
|
||||||
"dockerls", -- dockerfile
|
|
||||||
"jsonnet_ls", -- jsonnet language server
|
|
||||||
"terraformls", -- terraform hcl
|
|
||||||
"nushell", -- nushell language server
|
|
||||||
"scheme_langserver", -- scheme language server
|
|
||||||
},
|
|
||||||
formatting = {
|
|
||||||
disabled = {},
|
|
||||||
format_on_save = {
|
|
||||||
enabled = true,
|
|
||||||
allow_filetypes = {
|
|
||||||
"go",
|
|
||||||
"jsonnet",
|
|
||||||
"rust",
|
|
||||||
"terraform",
|
|
||||||
"nu",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
-- Mapping data with "desc" stored directly by vim.keymap.set().
|
|
||||||
--
|
|
||||||
-- Please use this mappings table to set keyboard mapping since this is the
|
|
||||||
-- lower level configuration and more robust one. (which-key will
|
|
||||||
-- automatically pick-up stored data by this setting.)
|
|
||||||
local utils = require "astronvim.utils"
|
|
||||||
|
|
||||||
require("telescope").load_extension("refactoring")
|
|
||||||
require("telescope").load_extension("yank_history")
|
|
||||||
require("telescope").load_extension("undo")
|
|
||||||
|
|
||||||
return {
|
|
||||||
-- normal mode
|
|
||||||
n = {
|
|
||||||
-- second key is the lefthand side of the map
|
|
||||||
-- mappings seen under group name "Buffer"
|
|
||||||
["<leader>bn"] = { "<cmd>tabnew<cr>", desc = "New tab" },
|
|
||||||
-- quick save
|
|
||||||
["<C-s>"] = { ":w!<cr>", desc = "Save File" }, -- change description but the same command
|
|
||||||
|
|
||||||
-- Terminal
|
|
||||||
-- NOTE: https://neovim.io/doc/user/builtin.html#jobstart()
|
|
||||||
-- 1. If {cmd} is a List it runs directly (no 'shell')
|
|
||||||
-- 2. If {cmd} is a String it runs in the 'shell'
|
|
||||||
-- search and replace globally
|
|
||||||
['<leader>ss'] = {'<cmd>lua require("spectre").toggle()<CR>', desc = "Toggle Spectre" },
|
|
||||||
['<leader>sw'] = {'<cmd>lua require("spectre").open_visual({select_word=true})<CR>', desc = "Search current word" },
|
|
||||||
['<leader>sp'] ={'<cmd>lua require("spectre").open_file_search({select_word=true})<CR>', desc = "Search on current file" },
|
|
||||||
|
|
||||||
-- refactoring
|
|
||||||
["<leader>ri"] = { function() require('refactoring').refactor('Inline Variable') end, desc = "Inverse of extract variable" },
|
|
||||||
["<leader>rb"] = { function() require('refactoring').refactor('Extract Block') end, desc = "Extract Block" },
|
|
||||||
["<leader>rbf"] = { function() require('refactoring').refactor('Extract Block To File') end, desc = "Extract Block To File" },
|
|
||||||
["<leader>rr"] = { function() require('telescope').extensions.refactoring.refactors() end, desc = "Prompt for a refactor to apply" },
|
|
||||||
["<leader>rp"] = { function() require('refactoring').debug.printf({below = false}) end, desc = "Insert print statement to mark the calling of a function" },
|
|
||||||
["<leader>rv"] = { function() require('refactoring').debug.print_var() end, desc = "Insert print statement to print a variable" },
|
|
||||||
["<leader>rc"] = { function() require('refactoring').debug.cleanup({}) end, desc = "Cleanup of all generated print statements" },
|
|
||||||
|
|
||||||
-- yank_history
|
|
||||||
["<leader>yh"] = { function() require("telescope").extensions.yank_history.yank_history() end, desc = "Preview Yank History" },
|
|
||||||
|
|
||||||
-- undo history
|
|
||||||
["<leader>uh"] = {"<cmd>Telescope undo<cr>", desc="Telescope undo" },
|
|
||||||
|
|
||||||
-- implementation/definition preview
|
|
||||||
["gpd"] = { "<cmd>lua require('goto-preview').goto_preview_definition()<CR>", desc="goto_preview_definition" },
|
|
||||||
["gpt"] = { "<cmd>lua require('goto-preview').goto_preview_type_definition()<CR>", desc="goto_preview_type_definition" },
|
|
||||||
["gpi"] = { "<cmd>lua require('goto-preview').goto_preview_implementation()<CR>", desc="goto_preview_implementation" },
|
|
||||||
["gP" ] = { "<cmd>lua require('goto-preview').close_all_win()<CR>", desc="close_all_win" },
|
|
||||||
["gpr"] = { "<cmd>lua require('goto-preview').goto_preview_references()<CR>", desc="goto_preview_references" },
|
|
||||||
},
|
|
||||||
-- Visual mode
|
|
||||||
v = {
|
|
||||||
-- search and replace globally
|
|
||||||
['<leader>sw'] = {'<esc><cmd>lua require("spectre").open_visual()<CR>', desc = "Search current word" },
|
|
||||||
},
|
|
||||||
-- visual mode(what's the difference between v and x???)
|
|
||||||
x = {
|
|
||||||
-- refactoring
|
|
||||||
["<leader>ri"] = { function() require('refactoring').refactor('Inline Variable') end, desc = "Inverse of extract variable" },
|
|
||||||
["<leader>re"] = { function() require('refactoring').refactor('Extract Function') end, desc = "Extracts the selected code to a separate function" },
|
|
||||||
["<leader>rf"] = { function() require('refactoring').refactor('Extract Function To File') end, desc = "Extract Function To File" },
|
|
||||||
["<leader>rv"] = { function() require('refactoring').refactor('Extract Variable') end, desc = "Extracts occurrences of a selected expression to its own variable" },
|
|
||||||
["<leader>rr"] = { function() require('telescope').extensions.refactoring.refactors() end, desc = "Prompt for a refactor to apply" },
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
pkgs,
|
pkgs,
|
||||||
astronvim,
|
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -14,20 +15,9 @@ let
|
|||||||
vdiff = "nvim -d";
|
vdiff = "nvim -d";
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
xdg.configFile = {
|
home.activation.installAstroNvim = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||||
# astronvim's config
|
${pkgs.rsync}/bin/rsync -avz --chmod=D2755,F744 ${./nvim}/ ${config.xdg.configHome}/nvim/
|
||||||
"nvim" = {
|
'';
|
||||||
source = astronvim;
|
|
||||||
force = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# my custom astronvim config, astronvim will load it after base config
|
|
||||||
# https://github.com/AstroNvim/AstroNvim/blob/v3.32.0/lua/astronvim/bootstrap.lua#L15-L16
|
|
||||||
"astronvim/lua/user" = {
|
|
||||||
source = ./astronvim_user;
|
|
||||||
force = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
home.shellAliases = shellAliases;
|
home.shellAliases = shellAliases;
|
||||||
programs.nushell.shellAliases = shellAliases;
|
programs.nushell.shellAliases = shellAliases;
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"neodev": {
|
||||||
|
"library": {
|
||||||
|
"enabled": true,
|
||||||
|
"plugins": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"neoconf": {
|
||||||
|
"plugins": {
|
||||||
|
"lua_ls": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lspconfig": {
|
||||||
|
"lua_ls": {
|
||||||
|
"Lua.format.enable": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
-- This file simply bootstraps the installation of Lazy.nvim and then calls other files for execution
|
||||||
|
-- This file doesn't necessarily need to be touched, BE CAUTIOUS editing this file and proceed at your own risk.
|
||||||
|
local lazypath = vim.env.LAZY or vim.fn.stdpath "data" .. "/lazy/lazy.nvim"
|
||||||
|
if not (vim.env.LAZY or (vim.uv or vim.loop).fs_stat(lazypath)) then
|
||||||
|
-- stylua: ignore
|
||||||
|
vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath })
|
||||||
|
end
|
||||||
|
vim.opt.rtp:prepend(lazypath)
|
||||||
|
|
||||||
|
-- validate that lazy is available
|
||||||
|
if not pcall(require, "lazy") then
|
||||||
|
-- stylua: ignore
|
||||||
|
vim.api.nvim_echo({ { ("Unable to load lazy from: %s\n"):format(lazypath), "ErrorMsg" }, { "Press any key to exit...", "MoreMsg" } }, true, {})
|
||||||
|
vim.fn.getchar()
|
||||||
|
vim.cmd.quit()
|
||||||
|
end
|
||||||
|
|
||||||
|
require "lazy_setup"
|
||||||
|
require "polish"
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
-- AstroCommunity: import any community modules here
|
||||||
|
-- We import this file in `lazy_setup.lua` before the `plugins/` folder.
|
||||||
|
-- This guarantees that the specs are processed before any user plugins.
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
"AstroNvim/astrocommunity",
|
||||||
|
-- Motion
|
||||||
|
{ import = "astrocommunity.motion.mini-surround" },
|
||||||
|
-- https://github.com/echasnovski/mini.ai
|
||||||
|
{ import = "astrocommunity.motion.mini-ai" },
|
||||||
|
{ import = "astrocommunity.motion.flash-nvim" },
|
||||||
|
-- Highly experimental plugin that completely replaces
|
||||||
|
-- the UI for messages, cmdline and the popupmenu.
|
||||||
|
-- { import = "astrocommunity.utility.noice-nvim" },
|
||||||
|
-- Fully featured & enhanced replacement for copilot.vim
|
||||||
|
-- <Tab> work with both auto completion in cmp and copilot
|
||||||
|
{ import = "astrocommunity.media.vim-wakatime" },
|
||||||
|
{ import = "astrocommunity.motion.leap-nvim" },
|
||||||
|
{ import = "astrocommunity.motion.flit-nvim" },
|
||||||
|
{ import = "astrocommunity.scrolling.nvim-scrollbar" },
|
||||||
|
{ import = "astrocommunity.editing-support.todo-comments-nvim" },
|
||||||
|
-- Language Support
|
||||||
|
---- Frontend & NodeJS
|
||||||
|
{ import = "astrocommunity.pack.typescript-all-in-one" },
|
||||||
|
{ import = "astrocommunity.pack.tailwindcss" },
|
||||||
|
{ import = "astrocommunity.pack.html-css" },
|
||||||
|
{ import = "astrocommunity.pack.prisma" },
|
||||||
|
{ import = "astrocommunity.pack.vue" },
|
||||||
|
---- Configuration Language
|
||||||
|
{ import = "astrocommunity.pack.markdown" },
|
||||||
|
{ import = "astrocommunity.pack.json" },
|
||||||
|
{ import = "astrocommunity.pack.yaml" },
|
||||||
|
{ import = "astrocommunity.pack.toml" },
|
||||||
|
---- Backend / System
|
||||||
|
{ import = "astrocommunity.pack.lua" },
|
||||||
|
{ import = "astrocommunity.pack.go" },
|
||||||
|
{ import = "astrocommunity.pack.rust" },
|
||||||
|
{ import = "astrocommunity.pack.python" },
|
||||||
|
{ import = "astrocommunity.pack.java" },
|
||||||
|
{ import = "astrocommunity.pack.cmake" },
|
||||||
|
{ import = "astrocommunity.pack.cpp" },
|
||||||
|
-- { import = "astrocommunity.pack.nix" }, -- manually add config for nix, comment this one.
|
||||||
|
{ import = "astrocommunity.pack.proto" },
|
||||||
|
|
||||||
|
---- Operation & Cloud Native
|
||||||
|
{ import = "astrocommunity.pack.terraform" },
|
||||||
|
{ import = "astrocommunity.pack.bash" },
|
||||||
|
{ import = "astrocommunity.pack.docker" },
|
||||||
|
{ import = "astrocommunity.pack.helm" },
|
||||||
|
|
||||||
|
-- colorscheme
|
||||||
|
{ import = "astrocommunity.colorscheme.catppuccin" },
|
||||||
|
|
||||||
|
-- Lua implementation of CamelCaseMotion, with extra consideration of punctuation.
|
||||||
|
{ import = "astrocommunity.motion.nvim-spider" },
|
||||||
|
-- AI Assistant
|
||||||
|
{ import = "astrocommunity.completion.copilot-lua-cmp" },
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
require("lazy").setup({
|
||||||
|
{
|
||||||
|
"AstroNvim/AstroNvim",
|
||||||
|
version = "^4", -- Remove version tracking to elect for nighly AstroNvim
|
||||||
|
import = "astronvim.plugins",
|
||||||
|
opts = { -- AstroNvim options must be set here with the `import` key
|
||||||
|
mapleader = " ", -- This ensures the leader key must be configured before Lazy is set up
|
||||||
|
maplocalleader = ",", -- This ensures the localleader key must be configured before Lazy is set up
|
||||||
|
icons_enabled = true, -- Set to false to disable icons (if no Nerd Font is available)
|
||||||
|
pin_plugins = nil, -- Default will pin plugins when tracking `version` of AstroNvim, set to true/false to override
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ import = "community" },
|
||||||
|
{ import = "plugins" },
|
||||||
|
} --[[@as LazySpec]], {
|
||||||
|
-- Configure any other `lazy.nvim` configuration options here
|
||||||
|
-- https://github.com/folke/lazy.nvim?tab=readme-ov-file#%EF%B8%8F-configuration
|
||||||
|
|
||||||
|
-- try to load one of these colorschemes when starting an installation during startup
|
||||||
|
install = { colorscheme = { "catppuccin" }, },
|
||||||
|
ui = { backdrop = 100 },
|
||||||
|
performance = {
|
||||||
|
rtp = {
|
||||||
|
-- disable some rtp plugins, add more to your liking
|
||||||
|
disabled_plugins = {
|
||||||
|
"gzip",
|
||||||
|
"netrwPlugin",
|
||||||
|
"tarPlugin",
|
||||||
|
"tohtml",
|
||||||
|
"zipPlugin",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} --[[@as LazyConfig]])
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
-- AstroCore provides a central place to modify mappings, vim options, autocommands, and more!
|
||||||
|
-- Configuration documentation can be found with `:h astrocore`
|
||||||
|
-- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`)
|
||||||
|
-- as this provides autocomplete and documentation while editing
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
"AstroNvim/astrocore",
|
||||||
|
---@type AstroCoreOpts
|
||||||
|
opts = {
|
||||||
|
-- Configure core features of AstroNvim
|
||||||
|
features = {
|
||||||
|
large_buf = { size = 1024 * 500, lines = 10000 }, -- set global limits for large files for disabling features like treesitter
|
||||||
|
autopairs = true, -- enable autopairs at start
|
||||||
|
cmp = true, -- enable completion at start
|
||||||
|
diagnostics_mode = 3, -- diagnostic mode on start (0 = off, 1 = no signs/virtual text, 2 = no virtual text, 3 = on)
|
||||||
|
highlighturl = true, -- highlight URLs at start
|
||||||
|
notifications = true, -- enable notifications at start
|
||||||
|
},
|
||||||
|
-- Diagnostics configuration (for vim.diagnostics.config({...})) when diagnostics are on
|
||||||
|
diagnostics = {
|
||||||
|
virtual_text = true,
|
||||||
|
underline = true,
|
||||||
|
},
|
||||||
|
-- vim options can be configured here
|
||||||
|
options = {
|
||||||
|
opt = { -- vim.opt.<key>
|
||||||
|
relativenumber = true, -- Show relative numberline
|
||||||
|
signcolumn = "auto", -- Show sign column when used only
|
||||||
|
spell = false, -- Spell checking
|
||||||
|
swapfile = false, -- Swapfile
|
||||||
|
smartindent = false, -- fix https://github.com/ryan4yin/nix-config/issues/4
|
||||||
|
title = true, -- Set the title of window to `filename [+=-] (path) - NVIM`
|
||||||
|
-- The percentage of 'columns' to use for the title
|
||||||
|
-- When the title is longer, only the end of the path name is shown.
|
||||||
|
titlelen = 20,
|
||||||
|
},
|
||||||
|
g = { -- vim.g.<key>
|
||||||
|
-- configure global vim variables (vim.g)
|
||||||
|
-- NOTE: `mapLeader` and `maplocalLeader` must be set in the AstroNvim opts or before `lazy.setup`
|
||||||
|
-- This can be found in the `lua/lazy_setup.lua` file
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- Mappings can be configured through AstroCore as well.
|
||||||
|
-- https://docs.astronvim.com/recipes/mappings/
|
||||||
|
-- NOTE: keycodes follow the casing in the vimdocs. For example, `<Leader>` must be capitalized
|
||||||
|
mappings = {
|
||||||
|
-- first key is the mode
|
||||||
|
n = {
|
||||||
|
-- second key is the lefthand side of the map
|
||||||
|
|
||||||
|
-- second key is the lefthand side of the map
|
||||||
|
-- mappings seen under group name "Buffer"
|
||||||
|
["<Leader>bn"] = { "<cmd>tabnew<cr>", desc = "New tab" },
|
||||||
|
-- quick save
|
||||||
|
-- ["<C-s>"] = { ":w!<cr>", desc = "Save File" },
|
||||||
|
|
||||||
|
-- Terminal
|
||||||
|
-- NOTE: https://neovim.io/doc/user/builtin.html#jobstart()
|
||||||
|
-- 1. If {cmd} is a List it runs directly (no 'shell')
|
||||||
|
-- 2. If {cmd} is a String it runs in the 'shell'
|
||||||
|
-- search and replace globally
|
||||||
|
["<Leader>ss"] = { '<cmd>lua require("spectre").toggle()<CR>', desc = "Toggle Spectre" },
|
||||||
|
["<Leader>sw"] = {
|
||||||
|
'<cmd>lua require("spectre").open_visual({select_word=true})<CR>',
|
||||||
|
desc = "Search current word",
|
||||||
|
},
|
||||||
|
["<Leader>sp"] = {
|
||||||
|
'<cmd>lua require("spectre").open_file_search({select_word=true})<CR>',
|
||||||
|
desc = "Search on current file",
|
||||||
|
},
|
||||||
|
|
||||||
|
-- yank_history
|
||||||
|
["<Leader>yh"] = {
|
||||||
|
function() require("telescope").extensions.yank_history.yank_history() end,
|
||||||
|
desc = "Preview Yank History",
|
||||||
|
},
|
||||||
|
|
||||||
|
-- undo history
|
||||||
|
["<Leader>uh"] = { "<cmd>Telescope undo<cr>", desc = "Telescope undo" },
|
||||||
|
|
||||||
|
-- implementation/definition preview
|
||||||
|
["gpd"] = { "<cmd>lua require('goto-preview').goto_preview_definition()<CR>", desc = "goto_preview_definition" },
|
||||||
|
["gpt"] = {
|
||||||
|
"<cmd>lua require('goto-preview').goto_preview_type_definition()<CR>",
|
||||||
|
desc = "goto_preview_type_definition",
|
||||||
|
},
|
||||||
|
["gpi"] = {
|
||||||
|
"<cmd>lua require('goto-preview').goto_preview_implementation()<CR>",
|
||||||
|
desc = "goto_preview_implementation",
|
||||||
|
},
|
||||||
|
["gP"] = { "<cmd>lua require('goto-preview').close_all_win()<CR>", desc = "close_all_win" },
|
||||||
|
["gpr"] = { "<cmd>lua require('goto-preview').goto_preview_references()<CR>", desc = "goto_preview_references" },
|
||||||
|
},
|
||||||
|
t = {
|
||||||
|
-- setting a mapping to false will disable it
|
||||||
|
-- ["<esc>"] = false,
|
||||||
|
},
|
||||||
|
-- Visual mode
|
||||||
|
v = {
|
||||||
|
-- search and replace globally
|
||||||
|
["<Leader>sw"] = { '<esc><cmd>lua require("spectre").open_visual()<CR>', desc = "Search current word" },
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,205 @@
|
|||||||
|
-- AstroLSP allows you to customize the features in AstroNvim's LSP configuration engine
|
||||||
|
-- Configuration documentation can be found with `:h astrolsp`
|
||||||
|
-- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`)
|
||||||
|
-- as this provides autocomplete and documentation while editing
|
||||||
|
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
"AstroNvim/astrolsp",
|
||||||
|
---@type AstroLSPOpts
|
||||||
|
opts = {
|
||||||
|
-- Configuration table of features provided by AstroLSP
|
||||||
|
features = {
|
||||||
|
autoformat = true, -- enable or disable auto formatting on start
|
||||||
|
codelens = true, -- enable/disable codelens refresh on start
|
||||||
|
inlay_hints = false, -- enable/disable inlay hints on start
|
||||||
|
semantic_tokens = true, -- enable/disable semantic token highlighting
|
||||||
|
},
|
||||||
|
-- customize lsp formatting options
|
||||||
|
formatting = {
|
||||||
|
-- control auto formatting on save
|
||||||
|
format_on_save = {
|
||||||
|
enabled = true, -- enable or disable format on save globally
|
||||||
|
allow_filetypes = { -- enable format on save for specified filetypes only
|
||||||
|
"go",
|
||||||
|
"jsonnet",
|
||||||
|
"rust",
|
||||||
|
"terraform",
|
||||||
|
"nu",
|
||||||
|
},
|
||||||
|
ignore_filetypes = { -- disable format on save for specified filetypes
|
||||||
|
-- "python",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disabled = { -- disable formatting capabilities for the listed language servers
|
||||||
|
-- disable lua_ls formatting capability if you want to use StyLua to format your lua code
|
||||||
|
-- "lua_ls",
|
||||||
|
},
|
||||||
|
timeout_ms = 1000, -- default format timeout
|
||||||
|
-- filter = function(client) -- fully override the default formatting function
|
||||||
|
-- return true
|
||||||
|
-- end
|
||||||
|
},
|
||||||
|
-- enable servers that you already have installed without mason
|
||||||
|
servers = {
|
||||||
|
---- Frontend & NodeJS
|
||||||
|
"tsserver", -- typescript/javascript language server
|
||||||
|
"tailwindcss", -- tailwindcss language server
|
||||||
|
"html", -- html language server
|
||||||
|
"cssls", -- css language server
|
||||||
|
"prismals", -- prisma language server
|
||||||
|
"volar", -- vue language server
|
||||||
|
---- Configuration Language
|
||||||
|
"marksman", -- markdown ls
|
||||||
|
"jsonls", -- json language server
|
||||||
|
"yamlls", -- yaml language server
|
||||||
|
"taplo", -- toml language server
|
||||||
|
---- Backend
|
||||||
|
"lua_ls", -- lua
|
||||||
|
"gopls", -- go
|
||||||
|
"rust_analyzer", -- rust
|
||||||
|
"pyright", -- python
|
||||||
|
"ruff_lsp", -- extremely fast Python linter and code transformation
|
||||||
|
"jdtls", -- java
|
||||||
|
"nil_ls", -- nix language server
|
||||||
|
"bufls", -- protocol buffer language server
|
||||||
|
"zls", -- zig language server
|
||||||
|
---- HDL
|
||||||
|
"verible", -- verilog language server
|
||||||
|
---- Operation & Cloud Nativautoindente
|
||||||
|
"bashls", -- bash
|
||||||
|
"cmake", -- cmake language server
|
||||||
|
"clangd", -- c/c++
|
||||||
|
"dockerls", -- dockerfile
|
||||||
|
"jsonnet_ls", -- jsonnet language server
|
||||||
|
"terraformls", -- terraform hcl
|
||||||
|
"nushell", -- nushell language server
|
||||||
|
"scheme_langserver", -- scheme language server
|
||||||
|
},
|
||||||
|
-- customize language server configuration options passed to `lspconfig`
|
||||||
|
---@diagnostic disable: missing-fields
|
||||||
|
config = {
|
||||||
|
-- the offset_encoding of clangd will confilicts whit null-ls
|
||||||
|
-- so we need to manually set it to utf-8
|
||||||
|
clangd = {
|
||||||
|
capabilities = {
|
||||||
|
offsetEncoding = "utf-8",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
scheme_langserver = {
|
||||||
|
filetypes = { "scheme", "scm" },
|
||||||
|
single_file_support = true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- customize how language servers are attached
|
||||||
|
handlers = {
|
||||||
|
-- a function without a key is simply the default handler, functions take two parameters, the server name and the configured options table for that server
|
||||||
|
-- function(server, opts) require("lspconfig")[server].setup(opts) end
|
||||||
|
|
||||||
|
-- the key is the server that is being setup with `lspconfig`
|
||||||
|
-- rust_analyzer = false, -- setting a handler to false will disable the set up of that language server
|
||||||
|
-- pyright = function(_, opts) require("lspconfig").pyright.setup(opts) end -- or a custom handler function can be passed
|
||||||
|
},
|
||||||
|
-- Configure buffer local auto commands to add when attaching a language server
|
||||||
|
autocmds = {
|
||||||
|
-- first key is the `augroup` to add the auto commands to (:h augroup)
|
||||||
|
lsp_document_highlight = {
|
||||||
|
-- Optional condition to create/delete auto command group
|
||||||
|
-- can either be a string of a client capability or a function of `fun(client, bufnr): boolean`
|
||||||
|
-- condition will be resolved for each client on each execution and if it ever fails for all clients,
|
||||||
|
-- the auto commands will be deleted for that buffer
|
||||||
|
cond = "textDocument/documentHighlight",
|
||||||
|
-- cond = function(client, bufnr) return client.name == "lua_ls" end,
|
||||||
|
-- list of auto commands to set
|
||||||
|
{
|
||||||
|
-- events to trigger
|
||||||
|
event = { "CursorHold", "CursorHoldI" },
|
||||||
|
-- the rest of the autocmd options (:h nvim_create_autocmd)
|
||||||
|
desc = "Document Highlighting",
|
||||||
|
callback = function() vim.lsp.buf.document_highlight() end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
event = { "CursorMoved", "CursorMovedI", "BufLeave" },
|
||||||
|
desc = "Document Highlighting Clear",
|
||||||
|
callback = function() vim.lsp.buf.clear_references() end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- mappings to be set up on attaching of a language server
|
||||||
|
mappings = {
|
||||||
|
n = {
|
||||||
|
gl = { function() vim.diagnostic.open_float() end, desc = "Hover diagnostics" },
|
||||||
|
|
||||||
|
-- a `cond` key can provided as the string of a server capability to be required to attach, or a function with `client` and `bufnr` parameters from the `on_attach` that returns a boolean
|
||||||
|
-- gD = {
|
||||||
|
-- function() vim.lsp.buf.declaration() end,
|
||||||
|
-- desc = "Declaration of current symbol",
|
||||||
|
-- cond = "textDocument/declaration",
|
||||||
|
-- },
|
||||||
|
-- ["<Leader>uY"] = {
|
||||||
|
-- function() require("astrolsp.toggles").buffer_semantic_tokens() end,
|
||||||
|
-- desc = "Toggle LSP semantic highlight (buffer)",
|
||||||
|
-- cond = function(client) return client.server_capabilities.semanticTokensProvider and vim.lsp.semantic_tokens end,
|
||||||
|
-- },
|
||||||
|
|
||||||
|
-- refactoring
|
||||||
|
["<Leader>ri"] = {
|
||||||
|
function() require("refactoring").refactor "Inline Variable" end,
|
||||||
|
desc = "Inverse of extract variable",
|
||||||
|
},
|
||||||
|
["<Leader>rb"] = { function() require("refactoring").refactor "Extract Block" end, desc = "Extract Block" },
|
||||||
|
["<Leader>rbf"] = {
|
||||||
|
function() require("refactoring").refactor "Extract Block To File" end,
|
||||||
|
desc = "Extract Block To File",
|
||||||
|
},
|
||||||
|
["<Leader>rr"] = {
|
||||||
|
function() require("telescope").extensions.refactoring.refactors() end,
|
||||||
|
desc = "Prompt for a refactor to apply",
|
||||||
|
},
|
||||||
|
["<Leader>rp"] = {
|
||||||
|
function() require("refactoring").debug.printf { below = false } end,
|
||||||
|
desc = "Insert print statement to mark the calling of a function",
|
||||||
|
},
|
||||||
|
["<Leader>rv"] = {
|
||||||
|
function() require("refactoring").debug.print_var() end,
|
||||||
|
desc = "Insert print statement to print a variable",
|
||||||
|
},
|
||||||
|
["<Leader>rc"] = {
|
||||||
|
function() require("refactoring").debug.cleanup {} end,
|
||||||
|
desc = "Cleanup of all generated print statements",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- visual mode(what's the difference between v and x???)
|
||||||
|
x = {
|
||||||
|
-- refactoring
|
||||||
|
["<Leader>ri"] = {
|
||||||
|
function() require("refactoring").refactor "Inline Variable" end,
|
||||||
|
desc = "Inverse of extract variable",
|
||||||
|
},
|
||||||
|
["<Leader>re"] = {
|
||||||
|
function() require("refactoring").refactor "Extract Function" end,
|
||||||
|
desc = "Extracts the selected code to a separate function",
|
||||||
|
},
|
||||||
|
["<Leader>rf"] = {
|
||||||
|
function() require("refactoring").refactor "Extract Function To File" end,
|
||||||
|
desc = "Extract Function To File",
|
||||||
|
},
|
||||||
|
["<Leader>rv"] = {
|
||||||
|
function() require("refactoring").refactor "Extract Variable" end,
|
||||||
|
desc = "Extracts occurrences of a selected expression to its own variable",
|
||||||
|
},
|
||||||
|
["<Leader>rr"] = {
|
||||||
|
function() require("telescope").extensions.refactoring.refactors() end,
|
||||||
|
desc = "Prompt for a refactor to apply",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- A custom `on_attach` function to be run after the default `on_attach` function
|
||||||
|
-- takes two parameters `client` and `bufnr` (`:h lspconfig-setup`)
|
||||||
|
on_attach = function(client, bufnr)
|
||||||
|
-- this would disable semanticTokensProvider for all clients
|
||||||
|
-- client.server_capabilities.semanticTokensProvider = nil
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
-- AstroUI provides the basis for configuring the AstroNvim User Interface
|
||||||
|
-- Configuration documentation can be found with `:h astroui`
|
||||||
|
-- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`)
|
||||||
|
-- as this provides autocomplete and documentation while editing
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
"AstroNvim/astroui",
|
||||||
|
---@type AstroUIOpts
|
||||||
|
opts = {
|
||||||
|
-- change colorscheme
|
||||||
|
-- colorscheme = "astrodark",
|
||||||
|
colorscheme = "catppuccin",
|
||||||
|
-- AstroUI allows you to easily modify highlight groups easily for any and all colorschemes
|
||||||
|
highlights = {
|
||||||
|
init = { -- this table overrides highlights in all themes
|
||||||
|
-- Normal = { bg = "#000000" },
|
||||||
|
},
|
||||||
|
astrotheme = { -- a table of overrides/changes when applying the astrotheme theme
|
||||||
|
-- Normal = { bg = "#000000" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- Icons can be configured throughout the interface
|
||||||
|
icons = {
|
||||||
|
-- configure the loading of the lsp in the status line
|
||||||
|
LSPLoading1 = "⠋",
|
||||||
|
LSPLoading2 = "⠙",
|
||||||
|
LSPLoading3 = "⠹",
|
||||||
|
LSPLoading4 = "⠸",
|
||||||
|
LSPLoading5 = "⠼",
|
||||||
|
LSPLoading6 = "⠴",
|
||||||
|
LSPLoading7 = "⠦",
|
||||||
|
LSPLoading8 = "⠧",
|
||||||
|
LSPLoading9 = "⠇",
|
||||||
|
LSPLoading10 = "⠏",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
return {
|
||||||
|
"0x00-ketsu/autosave.nvim",
|
||||||
|
-- lazy-loading on events
|
||||||
|
event = { "InsertLeave", "TextChanged" },
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.prompt_style = "stdout" -- notify or stdout
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
return {
|
||||||
|
"catppuccin/nvim",
|
||||||
|
name = "catppuccin",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.flavour = "mocha" -- latte, frappe, macchiato, mocha
|
||||||
|
opts.transparent_background = true -- setting the background color.
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
return {
|
||||||
|
"Olical/conjure",
|
||||||
|
ft = { "clojure", "fennel", "python", "scheme" }, -- etc
|
||||||
|
-- [Optional] cmp-conjure for cmp
|
||||||
|
dependencies = {
|
||||||
|
{
|
||||||
|
"PaterJason/cmp-conjure",
|
||||||
|
config = function()
|
||||||
|
local cmp = require "cmp"
|
||||||
|
local config = cmp.get_config()
|
||||||
|
table.insert(config.sources, {
|
||||||
|
name = "buffer",
|
||||||
|
option = {
|
||||||
|
sources = {
|
||||||
|
{ name = "conjure" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
cmp.setup(config)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
require("conjure.main").main()
|
||||||
|
require("conjure.mapping")["on-filetype"]()
|
||||||
|
end,
|
||||||
|
init = function()
|
||||||
|
-- Set configuration options here
|
||||||
|
vim.g["conjure#debug"] = true
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
-- Custom copilot-lua to enable filetypes: markdown
|
||||||
|
return {
|
||||||
|
"zbirenbaum/copilot.lua",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.filetypes = {
|
||||||
|
yaml = true,
|
||||||
|
markdown = true,
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return { "folke/flash.nvim", vscode = false }
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
-- implementation/definition preview
|
||||||
|
return {
|
||||||
|
"rmagatti/goto-preview",
|
||||||
|
config = function() require("goto-preview").setup {} end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
-- markdown preview
|
||||||
|
return {
|
||||||
|
"0x00-ketsu/markdown-preview.nvim",
|
||||||
|
ft = { "md", "markdown", "mkd", "mkdn", "mdwn", "mdown", "mdtxt", "mdtext", "rmd", "wiki" },
|
||||||
|
config = function()
|
||||||
|
require("markdown-preview").setup {
|
||||||
|
-- your configuration comes here
|
||||||
|
-- or leave it empty to use the default settings
|
||||||
|
-- refer to the setup section below
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
-- Customize Mason plugins
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
-- use mason-lspconfig to configure LSP installations
|
||||||
|
{
|
||||||
|
"williamboman/mason-lspconfig.nvim",
|
||||||
|
-- mason is unusable on NixOS, disable it.
|
||||||
|
-- ensure_installed nothing
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = nil
|
||||||
|
opts.automatic_installation = false
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- overrides `require("mason-lspconfig").setup(...)`
|
||||||
|
-- opts = function(_, opts)
|
||||||
|
-- -- add more things to the ensure_installed table protecting against community packs modifying it
|
||||||
|
-- opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||||
|
-- "lua_ls",
|
||||||
|
-- -- add more arguments for adding more language servers
|
||||||
|
-- })
|
||||||
|
-- end,
|
||||||
|
},
|
||||||
|
-- use mason-null-ls to configure Formatters/Linter installation for null-ls sources
|
||||||
|
{
|
||||||
|
"jay-babu/mason-null-ls.nvim",
|
||||||
|
-- mason is unusable on NixOS, disable it.
|
||||||
|
-- ensure_installed nothing
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = nil
|
||||||
|
opts.automatic_installation = false
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- -- overrides `require("mason-null-ls").setup(...)`
|
||||||
|
-- opts = function(_, opts)
|
||||||
|
-- -- add more things to the ensure_installed table protecting against community packs modifying it
|
||||||
|
-- opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||||
|
-- "prettier",
|
||||||
|
-- "stylua",
|
||||||
|
-- -- add more arguments for adding more null-ls sources
|
||||||
|
-- })
|
||||||
|
-- end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
-- https://docs.astronvim.com/recipes/dap/
|
||||||
|
"jay-babu/mason-nvim-dap.nvim",
|
||||||
|
-- mason is unusable on NixOS, disable it.
|
||||||
|
-- ensure_installed nothing
|
||||||
|
-- opts = function(_, opts)
|
||||||
|
-- opts.ensure_installed = nil
|
||||||
|
-- opts.automatic_installation = false
|
||||||
|
-- end,
|
||||||
|
|
||||||
|
-- overrides `require("mason-nvim-dap").setup(...)`
|
||||||
|
-- opts = function(_, opts)
|
||||||
|
-- -- add more things to the ensure_installed table protecting against community packs modifying it
|
||||||
|
-- opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||||
|
-- "python",
|
||||||
|
-- -- add more arguments for adding more debuggers
|
||||||
|
-- })
|
||||||
|
-- end,
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
-- File explorer(Custom configs)
|
||||||
|
return {
|
||||||
|
"nvim-neo-tree/neo-tree.nvim",
|
||||||
|
opts = {
|
||||||
|
filesystem = {
|
||||||
|
filtered_items = {
|
||||||
|
visible = true, -- visible by default
|
||||||
|
hide_dotfiles = false,
|
||||||
|
hide_gitignored = false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- full signature help, docs and completion for the nvim lua API.
|
||||||
|
return { "folke/neodev.nvim", opts = {} }
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return { "Olical/nfnl", ft = "fennel" }
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
-- Customize None-ls sources
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
opts = function(_, config)
|
||||||
|
-- config variable is the default configuration table for the setup function call
|
||||||
|
local null_ls = require "null-ls"
|
||||||
|
local code_actions = null_ls.builtins.code_actions
|
||||||
|
local diagnostics = null_ls.builtins.diagnostics
|
||||||
|
local formatting = null_ls.builtins.formatting
|
||||||
|
local hover = null_ls.builtins.hover
|
||||||
|
local completion = null_ls.builtins.completion
|
||||||
|
|
||||||
|
-- Check supported formatters and linters
|
||||||
|
-- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/formatting
|
||||||
|
-- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics
|
||||||
|
config.sources = {
|
||||||
|
-- Common Code Actions
|
||||||
|
code_actions.gitsigns,
|
||||||
|
-- common refactoring actions based off the Refactoring book by Martin Fowler
|
||||||
|
code_actions.refactoring,
|
||||||
|
code_actions.gomodifytags, -- Go - modify struct field tags
|
||||||
|
code_actions.impl, -- Go - generate interface method stubs
|
||||||
|
code_actions.proselint, -- English prose linter
|
||||||
|
code_actions.statix, -- Lints and suggestions for Nix.
|
||||||
|
|
||||||
|
-- Diagnostic
|
||||||
|
diagnostics.actionlint, -- GitHub Actions workflow syntax checking
|
||||||
|
diagnostics.buf, -- check text in current buffer
|
||||||
|
diagnostics.checkmake, -- check Makefiles
|
||||||
|
diagnostics.deadnix, -- Scan Nix files for dead code.
|
||||||
|
|
||||||
|
-- Formatting
|
||||||
|
formatting.prettier, -- js/ts/vue/css/html/json/... formatter
|
||||||
|
diagnostics.hadolint, -- Dockerfile linter
|
||||||
|
formatting.black, -- Python formatter
|
||||||
|
formatting.goimports, -- Go formatter
|
||||||
|
formatting.shfmt, -- Shell formatter
|
||||||
|
formatting.terraform_fmt, -- Terraform formatter
|
||||||
|
formatting.stylua, -- Lua formatter
|
||||||
|
formatting.alejandra, -- Nix formatter
|
||||||
|
formatting.sqlfluff.with { -- SQL formatter
|
||||||
|
extra_args = { "--dialect", "postgres" }, -- change to your dialect
|
||||||
|
},
|
||||||
|
formatting.nginx_beautifier, -- Nginx formatter
|
||||||
|
formatting.verible_verilog_format, -- Verilog formatter
|
||||||
|
formatting.emacs_scheme_mode, -- using emacs in batch mode to format scheme files.
|
||||||
|
formatting.fnlfmt, -- Format Fennel code
|
||||||
|
}
|
||||||
|
return config -- return final config table
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- The plugin offers the abilibty to search and replace.
|
||||||
|
return {
|
||||||
|
"nvim-pack/nvim-spectre",
|
||||||
|
dependencies = {
|
||||||
|
{ "nvim-lua/plenary.nvim" },
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
return {
|
||||||
|
'nvim-orgmode/orgmode',
|
||||||
|
event = 'VeryLazy',
|
||||||
|
ft = { 'org' },
|
||||||
|
config = function()
|
||||||
|
-- Setup orgmode
|
||||||
|
require('orgmode').setup({
|
||||||
|
org_agenda_files = "~/org/**/*",
|
||||||
|
org_default_notes_file = "~/org/refile.org",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- NOTE: If you are using nvim-treesitter with ~ensure_installed = "all"~ option
|
||||||
|
-- add ~org~ to ignore_install
|
||||||
|
require('nvim-treesitter.configs').setup({
|
||||||
|
ensure_installed = 'all',
|
||||||
|
ignore_install = { 'org' },
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
return {
|
||||||
|
"eraserhd/parinfer-rust",
|
||||||
|
build = "cargo build --release",
|
||||||
|
ft = { "scm", "scheme" },
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
-- The plugin offers the alibity to refactor code.
|
||||||
|
return {
|
||||||
|
"ThePrimeagen/refactoring.nvim",
|
||||||
|
dependencies = {
|
||||||
|
{ "nvim-lua/plenary.nvim" },
|
||||||
|
{ "nvim-treesitter/nvim-treesitter" },
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
-- Enhanced matchparen.vim plugin for Neovim to highlight the outer pair.
|
||||||
|
return {
|
||||||
|
"utilyre/sentiment.nvim",
|
||||||
|
version = "*",
|
||||||
|
event = "VeryLazy", -- keep for lazy loading
|
||||||
|
opts = {
|
||||||
|
-- config
|
||||||
|
},
|
||||||
|
init = function()
|
||||||
|
-- `matchparen.vim` needs to be disabled manually in case of lazy loading
|
||||||
|
vim.g.loaded_matchparen = 1
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
return {
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
branch = "0.1.x",
|
||||||
|
dependencies = { "nvim-lua/plenary.nvim" },
|
||||||
|
init = function()
|
||||||
|
-- 1. Disable highlighting for certain filetypes
|
||||||
|
-- 2. Ignore files larger than a certain filesize
|
||||||
|
local previewers = require "telescope.previewers"
|
||||||
|
|
||||||
|
local _bad = { ".*%.csv", ".*%.min.js" } -- Put all filetypes that slow you down in this array
|
||||||
|
local filesize_threshold = 300 * 1024 -- 300KB
|
||||||
|
local bad_files = function(filepath)
|
||||||
|
for _, v in ipairs(_bad) do
|
||||||
|
if filepath:match(v) then return false end
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local new_maker = function(filepath, bufnr, opts)
|
||||||
|
opts = opts or {}
|
||||||
|
if opts.use_ft_detect == nil then opts.use_ft_detect = true end
|
||||||
|
|
||||||
|
-- 1. Check if the file is in the bad_files array, and if so, don't highlight it
|
||||||
|
opts.use_ft_detect = opts.use_ft_detect == false and false or bad_files(filepath)
|
||||||
|
|
||||||
|
-- 2. Check the file size, and ignore it if it's too big(preview nothing).
|
||||||
|
filepath = vim.fn.expand(filepath)
|
||||||
|
vim.loop.fs_stat(filepath, function(_, stat)
|
||||||
|
if not stat then return end
|
||||||
|
if stat.size > filesize_threshold then
|
||||||
|
return
|
||||||
|
else
|
||||||
|
previewers.buffer_previewer_maker(filepath, bufnr, opts)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Load Extensions
|
||||||
|
require("telescope").load_extension "refactoring"
|
||||||
|
require("telescope").load_extension "yank_history"
|
||||||
|
require("telescope").load_extension "undo"
|
||||||
|
end
|
||||||
|
|
||||||
|
require("telescope").setup {
|
||||||
|
defaults = {
|
||||||
|
buffer_previewer_maker = new_maker,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- disable toggleterm.nvim, zellij's terminal is far better than neovim's one
|
||||||
|
return { "akinsho/toggleterm.nvim", enabled = false }
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
-- Customize Treesitter
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.incremental_selection = {
|
||||||
|
enable = true,
|
||||||
|
keymaps = {
|
||||||
|
init_selection = "<C-space>", -- Ctrl + Space
|
||||||
|
node_incremental = "<C-space>",
|
||||||
|
scope_incremental = "<A-space>", -- Alt + Space
|
||||||
|
node_decremental = "<bs>", -- Backspace
|
||||||
|
},
|
||||||
|
}
|
||||||
|
opts.ignore_install = { "gotmpl" }
|
||||||
|
|
||||||
|
-- add more things to the ensure_installed table protecting against community packs modifying it
|
||||||
|
opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||||
|
-- neovim
|
||||||
|
"vim",
|
||||||
|
"lua",
|
||||||
|
-- operation & cloud native
|
||||||
|
"dockerfile",
|
||||||
|
"hcl",
|
||||||
|
"jsonnet",
|
||||||
|
"regex",
|
||||||
|
"terraform",
|
||||||
|
"nix",
|
||||||
|
"csv",
|
||||||
|
-- other programming language
|
||||||
|
"diff",
|
||||||
|
"gitignore",
|
||||||
|
"gitcommit",
|
||||||
|
"latex",
|
||||||
|
"sql",
|
||||||
|
-- Lisp like
|
||||||
|
"fennel",
|
||||||
|
"clojure",
|
||||||
|
"commonlisp",
|
||||||
|
-- customized languages:
|
||||||
|
"scheme",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- add support for scheme
|
||||||
|
local parser_config = require("nvim-treesitter.parsers").get_parser_configs()
|
||||||
|
parser_config.scheme = {
|
||||||
|
install_info = {
|
||||||
|
url = "https://github.com/6cdh/tree-sitter-scheme", -- local path or git repo
|
||||||
|
files = { "src/parser.c" },
|
||||||
|
-- optional entries:
|
||||||
|
branch = "main", -- default branch in case of git repo if different from master
|
||||||
|
generate_requires_npm = false, -- if stand-alone parser without npm dependencies
|
||||||
|
requires_generate_from_grammar = false, -- if folder contains pre-generated src/parser.c
|
||||||
|
},
|
||||||
|
}
|
||||||
|
-- use scheme parser for filetypes: scm
|
||||||
|
vim.treesitter.language.register("scheme", "scm")
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
-- joining blocks of code into oneline, or splitting one line into multiple lines.
|
||||||
|
return {
|
||||||
|
"Wansmer/treesj",
|
||||||
|
keys = { "<space>m", "<space>j", "<space>s" },
|
||||||
|
dependencies = { "nvim-treesitter/nvim-treesitter" },
|
||||||
|
config = function()
|
||||||
|
require("treesj").setup { --[[ your config ]]
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- Undo tree
|
||||||
|
return { "debugloop/telescope-undo.nvim" }
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
-- You can also add or configure plugins by creating files in this `plugins/` folder
|
||||||
|
-- Here are some examples:
|
||||||
|
|
||||||
|
---@type LazySpec
|
||||||
|
return {
|
||||||
|
|
||||||
|
-- == Examples of Adding Plugins ==
|
||||||
|
|
||||||
|
"andweeb/presence.nvim",
|
||||||
|
{
|
||||||
|
"ray-x/lsp_signature.nvim",
|
||||||
|
event = "BufRead",
|
||||||
|
config = function() require("lsp_signature").setup() end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- == Examples of Overriding Plugins ==
|
||||||
|
|
||||||
|
-- customize alpha options
|
||||||
|
{
|
||||||
|
"goolord/alpha-nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
-- customize the dashboard header
|
||||||
|
opts.section.header.val = {
|
||||||
|
" █████ ███████ ████████ ██████ ██████",
|
||||||
|
"██ ██ ██ ██ ██ ██ ██ ██",
|
||||||
|
"███████ ███████ ██ ██████ ██ ██",
|
||||||
|
"██ ██ ██ ██ ██ ██ ██ ██",
|
||||||
|
"██ ██ ███████ ██ ██ ██ ██████",
|
||||||
|
" ",
|
||||||
|
" ███ ██ ██ ██ ██ ███ ███",
|
||||||
|
" ████ ██ ██ ██ ██ ████ ████",
|
||||||
|
" ██ ██ ██ ██ ██ ██ ██ ████ ██",
|
||||||
|
" ██ ██ ██ ██ ██ ██ ██ ██ ██",
|
||||||
|
" ██ ████ ████ ██ ██ ██",
|
||||||
|
}
|
||||||
|
return opts
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- You can disable default plugins as follows:
|
||||||
|
{ "max397574/better-escape.nvim", enabled = false },
|
||||||
|
|
||||||
|
-- You can also easily customize additional setup of plugins that is outside of the plugin's setup call
|
||||||
|
{
|
||||||
|
"L3MON4D3/LuaSnip",
|
||||||
|
config = function(plugin, opts)
|
||||||
|
require "astronvim.plugins.configs.luasnip"(plugin, opts) -- include the default astronvim config that calls the setup call
|
||||||
|
-- add more custom luasnip configuration such as filetype extend or custom snippets
|
||||||
|
local luasnip = require "luasnip"
|
||||||
|
luasnip.filetype_extend("javascript", { "javascriptreact" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"windwp/nvim-autopairs",
|
||||||
|
config = function(plugin, opts)
|
||||||
|
require "astronvim.plugins.configs.nvim-autopairs"(plugin, opts) -- include the default astronvim config that calls the setup call
|
||||||
|
-- add more custom autopairs configuration such as custom rules
|
||||||
|
local npairs = require "nvim-autopairs"
|
||||||
|
local Rule = require "nvim-autopairs.rule"
|
||||||
|
local cond = require "nvim-autopairs.conds"
|
||||||
|
npairs.add_rules(
|
||||||
|
{
|
||||||
|
Rule("$", "$", { "tex", "latex" })
|
||||||
|
-- don't add a pair if the next character is %
|
||||||
|
:with_pair(cond.not_after_regex "%%")
|
||||||
|
-- don't add a pair if the previous character is xxx
|
||||||
|
:with_pair(
|
||||||
|
cond.not_before_regex("xxx", 3)
|
||||||
|
)
|
||||||
|
-- don't move right when repeat character
|
||||||
|
:with_move(cond.none())
|
||||||
|
-- don't delete if the next character is xx
|
||||||
|
:with_del(cond.not_after_regex "xx")
|
||||||
|
-- disable adding a newline when you press <cr>
|
||||||
|
:with_cr(cond.none()),
|
||||||
|
},
|
||||||
|
-- disable for .vim files, but it work for another filetypes
|
||||||
|
Rule("a", "a", "-vim")
|
||||||
|
)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
-- clipboard manager
|
||||||
|
return {
|
||||||
|
"gbprod/yanky.nvim",
|
||||||
|
opts = function()
|
||||||
|
local mapping = require "yanky.telescope.mapping"
|
||||||
|
local mappings = mapping.get_defaults()
|
||||||
|
mappings.i["<c-p>"] = nil
|
||||||
|
return {
|
||||||
|
highlight = { timer = 200 },
|
||||||
|
picker = {
|
||||||
|
telescope = {
|
||||||
|
use_default_mappings = false,
|
||||||
|
mappings = mappings,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"y",
|
||||||
|
"<Plug>(YankyYank)",
|
||||||
|
mode = { "n", "x" },
|
||||||
|
desc = "Yank text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"p",
|
||||||
|
"<Plug>(YankyPutAfter)",
|
||||||
|
mode = { "n", "x" },
|
||||||
|
desc = "Put yanked text after cursor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"P",
|
||||||
|
"<Plug>(YankyPutBefore)",
|
||||||
|
mode = { "n", "x" },
|
||||||
|
desc = "Put yanked text before cursor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gp",
|
||||||
|
"<Plug>(YankyGPutAfter)",
|
||||||
|
mode = { "n", "x" },
|
||||||
|
desc = "Put yanked text after selection",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gP",
|
||||||
|
"<Plug>(YankyGPutBefore)",
|
||||||
|
mode = { "n", "x" },
|
||||||
|
desc = "Put yanked text before selection",
|
||||||
|
},
|
||||||
|
{ "[y", "<Plug>(YankyCycleForward)", desc = "Cycle forward through yank history" },
|
||||||
|
{ "]y", "<Plug>(YankyCycleBackward)", desc = "Cycle backward through yank history" },
|
||||||
|
{ "]p", "<Plug>(YankyPutIndentAfterLinewise)", desc = "Put indented after cursor (linewise)" },
|
||||||
|
{ "[p", "<Plug>(YankyPutIndentBeforeLinewise)", desc = "Put indented before cursor (linewise)" },
|
||||||
|
{ "]P", "<Plug>(YankyPutIndentAfterLinewise)", desc = "Put indented after cursor (linewise)" },
|
||||||
|
{ "[P", "<Plug>(YankyPutIndentBeforeLinewise)", desc = "Put indented before cursor (linewise)" },
|
||||||
|
{ ">p", "<Plug>(YankyPutIndentAfterShiftRight)", desc = "Put and indent right" },
|
||||||
|
{ "<p", "<Plug>(YankyPutIndentAfterShiftLeft)", desc = "Put and indent left" },
|
||||||
|
{ ">P", "<Plug>(YankyPutIndentBeforeShiftRight)", desc = "Put before and indent right" },
|
||||||
|
{ "<P", "<Plug>(YankyPutIndentBeforeShiftLeft)", desc = "Put before and indent left" },
|
||||||
|
{ "=p", "<Plug>(YankyPutAfterFilter)", desc = "Put after applying a filter" },
|
||||||
|
{ "=P", "<Plug>(YankyPutBeforeFilter)", desc = "Put before applying a filter" },
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
-- This will run last in the setup process and is a good place to configure
|
||||||
|
-- things like custom filetypes. This just pure lua so anything that doesn't
|
||||||
|
-- fit in the normal config locations above can go here
|
||||||
|
|
||||||
|
-- Set up custom filetypes
|
||||||
|
-- vim.filetype.add {
|
||||||
|
-- extension = {
|
||||||
|
-- foo = "fooscript",
|
||||||
|
-- },
|
||||||
|
-- filename = {
|
||||||
|
-- ["Foofile"] = "fooscript",
|
||||||
|
-- },
|
||||||
|
-- pattern = {
|
||||||
|
-- ["~/%.config/foo/.*"] = "fooscript",
|
||||||
|
-- },
|
||||||
|
-- }
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
base: lua51
|
||||||
|
|
||||||
|
globals:
|
||||||
|
vim:
|
||||||
|
any: true
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
std = "neovim"
|
||||||
|
|
||||||
|
[rules]
|
||||||
|
global_usage = "allow"
|
||||||
|
if_same_then_else = "allow"
|
||||||
|
incorrect_standard_library_use = "allow"
|
||||||
|
mixed_table = "allow"
|
||||||
|
multiple_statements = "allow"
|
||||||
@@ -15,7 +15,8 @@
|
|||||||
gcc
|
gcc
|
||||||
# c/c++ tools with clang-tools, the unwrapped version won't
|
# c/c++ tools with clang-tools, the unwrapped version won't
|
||||||
# add alias like `cc` and `c++`, so that it won't conflict with gcc
|
# add alias like `cc` and `c++`, so that it won't conflict with gcc
|
||||||
llvmPackages.clang-unwrapped
|
# llvmPackages.clang-unwrapped
|
||||||
|
clang-tools
|
||||||
lldb
|
lldb
|
||||||
|
|
||||||
#-- python
|
#-- python
|
||||||
@@ -25,22 +26,25 @@
|
|||||||
with ps; [
|
with ps; [
|
||||||
ruff-lsp
|
ruff-lsp
|
||||||
black # python formatter
|
black # python formatter
|
||||||
|
# debugpy
|
||||||
|
|
||||||
|
# my commonly used python packages
|
||||||
jupyter
|
jupyter
|
||||||
ipython
|
ipython
|
||||||
pandas
|
pandas
|
||||||
requests
|
requests
|
||||||
pyquery
|
pyquery
|
||||||
pyyaml
|
pyyaml
|
||||||
|
boto3
|
||||||
|
|
||||||
## emacs's lsp-bridge dependenciesge
|
## emacs's lsp-bridge dependenciesge
|
||||||
epc
|
# epc
|
||||||
orjson
|
# orjson
|
||||||
sexpdata
|
# sexpdata
|
||||||
six
|
# six
|
||||||
setuptools
|
# setuptools
|
||||||
paramiko
|
# paramiko
|
||||||
rapidfuzz
|
# rapidfuzz
|
||||||
]
|
]
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -51,7 +55,7 @@
|
|||||||
|
|
||||||
#-- nix
|
#-- nix
|
||||||
nil
|
nil
|
||||||
rnix-lsp
|
# rnix-lsp
|
||||||
# nixd
|
# nixd
|
||||||
statix # Lints and suggestions for the nix programming language
|
statix # Lints and suggestions for the nix programming language
|
||||||
deadnix # Find and remove unused code in .nix source files
|
deadnix # Find and remove unused code in .nix source files
|
||||||
|
|||||||
@@ -1,30 +1,31 @@
|
|||||||
# Encryption
|
# Encryption
|
||||||
|
|
||||||
We have GnuPG & password-store installed by default, mainly for password management, authentication & communication encryption.
|
We have GnuPG & password-store installed by default, mainly for password management, authentication
|
||||||
|
& communication encryption.
|
||||||
|
|
||||||
We also have LUKS2 for disk encryption on Linux, and [rclone](https://rclone.org/crypt/) for cross-platform data encryption & syncing.
|
We also have LUKS2 for disk encryption on Linux, and [rclone](https://rclone.org/crypt/) for
|
||||||
|
cross-platform data encryption & syncing.
|
||||||
|
|
||||||
[age](https://github.com/FiloSottile/age) may be more general for file encryption.
|
[age](https://github.com/FiloSottile/age) may be more general for file encryption.
|
||||||
|
|
||||||
[Sops](https://github.com/getsops/sops/tree/main) can be used for file encryption too, if you prefer
|
[Sops](https://github.com/getsops/sops/tree/main) can be used for file encryption too, if you prefer
|
||||||
using a Cloud provider for key management.
|
using a Cloud provider for key management.
|
||||||
|
|
||||||
|
|
||||||
## Asymmetric Encryption
|
## Asymmetric Encryption
|
||||||
|
|
||||||
Both age, Sops & GnuPG provide asymmetric encryption, which is useful for encrypting files for a specific user.
|
Both age, Sops & GnuPG provide asymmetric encryption, which is useful for encrypting files for a
|
||||||
|
specific user.
|
||||||
|
|
||||||
For morden use, age is recommended, as it use [AEAD encryption function - ChaCha20-Poly1305][age Format v1],
|
For morden use, age is recommended, as it use [AEAD encryption function -
|
||||||
If you do not want to manage the keys by yourself, Sops is recommended, as it use KMS for key management.
|
ChaCha20-Poly1305][age Format v1], If you do not want to manage the keys by yourself, Sops is
|
||||||
|
recommended, as it use KMS for key management.
|
||||||
|
|
||||||
## Symmetric Encryption
|
## Symmetric Encryption
|
||||||
|
|
||||||
Both age & GnuPG provide symmetric encryption, which is useful for encrypting files for a specific user.
|
Both age & GnuPG provide symmetric encryption, which is useful for encrypting files for a specific
|
||||||
|
user.
|
||||||
As described in [age Format v1][age Format v1], age use scrypt to encrypt and decrypt the file key with a provided passphrase,
|
|
||||||
which is more secure than GnuPG's symmetric encryption.
|
|
||||||
|
|
||||||
|
|
||||||
|
As described in [age Format v1][age Format v1], age use scrypt to encrypt and decrypt the file key
|
||||||
|
with a provided passphrase, which is more secure than GnuPG's symmetric encryption.
|
||||||
|
|
||||||
[age Format v1]: https://age-encryption.org/v1
|
[age Format v1]: https://age-encryption.org/v1
|
||||||
|
|
||||||
|
|||||||
+114
-58
@@ -1,10 +1,14 @@
|
|||||||
# GNU Privacy Guard(GnuPG)
|
# GNU Privacy Guard(GnuPG)
|
||||||
|
|
||||||
> Offical Website: https://www.gnupg.org/
|
> Official Website: https://www.gnupg.org/
|
||||||
|
|
||||||
The GNU Privacy Guard is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as **PGP**). GnuPG allows to encrypt and sign your data and communication, features a versatile key management system as well as access modules for all kind of public key directories.
|
The GNU Privacy Guard is a complete and free implementation of the OpenPGP standard as defined by
|
||||||
|
RFC4880 (also known as **PGP**). GnuPG allows to encrypt and sign your data and communication,
|
||||||
|
features a versatile key management system as well as access modules for all kind of public key
|
||||||
|
directories.
|
||||||
|
|
||||||
> In the following content, we will use GPG to refer to GnuPG tool, and PGP to refer to various concepts defined in the OepnPGP standard(e.g. PGP key, PGP key server).
|
> In the following content, we will use GPG to refer to GnuPG tool, and PGP to refer to various
|
||||||
|
> concepts defined in the OepnPGP standard(e.g. PGP key, PGP key server).
|
||||||
|
|
||||||
Key functions of GnuPG:
|
Key functions of GnuPG:
|
||||||
|
|
||||||
@@ -20,18 +24,21 @@ Main usage scenarios of GnuPG:
|
|||||||
3. Manage your ssh key
|
3. Manage your ssh key
|
||||||
4. Encrypt your data and store it somewhere.
|
4. Encrypt your data and store it somewhere.
|
||||||
|
|
||||||
GnuPG/OpenPGP is complex, so while using it, I have been looking forward to finding an encryption tool that is simple enough, functional enough, and widely adopted.
|
GnuPG/OpenPGP is complex, so while using it, I have been looking forward to finding an encryption
|
||||||
|
tool that is simple enough, functional enough, and widely adopted.
|
||||||
|
|
||||||
Currently I use both age & GnuPG:
|
Currently I use both age & GnuPG:
|
||||||
|
|
||||||
1. Age for secrets encryption(ssh key & other secret files), it's simple and easy to use.
|
1. Age for secrets encryption(ssh key & other secret files), it's simple and easy to use.
|
||||||
2. GnuPG for password-store and email encryption.
|
2. GnuPG for password-store and email encryption.
|
||||||
|
|
||||||
> At present, the safe and efficient use of GPG is probably combined with hardware keys such as yubikey. but I don't have one, so I won't talk about it here.
|
> At present, the safe and efficient use of GPG is probably combined with hardware keys such as
|
||||||
|
> yubikey. but I don't have one, so I won't talk about it here.
|
||||||
|
|
||||||
## Practical Cryptography for Developers
|
## Practical Cryptography for Developers
|
||||||
|
|
||||||
To use GnuGP without seamlessly, Some Practical Cryptography knowledge is required, here is dome tutorials:
|
To use GnuGP without seamlessly, Some Practical Cryptography knowledge is required, here is dome
|
||||||
|
tutorials:
|
||||||
|
|
||||||
- English version: <https://github.com/nakov/Practical-Cryptography-for-Developers-Book>
|
- English version: <https://github.com/nakov/Practical-Cryptography-for-Developers-Book>
|
||||||
- Chinese version: <https://thiscute.world/tags/cryptography/>
|
- Chinese version: <https://thiscute.world/tags/cryptography/>
|
||||||
@@ -50,12 +57,14 @@ Related Docs:
|
|||||||
- [Predictable, Passphrase-Derived PGP Keys][Predictable, Passphrase-Derived PGP Keys]
|
- [Predictable, Passphrase-Derived PGP Keys][Predictable, Passphrase-Derived PGP Keys]
|
||||||
- [OpenPGP - The almost perfect key pair][OpenPGP - The almost perfect key pair]
|
- [OpenPGP - The almost perfect key pair][OpenPGP - The almost perfect key pair]
|
||||||
|
|
||||||
|
GnuPG generate every secret key separately, and encrypt them with a symmetric key derived from your
|
||||||
|
passphrase. OpenPGP standard defines
|
||||||
|
[String-to-Key (S2K)](https://datatracker.ietf.org/doc/html/rfc4880#section-3.7) algorithm to derive
|
||||||
|
a symmetric key from your passphrase.
|
||||||
|
|
||||||
GnuPG generate every secret key separately, and encrypt them with a symmetric key derived from your passphrase.
|
GnuPG's
|
||||||
OpenPGP standard defines [String-to-Key (S2K)](https://datatracker.ietf.org/doc/html/rfc4880#section-3.7)
|
[OpenPGP protocol specific options](https://gnupg.org/documentation/manuals/gnupg/OpenPGP-Options.html#OpenPGP-Options)
|
||||||
algorithm to derive a symmetric key from your passphrase.
|
shows that:
|
||||||
|
|
||||||
GnuPG's [OpenPGP protocol specific options](https://gnupg.org/documentation/manuals/gnupg/OpenPGP-Options.html#OpenPGP-Options) shows that:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
--s2k-cipher-algo name
|
--s2k-cipher-algo name
|
||||||
@@ -81,24 +90,31 @@ gpg --s2k-mode 3 --s2k-count 65011712 --s2k-digest-algo SHA512 --s2k-cipher-algo
|
|||||||
To use the strongest options globally, you can specify these options in your `~/.gnupg/gpg.conf`.
|
To use the strongest options globally, you can specify these options in your `~/.gnupg/gpg.conf`.
|
||||||
I've added them to my Home Manager's `programs.gpg.settings` option.
|
I've added them to my Home Manager's `programs.gpg.settings` option.
|
||||||
|
|
||||||
|
|
||||||
### 1. PGP Key(Primary Key) generation
|
### 1. PGP Key(Primary Key) generation
|
||||||
|
|
||||||
Key management is the core of OpenPGP standard / GnuPG.
|
Key management is the core of OpenPGP standard / GnuPG.
|
||||||
|
|
||||||
GnuPG uses public-key cryptography so that users may communicate securely. In a public-key system, each user has a pair of keys consisting of a private key and a public key. **A user's private key is kept secret; it need **never be revealed. The public key may be given to anyone with whom the user wants to communicate**. GnuPG uses a somewhat more sophisticated scheme in which a user has a primary keypair and then zero or more additional subordinate keypairs. The primary and subordinate keypairs are bundled to facilitate key management and the bundle can often be considered simply as one keypair, or a keyring/keychain(which contains multiple sub key-pairs).
|
GnuPG uses public-key cryptography so that users may communicate securely. In a public-key system,
|
||||||
|
each user has a pair of keys consisting of a private key and a public key. **A user's private key is
|
||||||
|
kept secret; it need **never be revealed. The public key may be given to anyone with whom the user
|
||||||
|
wants to communicate\*\*. GnuPG uses a somewhat more sophisticated scheme in which a user has a
|
||||||
|
primary keypair and then zero or more additional subordinate keypairs. The primary and subordinate
|
||||||
|
keypairs are bundled to facilitate key management and the bundle can often be considered simply as
|
||||||
|
one keypair, or a keyring/keychain(which contains multiple sub key-pairs).
|
||||||
|
|
||||||
Let's generate a keypair interactively:
|
Let's generate a keypair interactively:
|
||||||
|
|
||||||
> Now in 2024, GnuPG 2.4.1 defaults to ECC algorithm (9) and Curve 25519 for ECC, which is morden and safe, I would recommend to use these defaults directly.
|
> Now in 2024, GnuPG 2.4.1 defaults to ECC algorithm (9) and Curve 25519 for ECC, which is morden
|
||||||
|
> and safe, I would recommend to use these defaults directly.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
gpg --full-gen-key
|
gpg --full-gen-key
|
||||||
```
|
```
|
||||||
|
|
||||||
This command will ask you for some algorithm related settings(ECC & Curve 25519), your personal info, and a strong passphrase to protect your PGP key. e.g.
|
This command will ask you for some algorithm related settings(ECC & Curve 25519), your personal
|
||||||
|
info, and a strong passphrase to protect your PGP key. e.g.
|
||||||
|
|
||||||
``` bash
|
```bash
|
||||||
› gpg --full-gen-key
|
› gpg --full-gen-key
|
||||||
gpg (GnuPG) 2.4.1; Copyright (C) 2023 g10 Code GmbH
|
gpg (GnuPG) 2.4.1; Copyright (C) 2023 g10 Code GmbH
|
||||||
This is free software: you are free to change and redistribute it.
|
This is free software: you are free to change and redistribute it.
|
||||||
@@ -131,9 +147,9 @@ Is this correct? (y/N) y
|
|||||||
|
|
||||||
GnuPG needs to construct a user ID to identify your key.
|
GnuPG needs to construct a user ID to identify your key.
|
||||||
|
|
||||||
Real name:
|
Real name:
|
||||||
Email address:
|
Email address:
|
||||||
Comment:
|
Comment:
|
||||||
You selected this USER-ID:
|
You selected this USER-ID:
|
||||||
"Ryan Yin (For pass For Work ssh only) <ryan4yin@linux.com>"
|
"Ryan Yin (For pass For Work ssh only) <ryan4yin@linux.com>"
|
||||||
|
|
||||||
@@ -163,7 +179,7 @@ sub cv25519 2024-01-09 [E] [expires: 2034-01-04]
|
|||||||
|
|
||||||
The generated keys are stored in `~/.gnupg` by default, the functions of each file are as follows:
|
The generated keys are stored in `~/.gnupg` by default, the functions of each file are as follows:
|
||||||
|
|
||||||
``` bash
|
```bash
|
||||||
› tree ~/.gnupg/
|
› tree ~/.gnupg/
|
||||||
/Users/ryan/.gnupg/
|
/Users/ryan/.gnupg/
|
||||||
|-- S.gpg-agent # socket file
|
|-- S.gpg-agent # socket file
|
||||||
@@ -185,28 +201,41 @@ The generated keys are stored in `~/.gnupg` by default, the functions of each fi
|
|||||||
4 directories, 12 files
|
4 directories, 12 files
|
||||||
```
|
```
|
||||||
|
|
||||||
The functions of most files are quite clear at a glance, but the `trustdb.gpg` in them is a bit difficult to understand. Here are the details: <https://www.gnupg.org/gph/en/manual/x334.html>
|
The functions of most files are quite clear at a glance, but the `trustdb.gpg` in them is a bit
|
||||||
|
difficult to understand. Here are the details: <https://www.gnupg.org/gph/en/manual/x334.html>
|
||||||
|
|
||||||
Home Manager will manage all the things in `~/.gnupg/` EXCEPT `~/.gnupg/openpgp-revocs.d/` and `~/.gnupg/private-keys-v1.d/`, which is expected.
|
Home Manager will manage all the things in `~/.gnupg/` EXCEPT `~/.gnupg/openpgp-revocs.d/` and
|
||||||
|
`~/.gnupg/private-keys-v1.d/`, which is expected.
|
||||||
|
|
||||||
### 3. Sub Key Generation & Best Practice
|
### 3. Sub Key Generation & Best Practice
|
||||||
|
|
||||||
In PGP, every keys has a **usage flag** to indicate its usage:
|
In PGP, every keys has a **usage flag** to indicate its usage:
|
||||||
|
|
||||||
- `C` means this key can be used to **Certify** other keys, which means this key can be used to **create/delete/revoke/modify** other keys.
|
- `C` means this key can be used to **Certify** other keys, which means this key can be used to
|
||||||
|
**create/delete/revoke/modify** other keys.
|
||||||
- `S` means this key can be used to **Sign** data.
|
- `S` means this key can be used to **Sign** data.
|
||||||
- `E` means this key can be used to **Encrypt** data.
|
- `E` means this key can be used to **Encrypt** data.
|
||||||
- `A` means this key can be used to **Authenticate** data with various non-GnuPG programs. The key can be used as e.g. an **SSH key**.
|
- `A` means this key can be used to **Authenticate** data with various non-GnuPG programs. The key
|
||||||
|
can be used as e.g. an **SSH key**.
|
||||||
|
|
||||||
The **best practice** is:
|
The **best practice** is:
|
||||||
|
|
||||||
1. Generate a primary key with strong cryptography arguments(such as ECC + Curve 25519).
|
1. Generate a primary key with strong cryptography arguments(such as ECC + Curve 25519).
|
||||||
2. Then generate 3 sub keys with `E`, `S` and `A` usage flag respectively.
|
2. Then generate 3 sub keys with `E`, `S` and `A` usage flag respectively.
|
||||||
3. **The Primary Key is extremely important**, Backup the primary key to somewhere absolutely safe(such as two encryptd USB drivers, keep them in different places), and then **delete it from your computer immediately**.
|
3. **The Primary Key is extremely important**, Backup the primary key to somewhere absolutely
|
||||||
4. The sub key is also important, but you can generate a new one and replace it easily. You can backup it to somewhere else, and import it to another machine to use your keypair.
|
safe(such as two encryptd USB drivers, keep them in different places), and then **delete it from
|
||||||
5. Backup your Primary key's revocation certificate to somewhere safe, it's the last way to rescure your safety if your primary key is compromised!
|
your computer immediately**.
|
||||||
1. It's a big problem if your revocation certificate is compromised, but not the bigest one. because it's only used to revoke your keypair, your data is still safe. But you should generate a new keypair and revoke the old one immediately.
|
4. The sub key is also important, but you can generate a new one and replace it easily. You can
|
||||||
1. It will be a big problem if your primary key is compromised, and you don't have a revocation certificate to revoke it. But since OpenPGP do not have a good way to distribute revocation certificate, even you have a revocation certificate, it's still hard to distribute it to others...
|
backup it to somewhere else, and import it to another machine to use your keypair.
|
||||||
|
5. Backup your Primary key's revocation certificate to somewhere safe, it's the last way to rescure
|
||||||
|
your safety if your primary key is compromised!
|
||||||
|
6. It's a big problem if your revocation certificate is compromised, but not the bigest one. because
|
||||||
|
it's only used to revoke your keypair, your data is still safe. But you should generate a new
|
||||||
|
keypair and revoke the old one immediately.
|
||||||
|
7. It will be a big problem if your primary key is compromised, and you don't have a revocation
|
||||||
|
certificate to revoke it. But since OpenPGP do not have a good way to distribute revocation
|
||||||
|
certificate, even you have a revocation certificate, it's still hard to distribute it to
|
||||||
|
others...
|
||||||
|
|
||||||
To keep your keypair safe, you should backup your keypair according to the following steps.
|
To keep your keypair safe, you should backup your keypair according to the following steps.
|
||||||
|
|
||||||
@@ -216,7 +245,7 @@ Now let's add the sub keys to the keypair we generated above:
|
|||||||
|
|
||||||
> GnuPG will ask you to input your passphrase to unlock your primary key.
|
> GnuPG will ask you to input your passphrase to unlock your primary key.
|
||||||
|
|
||||||
``` bash
|
```bash
|
||||||
› gpg --expert --edit-key ryan4yin@linux.com
|
› gpg --expert --edit-key ryan4yin@linux.com
|
||||||
gpg (GnuPG) 2.4.1; Copyright (C) 2023 g10 Code GmbH
|
gpg (GnuPG) 2.4.1; Copyright (C) 2023 g10 Code GmbH
|
||||||
This is free software: you are free to change and redistribute it.
|
This is free software: you are free to change and redistribute it.
|
||||||
@@ -380,7 +409,7 @@ ssb ed25519 2024-01-09 [A] [expires: 2034-01-04]
|
|||||||
› gpg --list-public-keys
|
› gpg --list-public-keys
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Backup & Restore
|
### 4. Backup & Restore
|
||||||
|
|
||||||
Export Public Keys(Both Primary Key & Sub Keys):
|
Export Public Keys(Both Primary Key & Sub Keys):
|
||||||
@@ -393,10 +422,12 @@ nix run nixpkgs#pgpdump ryan4yin-gpg-keys.pub
|
|||||||
|
|
||||||
Export Primary Key(The exported key is still encrypted by your passphrase):
|
Export Primary Key(The exported key is still encrypted by your passphrase):
|
||||||
|
|
||||||
> the `!` at the end of the key ID is to force GnuPG to export only the specified key, not the subkeys.
|
> the `!` at the end of the key ID is to force GnuPG to export only the specified key, not the
|
||||||
|
> subkeys.
|
||||||
|
|
||||||
> GnuPG will ask you to input your passphrase to unlock your keypair,
|
> GnuPG will ask you to input your passphrase to unlock your keypair, because GnuPG need to convert
|
||||||
> because GnuPG need to convert the secret key's format from its internal protection format to the one specified by the OpenPGP protocol.
|
> the secret key's format from its internal protection format to the one specified by the OpenPGP
|
||||||
|
> protocol.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# replace the key ID with your own sec key's ID
|
# replace the key ID with your own sec key's ID
|
||||||
@@ -416,16 +447,20 @@ Old: Secret Key Packet(tag 5)(134 bytes)
|
|||||||
Hash alg - SHA1(hash 2)
|
Hash alg - SHA1(hash 2)
|
||||||
Salt - 8c 78 58 c0 87 83 8c 2c
|
Salt - 8c 78 58 c0 87 83 8c 2c
|
||||||
Count - 65011712(coded count 255)
|
Count - 65011712(coded count 255)
|
||||||
IV - xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
IV - xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
|
||||||
Encrypted EdDSA x
|
Encrypted EdDSA x
|
||||||
Encrypted SHA1 hash
|
Encrypted SHA1 hash
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
As [Predictable, Passphrase-Derived PGP Keys][Predictable, Passphrase-Derived PGP Keys] says, we'll find that gpg ignored the `--s2k-count` option we specified when generating the keypair, and the `--s2k` related options we specified in `~/.gnupg/gpg.conf`,
|
As [Predictable, Passphrase-Derived PGP Keys][Predictable, Passphrase-Derived PGP Keys] says, we'll
|
||||||
the exported primary key is protectd by `SHA1` and `AES128`, which is not secure enough!
|
find that gpg ignored the `--s2k-count` option we specified when generating the keypair, and the
|
||||||
|
`--s2k` related options we specified in `~/.gnupg/gpg.conf`, the exported primary key is protectd by
|
||||||
|
`SHA1` and `AES128`, which is not secure enough!
|
||||||
|
|
||||||
So to increase the security of the exported primary key, we need to encrypt it again with a stronger algorithm, I choose `age` here(which use `scrypt` to encrypt the file key with a provided passphrase):
|
So to increase the security of the exported primary key, we need to encrypt it again with a stronger
|
||||||
|
algorithm, I choose `age` here(which use `scrypt` to encrypt the file key with a provided
|
||||||
|
passphrase):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# for simplicity, use the same passphrase as your gpg keypair here
|
# for simplicity, use the same passphrase as your gpg keypair here
|
||||||
@@ -446,11 +481,14 @@ age --passphrase -o ryan4yin-gpg-subkeys.priv.age ryan4yin-gpg-subkeys.priv
|
|||||||
rm ryan4yin-gpg-subkeys.priv
|
rm ryan4yin-gpg-subkeys.priv
|
||||||
```
|
```
|
||||||
|
|
||||||
Your can import the exported Private Key via `gpg --import <keyfile>` to restore it, but you need to decrypt it via age first.
|
Your can import the exported Private Key via `gpg --import <keyfile>` to restore it, but you need to
|
||||||
|
decrypt it via age first.
|
||||||
|
|
||||||
As for Public Keys, please import your publicKeys via Home Manager's `programs.gpg.publicKeys` option, DO NOT import it manually(via `gpg --import <keyfile>`).
|
As for Public Keys, please import your publicKeys via Home Manager's `programs.gpg.publicKeys`
|
||||||
|
option, DO NOT import it manually(via `gpg --import <keyfile>`).
|
||||||
|
|
||||||
To ensure security, delete the master key and revoke the certificate immediately after the backup is completed:
|
To ensure security, delete the master key and revoke the certificate immediately after the backup is
|
||||||
|
completed:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# delete the primary key and all its sub keys
|
# delete the primary key and all its sub keys
|
||||||
@@ -522,7 +560,8 @@ gpg --decrypt <file>
|
|||||||
gpg -d <file>
|
gpg -d <file>
|
||||||
```
|
```
|
||||||
|
|
||||||
If you just want to encrypt/decrypt a file quickly, you can use `age` with a passphrase, `gpg` can also do this, but it's not recommended(as age(scrypt)'s more secure):
|
If you just want to encrypt/decrypt a file quickly, you can use `age` with a passphrase, `gpg` can
|
||||||
|
also do this, but it's not recommended(as age(scrypt)'s more secure):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Encrypt a file via symmetric encryption(AES256), and output cleartext.
|
# Encrypt a file via symmetric encryption(AES256), and output cleartext.
|
||||||
@@ -538,27 +577,41 @@ gpg -d <file>
|
|||||||
|
|
||||||
### 7. Public Key Exchange & Revocation
|
### 7. Public Key Exchange & Revocation
|
||||||
|
|
||||||
In the case of many users, it is very difficult to exchange public keys securely and reliably with each other.
|
In the case of many users, it is very difficult to exchange public keys securely and reliably with
|
||||||
In the Web world, There is a **Chain of Trust**** to resolve this problem:
|
each other. In the Web world, There is a **Chain of Trust\*\*** to resolve this problem:
|
||||||
|
|
||||||
- A Certificate Authority(CA) is responsible to verify & sign all the certificate signing request.
|
- A Certificate Authority(CA) is responsible to verify & sign all the certificate signing request.
|
||||||
- Web Server can safely transmit its Web Certificate to the client via TLS protocol.
|
- Web Server can safely transmit its Web Certificate to the client via TLS protocol.
|
||||||
- Client can verify the recevied Web Certificate via the CA's root certificate(which is built in Browser/OS).
|
- Client can verify the received Web Certificate via the CA's root certificate(which is built in
|
||||||
|
Browser/OS).
|
||||||
|
|
||||||
But in OpenPGP:
|
But in OpenPGP:
|
||||||
|
|
||||||
- There is key servers to distribute(exchange) public keys, but it **do not verify the identity of the key owner**, and any uploaded data is **not allowed to be deleted**. Which make it **insecure and dangerous**.
|
- There is key servers to distribute(exchange) public keys, but it **do not verify the identity of
|
||||||
|
the key owner**, and any uploaded data is **not allowed to be deleted**. Which make it **insecure
|
||||||
|
and dangerous**.
|
||||||
- Why key server is dangerous?
|
- Why key server is dangerous?
|
||||||
- Many PGP novices follow various tutorials to upload various key with personal privacy (such as real names) to the public key server, and then find that they can't delete them, which is very embarrassing.
|
- Many PGP novices follow various tutorials to upload various key with personal privacy (such as
|
||||||
- Anyone can upload a key to the key server, and claim that it is the key of a certain person(such as Linus), which is very insecure.
|
real names) to the public key server, and then find that they can't delete them, which is very
|
||||||
|
embarrassing.
|
||||||
|
- Anyone can upload a key to the key server, and claim that it is the key of a certain
|
||||||
|
person(such as Linus), which is very insecure.
|
||||||
- **key server** is not recommend to use.
|
- **key server** is not recommend to use.
|
||||||
- GnuPG will generate revocation certificate when generating keypair(`~/.gnupg/private-keys-v1.d/<Key-ID.rev>`), anyone can import this certificate to revoke the keypair. But OpenPGP standard **DO NOT provide a way to distribute this certificate to others**.
|
- GnuPG will generate revocation certificate when generating
|
||||||
|
keypair(`~/.gnupg/private-keys-v1.d/<Key-ID.rev>`), anyone can import this certificate to revoke
|
||||||
|
the keypair. But OpenPGP standard **DO NOT provide a way to distribute this certificate to
|
||||||
|
others**.
|
||||||
- Not to mention some key status query protocol like OCSP in Web PKI.
|
- Not to mention some key status query protocol like OCSP in Web PKI.
|
||||||
- Users has to pulish their revocation certificate to their blog, github profile or somewhere else, and others has to check it and run `gpg --import <revocation-certificate>` to revoke the keypair manually.
|
- Users has to pulish their revocation certificate to their blog, github profile or somewhere
|
||||||
|
else, and others has to check it and run `gpg --import <revocation-certificate>` to revoke the
|
||||||
|
keypair manually.
|
||||||
|
|
||||||
In summary, **there is no good way to distribute public keys and revoke them in OpenPGP**, which is a big problem.
|
In summary, **there is no good way to distribute public keys and revoke them in OpenPGP**, which is
|
||||||
|
a big problem.
|
||||||
|
|
||||||
Currently, You have to distribute your public key or revocation certificate via your blog, github profile, or somewhere else, and others has to check it and run `gpg --import` to import your public key or revocation certificate manually.
|
Currently, You have to distribute your public key or revocation certificate via your blog, github
|
||||||
|
profile, or somewhere else, and others has to check it and run `gpg --import` to import your public
|
||||||
|
key or revocation certificate manually.
|
||||||
|
|
||||||
Anyway, let's try to revoke a keypair:
|
Anyway, let's try to revoke a keypair:
|
||||||
|
|
||||||
@@ -615,7 +668,8 @@ STuJCp+gru6OtbTCu8Y2LugQeDh7UicM7Ak=
|
|||||||
-----END PGP PUBLIC KEY BLOCK-----
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
```
|
```
|
||||||
|
|
||||||
As the revocation certificate says, we need to remove the first colon(`:`) before the 5 dashes(`-----BEGIN PGP PUBLIC KEY BLOCK-----`), then import it:
|
As the revocation certificate says, we need to remove the first colon(`:`) before the 5
|
||||||
|
dashes(`-----BEGIN PGP PUBLIC KEY BLOCK-----`), then import it:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
› gpg --import gpg-test-revoke.rev
|
› gpg --import gpg-test-revoke.rev
|
||||||
@@ -646,7 +700,8 @@ gpg: 9E78E897B6490D6B: skipped: Unusable public key
|
|||||||
gpg: README.md: encryption failed: Unusable public key
|
gpg: README.md: encryption failed: Unusable public key
|
||||||
```
|
```
|
||||||
|
|
||||||
But if you delete the `trustdb.gpg` and `pubring.kbx`, then import the revoked public key again, it will be valid and usable again... which is very dangerous.
|
But if you delete the `trustdb.gpg` and `pubring.kbx`, then import the revoked public key again, it
|
||||||
|
will be valid and usable again... which is very dangerous.
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
@@ -654,7 +709,8 @@ But if you delete the `trustdb.gpg` and `pubring.kbx`, then import the revoked p
|
|||||||
- [Predictable, Passphrase-Derived PGP Keys][Predictable, Passphrase-Derived PGP Keys]
|
- [Predictable, Passphrase-Derived PGP Keys][Predictable, Passphrase-Derived PGP Keys]
|
||||||
- [OpenPGP - The almost perfect key pair][OpenPGP - The almost perfect key pair]
|
- [OpenPGP - The almost perfect key pair][OpenPGP - The almost perfect key pair]
|
||||||
|
|
||||||
[2021年,用更现代的方法使用PGP(上)]: https://ulyc.github.io/2021/01/13/2021%E5%B9%B4-%E7%94%A8%E6%9B%B4%E7%8E%B0%E4%BB%A3%E7%9A%84%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8PGP-%E4%B8%8A/
|
[2021年,用更现代的方法使用PGP(上)]:
|
||||||
|
https://ulyc.github.io/2021/01/13/2021%E5%B9%B4-%E7%94%A8%E6%9B%B4%E7%8E%B0%E4%BB%A3%E7%9A%84%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8PGP-%E4%B8%8A/
|
||||||
[Predictable, Passphrase-Derived PGP Keys]: https://nullprogram.com/blog/2019/07/10/
|
[Predictable, Passphrase-Derived PGP Keys]: https://nullprogram.com/blog/2019/07/10/
|
||||||
[OpenPGP - The almost perfect key pair]: https://blog.eleven-labs.com/en/openpgp-almost-perfect-key-pair-part-1/
|
[OpenPGP - The almost perfect key pair]:
|
||||||
|
https://blog.eleven-labs.com/en/openpgp-almost-perfect-key-pair-part-1/
|
||||||
|
|||||||
@@ -16,32 +16,31 @@ To ensure security, we should change the GPG key every two or three years. Here
|
|||||||
3. Update `./default.nix` to use the new GPG sub keys.
|
3. Update `./default.nix` to use the new GPG sub keys.
|
||||||
4. Check which Key `pass` currently uses:
|
4. Check which Key `pass` currently uses:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/.local/share/password-store/
|
cd ~/.local/share/password-store/
|
||||||
# check which key is used by pass
|
# check which key is used by pass
|
||||||
cat .gpg-id
|
cat .gpg-id
|
||||||
# check which key is really used to encrypt the password
|
# check which key is really used to encrypt the password
|
||||||
gpg --list-packets path/to/any/password.gpg
|
gpg --list-packets path/to/any/password.gpg
|
||||||
```
|
```
|
||||||
4. Change the key used by `pass`:
|
|
||||||
```bash
|
|
||||||
# change the key used by pass, see `man pass` for more details
|
|
||||||
# you will be asked to enter the password of both the new and old keys
|
|
||||||
# then pass will re-encrypt all the passwords with the new key
|
|
||||||
pass init <new-key-id>
|
|
||||||
```
|
|
||||||
5. Check if the key is changed:
|
|
||||||
```bash
|
|
||||||
# check which key is used by pass
|
|
||||||
cat .gpg-id
|
|
||||||
# check which key is really used to encrypt the password
|
|
||||||
gpg --list-packets path/to/any/password.gpg
|
|
||||||
```
|
|
||||||
6. Delete the old GPG key pair:
|
|
||||||
```bash
|
|
||||||
# delete the old key pair
|
|
||||||
gpg --delete-secret-keys <old-key-id>
|
|
||||||
gpg --delete-keys <old-key-id>
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
5. Change the key used by `pass`:
|
||||||
|
```bash
|
||||||
|
# change the key used by pass, see `man pass` for more details
|
||||||
|
# you will be asked to enter the password of both the new and old keys
|
||||||
|
# then pass will re-encrypt all the passwords with the new key
|
||||||
|
pass init <new-key-id>
|
||||||
|
```
|
||||||
|
6. Check if the key is changed:
|
||||||
|
```bash
|
||||||
|
# check which key is used by pass
|
||||||
|
cat .gpg-id
|
||||||
|
# check which key is really used to encrypt the password
|
||||||
|
gpg --list-packets path/to/any/password.gpg
|
||||||
|
```
|
||||||
|
7. Delete the old GPG key pair:
|
||||||
|
```bash
|
||||||
|
# delete the old key pair
|
||||||
|
gpg --delete-secret-keys <old-key-id>
|
||||||
|
gpg --delete-keys <old-key-id>
|
||||||
|
```
|
||||||
|
|||||||
@@ -1,32 +1,39 @@
|
|||||||
# Zellij - A workspace lives in your terminal
|
# Zellij - A workspace lives in your terminal
|
||||||
|
|
||||||
Zellij is a terminal workspace with batteries included.
|
Zellij is a terminal workspace with batteries included. At its core, it is a terminal multiplexer
|
||||||
At its core, it is a terminal multiplexer (similar to tmux and screen), but this is merely its infrastructure layer.
|
(similar to tmux and screen), but this is merely its infrastructure layer.
|
||||||
|
|
||||||
Zellij is very user-friendly and easy to use, with a step-by-step hint system that will help you get to know the keybindings, which is very like the Neovim or helix.
|
Zellij is very user-friendly and easy to use, with a step-by-step hint system that will help you get
|
||||||
|
to know the keybindings, which is very like the Neovim or helix.
|
||||||
|
|
||||||
> By contrast, tmux's key design is counterintuitive, there is no prompt system, and the plug-in performance is rubbish. It's really a pain to use.
|
> By contrast, tmux's key design is counterintuitive, there is no prompt system, and the plug-in
|
||||||
> tmux's inital release was in 2007, it's too old, I would recommend any users that do not have a experience with multiplexer to use zellij instead of tmux.
|
> performance is rubbish. It's really a pain to use. tmux's initial release was in 2007, it's too
|
||||||
|
> old, I would recommend any users that do not have a experience with multiplexer to use zellij
|
||||||
|
> instead of tmux.
|
||||||
|
|
||||||
## Why use zellij as the detault terminal environment?
|
## Why use zellij as the default terminal environment?
|
||||||
|
|
||||||
By auto start zellij on shell login, and exit the shell session on zellij exit, we can use zellij as the default terminal environment.
|
By auto start zellij on shell login, and exit the shell session on zellij exit, we can use zellij as
|
||||||
|
the default terminal environment.
|
||||||
|
|
||||||
By this way, We will only use the most basic features of the terminal emulator(kitty/alacritty/wezterm/...),
|
By this way, We will only use the most basic features of the terminal
|
||||||
while most of the functions of terminal are provided by zellij.
|
emulator(kitty/alacritty/wezterm/...), while most of the functions of terminal are provided by
|
||||||
Thus we can easily switch to any terminal emulator without losing any key functions,
|
zellij. Thus we can easily switch to any terminal emulator without losing any key functions, and do
|
||||||
and do not need to take care of the differences between different terminal emulators.
|
not need to take care of the differences between different terminal emulators.
|
||||||
|
|
||||||
And Zellij can be used not only locally, but also on any remote server, which is very convenient. Learn once and use everywhere!
|
And Zellij can be used not only locally, but also on any remote server, which is very convenient.
|
||||||
|
Learn once and use everywhere!
|
||||||
|
|
||||||
> Yeah, you didn't misread it, zellij is very suitable for not only remotely, but also locally!
|
> Yeah, you didn't misread it, zellij is very suitable for not only remotely, but also locally!
|
||||||
|
|
||||||
Some features such as search/copy/scrollback in different terminal emulators are implemented in different ways, and has different user experience.
|
Some features such as search/copy/scrollback in different terminal emulators are implemented in
|
||||||
For example, Wezterm's default search function is very basic, and it's not easy to use. Kitty's scrollback search/copy is really tricky to use.
|
different ways, and has different user experience. For example, Wezterm's default search function is
|
||||||
As for some Editor such as Neovim, its intergrated terminal is really useful, but zellij is more powerful and useful than it, and more stable!
|
very basic, and it's not easy to use. Kitty's scrollback search/copy is really tricky to use. As for
|
||||||
Zellij overcomes these problems, and provides a unified user experience for all terminal emulators!
|
some Editor such as Neovim, its integrated terminal is really useful, but zellij is more powerful
|
||||||
|
and useful than it, and more stable! Zellij overcomes these problems, and provides a unified user
|
||||||
|
experience for all terminal emulators!
|
||||||
|
|
||||||
Teminal emulators should only be responsible for displaying characters.
|
Terminal emulators should only be responsible for displaying characters.
|
||||||
|
|
||||||
## Passthrough mode(Lock Mode)
|
## Passthrough mode(Lock Mode)
|
||||||
|
|
||||||
@@ -34,6 +41,7 @@ Teminal emulators should only be responsible for displaying characters.
|
|||||||
|
|
||||||
It's extremely useful when you want to:
|
It's extremely useful when you want to:
|
||||||
|
|
||||||
1. Use zellij locally for daily work, and use a remote zellij via ssh to do some work on the remote server.
|
1. Use zellij locally for daily work, and use a remote zellij via ssh to do some work on the remote
|
||||||
1. To avoid the key conflicts between zellij and the program running in the terminal, such as vim, tmux, etc.
|
server.
|
||||||
|
1. To avoid the key conflicts between zellij and the program running in the terminal, such as vim,
|
||||||
|
tmux, etc.
|
||||||
|
|||||||
@@ -4,4 +4,3 @@
|
|||||||
2. `shell.nix`: shell related.
|
2. `shell.nix`: shell related.
|
||||||
3. `rime-squirrel.nix`: [rime-squirrel](https://github.com/rime/squirrel)'s configuration.
|
3. `rime-squirrel.nix`: [rime-squirrel](https://github.com/rime/squirrel)'s configuration.
|
||||||
4. `default.nix`: the entrypoint of darwin's configuration, it import all the submodules above.
|
4. `default.nix`: the entrypoint of darwin's configuration, it import all the submodules above.
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
{myvars, ...}: {
|
|
||||||
home.homeDirectory = "/Users/${myvars.username}";
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
{mylib, ...}: {
|
{
|
||||||
|
mylib,
|
||||||
|
myvars,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
home.homeDirectory = "/Users/${myvars.username}";
|
||||||
imports =
|
imports =
|
||||||
(mylib.scanPaths ./.)
|
(mylib.scanPaths ./.)
|
||||||
++ [
|
++ [
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
1. `base`: The base module that is suitable for any NixOS environment.
|
1. `base`: The base module that is suitable for any NixOS environment.
|
||||||
2. `desktop`: Configuration for desktop environments, such as Hyprland, I3, etc.
|
2. `desktop`: Configuration for desktop environments, such as Hyprland, I3, etc.
|
||||||
6. `server.nix`: Configuration which is suitable for both servers and desktops. It import only `base` as its submodule.
|
3. `server.nix`: Configuration which is suitable for both servers and desktops. It import only
|
||||||
1. used by all my nixos servers.
|
`base` as its submodule.
|
||||||
7. `desktop.nix`: the entrypoint of desktop's configuration, it import both `base` and `desktop` as its submodules.
|
1. used by all my nixos servers.
|
||||||
1. used by all my nixos desktops.
|
4. `desktop.nix`: the entrypoint of desktop's configuration, it import both `base` and `desktop` as
|
||||||
|
its submodules.
|
||||||
|
1. used by all my nixos desktops.
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
# misc
|
# misc
|
||||||
libnotify
|
libnotify
|
||||||
wireguard-tools # manage wireguard vpn manually, via wg-quick
|
wireguard-tools # manage wireguard vpn manually, via wg-quick
|
||||||
|
|
||||||
|
ventoy # create bootable usb
|
||||||
|
virt-viewer # vnc connect to VM, used by kubevirt
|
||||||
];
|
];
|
||||||
|
|
||||||
# auto mount usb drives
|
# auto mount usb drives
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# Desktop Related
|
|
||||||
|
|
||||||
|
|
||||||
3. `base`: all common configurations for all desktops.
|
|
||||||
4. `hyprland`: Hyprland's configuration.
|
|
||||||
5. `i3`: i3's configuration.
|
|
||||||
|
|
||||||
|
|
||||||
## Why install I3/Hyprland in Home Manager instead of a NixOS Module?
|
|
||||||
|
|
||||||
1. I3 & Hyprland's configuration file is located in `~/.config`, which can be easily managed by Home Manager.
|
|
||||||
2. I have many user-specific systemd servcies, such gammastep, wallpaper-switcher, etc. Which can be easily managed by Home Manager, but if we add i3/hyprland in a NixOS Module, those user-level services may failed to start automatically. With i3/hyprland in a Home Manager Module, we can control their systemd service's dependent order more easily, so we can avoid issues like this.
|
|
||||||
3. By install packages as less as possible in NixOS Module, we can:
|
|
||||||
1. Make the NixOS system more secure and stable.
|
|
||||||
2. Make this flake more portable to other non-NixOS systems, as home-manager can be installed on any Linux system.
|
|
||||||
|
|
||||||
@@ -1,207 +0,0 @@
|
|||||||
{
|
|
||||||
"position": "top",
|
|
||||||
"layer": "top",
|
|
||||||
|
|
||||||
"modules-left": [
|
|
||||||
"custom/launcher",
|
|
||||||
"temperature",
|
|
||||||
"backlight",
|
|
||||||
"hyprland/workspaces"
|
|
||||||
],
|
|
||||||
"modules-center": [
|
|
||||||
"custom/playerctl"
|
|
||||||
],
|
|
||||||
"modules-right": [
|
|
||||||
"mpd",
|
|
||||||
"pulseaudio",
|
|
||||||
"battery",
|
|
||||||
"memory",
|
|
||||||
"cpu",
|
|
||||||
"network",
|
|
||||||
"clock",
|
|
||||||
"idle_inhibitor",
|
|
||||||
"custom/powermenu",
|
|
||||||
"tray"
|
|
||||||
],
|
|
||||||
"hyprland/workspaces": {
|
|
||||||
"format": "{icon}",
|
|
||||||
"on-click": "activate",
|
|
||||||
"format-icons": {
|
|
||||||
"1": "",
|
|
||||||
"2": "",
|
|
||||||
"3": "",
|
|
||||||
"4": "",
|
|
||||||
"5": "",
|
|
||||||
"6": "",
|
|
||||||
"7": "",
|
|
||||||
"8": "",
|
|
||||||
"9": "",
|
|
||||||
"10": "〇",
|
|
||||||
"focused": "",
|
|
||||||
"default": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"clock": {
|
|
||||||
"interval": 60,
|
|
||||||
"align": 0,
|
|
||||||
"rotate": 0,
|
|
||||||
"tooltip-format": "<big>{:%B %Y}</big>\n<tt><small>{calendar}</small></tt>",
|
|
||||||
"format": " {:%H:%M}",
|
|
||||||
"format-alt": " {:%a %b %d, %G}"
|
|
||||||
},
|
|
||||||
"cpu": {
|
|
||||||
"format": "\udb80\udf5b {usage}%",
|
|
||||||
"interval": 1,
|
|
||||||
"on-click-middle": "kitty btop",
|
|
||||||
"on-click-right": "kitty btop"
|
|
||||||
},
|
|
||||||
"custom/launcher": {
|
|
||||||
"format": "\uf313 ",
|
|
||||||
"on-click": "$HOME/.config/hypr/scripts/menu",
|
|
||||||
"on-click-middle": "exec default_wall",
|
|
||||||
"on-click-right": "exec wallpaper_random",
|
|
||||||
"tooltip": false
|
|
||||||
},
|
|
||||||
"custom/powermenu": {
|
|
||||||
"format": "\uf011",
|
|
||||||
"on-click": "$HOME/.config/hypr/scripts/wlogout",
|
|
||||||
"tooltip": false
|
|
||||||
},
|
|
||||||
"idle_inhibitor": {
|
|
||||||
"format": "{icon}",
|
|
||||||
"format-icons": {
|
|
||||||
"activated": "\uf06e",
|
|
||||||
"deactivated": "\uf070"
|
|
||||||
},
|
|
||||||
"tooltip": false
|
|
||||||
},
|
|
||||||
"memory": {
|
|
||||||
"format": "\udb83\udee0 {percentage}%",
|
|
||||||
"interval": 1,
|
|
||||||
"states": {
|
|
||||||
"warning": 85
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mpd": {
|
|
||||||
"interval": 2,
|
|
||||||
"unknown-tag": "N/A",
|
|
||||||
"format": "{stateIcon} {artist} - {title}",
|
|
||||||
"format-disconnected": " Disconnected",
|
|
||||||
"format-paused": "{stateIcon} {artist} - {title}",
|
|
||||||
"format-stopped": "Stopped ",
|
|
||||||
"state-icons": {
|
|
||||||
"paused": "",
|
|
||||||
"playing": ""
|
|
||||||
},
|
|
||||||
"tooltip-format": "MPD (connected)",
|
|
||||||
"tooltip-format-disconnected": "MPD (disconnected)",
|
|
||||||
// Commands to execute on events
|
|
||||||
"on-click": "mpc toggle",
|
|
||||||
"on-click-middle": "mpc prev",
|
|
||||||
"on-click-right": "mpc next",
|
|
||||||
"on-update": "",
|
|
||||||
"on-scroll-up": "mpc seek +00:00:01",
|
|
||||||
"on-scroll-down": "mpc seek -00:00:01",
|
|
||||||
"smooth-scrolling-threshold": 1
|
|
||||||
},
|
|
||||||
"custom/playerctl": {
|
|
||||||
"format": "{icon} <span>{}</span>",
|
|
||||||
"return-type": "json",
|
|
||||||
"max-length": 55,
|
|
||||||
"exec": "playerctl -a metadata --format '{\"text\": \" {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F",
|
|
||||||
"on-click-middle": "playerctl previous",
|
|
||||||
"on-click": "playerctl play-pause",
|
|
||||||
"on-click-right": "playerctl next",
|
|
||||||
"format-icons": {
|
|
||||||
"Paused": "<span foreground='#6dd9d9'></span>",
|
|
||||||
"Playing": "<span foreground='#82db97'></span>"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"network": {
|
|
||||||
"interval": 5,
|
|
||||||
//"interface": "wlan*", // (Optional) To force the use of this interface, set it for netspeed to work
|
|
||||||
"format-wifi": " {essid}",
|
|
||||||
"format-ethernet": " {ipaddr}/{cidr}",
|
|
||||||
"format-linked": " {ifname} (No IP)",
|
|
||||||
"format-disconnected": "睊 Disconnected",
|
|
||||||
"format-disabled": "睊 Disabled",
|
|
||||||
"format-alt": " {bandwidthUpBytes} | {bandwidthDownBytes}",
|
|
||||||
"tooltip-format": " {ifname} via {gwaddr}",
|
|
||||||
"on-click-middle": "nm-connection-editor",
|
|
||||||
"on-click-right": "kitty nmtui"
|
|
||||||
},
|
|
||||||
"pulseaudio": {
|
|
||||||
//"format": "{volume}% {icon} {format_source}",
|
|
||||||
"format": "{icon} {volume}%",
|
|
||||||
"format-muted": " Mute",
|
|
||||||
"format-bluetooth": " {volume}% {format_source}",
|
|
||||||
"format-bluetooth-muted": " Mute",
|
|
||||||
"format-source": " {volume}%",
|
|
||||||
"format-source-muted": "",
|
|
||||||
"format-icons": {
|
|
||||||
"headphone": "",
|
|
||||||
"hands-free": "",
|
|
||||||
"headset": "",
|
|
||||||
"phone": "",
|
|
||||||
"portable": "",
|
|
||||||
"car": "",
|
|
||||||
"default": [
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"scroll-step": 5.0,
|
|
||||||
// Commands to execute on events
|
|
||||||
"on-click": "amixer set Master toggle",
|
|
||||||
"on-click-right": "pavucontrol",
|
|
||||||
"smooth-scrolling-threshold": 1,
|
|
||||||
},
|
|
||||||
"temperature": {
|
|
||||||
"format": "\uf2c9 {temperatureC}\u00b0C",
|
|
||||||
"tooltip": false
|
|
||||||
},
|
|
||||||
"backlight": {
|
|
||||||
"format": "{icon} {percent}%",
|
|
||||||
"format-icons": [
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"tray": {
|
|
||||||
"icon-size": 15,
|
|
||||||
"spacing": 5
|
|
||||||
},
|
|
||||||
"battery": {
|
|
||||||
"bat": "BAT0",
|
|
||||||
"adapter": "ADP0",
|
|
||||||
"interval": 60,
|
|
||||||
"states": {
|
|
||||||
"warning": 30,
|
|
||||||
"critical": 15
|
|
||||||
},
|
|
||||||
"max-length": 20,
|
|
||||||
"format": "{icon} {capacity}%",
|
|
||||||
"format-warning": "{icon} {capacity}%",
|
|
||||||
"format-critical": "{icon} {capacity}%",
|
|
||||||
"format-charging": "<span font-family='Font Awesome 6 Free'></span> {capacity}%",
|
|
||||||
"format-plugged": " {capacity}%",
|
|
||||||
"format-alt": "{icon} {time}",
|
|
||||||
"format-full": " {capacity}%",
|
|
||||||
"format-icons": [
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" "
|
|
||||||
]
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
/** ********** Fonts ********** **/
|
|
||||||
* {
|
|
||||||
font-family: "JetBrains Mono", "Iosevka Nerd Font", sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** ********** Main Window ********** **/
|
|
||||||
window {
|
|
||||||
background-color: #1E1E2E;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** ********** Buttons ********** **/
|
|
||||||
button {
|
|
||||||
background-color: #242434;
|
|
||||||
color: #FFFFFF;
|
|
||||||
border: 2px solid #282838;
|
|
||||||
border-radius: 20px;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
background-size: 35%;
|
|
||||||
}
|
|
||||||
|
|
||||||
button:focus, button:active, button:hover {
|
|
||||||
background-color: #89B4FA;
|
|
||||||
outline-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** ********** Icons ********** **/
|
|
||||||
#lock {
|
|
||||||
background-image: image(url("icons/lock.png"), url("/usr/share/wlogout/icons/lock.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#logout {
|
|
||||||
background-image: image(url("icons/logout.png"), url("/usr/share/wlogout/icons/logout.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#suspend {
|
|
||||||
background-image: image(url("icons/suspend.png"), url("/usr/share/wlogout/icons/suspend.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#hibernate {
|
|
||||||
background-image: image(url("icons/hibernate.png"), url("/usr/share/wlogout/icons/hibernate.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#shutdown {
|
|
||||||
background-image: image(url("icons/shutdown.png"), url("/usr/share/wlogout/icons/shutdown.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#reboot {
|
|
||||||
background-image: image(url("icons/reboot.png"), url("/usr/share/wlogout/icons/reboot.png"));
|
|
||||||
}
|
|
||||||
+1
-1
@@ -6,6 +6,6 @@
|
|||||||
../base/home.nix
|
../base/home.nix
|
||||||
|
|
||||||
./base
|
./base
|
||||||
./desktop
|
./gui
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# Desktop Related
|
||||||
|
|
||||||
|
3. `base`: all common configurations for all desktops.
|
||||||
|
4. `hyprland`: Hyprland's configuration.
|
||||||
|
5. `i3`: i3's configuration.
|
||||||
|
|
||||||
|
## Why install I3/Hyprland in Home Manager instead of a NixOS Module?
|
||||||
|
|
||||||
|
1. I3 & Hyprland's configuration file is located in `~/.config`, which can be easily managed by Home
|
||||||
|
Manager.
|
||||||
|
2. I have many user-specific systemd services, such gammastep, wallpaper-switcher, etc. Which can be
|
||||||
|
easily managed by Home Manager, but if we add i3/hyprland in a NixOS Module, those user-level
|
||||||
|
services may failed to start automatically. With i3/hyprland in a Home Manager Module, we can
|
||||||
|
control their systemd service's dependent order more easily, so we can avoid issues like this.
|
||||||
|
3. By install packages as less as possible in NixOS Module, we can:
|
||||||
|
1. Make the NixOS system more secure and stable.
|
||||||
|
2. Make this flake more portable to other non-NixOS systems, as home-manager can be installed on
|
||||||
|
any Linux system.
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
pkgs-unstable,
|
pkgs-unstable,
|
||||||
pkgs-stable,
|
# pkgs-stable,
|
||||||
nur-ryan4yin,
|
nur-ryan4yin,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
# kicad # 3d printing, eletrical engineering
|
# kicad # 3d printing, eletrical engineering
|
||||||
|
|
||||||
# fpga
|
# fpga
|
||||||
pkgs-unstable.python311Packages.apycula # gowin fpga
|
pkgs-unstable.python312Packages.apycula # gowin fpga
|
||||||
pkgs-unstable.yosys # fpga synthesis
|
pkgs-unstable.yosys # fpga synthesis
|
||||||
pkgs-unstable.nextpnr # fpga place and route
|
pkgs-unstable.nextpnr # fpga place and route
|
||||||
pkgs-unstable.openfpgaloader # fpga programming
|
pkgs-unstable.openfpgaloader # fpga programming
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
# live streaming
|
# live streaming
|
||||||
obs-studio = {
|
obs-studio = {
|
||||||
enable = true;
|
enable = true;
|
||||||
plugins = with pkgs-stable.obs-studio-plugins; [
|
plugins = with pkgs.obs-studio-plugins; [
|
||||||
# screen capture
|
# screen capture
|
||||||
wlrobs
|
wlrobs
|
||||||
# obs-ndi
|
# obs-ndi
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user