Compare commits
361 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 51bea5b6ac | |||
| 7c286099b6 | |||
| c2512dc7d9 | |||
| 6a12b600a1 | |||
| 26f4f86ad8 | |||
| 495ed3f938 | |||
| ce49423247 | |||
| 3d4a2d4879 | |||
| c56690d09e | |||
| 86161aeb0c | |||
| 81bc4f64f6 | |||
| d3a2c49822 | |||
| 788f3ecd0c | |||
| 08d64425de | |||
| 762896ddb9 | |||
| 93c7507874 | |||
| a80bb7bd63 | |||
| 8053a2cb8e | |||
| f4697b5eca | |||
| 6ee2cb48cb | |||
| 5f87926bd6 | |||
| b053027899 | |||
| 9febf86f71 | |||
| 93a399e498 | |||
| d34debd3d3 | |||
| 0920e8b567 | |||
| 74a9106917 | |||
| bf1e77e88f | |||
| 07b4f981d1 | |||
| 7731b1f8af | |||
| 4ceec21c14 | |||
| 3bde6d23d9 | |||
| 5d7360294a | |||
| a29f6a2eda | |||
| ae9c127b5c | |||
| 77ca37eab1 | |||
| 306741c2a7 | |||
| 4098b0282e | |||
| 3a6a75c703 | |||
| 319cf87196 | |||
| c3ed6aa4e8 | |||
| c8e76ceff8 | |||
| 04818c5d50 | |||
| fb1d8118e3 | |||
| 551020e0e8 | |||
| 6cfc3c3154 | |||
| addf85e3b4 | |||
| 67c4aa8c7c | |||
| 910b9f322d | |||
| 6885c48513 | |||
| 05bcbab429 | |||
| 63bdadbda2 | |||
| f398c44307 | |||
| d2590d3653 | |||
| 8033e0c61f | |||
| 895ca585be | |||
| 87b2965e1f | |||
| f373f5ee5b | |||
| 914239487c | |||
| f77637d0c0 | |||
| c681e984a0 | |||
| 4fd5c4c374 | |||
| 8207ccbdff | |||
| cf7b5a5be7 | |||
| 8b4e922e5b | |||
| 7f6759ce06 | |||
| 0d569116d2 | |||
| 59f194f05b | |||
| 680e894fb2 | |||
| 73567c3e0d | |||
| ee3e35872a | |||
| d02f3dd7d3 | |||
| 7650a77193 | |||
| 59608f38db | |||
| 3283e990b2 | |||
| df3805c0d4 | |||
| 6c8469bb42 | |||
| f5444150ef | |||
| f26424a344 | |||
| 54d1d559a0 | |||
| 84ab80c752 | |||
| d72bc84265 | |||
| 73363d5ca8 | |||
| 0c23a823c6 | |||
| 6a03dddcbd | |||
| 4db8d0d2cb | |||
| 64a5b6fedd | |||
| 325496cfb3 | |||
| 1992c52352 | |||
| afce99cf38 | |||
| 7576007eb9 | |||
| 3e3365f51f | |||
| be9be72aff | |||
| 2f777ff38f | |||
| b143a89443 | |||
| 94e4598681 | |||
| ce99c3e2d3 | |||
| 4b5a7b1be7 | |||
| f6aa45aa00 | |||
| 3dbc94c3de | |||
| 424b000ab5 | |||
| e38d1936ca | |||
| b9c76b8f22 | |||
| 193b5f3558 | |||
| 023d3fd4e9 | |||
| 57a868228c | |||
| cface0caba | |||
| 28a4fb9a26 | |||
| 74c70653af | |||
| 5cc1583bd6 | |||
| c4fb878d28 | |||
| 2a5a196591 | |||
| a5295500f1 | |||
| 850a7b2c43 | |||
| 7e7f5a796e | |||
| 120dd53a7f | |||
| f539b686bb | |||
| 76ba6eff91 | |||
| f173ae37c0 | |||
| aaa6b77b15 | |||
| 5897019585 | |||
| 6218bb2280 | |||
| 4e552f9b5c | |||
| 195c5cab86 | |||
| 186356854b | |||
| 112ce70ca8 | |||
| 6aad61db73 | |||
| 69b4d96915 | |||
| c12fb46228 | |||
| f9e29233cc | |||
| 5a6cf1b475 | |||
| c15e89e54f | |||
| e948b0bd68 | |||
| e57fc9d479 | |||
| 7ea1e6ae16 | |||
| 4211d18ad1 | |||
| 91ab18fc55 | |||
| 69f77fecca | |||
| f9596089b3 | |||
| 02dce24f61 | |||
| 91e4ab8ef7 | |||
| 1222bb25d0 | |||
| a52f48fbbe | |||
| 6a8e4c24d9 | |||
| 8caece291d | |||
| 3c27adbb95 | |||
| 68c3c8436d | |||
| e5c464fa41 | |||
| 3a826d60f6 | |||
| e3115813a1 | |||
| 6fdc5e7fb9 | |||
| 11cf7738ca | |||
| 91112b9283 | |||
| a47df016af | |||
| 5ffba4685a | |||
| 9fb6e95d72 | |||
| faedc72f24 | |||
| 74ed0135aa | |||
| cde42a295f | |||
| 62b1495c76 | |||
| 2f4aabc197 | |||
| f9fc7cae9c | |||
| 3e834c5b62 | |||
| e814f64228 | |||
| 1092ed997a | |||
| a7ee0b3b5d | |||
| bc967093ff | |||
| 23ff53dcac | |||
| f9d0efd425 | |||
| 1a9ca02329 | |||
| 7216201bd6 | |||
| eda3221ac0 | |||
| 909b8ffe06 | |||
| e1ef5587fd | |||
| 6c228998e7 | |||
| ab8cacb04e | |||
| 26c7076816 | |||
| 6853991712 | |||
| 6db329c55d | |||
| e83b7a867f | |||
| e3fb563b79 | |||
| 74c8912897 | |||
| fb7a0cd178 | |||
| 847adc7d63 | |||
| 94e431abfc | |||
| f4f3ff347c | |||
| ff3cd9111f | |||
| f6266d72e6 | |||
| bc1bbf3318 | |||
| e9906c9322 | |||
| 72d14c7c9b | |||
| 9f4ff5a8a3 | |||
| 38354330ea | |||
| bda311ad9a | |||
| 2bc25074a6 | |||
| 219a7a6e0b | |||
| 85394e25f4 | |||
| a0fc2040a9 | |||
| b7f5aed4b8 | |||
| 6a23332ce1 | |||
| 12decc32b6 | |||
| e7e9a43dbb | |||
| 29760ddb27 | |||
| 307f5a490c | |||
| 2e53101fb7 | |||
| b6c1456f46 | |||
| cdf4ab580f | |||
| fdcc3be59d | |||
| 3c2ad0bec2 | |||
| 81dbc5b8de | |||
| 618f26017c | |||
| 4163d09af8 | |||
| 13031e30c2 | |||
| 3d2a2d50af | |||
| 3bf1b986cf | |||
| 7cf0e96efa | |||
| 87a1d56247 | |||
| def33a486b | |||
| 62bac83db4 | |||
| e0d0ff9203 | |||
| 1385a34f1a | |||
| 744fbf9ce5 | |||
| a23073bfee | |||
| 60d1909055 | |||
| cd4389a40f | |||
| d0035905e1 | |||
| fdf66fbae0 | |||
| 125bce3bc2 | |||
| 6ae7fee541 | |||
| 8d1c70cc72 | |||
| de05214ec5 | |||
| 34fdd92351 | |||
| 0c2dcc0734 | |||
| 2f47f7dc76 | |||
| 082327c693 | |||
| 1436c6c069 | |||
| b034b383d7 | |||
| 863f6a31f7 | |||
| 0cdc201974 | |||
| 40b782d94b | |||
| 23de363622 | |||
| 2195a599d6 | |||
| c58e76574e | |||
| 7fbd31a70a | |||
| e8a227dcb7 | |||
| 74420b4161 | |||
| aabe1c65fa | |||
| b25d30dd62 | |||
| 57cd863aa5 | |||
| 492708cfc7 | |||
| a5bd9c1d09 | |||
| 73642f6686 | |||
| d06fdb3076 | |||
| 956a997eb8 | |||
| f9bb934218 | |||
| 0029bdc8c7 | |||
| 18946a0814 | |||
| 5479ea26cd | |||
| 7885d10e29 | |||
| 935a1dccda | |||
| 958f5878c1 | |||
| 5e727543c1 | |||
| 38f9a3e1bb | |||
| 902f558995 | |||
| 2961a9591a | |||
| a8ac95ebad | |||
| 3ac0cea3cc | |||
| 58e333a23b | |||
| ba86a02fca | |||
| 7b28c08ab6 | |||
| 6f09e34c21 | |||
| 553e8d16e5 | |||
| ebce6504c6 | |||
| e3a33fdf03 | |||
| 16c8b893d3 | |||
| 9509c15ac3 | |||
| 6a74052413 | |||
| 205b1466de | |||
| 8b2b43d28a | |||
| 0c6e5dc32e | |||
| 95abfef3a9 | |||
| 070aeae8db | |||
| 35f9816db9 | |||
| 9f97c659d6 | |||
| d6954ea964 | |||
| 755596484b | |||
| d729ca1377 | |||
| 918403b098 | |||
| 1b663c757b | |||
| a5b57cd16e | |||
| 48a9d7c507 | |||
| 7a82b8085a | |||
| c8182216ae | |||
| e5b9a4917e | |||
| f771ec76a0 | |||
| 01b69e810e | |||
| 7f112010c2 | |||
| e902a9bdb1 | |||
| 07d6a5e102 | |||
| b6796f9592 | |||
| 4c04c8e3a3 | |||
| e14c197e8f | |||
| a1d51ffe0c | |||
| 8d7b622430 | |||
| da1e7253da | |||
| 123d90a8dd | |||
| 2483ee2707 | |||
| 3eec0b94a0 | |||
| ac68092d88 | |||
| 601816a5ee | |||
| 3a21601778 | |||
| d1eadc6f40 | |||
| 3c90833fb4 | |||
| fcc90318f2 | |||
| ccec1d4c29 | |||
| c56593516d | |||
| 8e356dd6fc | |||
| 7a1a9644c6 | |||
| eb38e7c6af | |||
| 1099cc7ab0 | |||
| d21131deca | |||
| 497823f9a3 | |||
| 76ca2dbb65 | |||
| e685d4416e | |||
| cb47adb6b3 | |||
| a9bc0ebdb8 | |||
| 1a3b80b608 | |||
| 7a6f4fb3ea | |||
| 5c236517bc | |||
| bccd5475df | |||
| c199f11582 | |||
| 0a27530c11 | |||
| 41d521e6f5 | |||
| b7f12a6ff2 | |||
| 155c02ed66 | |||
| 8a2c5ba577 | |||
| f904a672d4 | |||
| 379fdd5b46 | |||
| 21090c93e8 | |||
| 2b914efbb1 | |||
| 7b1bab3c9b | |||
| d517d74bf7 | |||
| d83cfcf681 | |||
| a9d08f15a2 | |||
| ce4588d0c2 | |||
| 69eee64e7e | |||
| 09fbea3f77 | |||
| 64a7b2c6cf | |||
| c8bc396e89 | |||
| 035c07d658 | |||
| 30d73dabf1 | |||
| adc49e7f6e | |||
| 74b19dd7dc | |||
| 329f03c1e2 | |||
| 99cf8d6ac6 | |||
| d222dc05a9 | |||
| 84b30c0233 | |||
| ebf1b6b4d0 | |||
| 6e246c38b6 | |||
| f5e2f1832a | |||
| d53ab3b4e3 |
@@ -25,9 +25,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Install nix
|
||||
uses: cachix/install-nix-action@v24
|
||||
uses: cachix/install-nix-action@v31
|
||||
with:
|
||||
install_url: https://nixos.org/nix/install
|
||||
extra_nix_config: |
|
||||
|
||||
@@ -8,3 +8,223 @@ logs/
|
||||
core*
|
||||
!core/
|
||||
!core.nix
|
||||
!coredns*
|
||||
|
||||
# =============== Python.gitignore ===========================
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[codz]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py.cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
# Pipfile.lock
|
||||
|
||||
# UV
|
||||
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# uv.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
# poetry.lock
|
||||
# poetry.toml
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
||||
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
||||
# pdm.lock
|
||||
# pdm.toml
|
||||
.pdm-python
|
||||
.pdm-build/
|
||||
|
||||
# pixi
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
||||
# pixi.lock
|
||||
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
||||
# in the .venv directory. It is recommended not to include this directory in version control.
|
||||
.pixi
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# Redis
|
||||
*.rdb
|
||||
*.aof
|
||||
*.pid
|
||||
|
||||
# RabbitMQ
|
||||
mnesia/
|
||||
rabbitmq/
|
||||
rabbitmq-data/
|
||||
|
||||
# ActiveMQ
|
||||
activemq-data/
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.envrc
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
# .idea/
|
||||
|
||||
# Abstra
|
||||
# Abstra is an AI-powered process automation framework.
|
||||
# Ignore directories containing user credentials, local state, and settings.
|
||||
# Learn more at https://abstra.io/docs
|
||||
.abstra/
|
||||
|
||||
# Visual Studio Code
|
||||
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
||||
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
||||
# you could uncomment the following to ignore the entire vscode folder
|
||||
# .vscode/
|
||||
|
||||
# Ruff stuff:
|
||||
.ruff_cache/
|
||||
|
||||
# PyPI configuration file
|
||||
.pypirc
|
||||
|
||||
# Marimo
|
||||
marimo/_static/
|
||||
marimo/_lsp/
|
||||
__marimo__/
|
||||
|
||||
# Streamlit
|
||||
.streamlit/secrets.toml
|
||||
|
||||
@@ -1,10 +1,21 @@
|
||||
[files]
|
||||
# Respect .ignore files.
|
||||
ignore-dot = true
|
||||
# Respect ignore files.
|
||||
ignore-files = true
|
||||
extend-exclude = ["themes/", "data/", "static-surprises/", "resources/"]
|
||||
# Typos-specific ignore globs (gitignore syntax).
|
||||
# NOTE: This setting is ignored when you pass the path directly on the command line, as cachix/git-hooks.nix does.
|
||||
# To ignore those files, you must also exclude those directories via git-hooks.hooks.typos.settings.exclude.
|
||||
extend-exclude = [
|
||||
"data/",
|
||||
"rime-data/",
|
||||
]
|
||||
|
||||
[default]
|
||||
# Check binary files as text.
|
||||
binary = false
|
||||
# Verify spelling in file names.
|
||||
check-filename = true
|
||||
# ignore some special identifiers(sha256, mac address, crypto keys, etc)
|
||||
extend-ignore-re = [
|
||||
"iterm2",
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
# AGENTS.md - Guidelines for AI Coding Agents
|
||||
|
||||
This file defines the default operating guide for AI agents working in this Nix Flake repository.
|
||||
Keep changes minimal, verifiable, and safe for multi-host deployments.
|
||||
|
||||
## Scope and Repository Model
|
||||
|
||||
This repository manages:
|
||||
|
||||
- NixOS hosts (desktop + servers)
|
||||
- macOS hosts via nix-darwin
|
||||
- Home Manager profiles shared across platforms
|
||||
- Remote deployments via colmena
|
||||
|
||||
High-level layout:
|
||||
|
||||
```text
|
||||
.
|
||||
├── flake.nix # Flake entry; outputs composed in ./outputs
|
||||
├── Justfile # Primary command entrypoint (uses nushell)
|
||||
├── outputs/
|
||||
│ ├── default.nix
|
||||
│ ├── x86_64-linux/
|
||||
│ ├── aarch64-linux/
|
||||
│ └── aarch64-darwin/
|
||||
├── modules/ # NixOS + darwin modules
|
||||
├── home/ # Home Manager modules
|
||||
├── hosts/ # Host-specific config
|
||||
├── vars/ # Shared variables
|
||||
├── lib/ # Helper functions
|
||||
├── agents/ # Reusable cross-project agent files and installer
|
||||
└── secrets/ # Agenix secret definitions
|
||||
```
|
||||
|
||||
## Ground Rules for Agents
|
||||
|
||||
- Prefer `just` tasks over ad-hoc commands when an equivalent task exists.
|
||||
- Make the smallest reasonable change; avoid drive-by refactors.
|
||||
- Do not commit secrets, generated credentials, or private keys.
|
||||
- Preserve platform guards (`[linux]`, `[macos]`) and host naming conventions.
|
||||
- Run formatting and evaluation checks for touched areas before finishing.
|
||||
|
||||
## Quick Start Workflow (Recommended)
|
||||
|
||||
1. Inspect context:
|
||||
|
||||
```bash
|
||||
just --list
|
||||
rg -n "<symbol-or-option>" modules home hosts outputs
|
||||
```
|
||||
|
||||
2. Implement the change.
|
||||
3. Format:
|
||||
|
||||
```bash
|
||||
just fmt
|
||||
```
|
||||
|
||||
4. Validate:
|
||||
|
||||
```bash
|
||||
just test
|
||||
```
|
||||
|
||||
5. If deployment behavior changed, provide the exact `just` command the user should run (do not run
|
||||
remote deploys unless explicitly requested).
|
||||
|
||||
## Canonical Commands
|
||||
|
||||
### Core quality loop
|
||||
|
||||
```bash
|
||||
just fmt # format Nix files
|
||||
just test # run eval tests: nix eval .#evalTests ...
|
||||
nix flake check # run flake checks + pre-commit style checks
|
||||
```
|
||||
|
||||
### Dependency/input updates
|
||||
|
||||
```bash
|
||||
just up # update all inputs and commit lock file
|
||||
just upp <input> # update one input and commit lock file
|
||||
just up-nix # update nixpkgs-related inputs
|
||||
```
|
||||
|
||||
### Local deploy commands
|
||||
|
||||
```bash
|
||||
just local # deploy config for current hostname
|
||||
just local debug # same with verbose/debug mode
|
||||
just niri # deploy "<hostname>-niri" on Linux
|
||||
just niri debug # debug mode
|
||||
```
|
||||
|
||||
### Remote deploy commands (colmena)
|
||||
|
||||
```bash
|
||||
just col <tag> # deploy nodes matching tag
|
||||
just lab # deploy all kubevirt nodes
|
||||
just k3s-prod # deploy k3s production nodes
|
||||
just k3s-test # deploy k3s test nodes
|
||||
```
|
||||
|
||||
### Useful direct commands
|
||||
|
||||
```bash
|
||||
nix eval .#evalTests --show-trace --print-build-logs --verbose
|
||||
nix build .#nixosConfigurations.<host>.config.system.build.toplevel
|
||||
nixos-rebuild switch --flake .#<hostname>
|
||||
```
|
||||
|
||||
## Test Structure and Expectations
|
||||
|
||||
Eval tests live under:
|
||||
|
||||
- `outputs/x86_64-linux/tests/`
|
||||
- `outputs/aarch64-linux/tests/`
|
||||
- `outputs/aarch64-darwin/tests/`
|
||||
|
||||
Typical test pair:
|
||||
|
||||
- `expr.nix`
|
||||
- `expected.nix`
|
||||
|
||||
Agent expectations:
|
||||
|
||||
- If logic changes affect shared modules, run `just test`.
|
||||
- If only docs/comments changed, tests may be skipped, but say so explicitly.
|
||||
- If tests cannot run, report why and include the exact failing command.
|
||||
|
||||
## Formatting and Style
|
||||
|
||||
### Formatting tools
|
||||
|
||||
- Nix: `nixfmt` (RFC style, width 100)
|
||||
- Non-Nix: `prettier` (see `.prettierrc.yaml`)
|
||||
- Spelling: `typos` (see `.typos.toml`)
|
||||
|
||||
### Nix style conventions
|
||||
|
||||
- Files use `kebab-case.nix`.
|
||||
- Prefer `inherit (...)` for attribute imports.
|
||||
- Prefer `lib.mkIf`, `lib.optional`, `lib.optionals` for conditional config.
|
||||
- Use `lib.mkDefault` for defaults and `lib.mkForce` only when necessary.
|
||||
- Keep module options documented with `description`.
|
||||
|
||||
Module pattern:
|
||||
|
||||
```nix
|
||||
{ lib, config, ... }:
|
||||
{
|
||||
options.myFeature = {
|
||||
enable = lib.mkEnableOption "my feature";
|
||||
};
|
||||
|
||||
config = lib.mkIf config.myFeature.enable {
|
||||
# ...
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## Platform Notes
|
||||
|
||||
- `Justfile` uses `nu` (`set shell := ["nu", "-c"]`).
|
||||
- Some tasks exist only on Linux or macOS via `[linux]` / `[macos]` guards.
|
||||
- `just local` has different implementations per platform:
|
||||
- Linux: `nixos-switch`
|
||||
- macOS: `darwin-build` + `darwin-switch`
|
||||
|
||||
## Secrets and Safety
|
||||
|
||||
- Secrets are managed with agenix and an external private secrets repo.
|
||||
- Never inline secret values in Nix files, tests, or docs.
|
||||
- Do not run broad remote deploy commands unless requested.
|
||||
- Prefer build/eval validation first, deploy second.
|
||||
|
||||
## Change Review Checklist (for agents)
|
||||
|
||||
Before finishing, verify:
|
||||
|
||||
1. Change is scoped to requested behavior.
|
||||
2. `just fmt` applied (or not needed, stated explicitly).
|
||||
3. `just test` run for config changes (or limitation explained).
|
||||
4. No secrets or machine-specific artifacts added.
|
||||
5. User-facing summary includes what changed and what was validated.
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
- Editing host-specific files when the change belongs in shared module layers (`modules/` or
|
||||
`home/`).
|
||||
- Forgetting to update both Linux and darwin paths when touching shared abstractions.
|
||||
- Running deployment commands to validate syntax when `nix eval`/`nix build` would be safer.
|
||||
- Introducing hardcoded usernames/paths instead of using `myvars` and existing abstractions.
|
||||
|
||||
## References
|
||||
|
||||
- [README.md](./README.md)
|
||||
- [agents/README.md](./agents/README.md)
|
||||
- [Justfile](./Justfile)
|
||||
- [outputs/README.md](./outputs/README.md)
|
||||
- [hosts/README.md](./hosts/README.md)
|
||||
- [home/README.md](./home/README.md)
|
||||
- [modules/README.md](./modules/README.md)
|
||||
- [secrets/README.md](./secrets/README.md)
|
||||
@@ -44,14 +44,14 @@ history:
|
||||
repl:
|
||||
nix repl -f flake:nixpkgs
|
||||
|
||||
# remove all generations older than 7 days
|
||||
# remove all old generations
|
||||
# on darwin, you may need to switch to root user to run this command
|
||||
[group('nix')]
|
||||
clean:
|
||||
# Wipe out NixOS's history
|
||||
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
|
||||
# Wipe out home-manager's history
|
||||
nix profile wipe-history --profile $"($env.XDG_STATE_HOME)/nix/profiles/home-manager" --older-than 7d
|
||||
nix profile wipe-history --profile $"($env.XDG_STATE_HOME)/nix/profiles/home-manager"
|
||||
|
||||
# Garbage collect all unused nix store entries
|
||||
[group('nix')]
|
||||
@@ -74,6 +74,12 @@ shell:
|
||||
shell:
|
||||
nix shell nixpkgs#git nixpkgs#neovim
|
||||
|
||||
# upgrade determinate nix
|
||||
[macos]
|
||||
[group('nix')]
|
||||
nix-upgrade:
|
||||
sudo determinate-nixd upgrade
|
||||
|
||||
[group('nix')]
|
||||
fmt:
|
||||
# format the nix files in this repo
|
||||
@@ -100,7 +106,12 @@ repair-store *paths:
|
||||
# Update all Nixpkgs inputs
|
||||
[group('nix')]
|
||||
up-nix:
|
||||
nix flake update nixpkgs nixpkgs-stable nixpkgs-unstable nixpkgs-darwin nixpkgs-ollama
|
||||
nix flake update --commit-lock-file nixpkgs-stable nixpkgs-master nixpkgs-darwin nixpkgs-patched
|
||||
|
||||
# override nixpkgs's commit hash
|
||||
[group('nix')]
|
||||
override-pkgs hash:
|
||||
nix flake update --commit-lock-file nixpkgs --override-input nixpkgs github:NixOS/nixpkgs/{{hash}}
|
||||
|
||||
############################################################################
|
||||
#
|
||||
@@ -108,19 +119,21 @@ up-nix:
|
||||
#
|
||||
############################################################################
|
||||
|
||||
# Deploy the nixosConfiguration by hostname match
|
||||
[linux]
|
||||
[group('desktop')]
|
||||
hypr mode="default":
|
||||
[group('homelab')]
|
||||
local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch ai-hyprland {{mode}}
|
||||
nixos-switch (hostname) {{mode}}
|
||||
|
||||
# Deploy the niri nixosConfiguration by hostname match
|
||||
[linux]
|
||||
[group('desktop')]
|
||||
s-hypr mode="default":
|
||||
niri mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch shoukei-hyprland {{mode}}
|
||||
nixos-switch $"(hostname)-niri" {{mode}}
|
||||
|
||||
############################################################################
|
||||
#
|
||||
@@ -141,23 +154,15 @@ darwin-rollback:
|
||||
use {{utils_nu}} *;
|
||||
darwin-rollback
|
||||
|
||||
# Depoly to fern(macOS host)
|
||||
# Deploy the darwinConfiguration by hostname match
|
||||
[macos]
|
||||
[group('desktop')]
|
||||
fe mode="default":
|
||||
local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
darwin-build "fern" {{mode}};
|
||||
darwin-switch "fern" {{mode}}
|
||||
darwin-build (hostname) {{mode}};
|
||||
darwin-switch (hostname) {{mode}}
|
||||
|
||||
# Depoly to frieren(macOS host)
|
||||
[macos]
|
||||
[group('desktop')]
|
||||
fr mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
darwin-build "frieren" {{mode}};
|
||||
darwin-switch "frieren" {{mode}}
|
||||
|
||||
# Reset launchpad to force it to reindex Applications
|
||||
[macos]
|
||||
@@ -178,13 +183,6 @@ reset-launchpad:
|
||||
col tag:
|
||||
colmena apply --on '@{{tag}}' --verbose --show-trace
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
local name mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch {{name}} {{mode}}
|
||||
|
||||
# Build and upload a vm image
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
@@ -204,37 +202,16 @@ lab:
|
||||
shoryu:
|
||||
colmena apply --on '@kubevirt-shoryu' --verbose --show-trace
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
shoryu-local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch kubevirt-shoryu {{mode}}
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
shushou:
|
||||
colmena apply --on '@kubevirt-shushou' --verbose --show-trace
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
shushou-local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch kubevirt-shushou {{mode}}
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
youko:
|
||||
colmena apply --on '@kubevirt-youko' --verbose --show-trace
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
youko-local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch kubevirt-youko {{mode}}
|
||||
|
||||
############################################################################
|
||||
#
|
||||
# Commands for other Virtual Machines
|
||||
@@ -256,37 +233,16 @@ upload-idols mode="default":
|
||||
aqua:
|
||||
colmena apply --on '@aqua' --verbose --show-trace
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
aqua-local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch aquamarine {{mode}}
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
ruby:
|
||||
colmena apply --on '@ruby' --verbose --show-trace
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
ruby-local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch ruby {{mode}}
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
kana:
|
||||
colmena apply --on '@kana' --verbose --show-trace
|
||||
|
||||
[linux]
|
||||
[group('homelab')]
|
||||
kana-local mode="default":
|
||||
#!/usr/bin/env nu
|
||||
use {{utils_nu}} *;
|
||||
nixos-switch kana {{mode}}
|
||||
|
||||
############################################################################
|
||||
#
|
||||
# Kubernetes related commands
|
||||
@@ -378,25 +334,26 @@ list-systemd:
|
||||
|
||||
# =================================================
|
||||
#
|
||||
# Nixpkgs Review via Github Action
|
||||
# GitHub CLI + Nixpkgs Review via Github Action
|
||||
# https://github.com/ryan4yin/nixpkgs-review-gha
|
||||
#
|
||||
# =================================================
|
||||
|
||||
[group('github')]
|
||||
gh-login:
|
||||
gh auth login -h github.com --skip-ssh-key --git-protocol ssh
|
||||
|
||||
# Run nixpkgs-review for PR
|
||||
[linux]
|
||||
[group('nixpkgs')]
|
||||
pkg-review pr:
|
||||
gh workflow run review.yml --repo ryan4yin/nixpkgs-review-gha -f x86_64-darwin=no -f post-result=true -f pr={{pr}}
|
||||
|
||||
# Run package tests for PR
|
||||
[linux]
|
||||
[group('nixpkgs')]
|
||||
pkg-test pr pname:
|
||||
gh workflow run review.yml --repo ryan4yin/nixpkgs-review-gha -f x86_64-darwin=no -f post-result=true -f pr={{pr}} -f extra-args="-p {{pname}}.passthru.tests"
|
||||
|
||||
# View the summary of a workflow
|
||||
[linux]
|
||||
[group('nixpkgs')]
|
||||
pkg-summary:
|
||||
gh workflow view review.yml --repo ryan4yin/nixpkgs-review-gha
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
<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>
|
||||
<a href="https://nixos.org/">
|
||||
<img src="https://img.shields.io/badge/NixOS-25.05-informational.svg?style=for-the-badge&logo=nixos&color=F2CDCD&logoColor=D9E0EE&labelColor=302D41"></a>
|
||||
<img src="https://img.shields.io/badge/NixOS-25.11-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">
|
||||
<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/badge/Nix%20Flakes-learning-informational.svg?style=for-the-badge&logo=nixos&color=F2CDCD&logoColor=D9E0EE&labelColor=302D41"></a>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
This repository is home to the nix code that builds my systems:
|
||||
|
||||
1. NixOS Desktops: NixOS with home-manager, hyprland, agenix, etc.
|
||||
1. NixOS Desktops: NixOS with home-manager, niri, agenix, etc.
|
||||
2. macOS Desktops: nix-darwin with home-manager, share the same home-manager configuration with
|
||||
NixOS Desktops.
|
||||
3. NixOS Servers: virtual machines running on Proxmox/KubeVirt, with various services, such as
|
||||
@@ -54,40 +54,45 @@ You don't have to go through the pain I've experienced again! Check out my
|
||||
|
||||
## Components
|
||||
|
||||
| | NixOS(Wayland) |
|
||||
| --------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Window Manager** | [Hyprland][Hyprland] |
|
||||
| **Terminal Emulator** | [Zellij][Zellij] + [Kitty][Kitty] |
|
||||
| **Bar** | [Waybar][Waybar] |
|
||||
| **Application Launcher** | [anyrun][anyrun] |
|
||||
| **Notification Daemon** | [Mako][Mako] |
|
||||
| **Display Manager** | [GDM][GDM] |
|
||||
| **Color Scheme** | [Catppuccin][Catppuccin] |
|
||||
| **network management tool** | [NetworkManager][NetworkManager] |
|
||||
| **Input method framework** | [Fcitx5][Fcitx5] |
|
||||
| **System resource monitor** | [Btop][Btop] |
|
||||
| **File Manager** | [Yazi][Yazi] + [thunar][thunar] |
|
||||
| **Shell** | [Nushell][Nushell] + [Starship][Starship] |
|
||||
| **Media Player** | [mpv][mpv] |
|
||||
| **Text Editor** | [Neovim][Neovim] |
|
||||
| **Fonts** | [Nerd fonts][Nerd fonts] |
|
||||
| **Image Viewer** | [imv][imv] |
|
||||
| **Screenshot Software** | [hyprshot][hyprshot] |
|
||||
| **Screen Recording** | [OBS][OBS] |
|
||||
| **Filesystem & Encryption** | tmpfs on `/`, [Btrfs][Btrfs] subvolumes on a [LUKS][LUKS] encrypted partition for persistent, unlock via passphrase |
|
||||
| **Secure Boot** | [lanzaboote][lanzaboote] |
|
||||
| | NixOS(Wayland) |
|
||||
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Window Manager** | [Niri][Niri] |
|
||||
| **Terminal Emulator** | [Zellij][Zellij] + [foot][foot]/[Kitty][Kitty]/[Alacritty][Alacritty]/[Ghostty][Ghostty] |
|
||||
| **Status Bar** / **Notifier** / **Launcher** / **lockscreens** | [noctalia-shell][noctalia-shell] |
|
||||
| **Display Manager** | [tuigreet][tuigreet] |
|
||||
| **Color Scheme** | [catppuccin-nix][catppuccin-nix] |
|
||||
| **network management tool** | [NetworkManager][NetworkManager] |
|
||||
| **Input method framework** | [Fcitx5][Fcitx5] + [rime][rime] + [小鹤音形 flypy][flypy] |
|
||||
| **System resource monitor** | [Btop][Btop] |
|
||||
| **File Manager** | [Yazi][Yazi] + [thunar][thunar] |
|
||||
| **Shell** | [Nushell][Nushell] + [Starship][Starship] |
|
||||
| **Media Player** | [mpv][mpv] |
|
||||
| **Editors / IDE** | [Helix][Helix] (primary), [Neovim][Neovim] (backup) — [configuration & usage](./home/base/core/editors/) |
|
||||
| **Fonts** | [Nerd fonts][Nerd fonts] |
|
||||
| **Image Viewer** | [imv][imv] |
|
||||
| **Screenshot Software** | Niri's builtin function |
|
||||
| **Screen Recording** | [OBS][OBS] |
|
||||
| **Filesystem & Encryption** | tmpfs as `/`, [Btrfs][Btrfs] subvolumes on a [LUKS][LUKS] encrypted partition for persistent, unlock via passphrase |
|
||||
| **Secure Boot** | [lanzaboote][lanzaboote] |
|
||||
|
||||
Wallpapers: https://github.com/ryan4yin/wallpapers
|
||||
|
||||
## Hyprland + AstroNvim
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
## Neovim
|
||||

|
||||
|
||||
See [./home/base/tui/editors/neovim/](./home/base/tui/editors/neovim/) for details.
|
||||
## Editors / IDE
|
||||
|
||||
- **Terminal editors:** [./home/base/core/editors/](./home/base/core/editors/) — Helix / Neovim,
|
||||
`$EDITOR`, docs.
|
||||
- **VS Code (GUI, Home Manager on NixOS):**
|
||||
[./home/linux/gui/base/editors.nix](./home/linux/gui/base/editors.nix).
|
||||
- **LLM coding agents:** [./agents](./agents/) — rules, installers, CLI snippets; see
|
||||
[./agents/README.md](./agents/README.md).
|
||||
|
||||
## Secrets Management
|
||||
|
||||
@@ -109,17 +114,15 @@ For NixOS:
|
||||
> 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`.
|
||||
|
||||
```bash
|
||||
# deploy one of the configuration based on the hostname
|
||||
sudo nixos-rebuild switch --flake .#ai-hyprland
|
||||
sudo nixos-rebuild switch --flake .#ai-niri
|
||||
|
||||
# deploy via `just`(a command runner with similar syntax to make) & Justfile
|
||||
just hypr # deploy my pc with hyprland compositor
|
||||
# Deploy the niri nixosConfiguration by hostname match
|
||||
just niri
|
||||
|
||||
# or we can deploy with details
|
||||
just hypr debug
|
||||
just niri debug
|
||||
```
|
||||
|
||||
For macOS:
|
||||
@@ -132,11 +135,11 @@ nix-shell -p just nushell
|
||||
# 3. comment home-manager's code in lib/macosSystem.nix to speed up the first deployment.
|
||||
# 4. comment out the proxy settings in scripts/darwin_set_proxy.py if the proxy is not ready yet.
|
||||
|
||||
# deploy fern's configuration(Apple Silicon)
|
||||
just fr
|
||||
# Deploy the darwinConfiguration by hostname match
|
||||
just local
|
||||
|
||||
# deploy with details
|
||||
just fr debug
|
||||
just local debug
|
||||
```
|
||||
|
||||
> [What y'all will need when Nix drives you to drink.](https://www.youtube.com/watch?v=Eni9PPPPBpg)
|
||||
@@ -155,52 +158,44 @@ Other dotfiles that inspired me:
|
||||
- [davidtwco/veritas](https://github.com/davidtwco/veritas)
|
||||
- [gvolpe/nix-config](https://github.com/gvolpe/nix-config)
|
||||
- [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, etc.
|
||||
- [nix-community/srvos](https://github.com/nix-community/srvos): a collection of opinionated and
|
||||
sharable NixOS configurations for servers
|
||||
- Modularized NixOS Configuration
|
||||
- [hlissner/dotfiles](https://github.com/hlissner/dotfiles)
|
||||
- [viperML/dotfiles](https://github.com/viperML/dotfiles)
|
||||
- Hyprland(wayland)
|
||||
- [notwidow/hyprland](https://github.com/notwidow/hyprland): This is where I start my hyprland
|
||||
journey.
|
||||
- [HeinzDev/Hyprland-dotfiles](https://github.com/HeinzDev/Hyprland-dotfiles): Refer to the waybar
|
||||
configuration here.
|
||||
- [Zeioth/zeioth-hyprland-config](https://github.com/Zeioth/zeioth-hyprland-config)
|
||||
- [linuxmobile/kaku](https://github.com/linuxmobile/kaku)
|
||||
- Neovim/AstroNvim
|
||||
- [maxbrunet/dotfiles](https://github.com/maxbrunet/dotfiles): astronvim with nix flakes.
|
||||
- Misc
|
||||
- [1amSimp1e/dots](https://github.com/1amSimp1e/dots)
|
||||
|
||||
[Hyprland]: https://github.com/hyprwm/Hyprland
|
||||
[Niri]: https://github.com/YaLTeR/niri
|
||||
[Kitty]: https://github.com/kovidgoyal/kitty
|
||||
[foot]: https://codeberg.org/dnkl/foot
|
||||
[Alacritty]: https://github.com/alacritty/alacritty
|
||||
[Ghostty]: https://github.com/ghostty-org/ghostty
|
||||
[Nushell]: https://github.com/nushell/nushell
|
||||
[Starship]: https://github.com/starship/starship
|
||||
[Waybar]: https://github.com/Alexays/Waybar
|
||||
[polybar]: https://github.com/polybar/polybar
|
||||
[rofi]: https://github.com/davatorium/rofi
|
||||
[anyrun]: https://github.com/Kirottu/anyrun
|
||||
[Dunst]: https://github.com/dunst-project/dunst
|
||||
[Fcitx5]: https://github.com/fcitx/fcitx5
|
||||
[rime]: https://wiki.archlinux.org/title/Rime
|
||||
[flypy]: https://flypy.cc/
|
||||
[Btop]: https://github.com/aristocratos/btop
|
||||
[mpv]: https://github.com/mpv-player/mpv
|
||||
[Zellij]: https://github.com/zellij-org/zellij
|
||||
[Helix]: https://github.com/helix-editor/helix
|
||||
[Neovim]: https://github.com/neovim/neovim
|
||||
[AstroNvim]: https://github.com/AstroNvim/AstroNvim
|
||||
[Hyprshot]: https://github.com/Gustash/Hyprshot
|
||||
[imv]: https://sr.ht/~exec64/imv/
|
||||
[OBS]: https://obsproject.com
|
||||
[Mako]: https://github.com/emersion/mako
|
||||
[Nerd fonts]: https://github.com/ryanoasis/nerd-fonts
|
||||
[catppuccin]: https://github.com/catppuccin/catppuccin
|
||||
[catppuccin-nix]: https://github.com/catppuccin/nix
|
||||
[NetworkManager]: https://wiki.gnome.org/Projects/NetworkManager
|
||||
[wl-clipboard]: https://github.com/bugaevc/wl-clipboard
|
||||
[GDM]: https://wiki.archlinux.org/title/GDM
|
||||
[tuigreet]: https://github.com/apognu/tuigreet
|
||||
[thunar]: https://gitlab.xfce.org/xfce/thunar
|
||||
[Yazi]: https://github.com/sxyazi/yazi
|
||||
[Catppuccin]: https://github.com/catppuccin/catppuccin
|
||||
[Btrfs]: https://btrfs.readthedocs.io
|
||||
[LUKS]: https://wiki.archlinux.org/title/Dm-crypt/Encrypting_an_entire_system
|
||||
[lanzaboote]: https://github.com/nix-community/lanzaboote
|
||||
[noctalia-shell]: https://github.com/noctalia-dev/noctalia-shell
|
||||
|
||||
|
After Width: | Height: | Size: 463 KiB |
|
After Width: | Height: | Size: 581 KiB |
|
After Width: | Height: | Size: 588 KiB |
|
Before Width: | Height: | Size: 450 KiB |
|
Before Width: | Height: | Size: 320 KiB |
|
Before Width: | Height: | Size: 359 KiB |
|
Before Width: | Height: | Size: 382 KiB |
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,85 @@
|
||||
# RULES - Global Agent Baseline
|
||||
|
||||
This file defines the cross-project baseline for AI coding agents. It focuses on safety, boundaries,
|
||||
and portable behavior.
|
||||
|
||||
## 1) Instruction Priority
|
||||
|
||||
Apply instructions in this order:
|
||||
|
||||
1. Runtime system/developer instructions
|
||||
2. User task request
|
||||
3. Project-local policy (`AGENTS.md`, `CLAUDE.md`, repo docs)
|
||||
4. This global RULES
|
||||
|
||||
If rules conflict, follow the higher-priority source and state the conflict briefly.
|
||||
|
||||
## 2) Hard Safety Boundaries (MUST NOT)
|
||||
|
||||
- MUST NOT read/write outside the approved workspace.
|
||||
- MUST NOT perform broad operations on the entire home directory.
|
||||
- MUST NOT mutate remote Git state unless explicitly requested.
|
||||
- Examples: `git push`, creating/updating remote PRs/Issues via `gh`.
|
||||
- MUST NOT auto-run remote-mutating commands unless explicitly requested.
|
||||
- Examples: `kubectl apply/delete`, `helm upgrade`, `terraform apply`, remote `ssh` mutation.
|
||||
- MUST NOT use destructive/force/delete options EVEN if explicitly requested.
|
||||
- Examples: `--force`, `rm -rf`, `git reset --hard`, `gh repo delete`, `terraform destroy`
|
||||
- MUST NOT expose or commit secrets (tokens, keys, kubeconfig credentials, passwords).
|
||||
|
||||
## 3) Security and Secrets Handling
|
||||
|
||||
- Never write secret literals into tracked files.
|
||||
- Use environment variables, secret managers, or placeholders.
|
||||
- Redact sensitive output in logs and summaries.
|
||||
- For infra/IaC changes, prefer plan/eval/check before apply/switch.
|
||||
|
||||
## 4) Scope Discipline
|
||||
|
||||
- Keep changes strictly within requested scope.
|
||||
- Do not refactor unrelated areas unless user asks.
|
||||
- Preserve backward compatibility unless a breaking change is explicitly requested.
|
||||
|
||||
## 5) Change Hygiene
|
||||
|
||||
- Keep diffs minimal and reviewable.
|
||||
- Group logically related edits together.
|
||||
- Do not revert user/unrelated changes unless explicitly asked.
|
||||
- Do not claim verification you did not run.
|
||||
|
||||
## 6) Tooling Defaults
|
||||
|
||||
- Prefer structural search tools first for code find/replace (`ast-grep`/`jq`/`yq`), then text tools
|
||||
(`rg`, `fd`).
|
||||
- Prefer project task runners (`just`, `make`, `task`, `npm scripts`, etc.) over ad-hoc commands
|
||||
when equivalent.
|
||||
- If a required command is not already available, use only `nix run`, `flake.nix`/`shell.nix` or
|
||||
`uv`/`pnpm` to provide it.
|
||||
- If that is still insufficient, stop and ask the user to prepare the environment instead of using
|
||||
any other installation method.
|
||||
- Use `gh` CLI for GitHub operations, especially code/PR/issue search and inspection.
|
||||
|
||||
## 7) Environment Defaults
|
||||
|
||||
- Primary OS: NixOS.
|
||||
- Shell: default to `nushell`, `bash` also exists.
|
||||
|
||||
## 8) Script Engineering Principles
|
||||
|
||||
Treat scripts as interruptible jobs that must be diagnosable and safe to rerun:
|
||||
|
||||
- Split workflows into explicit stages; allow running a selected stage via flags/arguments.
|
||||
- Make reruns idempotent; persist progress after each stage and support resume.
|
||||
- Cache external data with invalidation strategy to speed retries and improve reproducibility.
|
||||
- For HTTP flows, separate transport success from business success; support retry/backoff.
|
||||
- Provide independent verification commands/checks for key outputs (counts, samples, invariants).
|
||||
|
||||
## 9) Communication Defaults
|
||||
|
||||
- Respond in the language the user is currently using, prefer English & Chinese.
|
||||
- Code, commands, identifiers, and code comments: English.
|
||||
- Be concise, concrete, and action-oriented.
|
||||
|
||||
## 10) Project Overlay
|
||||
|
||||
Project-local policy may add stricter constraints (build/test/deploy/style/ownership/environment).
|
||||
It must not weaken this baseline.
|
||||
@@ -0,0 +1,59 @@
|
||||
# agents
|
||||
|
||||
Reusable, symlink-first agent resources shared across projects.
|
||||
|
||||
This directory is the canonical source for baseline agent rules and supporting command references.
|
||||
The primary workflow is to symlink files from here into each agent runtime/config location.
|
||||
|
||||
## What this directory contains
|
||||
|
||||
- `AGENTS.md`: global baseline rules for coding agents.
|
||||
- `permissions.md`: permission policies for agent tool access.
|
||||
- `install-rules.py`: installs the baseline by creating symlinks in supported agent config dirs.
|
||||
- `install-cli.md`: curated CLI install/update command snippets.
|
||||
- `install-skills.md`: curated `npx skills` command snippets.
|
||||
|
||||
## Core workflow
|
||||
|
||||
1. Maintain shared rules in `agents/AGENTS.md`.
|
||||
2. Define permission policies in `agents/permissions.md`.
|
||||
3. Run `install-rules.py` to refresh symlinks in local agent homes.
|
||||
4. Use `install-cli.md` and `install-skills.md` as reference snippets when needed.
|
||||
|
||||
## Install baseline rules (symlink-based)
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python3 agents/install-rules.py
|
||||
```
|
||||
|
||||
Current targets:
|
||||
|
||||
- Codex: `AGENTS.md` -> `${CODEX_HOME:-~/.codex}/AGENTS.md`
|
||||
- OpenCode: `AGENTS.md` -> `${XDG_CONFIG_HOME:-~/.config}/opencode/AGENTS.md`
|
||||
- Claude Code: `AGENTS.md` -> `~/.claude/CLAUDE.md`
|
||||
|
||||
Behavior:
|
||||
|
||||
- Each target is handled independently.
|
||||
- Missing destination directories are skipped.
|
||||
- Existing destination file/symlink is replaced with a symlink to this repo source file.
|
||||
|
||||
## About `install-cli.md` and `install-skills.md`
|
||||
|
||||
Use them as snippet libraries:
|
||||
|
||||
- review the commands
|
||||
- select what you need
|
||||
- run selected commands manually
|
||||
|
||||
## Conventions
|
||||
|
||||
- Keep files portable and reviewable.
|
||||
- Keep secrets and machine-specific credentials out of this directory.
|
||||
- Keep guidance generic enough to reuse across multiple agent environments.
|
||||
|
||||
## Goal
|
||||
|
||||
Maintain one reusable source of truth for agent setup that stays simple to sync and easy to evolve.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Agent CLI Commands
|
||||
|
||||
Reference commands for installing and updating agent CLIs. Run only the commands you need.
|
||||
|
||||
## Install CLIs
|
||||
|
||||
Installed via Nix:
|
||||
|
||||
- codex
|
||||
- cursor-cli
|
||||
- claude-code
|
||||
- opencode
|
||||
|
||||
Install Manually:
|
||||
|
||||
```bash
|
||||
# kimi-cli
|
||||
uv tool install --python 3.13 kimi-cli
|
||||
uv tool upgrade kimi-cli --no-cache
|
||||
```
|
||||
|
||||
## Optional tooling
|
||||
|
||||
```bash
|
||||
# context7: up-to-date docs and code examples for LLMs and agents
|
||||
npx ctx7 setup
|
||||
```
|
||||
|
||||
## Update npm-installed agent tools
|
||||
|
||||
```bash
|
||||
npm update -g
|
||||
```
|
||||
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def install_one(target_dir: Path, source_file: Path, target_name: str) -> None:
|
||||
if not target_dir.exists():
|
||||
print(f"skipped {target_dir} (not found)")
|
||||
return
|
||||
|
||||
target_file = target_dir / target_name
|
||||
|
||||
if target_file.exists() or target_file.is_symlink():
|
||||
target_file.unlink()
|
||||
|
||||
target_file.symlink_to(source_file)
|
||||
print(f"linked {target_file} -> {source_file}")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
script_dir = Path(__file__).resolve().parent
|
||||
agents_file = script_dir / "AGENTS.md"
|
||||
|
||||
if not agents_file.is_file():
|
||||
print(f"Missing source file: {agents_file}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
codex_dir = Path(os.environ.get("CODEX_HOME", "~/.codex")).expanduser()
|
||||
xdg_config_home = Path(os.environ.get("XDG_CONFIG_HOME", "~/.config")).expanduser()
|
||||
opencode_dir = xdg_config_home / "opencode"
|
||||
claude_dir = Path("~/.claude").expanduser()
|
||||
install_one(codex_dir, agents_file, "AGENTS.md")
|
||||
install_one(opencode_dir, agents_file, "AGENTS.md")
|
||||
install_one(claude_dir, agents_file, "CLAUDE.md")
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,63 @@
|
||||
# Agent Skills Commands
|
||||
|
||||
Reference commands for listing, installing, and updating skills via `npx skills`. Run only the
|
||||
commands you need.
|
||||
|
||||
## Inspect and update installed skills
|
||||
|
||||
```bash
|
||||
# list all installed skills (project + global)
|
||||
npx skills list
|
||||
|
||||
# list only global skills
|
||||
npx skills ls -g
|
||||
|
||||
# check for updates
|
||||
npx skills check
|
||||
|
||||
# update all installed skills
|
||||
npx skills update
|
||||
|
||||
# remove from global scope
|
||||
npx skills remove --global web-design-guidelines
|
||||
```
|
||||
|
||||
## Discover skills from repositories
|
||||
|
||||
```bash
|
||||
# list skills in a repository
|
||||
npx skills add vercel-labs/agent-skills --list
|
||||
```
|
||||
|
||||
## Install commonly used skill packs
|
||||
|
||||
```bash
|
||||
# superpowers
|
||||
npx skills add -g obra/superpowers --agent '*' --skill '*'
|
||||
|
||||
# github skills
|
||||
npx skills add -g github/awesome-copilot --agent '*' --skill 'git-commit' --skill 'gh-cli'
|
||||
|
||||
# find skills
|
||||
npx skills add -g vercel-labs/skills --agent '*'
|
||||
|
||||
# anthropic skills
|
||||
npx skills add -g anthropics/skills --agent '*' --skill 'skill-creator' --skill 'pdf'
|
||||
```
|
||||
|
||||
## Optional packs
|
||||
|
||||
```bash
|
||||
npx skills add -g pbakaus/impeccable --agent '*' --skill '*'
|
||||
|
||||
npx skills add -g coreyhaines31/marketingskills --agent '*' --skill '*'
|
||||
|
||||
npx skills add -g phuryn/pm-skills --agent '*' --skill '*'
|
||||
```
|
||||
|
||||
References:
|
||||
|
||||
- https://github.com/vercel-labs/skills
|
||||
- https://github.com/pbakaus/impeccable
|
||||
- https://github.com/coreyhaines31/marketingskills
|
||||
- https://github.com/phuryn/pm-skills
|
||||
@@ -0,0 +1,190 @@
|
||||
# Permissions Configuration
|
||||
|
||||
This document records the current permission requirements for AI agents operating in this
|
||||
repository.
|
||||
|
||||
## Scope
|
||||
|
||||
| Environment | Policy |
|
||||
| ------------------------ | ------------------------------------------- |
|
||||
| **Personal workstation** | Restrictive - protect user's daily workflow |
|
||||
| **Homelab VMs** | Permissive - agents have full autonomy |
|
||||
|
||||
The permissions below apply to **personal workstation** only. For homelab VMs, almost everything is
|
||||
allowed except destructive operations on production systems.
|
||||
|
||||
## Default Policy
|
||||
|
||||
| Tool | Permission |
|
||||
| ---------------- | ---------- |
|
||||
| `*` (all others) | ask |
|
||||
|
||||
## File Read Permissions
|
||||
|
||||
| Pattern | Permission |
|
||||
| --------------- | ---------- |
|
||||
| `*` (all files) | allow |
|
||||
| `*.env` | deny |
|
||||
| `*.env.*` | deny |
|
||||
| `*.env.example` | allow |
|
||||
| `*.pem` | deny |
|
||||
| `*.key` | deny |
|
||||
| `*kubeconfig*` | deny |
|
||||
| `.ssh/**` | deny |
|
||||
| `.aws/**` | deny |
|
||||
| `.kube/**` | deny |
|
||||
| `.gnupg/**` | deny |
|
||||
|
||||
## Always Allowed Tools
|
||||
|
||||
These tools run without prompting:
|
||||
|
||||
- `glob`
|
||||
- `grep`
|
||||
- `lsp`
|
||||
- `question`
|
||||
- `skill`
|
||||
- `todowrite`
|
||||
- `webfetch`
|
||||
- `websearch`
|
||||
- `codesearch`
|
||||
- `edit` (covers `write` and `apply_patch`)
|
||||
|
||||
## Bash Command Permissions
|
||||
|
||||
### Always Allowed (Read-only operations)
|
||||
|
||||
**Git:**
|
||||
|
||||
- `git status`, `git diff`, `git log`, `git show`, `git branch`, `git remote`
|
||||
|
||||
**Kubernetes:**
|
||||
|
||||
- `kubectl get`, `kubectl describe`, `kubectl logs`, `kubectl top`
|
||||
- `kubectl api-resources`, `kubectl api-versions`
|
||||
- `kubectl config view`, `kubectl config get-contexts`
|
||||
- `kubectl explain`
|
||||
- `kubectl kustomize`, `kustomize build`, `kustomize version`
|
||||
|
||||
**Terraform:**
|
||||
|
||||
- `terraform plan`, `terraform show`, `terraform state list`, `terraform state show`
|
||||
- `terraform output`, `terraform version`, `terraform providers`, `terraform fmt`
|
||||
|
||||
**GitHub CLI:**
|
||||
|
||||
- `gh repo view/list`, `gh issue view/list`, `gh pr view/list/diff/checks`
|
||||
- `gh api`, `gh search`, `gh gist list/view`
|
||||
- `gh release view/list`, `gh workflow list/view`, `gh run list/view`
|
||||
- `gh status`, `gh auth status`
|
||||
|
||||
**Helm:**
|
||||
|
||||
- `helm list`, `helm get`, `helm show`, `helm search`
|
||||
- `helm repo list`, `helm status`, `helm version`, `helm template`
|
||||
|
||||
**Google Cloud:**
|
||||
|
||||
- `gcloud * list`, `gcloud * describe`, `gcloud * get-iam-policy`
|
||||
- `gcloud config list`, `gcloud auth list`, `gcloud version`
|
||||
|
||||
**Nix:**
|
||||
|
||||
- `nix eval`, `nix build`, `nix flake show`, `nix flake metadata`
|
||||
- `nix flake check`, `nix flake lock`
|
||||
- `nix profile list`, `nix profile history`
|
||||
- `nix store verify`, `nix store ls`, `nix store path-info`
|
||||
- `nix search`, `nix doctor`, `nix --version`
|
||||
- `nixos-rebuild build`, `darwin-rebuild build`
|
||||
- `nom build`
|
||||
|
||||
**Just:**
|
||||
|
||||
- `just --list`, `just --show`, `just --dry-run`
|
||||
|
||||
**Linters & Formatters:**
|
||||
|
||||
- `statix check`, `deadnix`, `nixfmt --check`
|
||||
- `shellcheck`, `hadolint`, `actionlint`
|
||||
- `ruff check`, `clippy`, `prettier --check`
|
||||
- `tokei`
|
||||
|
||||
**System diagnostics:**
|
||||
|
||||
- `systemctl status`, `systemctl list-units`, `systemctl show`
|
||||
- `journalctl -u`, `journalctl --since`
|
||||
- `lspci`, `lsusb`, `lsblk`, `df`, `free`, `uptime`, `uname -a`
|
||||
- `sensors`, `lsof`
|
||||
|
||||
**Git (extended):**
|
||||
|
||||
- `git tag`, `git blame`, `git reflog`, `git stash list`
|
||||
- `git lfs status`, `git lfs ls-files`
|
||||
|
||||
**Development tools:**
|
||||
|
||||
- `go version`, `go env`, `go list`, `go doc`, `go vet`
|
||||
- `cargo --version`, `cargo tree`, `cargo metadata`
|
||||
- `python3 --version`, `python3 -m py_compile`
|
||||
- `node --version`, `pnpm list`, `uv pip list`
|
||||
|
||||
**General utilities:**
|
||||
|
||||
- `rg`, `fd`, `cp`, `mv`, `chmod`
|
||||
- `ls`, `cat`, `head`, `tail`, `wc`, `find`, `which`
|
||||
- `echo`, `pwd`, `date`, `env`, `printenv`
|
||||
- `file`, `stat`, `du`, `tree`, `bat`, `eza`
|
||||
- `jq`, `yq`, `tldr`
|
||||
- `mkdir`, `rmdir`, `grep`
|
||||
|
||||
### Requires Confirmation
|
||||
|
||||
| Command | Permission |
|
||||
| ---------- | ---------- |
|
||||
| `rm *` | ask |
|
||||
| `rm -rf *` | ask |
|
||||
|
||||
### Always Denied
|
||||
|
||||
| Command | Permission |
|
||||
| -------- | ---------- |
|
||||
| `sudo *` | deny |
|
||||
|
||||
## Homelab VM Permissions
|
||||
|
||||
For agents running in dedicated homelab VMs, permissions are significantly relaxed:
|
||||
|
||||
| Category | Permission |
|
||||
| -------------------- | --------------------- |
|
||||
| `bash` | allow (most commands) |
|
||||
| `edit` | allow |
|
||||
| `write` | allow |
|
||||
| `task` | allow |
|
||||
| `external_directory` | allow |
|
||||
| `rm` | allow |
|
||||
|
||||
**Still restricted in homelab VMs:**
|
||||
|
||||
- Production cluster destructive operations (`kubectl delete`, `helm uninstall`)
|
||||
- Infrastructure teardown (`terraform destroy`)
|
||||
- Secret exposure in logs
|
||||
|
||||
## Other Tool Permissions
|
||||
|
||||
| Tool | Permission |
|
||||
| -------------------- | ---------- |
|
||||
| `edit` | allow |
|
||||
| `task` | ask |
|
||||
| `external_directory` | ask |
|
||||
| `doom_loop` | deny |
|
||||
|
||||
## Summary
|
||||
|
||||
- **Default policy**: All tools `ask` — only explicitly whitelisted tools auto-allow
|
||||
- **File operations**: `read`, `glob`, `grep`, `edit`, `write` all allowed in workspace
|
||||
- **Nix operations**: Build/eval/flake commands auto-allowed (writes to store only)
|
||||
- **Linting & formatting**: All check commands auto-allowed
|
||||
- **System diagnostics**: Read-only system info auto-allowed
|
||||
- **Sensitive files**: Credentials, keys, and cloud configs are blocked
|
||||
- **Bash commands**: Read-only ops auto-allowed; `rm` requires confirmation; `sudo` blocked
|
||||
- **Scope control**: `task` and `external_directory` require approval
|
||||
@@ -3,5 +3,21 @@
|
||||
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/)
|
||||
## Current Structure
|
||||
|
||||
- **ecc-ca.crt** - ECC CA certificate file
|
||||
- **ecc-ca.srl** - CA serial number file for certificate tracking
|
||||
- **ecc-csr.conf** - OpenSSL configuration file for certificate signing requests
|
||||
- **ecc-server.crt** - Server certificate signed by the ECC CA
|
||||
- **gen-certs.sh** - Shell script to generate certificates automatically
|
||||
|
||||
## Security Notes
|
||||
|
||||
All private keys (`.key` files) are ignored by git and stored in a private secrets repository. The
|
||||
public certificates and configuration files are committed to this repository for reference.
|
||||
|
||||
## Usage
|
||||
|
||||
Run `./gen-certs.sh` to generate new certificates using the ECC CA configuration.
|
||||
|
||||
See [../secrets](../secrets/) for the corresponding private key management.
|
||||
|
||||
@@ -16,14 +16,16 @@
|
||||
nixConfig = {
|
||||
# substituers will be appended to the default substituters when fetching packages
|
||||
extra-substituters = [
|
||||
"https://anyrun.cachix.org"
|
||||
"https://cache.numtide.com"
|
||||
# "https://nix-gaming.cachix.org"
|
||||
# "https://nixpkgs-wayland.cachix.org"
|
||||
# "https://install.determinate.systems"
|
||||
];
|
||||
extra-trusted-public-keys = [
|
||||
"anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s="
|
||||
"niks3.numtide.com-1:DTx8wZduET09hRmMtKdQDxNNthLQETkc/yaX7M4qK0g="
|
||||
# "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4="
|
||||
# "nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA="
|
||||
# "cache.flakehub.com-3:hJuILl5sVK4iKm86JzgdXW12Y2Hwd5G07qKtHTOcDCM="
|
||||
];
|
||||
};
|
||||
|
||||
@@ -34,15 +36,20 @@
|
||||
# which represents the GitHub repository URL + branch/commit-id/tag.
|
||||
|
||||
# Official NixOS package source, using nixos's unstable branch by default
|
||||
# Find git commit hash with build status here(3 jobs per day):
|
||||
# https://hydra.nixos.org/jobset/nixpkgs/unstable
|
||||
# update via nix flake update nixpkgs --override-input nixpkgs github:NixOS/nixpkgs/<commit-hash>
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
# nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable-small";
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.05";
|
||||
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||
nixpkgs-2505.url = "github:nixos/nixpkgs/nixos-25.05";
|
||||
|
||||
nixpkgs-ollama.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
# nixpkgs with some custom patches
|
||||
nixpkgs-patched.url = "github:ryan4yin/nixpkgs/nixos-unstable-patched";
|
||||
# get some latest packages from the master branch
|
||||
nixpkgs-master.url = "github:nixos/nixpkgs/master";
|
||||
|
||||
# for macos
|
||||
# nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-25.05-darwin";
|
||||
# nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-25.11-darwin";
|
||||
nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
nix-darwin = {
|
||||
url = "github:lnl7/nix-darwin";
|
||||
@@ -52,7 +59,7 @@
|
||||
# home-manager, used for managing user configuration
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/master";
|
||||
# url = "github:nix-community/home-manager/release-25.05";
|
||||
# url = "github:nix-community/home-manager/release-25.11";
|
||||
|
||||
# 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,
|
||||
@@ -60,6 +67,11 @@
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
nixvim = {
|
||||
url = "github:nix-community/nixvim";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
# https://github.com/catppuccin/nix
|
||||
catppuccin = {
|
||||
url = "github:catppuccin/nix";
|
||||
@@ -67,7 +79,7 @@
|
||||
};
|
||||
|
||||
lanzaboote = {
|
||||
url = "github:nix-community/lanzaboote/v0.4.2";
|
||||
url = "github:nix-community/lanzaboote/v1.0.0";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
@@ -75,14 +87,6 @@
|
||||
url = "github:nix-community/preservation";
|
||||
};
|
||||
|
||||
# community wayland nixpkgs
|
||||
# nixpkgs-wayland.url = "github:nix-community/nixpkgs-wayland";
|
||||
# anyrun - a wayland launcher
|
||||
anyrun = {
|
||||
url = "github:Kirottu/anyrun";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
# generate iso/qcow2/docker/... image from nixos configuration
|
||||
nixos-generators = {
|
||||
url = "github:nix-community/nixos-generators";
|
||||
@@ -97,13 +101,8 @@
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
nix-gaming = {
|
||||
url = "github:fufexan/nix-gaming";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
disko = {
|
||||
url = "github:nix-community/disko/v1.11.0";
|
||||
url = "github:nix-community/disko/v1.13.0";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
@@ -128,25 +127,31 @@
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
ghostty = {
|
||||
url = "github:ghostty-org/ghostty";
|
||||
};
|
||||
|
||||
blender-bin = {
|
||||
url = "github:edolstra/nix-warez?dir=blender";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
nixos-apple-silicon = {
|
||||
# 2025-07-04
|
||||
url = "github:nix-community/nixos-apple-silicon/eba4b40c816e5aff8951ae231ac237e8aab8ec1d";
|
||||
# asahi-6.18.9
|
||||
url = "github:nix-community/nixos-apple-silicon";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
# AI coding agents
|
||||
llm-agents.url = "github:numtide/llm-agents.nix";
|
||||
|
||||
# -------------- Gaming ---------------------
|
||||
|
||||
nix-gaming = {
|
||||
url = "github:fufexan/nix-gaming";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
######################## Some non-flake repositories #########################################
|
||||
|
||||
polybar-themes = {
|
||||
url = "github:adi1090x/polybar-themes";
|
||||
nu_scripts = {
|
||||
url = "github:ryan4yin/nu_scripts";
|
||||
flake = false;
|
||||
};
|
||||
|
||||
@@ -174,8 +179,5 @@
|
||||
url = "github:ryan4yin/nur-packages";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
# for waydroid
|
||||
# nur-ataraxiasjel.url = "github:AtaraxiaSjel/nur";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -12,14 +12,53 @@
|
||||
1. Accessing the network when they don't need to.
|
||||
1. Accessing hardware devices they don't need.
|
||||
|
||||
## Current Status
|
||||
## Current Structure
|
||||
|
||||
1. **System Level**:
|
||||
- [ ] AppArmor
|
||||
- [ ] Kernel & System Hardening
|
||||
1. **Per-App Level**:
|
||||
- Nixpak (Bubblewrap, running at user-level)
|
||||
- Firejail (a SUID program, meaning it's running as root)
|
||||
### 1. **System Level**
|
||||
|
||||
- **AppArmor** (`apparmor/`): AppArmor profiles and configuration
|
||||
- **Kernel & System Hardening** (`profiles/`): System-wide hardening profiles
|
||||
|
||||
### 2. **Per-App Level**
|
||||
|
||||
- **Nixpak** (`nixpaks/`): Bubblewrap-based sandboxing for applications
|
||||
- Firefox configuration
|
||||
- QQ (Chinese messaging app) configuration
|
||||
- Modular system with reusable components
|
||||
- **Firejail** (legacy): SUID-based sandboxing (not used)
|
||||
- **Bubblewrap** (`bwraps/`): Direct bubblewrap configurations
|
||||
- WeChat sandboxing configuration
|
||||
|
||||
## Current Implementation Status
|
||||
|
||||
| Component | Status | Notes |
|
||||
| ----------------- | --------- | ------------------------------ |
|
||||
| AppArmor Profiles | 🚧 WIP | Basic structure in place |
|
||||
| Nixpak Firefox | ✅ Active | Firefox sandboxing via nixpak |
|
||||
| Nixpak QQ | ✅ Active | QQ application sandboxing |
|
||||
| Bubblewrap WeChat | ✅ Active | WeChat specific sandboxing |
|
||||
| System Profiles | 🚧 WIP | Hardened system configurations |
|
||||
|
||||
## Directory Structure
|
||||
|
||||
```
|
||||
hardening/
|
||||
├── README.md
|
||||
├── apparmor/ # AppArmor security profiles
|
||||
│ └── default.nix
|
||||
├── bwraps/ # Direct bubblewrap configurations
|
||||
│ ├── default.nix
|
||||
│ └── wechat.nix
|
||||
├── nixpaks/ # Nixpak application sandboxing
|
||||
│ ├── default.nix
|
||||
│ ├── firefox.nix
|
||||
│ ├── qq.nix
|
||||
│ └── modules/ # Reusable nixpak modules
|
||||
│ ├── gui-base.nix
|
||||
│ └── network.nix
|
||||
└── profiles/ # System hardening profiles
|
||||
└── default.nix
|
||||
```
|
||||
|
||||
## Kernel Hardening
|
||||
|
||||
@@ -69,13 +108,6 @@ provide a much higher level of security.
|
||||
- [Paranoid NixOS Setup - xeiaso](https://xeiaso.net/blog/paranoid-nixos-2021-07-18/)
|
||||
- [nix-mineral](https://github.com/cynicsketch/nix-mineral): NixOS module for convenient system
|
||||
hardening.
|
||||
- nixpak configs:
|
||||
- https://github.com/pokon548/OysterOS/tree/b97604d89953373d6316286b96f6a964af2c398d/desktop/application
|
||||
- https://github.com/segment-tree/my-nixos/tree/ceb6041f73bd9edcb78a8818b27a28f7c629193b/hm/me/apps/nixpak
|
||||
- https://github.com/Keksgesicht/nixos-config/tree/91cc77d8d6b598da7c4dbed143e0009c2dea6940/packages/nixpak
|
||||
- https://github.com/bluskript/nix-config/blob/7ecb6a7254c1ac4969072f4c4febdc19f8b83b30/pkgs/nixpak/default.nix
|
||||
- firejail configs:
|
||||
- https://github.com/stelcodes/nixos-config/blob/f8967c82a5e5f3d128eb1aaf7498b5f918f719ec/packages/overlay.nix#L261
|
||||
- apparmor configs:
|
||||
- https://github.com/zramctl/dotfiles/blob/4fe177f6984154960942bb47d5a375098ec6ed6a/modules/nixos/security/apparmor.nix#L4
|
||||
- https://git.grimmauld.de/Grimmauld/grimm-nixos-laptop/src/branch/main/hardening
|
||||
|
||||
@@ -15,18 +15,21 @@ let
|
||||
pname = "wechat";
|
||||
# https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/we/wechat/package.nix
|
||||
sources = {
|
||||
# use https://web.archive.org/save to archive the Linux versions
|
||||
# add `if_` at the end of timestamps to avoid toolbar insertion
|
||||
# for a more complicated guide, see https://en.wikipedia.org/wiki/Help:Using_the_Wayback_Machine
|
||||
aarch64-linux = {
|
||||
version = "4.0.1.11";
|
||||
version = "4.1.1.4";
|
||||
src = fetchurl {
|
||||
url = "https://web.archive.org/web/20250512112413if_/https://dldir1v6.qq.com/weixin/Universal/Linux/WeChatLinux_arm64.AppImage";
|
||||
hash = "sha256-Rg+FWNgOPC02ILUskQqQmlz1qNb9AMdvLcRWv7NQhGk=";
|
||||
url = "https://web.archive.org/web/20260311102559if_/https://dldir1v6.qq.com/weixin/Universal/Linux/WeChatLinux_arm64.AppImage";
|
||||
hash = "sha256-YlWJxT62tXDaNwYVpsPMC5elFH8fsbI1HjTQn6ePiPo=";
|
||||
};
|
||||
};
|
||||
x86_64-linux = {
|
||||
version = "4.0.1.11";
|
||||
version = "4.1.1.4";
|
||||
src = fetchurl {
|
||||
url = "https://web.archive.org/web/20250512110825if_/https://dldir1v6.qq.com/weixin/Universal/Linux/WeChatLinux_x86_64.AppImage";
|
||||
hash = "sha256-gBWcNQ1o1AZfNsmu1Vi1Kilqv3YbR+wqOod4XYAeVKo=";
|
||||
url = "https://web.archive.org/web/20260311102439if_/https://dldir1v6.qq.com/weixin/Universal/Linux/WeChatLinux_x86_64.AppImage";
|
||||
hash = "sha256-XxAvFnlljqurGPDgRr+DnuCKbdVvgXBPh02DLHY3Oz8=";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs-master,
|
||||
nixpak,
|
||||
...
|
||||
}:
|
||||
@@ -14,7 +15,7 @@ let
|
||||
(sloth.concat' sloth.homeDir mapdir)
|
||||
];
|
||||
};
|
||||
wrapper = _pkgs: path: (_pkgs.callPackage path callArgs).config.script;
|
||||
wrapper = _pkgs: path: (_pkgs.callPackage path callArgs);
|
||||
in
|
||||
{
|
||||
# Add nixpaked Apps into nixpkgs, and reference them in home-manager or other nixos modules
|
||||
@@ -22,13 +23,8 @@ in
|
||||
(_: super: {
|
||||
nixpaks = {
|
||||
qq = wrapper super ./qq.nix;
|
||||
qq-desktop-item = super.callPackage ./qq-desktop-item.nix { };
|
||||
|
||||
wechat = wrapper super ./wechat.nix;
|
||||
wechat-desktop-item = super.callPackage ./wechat-desktop-item.nix { };
|
||||
|
||||
telegram-desktop = wrapper super ./telegram-desktop.nix;
|
||||
firefox = wrapper super ./firefox.nix;
|
||||
firefox-desktop-item = super.callPackage ./firefox-desktop-item.nix { };
|
||||
};
|
||||
})
|
||||
];
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
{ makeDesktopItem }:
|
||||
makeDesktopItem {
|
||||
name = "firefox";
|
||||
desktopName = "firefox";
|
||||
exec = "firefox %U";
|
||||
terminal = false;
|
||||
icon = "firefox";
|
||||
type = "Application";
|
||||
categories = [ "Network" ];
|
||||
comment = "firefox boxed";
|
||||
}
|
||||
@@ -5,84 +5,123 @@
|
||||
# - Firefox's flatpak manifest: https://hg.mozilla.org/mozilla-central/file/tip/taskcluster/docker/firefox-flatpak/runme.sh#l151
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
firefox,
|
||||
mkNixPak,
|
||||
buildEnv,
|
||||
makeDesktopItem,
|
||||
...
|
||||
}:
|
||||
mkNixPak {
|
||||
config =
|
||||
{
|
||||
config,
|
||||
sloth,
|
||||
...
|
||||
}:
|
||||
{
|
||||
app = {
|
||||
package = pkgs.firefox-wayland;
|
||||
binPath = "bin/firefox";
|
||||
};
|
||||
flatpak.appId = "org.mozilla.firefox";
|
||||
|
||||
imports = [
|
||||
./modules/gui-base.nix
|
||||
./modules/network.nix
|
||||
];
|
||||
let
|
||||
appId = "org.mozilla.firefox";
|
||||
wrapped = mkNixPak {
|
||||
config =
|
||||
{
|
||||
config,
|
||||
sloth,
|
||||
...
|
||||
}:
|
||||
{
|
||||
app = {
|
||||
package = firefox;
|
||||
binPath = "bin/firefox";
|
||||
};
|
||||
flatpak.appId = appId;
|
||||
|
||||
# list all dbus services:
|
||||
# ls -al /run/current-system/sw/share/dbus-1/services/
|
||||
# ls -al /etc/profiles/per-user/ryan/share/dbus-1/services/
|
||||
dbus.policies = {
|
||||
"org.mozilla.firefox.*" = "own"; # firefox
|
||||
"org.mozilla.firefox_beta.*" = "own"; # firefox beta
|
||||
"org.mpris.MediaPlayer2.firefox.*" = "own";
|
||||
"org.freedesktop.NetworkManager" = "talk";
|
||||
|
||||
"org.gnome.Shell.Screencast" = "talk";
|
||||
# System tray icon
|
||||
"org.freedesktop.Notifications" = "talk";
|
||||
"org.kde.StatusNotifierWatcher" = "talk";
|
||||
# File Manager
|
||||
"org.freedesktop.FileManager1" = "talk";
|
||||
# Uses legacy StatusNotifier implementation
|
||||
"org.kde.*" = "own";
|
||||
};
|
||||
|
||||
bubblewrap = {
|
||||
# To trace all the home files QQ accesses, you can use the following nushell command:
|
||||
# just trace-access firefox
|
||||
# See the Justfile in the root of this repository for more information.
|
||||
bind.rw = [
|
||||
# given the read write permission to the following directories.
|
||||
# NOTE: sloth.mkdir is used to create the directory if it does not exist!
|
||||
(sloth.mkdir (sloth.concat' sloth.homeDir "/.mozilla"))
|
||||
|
||||
sloth.xdgDocumentsDir
|
||||
sloth.xdgDownloadDir
|
||||
sloth.xdgMusicDir
|
||||
sloth.xdgVideosDir
|
||||
];
|
||||
bind.ro = [
|
||||
"/sys/bus/pci"
|
||||
[
|
||||
"${config.app.package}/lib/firefox"
|
||||
"/app/etc/firefox"
|
||||
]
|
||||
|
||||
# ================ for browserpass extension ===============================
|
||||
"/etc/gnupg"
|
||||
(sloth.concat' sloth.homeDir "/.gnupg") # gpg's config
|
||||
(sloth.concat' sloth.homeDir "/.local/share/password-store") # my secrets
|
||||
(sloth.concat' sloth.runtimeDir "/gnupg") # for access gpg-agent socket
|
||||
|
||||
# Unsure
|
||||
(sloth.concat' sloth.xdgConfigHome "/dconf")
|
||||
imports = [
|
||||
./modules/gui-base.nix
|
||||
./modules/network.nix
|
||||
./modules/common.nix
|
||||
];
|
||||
|
||||
sockets = {
|
||||
x11 = false;
|
||||
wayland = true;
|
||||
pipewire = true;
|
||||
bubblewrap = {
|
||||
# To trace all the home files Firefox accesses, you can use the following nushell command:
|
||||
# just trace-access firefox
|
||||
# See the Justfile in the root of this repository for more information.
|
||||
bind.rw = [
|
||||
# given the read write permission to the following directories.
|
||||
# NOTE: sloth.mkdir is used to create the directory if it does not exist!
|
||||
(sloth.mkdir (sloth.concat' sloth.homeDir "/.mozilla"))
|
||||
|
||||
sloth.xdgDocumentsDir
|
||||
sloth.xdgDownloadDir
|
||||
sloth.xdgMusicDir
|
||||
sloth.xdgVideosDir
|
||||
sloth.xdgPicturesDir
|
||||
];
|
||||
bind.ro = [
|
||||
"/sys/bus/pci"
|
||||
[
|
||||
"${config.app.package}/lib/firefox"
|
||||
"/app/etc/firefox"
|
||||
]
|
||||
|
||||
# ================ for browserpass extension ===============================
|
||||
"/etc/gnupg"
|
||||
(sloth.concat' sloth.homeDir "/.gnupg") # gpg's config
|
||||
(sloth.concat' sloth.homeDir "/.local/share/password-store") # my secrets
|
||||
(sloth.concat' sloth.runtimeDir "/gnupg") # for access gpg-agent socket
|
||||
|
||||
# Unsure
|
||||
(sloth.concat' sloth.xdgConfigHome "/dconf")
|
||||
];
|
||||
|
||||
sockets = {
|
||||
x11 = false;
|
||||
wayland = true;
|
||||
pipewire = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
exePath = lib.getExe wrapped.config.script;
|
||||
in
|
||||
buildEnv {
|
||||
inherit (wrapped.config.script) name meta passthru;
|
||||
paths = [
|
||||
wrapped.config.script
|
||||
(makeDesktopItem {
|
||||
name = appId;
|
||||
desktopName = "Firefox";
|
||||
genericName = "Firefox Boxed";
|
||||
comment = "Firefox Browser";
|
||||
exec = "${exePath} %U";
|
||||
terminal = false;
|
||||
icon = "firefox";
|
||||
startupNotify = true;
|
||||
startupWMClass = "firefox";
|
||||
type = "Application";
|
||||
categories = [
|
||||
"Network"
|
||||
"WebBrowser"
|
||||
];
|
||||
mimeTypes = [
|
||||
"text/html"
|
||||
"text/xml"
|
||||
"application/xhtml+xml"
|
||||
"application/vnd.mozilla.xul+xml"
|
||||
"x-scheme-handler/http"
|
||||
"x-scheme-handler/https"
|
||||
];
|
||||
|
||||
actions = {
|
||||
new-private-window = {
|
||||
name = "New Private Window";
|
||||
exec = "${exePath} --private-window %U";
|
||||
};
|
||||
new-window = {
|
||||
name = "New Window";
|
||||
exec = "${exePath} --new-window %U";
|
||||
};
|
||||
profile-manager-window = {
|
||||
name = "Profile Manager";
|
||||
exec = "${exePath} --ProfileManager";
|
||||
};
|
||||
};
|
||||
|
||||
extraConfig = {
|
||||
X-Flatpak = appId;
|
||||
};
|
||||
})
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
# https://github.com/mnixry/nixos-config/blob/74913c2b90d06e31170bbbaa0074f915721da224/desktop/packages/nixpaks-common.nix
|
||||
# https://github.com/Kraftland/portable/blob/09c4a4227538a3f42de208a6ecbdc938ac9c00dd/portable.sh
|
||||
# https://flatpak.github.io/xdg-desktop-portal/docs/api-reference.html
|
||||
{
|
||||
lib,
|
||||
sloth,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
inherit (config.flatpak) appId;
|
||||
in
|
||||
{
|
||||
config = {
|
||||
# list all dbus services:
|
||||
# ls -al /run/current-system/sw/share/dbus-1/services/
|
||||
# ls -al /etc/profiles/per-user/ryan/share/dbus-1/services/
|
||||
dbus = {
|
||||
# `--see`: The bus name can be enumerated by the application.
|
||||
# `--talk`: The application can send messages to, and receive replies and signals from, the bus name.
|
||||
# `--own`: The application can own the bus name
|
||||
policies = {
|
||||
"${appId}" = "own";
|
||||
"${appId}.*" = "own";
|
||||
"org.freedesktop.DBus" = "talk";
|
||||
"ca.desrt.dconf" = "talk";
|
||||
"org.freedesktop.appearance" = "talk";
|
||||
"org.freedesktop.appearance.*" = "talk";
|
||||
}
|
||||
// (builtins.listToAttrs (
|
||||
map (id: lib.nameValuePair "org.kde.StatusNotifierItem-${toString id}-1" "own") (
|
||||
lib.lists.range 2 29
|
||||
)
|
||||
))
|
||||
// {
|
||||
# --- MPRIS Media Control ---
|
||||
# Allows the app to register as a media player. These are derived from the appID.
|
||||
"org.mpris.MediaPlayer2.${appId}" = "own";
|
||||
"org.mpris.MediaPlayer2.${appId}.*" = "own";
|
||||
"org.mpris.MediaPlayer2.${lib.lists.last (lib.strings.splitString "." appId)}" = "own";
|
||||
"org.mpris.MediaPlayer2.${lib.lists.last (lib.strings.splitString "." appId)}.*" = "own";
|
||||
|
||||
# --- General Desktop Integration ---
|
||||
"com.canonical.AppMenu.Registrar" = "talk"; # For Ubuntu AppMenu
|
||||
"org.freedesktop.FileManager1" = "talk";
|
||||
"org.freedesktop.Notifications" = "talk";
|
||||
"org.kde.StatusNotifierWatcher" = "talk";
|
||||
"org.gnome.Shell.Screencast" = "talk";
|
||||
|
||||
# --- Accessibility (a11y) 无障碍服务 ---
|
||||
"org.a11y.Bus" = "see";
|
||||
|
||||
# --- Portal Access ---
|
||||
# "org.freedesktop.portal.*" = "talk";
|
||||
"org.freedesktop.portal.Documents" = "talk";
|
||||
"org.freedesktop.portal.FileTransfer" = "talk";
|
||||
"org.freedesktop.portal.FileTransfer.*" = "talk";
|
||||
"org.freedesktop.portal.Notification" = "talk";
|
||||
"org.freedesktop.portal.OpenURI" = "talk";
|
||||
"org.freedesktop.portal.OpenURI.OpenFile" = "talk";
|
||||
"org.freedesktop.portal.OpenURI.OpenURI" = "talk";
|
||||
"org.freedesktop.portal.Print" = "talk";
|
||||
"org.freedesktop.portal.Request" = "see";
|
||||
|
||||
# --- Input Method Portals ---
|
||||
"org.freedesktop.portal.Fcitx" = "talk";
|
||||
"org.freedesktop.portal.Fcitx.*" = "talk";
|
||||
"org.freedesktop.portal.IBus" = "talk";
|
||||
"org.freedesktop.portal.IBus.*" = "talk";
|
||||
};
|
||||
# '--call' rules permit specific method calls on D-Bus interfaces.
|
||||
rules.call = {
|
||||
# --- Accessibility (a11y) 无障碍服务 ---
|
||||
"org.a11y.Bus" = [
|
||||
"org.a11y.Bus.GetAddress@/org/a11y/bus"
|
||||
"org.freedesktop.DBus.Properties.Get@/org/a11y/bus"
|
||||
];
|
||||
|
||||
# --- General Portal Rules ---
|
||||
"org.freedesktop.FileManager1" = [ "*" ];
|
||||
"org.freedesktop.Notifications.*" = [ "*" ];
|
||||
"org.freedesktop.portal.Documents" = [ "*" ];
|
||||
"org.freedesktop.portal.FileTransfer" = [ "*" ];
|
||||
"org.freedesktop.portal.FileTransfer.*" = [ "*" ];
|
||||
"org.freedesktop.portal.Fcitx" = [ "*" ];
|
||||
"org.freedesktop.portal.Fcitx.*" = [ "*" ];
|
||||
"org.freedesktop.portal.IBus" = [ "*" ];
|
||||
"org.freedesktop.portal.IBus.*" = [ "*" ];
|
||||
"org.freedesktop.portal.Notification" = [ "*" ];
|
||||
"org.freedesktop.portal.OpenURI" = [ "*" ];
|
||||
"org.freedesktop.portal.OpenURI.OpenFile" = [ "*" ];
|
||||
"org.freedesktop.portal.OpenURI.OpenURI" = [ "*" ];
|
||||
"org.freedesktop.portal.Print" = [ "*" ];
|
||||
"org.freedesktop.portal.Request" = [ "*" ];
|
||||
|
||||
# --- Main Desktop Portal Interface ---
|
||||
# A comprehensive list of permissions for interacting with the desktop environment.
|
||||
"org.freedesktop.portal.Desktop" = [
|
||||
# Properties & Settings
|
||||
"org.freedesktop.DBus.Properties.GetAll"
|
||||
"org.freedesktop.DBus.Properties.Get@/org/freedesktop/portal/desktop"
|
||||
"org.freedesktop.portal.Session.Close"
|
||||
"org.freedesktop.portal.Settings.ReadAll"
|
||||
"org.freedesktop.portal.Settings.Read"
|
||||
"org.freedesktop.portal.Account.GetUserInformation"
|
||||
|
||||
# Network & Proxy
|
||||
"org.freedesktop.portal.NetworkMonitor"
|
||||
"org.freedesktop.portal.NetworkMonitor.*"
|
||||
"org.freedesktop.portal.ProxyResolver.Lookup"
|
||||
"org.freedesktop.portal.ProxyResolver.Lookup.*"
|
||||
|
||||
# Screenshot / Screen Capture & Sharing
|
||||
"org.freedesktop.portal.ScreenCast"
|
||||
"org.freedesktop.portal.ScreenCast.*"
|
||||
"org.freedesktop.portal.Screenshot"
|
||||
"org.freedesktop.portal.Screenshot.Screenshot"
|
||||
|
||||
# Device Access(Camera / USB)
|
||||
"org.freedesktop.portal.Camera"
|
||||
"org.freedesktop.portal.Camera.*"
|
||||
"org.freedesktop.portal.Usb"
|
||||
"org.freedesktop.portal.Usb.*"
|
||||
|
||||
# Remote Desktop
|
||||
"org.freedesktop.portal.RemoteDesktop"
|
||||
"org.freedesktop.portal.RemoteDesktop.*"
|
||||
|
||||
# File Operations
|
||||
"org.freedesktop.portal.Documents"
|
||||
"org.freedesktop.portal.Documents.*"
|
||||
"org.freedesktop.portal.FileChooser"
|
||||
"org.freedesktop.portal.FileChooser.*"
|
||||
"org.freedesktop.portal.FileTransfer"
|
||||
"org.freedesktop.portal.FileTransfer.*"
|
||||
|
||||
# Notifications & Printing
|
||||
"org.freedesktop.portal.Notification"
|
||||
"org.freedesktop.portal.Notification.*"
|
||||
"org.freedesktop.portal.Print"
|
||||
"org.freedesktop.portal.Print.*"
|
||||
|
||||
# Open/Launch Handlers
|
||||
"org.freedesktop.portal.OpenURI"
|
||||
"org.freedesktop.portal.OpenURI.*"
|
||||
"org.freedesktop.portal.Email.ComposeEmail"
|
||||
|
||||
# Input Methods
|
||||
"org.freedesktop.portal.Fcitx"
|
||||
"org.freedesktop.portal.Fcitx.*"
|
||||
"org.freedesktop.portal.IBus"
|
||||
"org.freedesktop.portal.IBus.*"
|
||||
|
||||
# Secrets (Keyring)
|
||||
"org.freedesktop.portal.Secret"
|
||||
"org.freedesktop.portal.Secret.RetrieveSecret"
|
||||
|
||||
# Get/Update GlobalShortcuts
|
||||
# "org.freedesktop.portal.GlobalShortcuts"
|
||||
# "org.freedesktop.portal.GlobalShortcuts.*"
|
||||
|
||||
# -- get the user's location
|
||||
# "org.freedesktop.portal.Location"
|
||||
# "org.freedesktop.portal.Location.*"
|
||||
|
||||
# -- inhibit the user session from ending, suspending, idling or getting switched away.
|
||||
"org.freedesktop.portal.Inhibit"
|
||||
"org.freedesktop.portal.Inhibit.*"
|
||||
|
||||
# Generic Request Fallback
|
||||
"org.freedesktop.portal.Request"
|
||||
];
|
||||
};
|
||||
|
||||
# 'broadcast' rules permit receiving signals from D-Bus names.
|
||||
rules.broadcast = {
|
||||
"org.freedesktop.portal.*" = [ "@/org/freedesktop/portal/*" ];
|
||||
};
|
||||
args = [
|
||||
"--filter"
|
||||
"--sloppy-names"
|
||||
"--log"
|
||||
];
|
||||
};
|
||||
|
||||
etc.sslCertificates.enable = true;
|
||||
bubblewrap = {
|
||||
network = lib.mkDefault true;
|
||||
sockets = {
|
||||
wayland = true;
|
||||
pulse = true;
|
||||
};
|
||||
|
||||
bind.rw = with sloth; [
|
||||
[
|
||||
(mkdir appDataDir)
|
||||
xdgDataHome
|
||||
]
|
||||
[
|
||||
(mkdir appConfigDir)
|
||||
xdgConfigHome
|
||||
]
|
||||
[
|
||||
(mkdir appCacheDir)
|
||||
xdgCacheHome
|
||||
]
|
||||
|
||||
(sloth.concat [
|
||||
sloth.runtimeDir
|
||||
"/"
|
||||
(sloth.envOr "WAYLAND_DISPLAY" "no")
|
||||
])
|
||||
(sloth.concat' sloth.runtimeDir "/at-spi/bus")
|
||||
(sloth.concat' sloth.runtimeDir "/gvfsd")
|
||||
(sloth.concat' sloth.runtimeDir "/dconf")
|
||||
|
||||
(sloth.concat' sloth.xdgCacheHome "/fontconfig")
|
||||
(sloth.concat' sloth.xdgCacheHome "/mesa_shader_cache")
|
||||
(sloth.concat' sloth.xdgCacheHome "/mesa_shader_cache_db")
|
||||
(sloth.concat' sloth.xdgCacheHome "/radv_builtin_shaders")
|
||||
];
|
||||
bind.ro = [
|
||||
(sloth.concat' sloth.runtimeDir "/doc")
|
||||
(sloth.concat' sloth.xdgConfigHome "/kdeglobals")
|
||||
(sloth.concat' sloth.xdgConfigHome "/gtk-2.0")
|
||||
(sloth.concat' sloth.xdgConfigHome "/gtk-3.0")
|
||||
(sloth.concat' sloth.xdgConfigHome "/gtk-4.0")
|
||||
(sloth.concat' sloth.xdgConfigHome "/fontconfig")
|
||||
(sloth.concat' sloth.xdgConfigHome "/dconf")
|
||||
];
|
||||
bind.dev = [ "/dev/shm" ] ++ (map (id: "/dev/video${toString id}") (lib.lists.range 0 9));
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -16,15 +16,7 @@ in
|
||||
config = {
|
||||
dbus.policies = {
|
||||
"${config.flatpak.appId}" = "own";
|
||||
"org.freedesktop.DBus" = "talk";
|
||||
"org.gtk.vfs.*" = "talk";
|
||||
"org.gtk.vfs" = "talk";
|
||||
"ca.desrt.dconf" = "talk";
|
||||
"org.a11y.Bus" = "talk";
|
||||
|
||||
# for default portal & gtk/hyprland's portal
|
||||
"org.freedesktop.portal.*" = "talk";
|
||||
"org.freedesktop.impl.portal.desktop.*" = "talk";
|
||||
# we add other policies in ./common.nix
|
||||
};
|
||||
# https://github.com/nixpak/nixpak/blob/master/modules/gpu.nix
|
||||
# 1. bind readonly - /run/opengl-driver
|
||||
@@ -69,8 +61,8 @@ in
|
||||
(sloth.concat' sloth.xdgConfigHome "/fontconfig")
|
||||
|
||||
"/etc/fonts" # for fontconfig
|
||||
"/etc/machine-id"
|
||||
"/etc/localtime"
|
||||
"/etc/localtime" # this is a symlink to /etc/zoneinfo/xxx
|
||||
"/etc/zoneinfo"
|
||||
|
||||
# Fix: libEGL warning: egl: failed to create dri2 screen
|
||||
"/etc/egl"
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
makeDesktopItem,
|
||||
qq,
|
||||
}:
|
||||
makeDesktopItem {
|
||||
name = "qq";
|
||||
desktopName = "QQ";
|
||||
exec = "${qq}/bin/qq %U";
|
||||
terminal = false;
|
||||
# To find the icon name(nushell):
|
||||
# let p = NIXPKGS_ALLOW_UNFREE=1 nix eval --impure nixpkgs#qq.outPath | str trim --char '"'
|
||||
# tree $"($p)/share/icons"
|
||||
icon = "${qq}/share/icons/hicolor/512x512/apps/qq.png";
|
||||
type = "Application";
|
||||
categories = [ "Network" ];
|
||||
comment = "QQ boxed";
|
||||
}
|
||||
@@ -5,65 +5,75 @@
|
||||
# - QQ's flatpak manifest: https://github.com/flathub/com.qq.QQ/blob/master/com.qq.QQ.yaml
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
qq,
|
||||
mkNixPak,
|
||||
buildEnv,
|
||||
makeDesktopItem,
|
||||
...
|
||||
}:
|
||||
mkNixPak {
|
||||
config =
|
||||
{ sloth, ... }:
|
||||
{
|
||||
app = {
|
||||
package = pkgs.qq.override {
|
||||
# fix fcitx5 input method
|
||||
commandLineArgs = lib.concatStringsSep " " [ "--enable-wayland-ime" ];
|
||||
|
||||
let
|
||||
appId = "com.qq.QQ";
|
||||
|
||||
wrapped = mkNixPak {
|
||||
config =
|
||||
{ sloth, ... }:
|
||||
{
|
||||
app = {
|
||||
package = qq;
|
||||
binPath = "bin/qq";
|
||||
};
|
||||
binPath = "bin/qq";
|
||||
};
|
||||
flatpak.appId = "com.tencent.qq";
|
||||
flatpak.appId = appId;
|
||||
|
||||
imports = [
|
||||
./modules/gui-base.nix
|
||||
./modules/network.nix
|
||||
];
|
||||
|
||||
# list all dbus services:
|
||||
# ls -al /run/current-system/sw/share/dbus-1/services/
|
||||
# ls -al /etc/profiles/per-user/ryan/share/dbus-1/services/
|
||||
dbus.policies = {
|
||||
"org.gnome.Shell.Screencast" = "talk";
|
||||
# System tray icon
|
||||
"org.freedesktop.Notifications" = "talk";
|
||||
"org.kde.StatusNotifierWatcher" = "talk";
|
||||
# File Manager
|
||||
"org.freedesktop.FileManager1" = "talk";
|
||||
# Uses legacy StatusNotifier implementation
|
||||
"org.kde.*" = "own";
|
||||
};
|
||||
bubblewrap = {
|
||||
# To trace all the home files QQ accesses, you can use the following nushell command:
|
||||
# just trace-access qq
|
||||
# See the Justfile in the root of this repository for more information.
|
||||
bind.rw = [
|
||||
# given the read write permission to the following directories.
|
||||
# NOTE: sloth.mkdir is used to create the directory if it does not exist!
|
||||
(sloth.mkdir (
|
||||
sloth.concat [
|
||||
sloth.xdgConfigHome
|
||||
"/QQ"
|
||||
]
|
||||
))
|
||||
|
||||
sloth.xdgDocumentsDir
|
||||
sloth.xdgDownloadDir
|
||||
sloth.xdgMusicDir
|
||||
sloth.xdgVideosDir
|
||||
imports = [
|
||||
./modules/gui-base.nix
|
||||
./modules/network.nix
|
||||
./modules/common.nix
|
||||
];
|
||||
sockets = {
|
||||
x11 = false;
|
||||
wayland = true;
|
||||
pipewire = true;
|
||||
|
||||
bubblewrap = {
|
||||
# To trace all the home files QQ accesses, you can use the following nushell command:
|
||||
# just trace-access qq
|
||||
# See the Justfile in the root of this repository for more information.
|
||||
bind.rw = [
|
||||
sloth.xdgDocumentsDir
|
||||
sloth.xdgDownloadDir
|
||||
sloth.xdgMusicDir
|
||||
sloth.xdgVideosDir
|
||||
sloth.xdgPicturesDir
|
||||
];
|
||||
sockets = {
|
||||
x11 = false;
|
||||
wayland = true;
|
||||
pipewire = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
exePath = lib.getExe wrapped.config.script;
|
||||
in
|
||||
buildEnv {
|
||||
inherit (wrapped.config.script) name meta passthru;
|
||||
paths = [
|
||||
wrapped.config.script
|
||||
(makeDesktopItem {
|
||||
name = appId;
|
||||
desktopName = "QQ";
|
||||
genericName = "QQ Boxed";
|
||||
comment = "Tencent QQ, also known as QQ, is an instant messaging software service and web portal developed by the Chinese technology company Tencent.";
|
||||
exec = "${exePath} %U";
|
||||
terminal = false;
|
||||
icon = "${qq}/share/icons/hicolor/512x512/apps/qq.png";
|
||||
startupNotify = true;
|
||||
startupWMClass = "QQ";
|
||||
type = "Application";
|
||||
categories = [
|
||||
"InstantMessaging"
|
||||
"Network"
|
||||
];
|
||||
extraConfig = {
|
||||
X-Flatpak = appId;
|
||||
};
|
||||
})
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
{
|
||||
lib,
|
||||
telegram-desktop,
|
||||
buildEnv,
|
||||
mkNixPak,
|
||||
makeDesktopItem,
|
||||
...
|
||||
}:
|
||||
let
|
||||
appId = "org.telegram.desktop";
|
||||
wrapped = mkNixPak {
|
||||
config =
|
||||
{ sloth, ... }:
|
||||
{
|
||||
imports = [
|
||||
./modules/gui-base.nix
|
||||
./modules/network.nix
|
||||
./modules/common.nix
|
||||
];
|
||||
app.package = telegram-desktop;
|
||||
flatpak = {
|
||||
appId = appId;
|
||||
};
|
||||
dbus = {
|
||||
enable = true;
|
||||
policies = {
|
||||
"com.canonical.indicator.application" = "talk";
|
||||
"org.ayatana.indicator.application" = "talk";
|
||||
"org.sigxcpu.Feedback" = "talk";
|
||||
};
|
||||
};
|
||||
|
||||
bubblewrap = {
|
||||
bind.rw = [
|
||||
sloth.xdgDocumentsDir
|
||||
sloth.xdgDownloadDir
|
||||
sloth.xdgMusicDir
|
||||
sloth.xdgVideosDir
|
||||
sloth.xdgPicturesDir
|
||||
];
|
||||
sockets = {
|
||||
x11 = false;
|
||||
wayland = true;
|
||||
pipewire = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
exePath = lib.getExe wrapped.config.script;
|
||||
in
|
||||
buildEnv {
|
||||
inherit (wrapped.config.script) name meta passthru;
|
||||
paths = [
|
||||
wrapped.config.script
|
||||
(makeDesktopItem {
|
||||
name = appId;
|
||||
desktopName = "Telegram";
|
||||
comment = "New era of messaging";
|
||||
tryExec = "${exePath}";
|
||||
exec = "${exePath} -- %u";
|
||||
icon = appId;
|
||||
startupNotify = true;
|
||||
startupWMClass = appId;
|
||||
terminal = false;
|
||||
type = "Application";
|
||||
categories = [
|
||||
"Chat"
|
||||
"Network"
|
||||
"InstantMessaging"
|
||||
"Qt"
|
||||
];
|
||||
mimeTypes = [
|
||||
"x-scheme-handler/tg"
|
||||
"x-scheme-handler/tonsite"
|
||||
];
|
||||
keywords = [
|
||||
"tg"
|
||||
"chat"
|
||||
"im"
|
||||
"messaging"
|
||||
"messenger"
|
||||
"sms"
|
||||
"tdesktop"
|
||||
];
|
||||
actions = {
|
||||
quit = {
|
||||
name = "Quit Telegram";
|
||||
exec = "${exePath} -quit";
|
||||
icon = "application-exit";
|
||||
};
|
||||
};
|
||||
extraConfig = {
|
||||
X-Flatpak = appId;
|
||||
DBusActivatable = "true";
|
||||
SingleMainWindow = "true";
|
||||
X-GNOME-UsesNotifications = "true";
|
||||
X-GNOME-SingleWindow = "true";
|
||||
};
|
||||
})
|
||||
];
|
||||
}
|
||||
@@ -1,5 +1,56 @@
|
||||
# Home Manager's Submodules
|
||||
|
||||
1. `base`: The base module that is suitable for both Linux and macOS.
|
||||
2. `linux`: Linux-specific configuration.
|
||||
3. `darwin`: macOS-specific configuration.
|
||||
This directory contains all Home Manager configurations organized by platform and functionality.
|
||||
|
||||
## Current Structure
|
||||
|
||||
```
|
||||
home/
|
||||
├── base/ # Cross-platform home manager configurations
|
||||
│ ├── core/ # Essential applications and settings
|
||||
│ │ ├── editors/ # Editor configurations (Neovim, Helix)
|
||||
│ │ ├── shells/ # Shell configurations (Nushell, Zellij)
|
||||
│ │ └── ...
|
||||
│ ├── gui/ # GUI applications and desktop settings
|
||||
│ │ ├── terminal/ # Terminal emulators (Kitty, Alacritty, etc.)
|
||||
│ │ └── ...
|
||||
│ ├── tui/ # Terminal/TUI applications
|
||||
│ │ ├── editors/ # Heavy editor/tooling pkgs only (`packages.nix`; core editors live under `core/editors`)
|
||||
│ │ ├── encryption/ # GPG, password-store, etc.
|
||||
│ │ └── ...
|
||||
│ └── home.nix # Main home manager entry point
|
||||
├── linux/ # Linux-specific home manager configurations
|
||||
│ ├── base/ # Linux base configurations
|
||||
│ ├── gui/ # Linux GUI applications
|
||||
│ │ ├── niri/ # Niri window manager
|
||||
│ │ └── ...
|
||||
│ ├── editors/ # Linux-specific editors
|
||||
│ └── ...
|
||||
├── hosts/ # Host-specific home manager entry modules
|
||||
│ ├── linux/ # Linux host home modules (ai, shoukei, k3s-*, etc.)
|
||||
│ └── darwin/ # macOS host home modules (fern, frieren)
|
||||
└── darwin/ # macOS-specific home manager configurations
|
||||
├── aerospace/ # macOS window manager
|
||||
├── proxy/ # Proxy configurations
|
||||
└── ...
|
||||
```
|
||||
|
||||
## Module Overview
|
||||
|
||||
1. **base**: The base module suitable for both Linux and macOS
|
||||
- Cross-platform applications and settings
|
||||
- Shared configurations for editors, shells, and essential tools
|
||||
|
||||
2. **linux**: Linux-specific configuration
|
||||
- Desktop environments (Noctalia Shell, Niri compositor)
|
||||
- Linux-specific GUI applications
|
||||
- System integration tools
|
||||
|
||||
3. **darwin**: macOS-specific configuration
|
||||
- macOS applications and services
|
||||
- Platform-specific integrations (Aerospace, Squirrel, etc.)
|
||||
|
||||
4. **hosts**: Host entry modules for Home Manager
|
||||
- Each output should reference only one host home module file
|
||||
- Host modules are responsible for importing shared stacks (`home/linux/*` or `home/darwin`) and
|
||||
applying host overrides
|
||||
|
||||
@@ -1,5 +1,64 @@
|
||||
# Home Manager's Base Submodules
|
||||
|
||||
1. `server`: Configuration which is suitable for both servers and desktops.
|
||||
1. `desktop`: Configuration for desktop environments, such as Hyprland, I3, etc.
|
||||
1. `core.nix`: Minimal home-manager's config
|
||||
This directory contains cross-platform base configurations that are shared between Linux and Darwin
|
||||
systems.
|
||||
|
||||
## Configuration Structure
|
||||
|
||||
### Core System
|
||||
|
||||
- **core/**: Essential cross-platform configurations
|
||||
- **core.nix**: Minimal home-manager configuration
|
||||
- **shells/**: Shell configurations (bash, zsh, fish, nu)
|
||||
- **editors/**: Helix + Neovim (Home Manager) and usage docs (`README.md` per editor)
|
||||
- **btop.nix**: System monitoring tools
|
||||
- **git.nix**: Git configuration and aliases
|
||||
- **npm.nix**: Node.js package management
|
||||
- **pip.nix**: Python package management
|
||||
- **starship.nix**: Cross-shell prompt configuration
|
||||
- **theme.nix**: Color schemes and theming
|
||||
- **yazi.nix**: Terminal file manager configuration
|
||||
- **zellij/**: Terminal multiplexer with custom layouts
|
||||
|
||||
### Desktop Environment
|
||||
|
||||
- **gui/**: Cross-platform GUI applications and configurations
|
||||
- **dev-tools.nix**: Development tools and IDEs
|
||||
- **media.nix**: Media players and utilities
|
||||
- **terminal/**: Terminal emulator configurations
|
||||
- **alacritty/**: Alacritty terminal
|
||||
- **kitty/**: Kitty terminal
|
||||
- **foot/**: Foot terminal (Linux)
|
||||
- **ghostty/**: Ghostty terminal
|
||||
|
||||
### Terminal Interface
|
||||
|
||||
- **tui/**: Terminal-based interface configurations
|
||||
- **cloud/**: Cloud development tools (Terraform, etc.)
|
||||
- **container.nix**: Container tools (Docker, Podman)
|
||||
- **dev-tools.nix**: Terminal-based development tools
|
||||
- **editors/**: Extra terminal editor Nix (see `core/editors/` for docs and baseline enables)
|
||||
- **encryption/**: Encryption and security tools
|
||||
- **gpg/**: GPG key management
|
||||
- **password-store/**: Password management with pass
|
||||
- **shell.nix**: Shell environment configurations
|
||||
- **ssh/**: SSH configuration and management
|
||||
- **zellij/**: Terminal workspace management
|
||||
|
||||
### System Management
|
||||
|
||||
- **home.nix**: Main home manager configuration file
|
||||
|
||||
## Platform Compatibility
|
||||
|
||||
All configurations in this directory are designed to work across:
|
||||
|
||||
- **Linux**: All distributions with Nix and Home Manager
|
||||
- **macOS**: Darwin systems with Home Manager
|
||||
- **WSL**: Windows Subsystem for Linux
|
||||
|
||||
## Usage
|
||||
|
||||
These base configurations provide the foundation for both Linux and Darwin systems, ensuring
|
||||
consistent environments across different platforms while allowing for platform-specific
|
||||
customizations.
|
||||
|
||||
@@ -1,34 +1,6 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
# Misc
|
||||
cowsay
|
||||
gnupg
|
||||
gnumake
|
||||
|
||||
# Modern cli tools, replacement of grep/sed/...
|
||||
|
||||
# Interactively filter its input using fuzzy searching, not limit to filenames.
|
||||
fzf
|
||||
# search for files by name, faster than find
|
||||
fd
|
||||
# search for files by its content, replacement of grep
|
||||
(ripgrep.override { withPCRE2 = true; })
|
||||
|
||||
# A fast and polyglot tool for code searching, linting, rewriting at large scale
|
||||
# supported languages: only some mainstream languages currently(do not support nix/nginx/yaml/toml/...)
|
||||
ast-grep
|
||||
|
||||
sad # CLI search and replace, just like sed, but with diff preview.
|
||||
yq-go # yaml processor https://github.com/mikefarah/yq
|
||||
just # a command runner like make, but simpler
|
||||
hyperfine # command-line benchmarking tool
|
||||
gping # ping, but with a graph(TUI)
|
||||
doggo # DNS client for humans
|
||||
duf # Disk Usage/Free Utility - a better 'df' alternative
|
||||
du-dust # A more intuitive version of `du` in rust
|
||||
gdu # disk usage analyzer(replacement of `du`)
|
||||
|
||||
# nix related
|
||||
#
|
||||
# it provides the command `nom` works just like `nix
|
||||
@@ -42,10 +14,15 @@
|
||||
# https://github.com/utdemir/nix-tree
|
||||
nix-tree # A TUI to visualize the dependency graph of a nix derivation
|
||||
|
||||
# productivity
|
||||
# misc
|
||||
cowsay
|
||||
gnupg
|
||||
caddy # A webserver with automatic HTTPS via Let's Encrypt(replacement of nginx)
|
||||
croc # File transfer between computers securely and easily
|
||||
ncdu # analyzer your disk usage Interactively, via TUI(replacement of `du`)
|
||||
# A fast and polyglot tool for code searching, linting, rewriting at large scale
|
||||
# supported languages: only some mainstream languages currently(do not support nix/nginx/yaml/toml/...)
|
||||
ast-grep
|
||||
|
||||
# other core cli tools are installed at system-level
|
||||
];
|
||||
|
||||
# A modern replacement for ‘ls’
|
||||
|
||||
@@ -71,5 +71,3 @@ Linting is distinct from Formatting because:
|
||||
|
||||
Formatters and Linters process each file independently, they do not need to know about other files
|
||||
in the project.
|
||||
|
||||
- [ ]
|
||||
@@ -1,3 +1,26 @@
|
||||
# Editors
|
||||
|
||||
See [desktop/editors/](../../desktop/editors/) for more details.
|
||||
Shared editor configuration and **usage notes** for terminal-focused editing.
|
||||
|
||||
## Roles
|
||||
|
||||
- **Helix** (`helix/`): Primary TUI editor — batteries-included, small attack surface. `$EDITOR` /
|
||||
`$VISUAL` default to `hx` (`session-env.nix`).
|
||||
- **Neovim** (`neovim/`): Backup editor — classic vim-style workflow and `:help` when needed. For
|
||||
privileged edits (`sudoedit`) and other security-sensitive inputs, `$SUDO_EDITOR` is
|
||||
`nvim --clean`; use that explicitly when `$EDITOR` must avoid user config/plugins.
|
||||
|
||||
Terminal layout and files: **Zellij** and **Yazi** live under `core/zellij/` and `core/yazi.nix`
|
||||
(not in this folder).
|
||||
|
||||
## Docs
|
||||
|
||||
- [`helix/README.md`](./helix/README.md) — Helix basics, cheatsheet, official doc links, Helix vs
|
||||
Neovim notes.
|
||||
- [`neovim/README.md`](./neovim/README.md) — Vim/Neovim basics, cheatsheet, and official doc links.
|
||||
|
||||
Nix modules in `helix/` and `neovim/` enable each editor via Home Manager. Language servers and
|
||||
other heavy editor-related packages are listed in
|
||||
[`../../tui/editors/`](../../tui/editors/README.md) (imported from `home/base/tui`).
|
||||
|
||||
Editor terminology (LSP, tree-sitter): [`Glossary.md`](./Glossary.md).
|
||||
|
||||
@@ -0,0 +1,209 @@
|
||||
# Helix (primary) — Kakoune-style usage
|
||||
|
||||
Neovim is powerful and has a very active community. This config still enables Neovim as a **backup**
|
||||
editor (vim-style muscle memory, `:help`, and occasional plugin workflows).
|
||||
|
||||
Helix is the **primary** TUI editor here: opinionated, batteries-included (LSP, tree-sitter, picker,
|
||||
multi-cursor, surround), and a smaller moving part than a large Neovim plugin stack.
|
||||
|
||||
## Tips
|
||||
|
||||
1. This flake sets `$EDITOR` / `$VISUAL` to **`hx`** by default. For security-sensitive edits
|
||||
(privileged files, unfamiliar binaries, secrets), prefer **`nvim --clean`** — `$SUDO_EDITOR` uses
|
||||
it so `sudoedit` stays minimal; invoke it yourself in other trust-boundary cases.
|
||||
1. Helix is **selection-first** (like Kakoune): extend a selection, then run an action (`d`, `c`,
|
||||
`y`, …). A lone cursor is a zero-width selection.
|
||||
1. Read the official docs before reinventing workflows:
|
||||
1. <https://docs.helix-editor.com/> — documentation home (links to usage, keymap, configuration).
|
||||
1. <https://docs.helix-editor.com/usage.html> — modes, buffers, motions overview.
|
||||
1. <https://docs.helix-editor.com/keymap.html> — full default keybindings.
|
||||
1. <https://docs.helix-editor.com/commands.html> — typable commands (`:` prompt).
|
||||
1. <https://docs.helix-editor.com/configuration.html> — `config.toml`, themes, remaps.
|
||||
1. <https://github.com/helix-editor/helix/wiki> — install tips, language servers, FAQ.
|
||||
1. Prefer **Zellij** for shells and panes; use **Helix** for buffers and text.
|
||||
1. On large codebases, navigation is often **by picker** (`Space f`, symbols, workspace search) or
|
||||
**by LSP** (`g` goto mode), complementing motion-based editing.
|
||||
1. After **git** operations (`checkout`, `merge`, `pull`, `rebase`) or whenever many files changed
|
||||
on disk, run **`:reload-all`** (alias **`:rla`**) so every open buffer is refreshed from disk in
|
||||
one step — much faster than revisiting each file or restarting Helix.
|
||||
|
||||
## Tutorial
|
||||
|
||||
Run `:tutor` inside Helix, or `hx --tutor` from the shell
|
||||
([tutor source](https://github.com/helix-editor/helix/blob/master/runtime/tutor)).
|
||||
|
||||
## Helix cheatsheet (common keys)
|
||||
|
||||
> Full reference: <https://docs.helix-editor.com/keymap.html>
|
||||
> Typable commands: <https://docs.helix-editor.com/commands.html>
|
||||
|
||||
### Terminal related
|
||||
|
||||
Zellij shortcuts used often (same idea as in the Neovim notes):
|
||||
|
||||
| Action | Zellij shortcut |
|
||||
| ------------------------- | --------------- |
|
||||
| Floating terminal | `Ctrl + p + w` |
|
||||
| Horizontal split terminal | `Ctrl + p + d` |
|
||||
| Vertical split terminal | `Ctrl + p + n` |
|
||||
|
||||
In Helix, `|` / `!` and variants pipe or insert shell output on selections (see **Changes**).
|
||||
|
||||
This flake’s Helix Home Manager module keeps **almost all default keys**; the only remap is
|
||||
**`Ctrl+Shift+o`** → jump backward, because Zellij uses **`Ctrl+o`** for Session (see
|
||||
`home/base/core/editors/helix/default.nix`). For other Zellij clashes, use **locked mode**
|
||||
(`Ctrl+g`), **`:`** commands, or the built-in **`Space`** menu.
|
||||
|
||||
### Command mode (`:`)
|
||||
|
||||
> <https://docs.helix-editor.com/commands.html>
|
||||
|
||||
| Action | Command examples |
|
||||
| ---------------------- | -------------------------------------------------------------------- |
|
||||
| Write / write all | `:w` / `:wa` |
|
||||
| Quit view / quit all | `:q` / `:qa` — add `!` to discard changes |
|
||||
| Write and quit | `:wq`, `:x` |
|
||||
| Write all and quit all | `:wqa`, `:xa` |
|
||||
| Open file | `:open path`, `:e path` |
|
||||
| Next / previous buffer | `:bn` / `:bp` (also `gn` / `gp` in normal) |
|
||||
| Close buffer | `:bc` (add `!` to force) |
|
||||
| Reload from disk | `:reload` (current buffer); `:reload-all` / **`:rla`** (all buffers) |
|
||||
| Change directory / pwd | `:cd` / `:pwd` |
|
||||
| Split open file | `:vs path`, `:hs path` |
|
||||
|
||||
### Movement (normal mode)
|
||||
|
||||
| Action | Keys / notes |
|
||||
| --------------------- | --------------------------------------------------- |
|
||||
| Arrow keys | `h` `j` `k` `l` |
|
||||
| Words | `w` `b` `e` — `W` `B` `E` for WORD-style |
|
||||
| Find char / till char | `f` `F` `t` `T` (not limited to current line) |
|
||||
| Line / file | `Home` / `End`; `gg` start or goto line; `G` line |
|
||||
| Half / full page | `Ctrl-u` / `Ctrl-d`; `Ctrl-b` / `Ctrl-f` |
|
||||
| Jumplist | `Ctrl-o` back, `Ctrl-i` forward; `Ctrl-s` save spot |
|
||||
|
||||
### Selection & changes
|
||||
|
||||
| Action | Keys / notes |
|
||||
| ---------------------- | ----------------------------------------------------------------- |
|
||||
| Extend selections | `v` select mode; motions extend instead of moving |
|
||||
| Line selection | `x` extend line; `X` line bounds |
|
||||
| Select all / regex | `%`; `s` regex in selections; `S` split on regex |
|
||||
| Undo / redo | `u` / `U` |
|
||||
| Delete / change / yank | `d` / `c` / `y` — acts on selection |
|
||||
| Paste | `p` / `P`; registers `"` … |
|
||||
| Insert | `i` `a` `I` `A` `o` `O` |
|
||||
| Indent / format | `>` / `<`; `=` format (LSP) |
|
||||
| Case | `~` toggle; lower/upper case via grave / `Alt-grave` (see keymap) |
|
||||
| Join lines | `J`; `Alt-J` join keeping space |
|
||||
|
||||
### Search
|
||||
|
||||
| Action | Keys |
|
||||
| -------------------- | ---------------------------------------- |
|
||||
| Search / reverse | `/` / `?` |
|
||||
| Next / prev match | `n` / `N` |
|
||||
| Selection as pattern | `*` (word bounds); `Alt-*` raw selection |
|
||||
|
||||
Use **extend mode** (`v`) with `n` / `N` to add matches to multi-cursors
|
||||
([keymap](https://docs.helix-editor.com/keymap.html#select--extend-mode)).
|
||||
|
||||
### Replace / multi-occur edits
|
||||
|
||||
Helix has no vim-style `:%s` with preview. Typical patterns:
|
||||
|
||||
- Select matches with `s` or search, then `c` to change all selections at once.
|
||||
- Workspace-wide search: `Space /` (global search picker).
|
||||
- Heavy refactors: external tools or another pane (see **Differences** below).
|
||||
|
||||
### Goto mode (`g` then …)
|
||||
|
||||
| Action | Keys (after `g`) |
|
||||
| -------------------- | ---------------- |
|
||||
| File start / end | `g` / `e` |
|
||||
| Line start / end | `h` / `l` |
|
||||
| File / URL | `f` |
|
||||
| First non-whitespace | `s` |
|
||||
| Definition / refs | `d` / `r` (LSP) |
|
||||
| Type / impl | `y` / `i` (LSP) |
|
||||
| Next / prev buffer | `n` / `p` |
|
||||
|
||||
Also: `gd` / `gD` definition/declaration-style jumps where bound.
|
||||
|
||||
### Match mode (`m` …)
|
||||
|
||||
Surround and textobjects: see <https://docs.helix-editor.com/surround.html> and
|
||||
<https://docs.helix-editor.com/textobjects.html>. Matching bracket: `mm` (tree-sitter).
|
||||
|
||||
### Window mode (`Ctrl-w` then …)
|
||||
|
||||
| Action | Keys |
|
||||
| ---------------- | --------------- |
|
||||
| Next window | `w` |
|
||||
| Vertical split | `v` |
|
||||
| Horizontal split | `s` |
|
||||
| Focus splits | `h` `j` `k` `l` |
|
||||
| Close / only | `q` / `o` |
|
||||
|
||||
### Space mode (`Space` then …)
|
||||
|
||||
| Action | Keys |
|
||||
| -------------------- | ------------------ |
|
||||
| File picker (roots) | `f` |
|
||||
| File picker (cwd) | `F` |
|
||||
| Buffer picker | `b` |
|
||||
| Global search | `/` |
|
||||
| Command palette | `?` |
|
||||
| Hover docs (LSP) | `k` |
|
||||
| Symbols / workspace | `s` / `S` |
|
||||
| Diagnostics | `d` / `D` |
|
||||
| Clipboard yank/paste | `y` / `p` variants |
|
||||
|
||||
Picker movement: <https://docs.helix-editor.com/pickers.html>.
|
||||
|
||||
### Minor modes from normal
|
||||
|
||||
| Mode | Key |
|
||||
| ----------- | --------- |
|
||||
| Command | `:` |
|
||||
| View scroll | `z` / `Z` |
|
||||
| Goto | `g` |
|
||||
| Match | `m` |
|
||||
| Window | `Ctrl-w` |
|
||||
|
||||
Some bindings need an **LSP** or **tree-sitter** grammar; see notes on the keymap page.
|
||||
|
||||
## Differences between Neovim and Helix
|
||||
|
||||
1. Selecting first, then action.
|
||||
1. Helix: delete 2 words: move/select with `w` … then `d`. You see the selection before the
|
||||
action.
|
||||
2. Neovim: delete 2 words: `d` then `2w`. No visual feedback before the action runs.
|
||||
1. Helix — modern built-in features: LSP, tree-sitter, fuzzy finder, multi-cursors, surround, and
|
||||
more.
|
||||
1. The same is available in Neovim, but usually via plugins you choose and maintain.
|
||||
1. Helix is built in Rust from scratch: smaller codebase, modern defaults. No VimScript, no Lua in
|
||||
user config.
|
||||
1. Neovim carries Vim heritage (VimScript) and Lua-heavy customization.
|
||||
1. Neovim has a huge plugin ecosystem.
|
||||
1. Helix is newer; a stable plugin system is still evolving:
|
||||
<https://github.com/helix-editor/helix/pull/8675>
|
||||
1. Neovim has an integrated terminal (similar in spirit to VS Code’s).
|
||||
1. Helix does not ship one; use Zellij / tmux / terminal features instead.
|
||||
1. <https://github.com/helix-editor/helix/issues/1976#issuecomment-1091074719>
|
||||
1. <https://github.com/helix-editor/helix/pull/4649>
|
||||
1. Helix has no built-in tree panel; pair with **Yazi**, ranger, or Broot and open files from there.
|
||||
1. A tree view may arrive with plugins later; many users rely on the file picker instead.
|
||||
1. Global substitution is weaker in Helix; run replacements in another pane (Zellij) or an external
|
||||
tool when needed.
|
||||
1. <https://github.com/helix-editor/helix/issues/196>
|
||||
1. Neovim’s `:s` with preview remains strong for interactive refactors; external tools (e.g.
|
||||
<https://github.com/ms-jpq/sad>) can fill gaps in Helix-centric flows.
|
||||
1. Complexity vs batteries-included tradeoffs:
|
||||
<https://github.com/helix-editor/helix/discussions/6356>
|
||||
|
||||
Using **Helix** (and Neovim when useful) inside **Yazi** and **Zellij** keeps editing, files, and
|
||||
panes explicit and scriptable — different from a single IDE window, but very composable.
|
||||
|
||||
Helix nudges you away from reproducing VS Code/JetBrains inside one process; Neovim remains there
|
||||
when you want that depth.
|
||||
@@ -2,5 +2,119 @@
|
||||
{
|
||||
programs.helix = {
|
||||
enable = true;
|
||||
package = pkgs.helix;
|
||||
settings = {
|
||||
editor = {
|
||||
# Display & cursor
|
||||
line-number = "relative";
|
||||
cursorline = true;
|
||||
color-modes = true;
|
||||
scrolloff = 8;
|
||||
|
||||
# use system clipboard by default
|
||||
default-yank-register = "+";
|
||||
# Wrap long lines to the viewport (word-wrap style; does not insert hard line endings)
|
||||
soft-wrap = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
# Completion / formatting
|
||||
auto-format = true;
|
||||
preview-completion-insert = true;
|
||||
completion-timeout = 5;
|
||||
idle-timeout = 200;
|
||||
end-of-line-diagnostics = "hint";
|
||||
|
||||
# Save to disk on focus loss and after idle (helps LSP see disk changes)
|
||||
auto-save = {
|
||||
focus-lost = true;
|
||||
after-delay = {
|
||||
enable = true;
|
||||
timeout = 2000;
|
||||
};
|
||||
};
|
||||
|
||||
# LSP: inlay hints, signature help, progress / messages in status area
|
||||
lsp = {
|
||||
display-messages = true;
|
||||
display-progress-messages = true;
|
||||
display-inlay-hints = true;
|
||||
auto-signature-help = true;
|
||||
};
|
||||
|
||||
inline-diagnostics = {
|
||||
cursor-line = "hint";
|
||||
other-lines = "disable";
|
||||
};
|
||||
|
||||
# Buffers tab strip, menu borders, status line layout
|
||||
bufferline = "multiple";
|
||||
popup-border = "menu";
|
||||
statusline = {
|
||||
left = [
|
||||
"mode"
|
||||
"spinner"
|
||||
"version-control"
|
||||
"file-name"
|
||||
"read-only-indicator"
|
||||
"file-modification-indicator"
|
||||
];
|
||||
center = [ ];
|
||||
right = [
|
||||
"workspace-diagnostics"
|
||||
"diagnostics"
|
||||
"selections"
|
||||
"position"
|
||||
"position-percentage"
|
||||
"file-type"
|
||||
"file-encoding"
|
||||
"file-line-ending"
|
||||
];
|
||||
separator = "│";
|
||||
diagnostics = [
|
||||
"error"
|
||||
"warning"
|
||||
"info"
|
||||
];
|
||||
workspace-diagnostics = [
|
||||
"error"
|
||||
"warning"
|
||||
];
|
||||
mode = {
|
||||
normal = "NORMAL";
|
||||
insert = "INSERT";
|
||||
select = "SELECT";
|
||||
};
|
||||
};
|
||||
|
||||
# Show dotfiles in picker (project-wide ignores still apply)
|
||||
file-picker.hidden = false;
|
||||
|
||||
cursor-shape = {
|
||||
insert = "bar";
|
||||
normal = "block";
|
||||
select = "underline";
|
||||
};
|
||||
indent-guides.render = true;
|
||||
};
|
||||
|
||||
keys.normal = {
|
||||
space.space = ":reload-all";
|
||||
esc = [
|
||||
"collapse_selection"
|
||||
"keep_primary_selection"
|
||||
];
|
||||
space.w = ":w";
|
||||
space.q = ":q";
|
||||
|
||||
# useful vim keybindings
|
||||
"$" = "goto_line_end";
|
||||
"0" = "goto_line_start";
|
||||
|
||||
# Ctrl+o opens Zellij Session
|
||||
"C-S-o" = "jump_backward";
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
# Neovim (backup) — vim-style usage
|
||||
|
||||
Primary day-to-day editing is **Helix**; this file is the **vim/Neovim** quick reference and doc
|
||||
pointers for when you reach for Neovim as a backup.
|
||||
|
||||
## Tips
|
||||
|
||||
1. Many motions already exist in vim — check vim/Neovim docs before adding plugins or reinventing
|
||||
wheels.
|
||||
1. For deeper skill, read the official docs:
|
||||
1. <https://vimhelp.org/> — vim help.
|
||||
1. <https://neovim.io/doc/user/> — Neovim user manual.
|
||||
1. Prefer **Zellij** for shells and panes; use **Helix** or **Neovim** for buffers and text.
|
||||
1. Two powerful navigation modes on large codebases:
|
||||
1. **By path** — when you know the tree layout.
|
||||
1. **By content** — when you know what the code says.
|
||||
|
||||
## Tutorial
|
||||
|
||||
Type `:tutor` (or `:Tutor` in Neovim) for the built-in vim tutorial.
|
||||
|
||||
## Vim cheatsheet (common keys)
|
||||
|
||||
> For a fuller reference: <https://vimhelp.org/quickref.txt.html>
|
||||
|
||||
Emacs Evil, Neovim, and vim share the motions below.
|
||||
|
||||
### Terminal related
|
||||
|
||||
Zellij shortcuts used often:
|
||||
|
||||
| Action | Zellij shortcut |
|
||||
| ------------------------- | --------------- |
|
||||
| Floating terminal | `Ctrl + p + w` |
|
||||
| Horizontal split terminal | `Ctrl + p + d` |
|
||||
| Vertical split terminal | `Ctrl + p + n` |
|
||||
| Run a shell command | `!xxx` |
|
||||
|
||||
### File management
|
||||
|
||||
> <https://neovim.io/doc/user/usr_22.html>
|
||||
> <https://vimhelp.org/editing.txt.html>
|
||||
|
||||
| Action | Command |
|
||||
| ----------------------------- | -------------------------------------------- |
|
||||
| Save selection to a file | `:w filename` (shows `:'<,'>w filename`) |
|
||||
| Save and close current buffer | `:wq` |
|
||||
| Save all buffers | `:wa` |
|
||||
| Save and close all buffers | `:wqa` |
|
||||
| Edit a file | `:e filename` (or `:e <TAB>` for completion) |
|
||||
| Browse files | `:Ex` or `:e .` |
|
||||
| Discard changes and reload | `:e!` |
|
||||
|
||||
### Motion
|
||||
|
||||
> <https://vimhelp.org/motion.txt.html>
|
||||
|
||||
| Action | Command |
|
||||
| ----------------------------------- | --------------------------------------- |
|
||||
| Start / end of buffer | `gg` / `G` |
|
||||
| Go to line 5 | `5gg` / `5G` |
|
||||
| Left / down / up / right | `h` `j` `k` `l` (counts like `5j` work) |
|
||||
| Jump to matchpairs `()`, `{}`, `[]` | `%` |
|
||||
| Start / end of line | `0` / `$` |
|
||||
| Sentence forward / backward | `(` / `)` |
|
||||
| Paragraph forward / backward | `{` / `}` |
|
||||
| Section forward / backward | `[[` / `]]` |
|
||||
| Jump to marks | `'` + mark (Neovim may prompt) |
|
||||
|
||||
Text objects:
|
||||
|
||||
- **Sentence**: ends at `.` `!` `?` plus line end or space/tab.
|
||||
- **Paragraph**: ends at a blank line.
|
||||
- **Section**: between section headers; `[[` / `]]` often stop at `{` in column 1 (handy in
|
||||
C/Go/Java).
|
||||
|
||||
### Text manipulation
|
||||
|
||||
Basics:
|
||||
|
||||
| Action | Command |
|
||||
| ----------------------------- | ------------------------------ |
|
||||
| Delete character under cursor | `x` |
|
||||
| Put (paste) | `p` |
|
||||
| Delete operator + motion | `d` |
|
||||
| Undo word (insert) | `CTRL-w` |
|
||||
| Undo line (insert) | `CTRL-u` |
|
||||
| Undo change | `u` |
|
||||
| Redo | `Ctrl-r` |
|
||||
| Repeat previous insert | `Ctrl-a` |
|
||||
| Repeat last change | `.` |
|
||||
| Toggle case | `~` |
|
||||
| Uppercase (visual) | `U` |
|
||||
| Lowercase (visual) | `u` |
|
||||
| Align selection | `:center` / `:left` / `:right` |
|
||||
|
||||
Misc:
|
||||
|
||||
| Action | Shortcut |
|
||||
| ------------------------ | ----------- |
|
||||
| Character-wise visual | `v` |
|
||||
| Line-wise visual | `V` |
|
||||
| Block visual | `<Ctrl-v>` |
|
||||
| Fold close / open | `zc` / `zo` |
|
||||
| Go to definition | `gd` |
|
||||
| Go to references | `gD` |
|
||||
| Comment line (if mapped) | e.g. `gcc` |
|
||||
|
||||
| Action | Command |
|
||||
| ----------------------------------- | -------------- |
|
||||
| Sort lines | `:sort` |
|
||||
| Join lines | `:join` or `J` |
|
||||
| Join without spaces | `:join!` |
|
||||
| Insert at line start / end | `I` / `A` |
|
||||
| Delete to end of line | `D` |
|
||||
| Change to end of line (into insert) | `C` |
|
||||
|
||||
Advanced patterns:
|
||||
|
||||
- Append to many lines: `:normal A<text>` (often after visual-block `Ctrl-v`).
|
||||
- Neovim may pad short lines with spaces when block-appending past EOL.
|
||||
- Delete last character on many lines: `:normal $x` over a visual selection.
|
||||
- Delete last word on many lines: `:normal $bD`.
|
||||
|
||||
### Search
|
||||
|
||||
| Action | Command |
|
||||
| --------------------------------- | ------- |
|
||||
| Search forward / backward | `/` `?` |
|
||||
| Repeat search same / opposite dir | `n` `N` |
|
||||
|
||||
### Find and replace
|
||||
|
||||
| Action | Command |
|
||||
| ------------------- | ---------------------------------- |
|
||||
| In visual selection | `:s/old/new/g` |
|
||||
| Current line | same |
|
||||
| Whole buffer | `:%s/old/new/g` |
|
||||
| Regex example | `:%s@\vhttp://(\w+)@https://\1@gc` |
|
||||
|
||||
Notes:
|
||||
|
||||
- `\v` — “very magic”, less backslash noise in the pattern.
|
||||
- `\1` — first capture group.
|
||||
|
||||
### Specific line ranges
|
||||
|
||||
| Action | Command examples |
|
||||
| --------------------- | ------------------------------------ |
|
||||
| Lines 10–end | `:10,$s/old/new/g` or `:10,$s@^@#@g` |
|
||||
| Lines 10–20 | `:10,20s/old/new/g` |
|
||||
| Strip trailing spaces | `:%s/\s\+$//g` |
|
||||
|
||||
Flags: `g` all matches in range, `c` confirm each, `i` ignore case.
|
||||
|
||||
### Buffers, windows, tabs
|
||||
|
||||
> <https://neovim.io/doc/user/usr_08.html>
|
||||
> <https://vimhelp.org/windows.txt.html>
|
||||
|
||||
- **Buffer** — in-memory text for a file.
|
||||
- **Window** — viewport on a buffer.
|
||||
- **Tab page** — layout of windows.
|
||||
|
||||
| Action | Command |
|
||||
| ------------------ | ------------------------------ |
|
||||
| Horizontal split | `:sp` or `:sp filename` |
|
||||
| Vertical split | `:vs` or `:vs filename` |
|
||||
| Next / prev window | `Ctrl-w w` or `Ctrl-w h/j/k/l` |
|
||||
| List buffers | `:ls` |
|
||||
| Next / prev buffer | `]b` / `[b` or `:bn` / `:bp` |
|
||||
| New tab | `:tabnew` |
|
||||
| Next / prev tab | `gt` / `gT` |
|
||||
|
||||
### History
|
||||
|
||||
| Action | Command |
|
||||
| --------------- | ------- |
|
||||
| Command history | `q:` |
|
||||
| Search history | `q/` |
|
||||
@@ -1,11 +1,96 @@
|
||||
{ pkgs, ... }:
|
||||
{ config, nixvim, ... }:
|
||||
{
|
||||
programs = {
|
||||
neovim = {
|
||||
enable = true;
|
||||
|
||||
viAlias = true;
|
||||
vimAlias = true;
|
||||
imports = [ nixvim.homeModules.nixvim ];
|
||||
home.shellAliases = {
|
||||
|
||||
vi = "nvim";
|
||||
vim = "nvim";
|
||||
};
|
||||
|
||||
programs.nixvim = {
|
||||
enable = true;
|
||||
|
||||
clipboard.providers.wl-copy.enable = true;
|
||||
|
||||
opts = {
|
||||
number = true;
|
||||
relativenumber = true;
|
||||
cursorline = true;
|
||||
signcolumn = "auto";
|
||||
clipboard = "unnamedplus";
|
||||
scrolloff = 8;
|
||||
swapfile = false;
|
||||
title = true;
|
||||
titlelen = 20;
|
||||
smartindent = false;
|
||||
mouse = "a";
|
||||
undofile = true;
|
||||
ignorecase = true;
|
||||
smartcase = true;
|
||||
splitbelow = true;
|
||||
splitright = true;
|
||||
updatetime = 300;
|
||||
wrap = true;
|
||||
linebreak = true;
|
||||
};
|
||||
|
||||
colorschemes.catppuccin = {
|
||||
enable = true;
|
||||
settings = {
|
||||
transparent_background = true;
|
||||
};
|
||||
};
|
||||
|
||||
plugins.lsp.servers = {
|
||||
nixd.enable = true;
|
||||
"rust_analyzer" = {
|
||||
enable = true;
|
||||
installCargo = false;
|
||||
installRustc = false;
|
||||
};
|
||||
gopls.enable = true;
|
||||
pyright.enable = true;
|
||||
bashls.enable = true;
|
||||
};
|
||||
|
||||
plugins.treesitter = {
|
||||
enable = true;
|
||||
grammarPackages = with config.programs.nixvim.plugins.treesitter.package.builtGrammars; [
|
||||
bash
|
||||
json
|
||||
lua
|
||||
make
|
||||
markdown
|
||||
nix
|
||||
regex
|
||||
rust
|
||||
go
|
||||
python
|
||||
toml
|
||||
vim
|
||||
vimdoc
|
||||
xml
|
||||
yaml
|
||||
nu
|
||||
];
|
||||
};
|
||||
|
||||
plugins.neo-tree = {
|
||||
enable = true;
|
||||
settings = {
|
||||
filesystem = {
|
||||
filtered_items = {
|
||||
visible = true;
|
||||
hide_dotfiles = false;
|
||||
hide_gitignored = false;
|
||||
};
|
||||
follow_current_file = {
|
||||
enabled = true;
|
||||
leave_dirs_open = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
# Default interactive editor is Helix (`hx`). For trust-boundary edits (e.g. `sudoedit`,
|
||||
# secrets, unfamiliar payloads), prefer `nvim --clean` — wired via `SUDO_EDITOR`.
|
||||
{
|
||||
home.sessionVariables = {
|
||||
EDITOR = "hx";
|
||||
VISUAL = "hx";
|
||||
SUDO_EDITOR = "nvim --clean";
|
||||
};
|
||||
}
|
||||
@@ -16,42 +16,34 @@
|
||||
|
||||
# GitHub CLI tool
|
||||
# https://cli.github.com/manual/
|
||||
programs.gh = {
|
||||
enable = true;
|
||||
settings = {
|
||||
git_protocol = "ssh";
|
||||
prompt = "enabled";
|
||||
aliases = {
|
||||
co = "pr checkout";
|
||||
pv = "pr view";
|
||||
};
|
||||
};
|
||||
hosts = {
|
||||
"github.com" = {
|
||||
"users" = {
|
||||
"ryan4yin" = null;
|
||||
};
|
||||
"user" = "ryan4yin";
|
||||
};
|
||||
};
|
||||
};
|
||||
programs.gh.enable = true;
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
lfs.enable = true;
|
||||
|
||||
userName = myvars.userfullname;
|
||||
userEmail = myvars.useremail;
|
||||
signing.format = "openpgp";
|
||||
# signing = {
|
||||
# key = "xxx";
|
||||
# signByDefault = true;
|
||||
# };
|
||||
|
||||
includes = [
|
||||
{
|
||||
# use different email & name for work
|
||||
# use different email & name for work:
|
||||
#
|
||||
# [user]
|
||||
# email = "xxx@xxx.com"
|
||||
# name = "Ryan Yin"
|
||||
path = "~/work/.gitconfig";
|
||||
condition = "gitdir:~/work/";
|
||||
}
|
||||
];
|
||||
|
||||
extraConfig = {
|
||||
settings = {
|
||||
user.email = myvars.useremail;
|
||||
user.name = myvars.userfullname;
|
||||
|
||||
init.defaultBranch = "main";
|
||||
trim.bases = "develop,master,main"; # for git-trim
|
||||
push.autoSetupRemote = true;
|
||||
@@ -63,58 +55,51 @@
|
||||
"ssh://git@github.com/ryan4yin" = {
|
||||
insteadOf = "https://github.com/ryan4yin";
|
||||
};
|
||||
# "ssh://git@gitlab.com/" = {
|
||||
# insteadOf = "https://gitlab.com/";
|
||||
# };
|
||||
# "ssh://git@bitbucket.com/" = {
|
||||
# insteadOf = "https://bitbucket.com/";
|
||||
# "ssh://git@bitbucket.com/ryan4yin" = {
|
||||
# insteadOf = "https://bitbucket.com/ryan4yin";
|
||||
# };
|
||||
};
|
||||
};
|
||||
|
||||
# signing = {
|
||||
# key = "xxx";
|
||||
# signByDefault = true;
|
||||
# };
|
||||
alias = {
|
||||
# common aliases
|
||||
br = "branch";
|
||||
co = "checkout";
|
||||
st = "status";
|
||||
ls = "log --pretty=format:\"%C(yellow)%h%Cred%d\\\\ %Creset%s%Cblue\\\\ [%cn]\" --decorate";
|
||||
ll = "log --pretty=format:\"%C(yellow)%h%Cred%d\\\\ %Creset%s%Cblue\\\\ [%cn]\" --decorate --numstat";
|
||||
cm = "commit -m"; # commit via `git cm <message>`
|
||||
ca = "commit -am"; # commit all changes via `git ca <message>`
|
||||
dc = "diff --cached";
|
||||
|
||||
# A syntax-highlighting pager for git, diff, grep, and blame output
|
||||
delta = {
|
||||
enable = true;
|
||||
options = {
|
||||
diff-so-fancy = true;
|
||||
line-numbers = true;
|
||||
true-color = "always";
|
||||
# features => named groups of settings, used to keep related settings organized
|
||||
# features = "";
|
||||
amend = "commit --amend -m"; # amend commit message via `git amend <message>`
|
||||
unstage = "reset HEAD --"; # unstage file via `git unstage <file>`
|
||||
merged = "branch --merged"; # list merged(into HEAD) branches via `git merged`
|
||||
unmerged = "branch --no-merged"; # list unmerged(into HEAD) branches via `git unmerged`
|
||||
nonexist = "remote prune origin --dry-run"; # list non-exist(remote) branches via `git nonexist`
|
||||
|
||||
# delete merged branches except master & dev & staging
|
||||
# `!` indicates it's a shell script, not a git subcommand
|
||||
delmerged = ''! git branch --merged | egrep -v "(^\*|main|master|dev|staging)" | xargs git branch -d'';
|
||||
# delete non-exist(remote) branches
|
||||
delnonexist = "remote prune origin";
|
||||
|
||||
# aliases for submodule
|
||||
update = "submodule update --init --recursive";
|
||||
foreach = "submodule foreach";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
aliases = {
|
||||
# common aliases
|
||||
br = "branch";
|
||||
co = "checkout";
|
||||
st = "status";
|
||||
ls = "log --pretty=format:\"%C(yellow)%h%Cred%d\\\\ %Creset%s%Cblue\\\\ [%cn]\" --decorate";
|
||||
ll = "log --pretty=format:\"%C(yellow)%h%Cred%d\\\\ %Creset%s%Cblue\\\\ [%cn]\" --decorate --numstat";
|
||||
cm = "commit -m"; # commit via `git cm <message>`
|
||||
ca = "commit -am"; # commit all changes via `git ca <message>`
|
||||
dc = "diff --cached";
|
||||
|
||||
amend = "commit --amend -m"; # amend commit message via `git amend <message>`
|
||||
unstage = "reset HEAD --"; # unstage file via `git unstage <file>`
|
||||
merged = "branch --merged"; # list merged(into HEAD) branches via `git merged`
|
||||
unmerged = "branch --no-merged"; # list unmerged(into HEAD) branches via `git unmerged`
|
||||
nonexist = "remote prune origin --dry-run"; # list non-exist(remote) branches via `git nonexist`
|
||||
|
||||
# delete merged branches except master & dev & staging
|
||||
# `!` indicates it's a shell script, not a git subcommand
|
||||
delmerged = ''! git branch --merged | egrep -v "(^\*|main|master|dev|staging)" | xargs git branch -d'';
|
||||
# delete non-exist(remote) branches
|
||||
delnonexist = "remote prune origin";
|
||||
|
||||
# aliases for submodule
|
||||
update = "submodule update --init --recursive";
|
||||
foreach = "submodule foreach";
|
||||
# A syntax-highlighting pager for git, diff, grep, and blame output
|
||||
programs.delta = {
|
||||
enable = true;
|
||||
enableGitIntegration = true;
|
||||
options = {
|
||||
diff-so-fancy = true;
|
||||
line-numbers = true;
|
||||
true-color = "always";
|
||||
# features => named groups of settings, used to keep related settings organized
|
||||
# features = "";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -122,5 +107,5 @@
|
||||
programs.lazygit.enable = true;
|
||||
|
||||
# Yet another Git TUI (written in rust).
|
||||
programs.gitui.enable = true;
|
||||
programs.gitui.enable = false;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
{ config, ... }:
|
||||
{
|
||||
# make `npm install -g <pkg>` happey
|
||||
#
|
||||
# mainly used to install npm packages that updates frequently
|
||||
# such as gemini-cli, claude-code, etc.
|
||||
# 1. make `npm install -g <pkg>` happey
|
||||
# 2. set min-release-age for security
|
||||
home.file.".npmrc".text = ''
|
||||
prefix=${config.home.homeDirectory}/.npm
|
||||
min-release-age=7
|
||||
'';
|
||||
}
|
||||
|
||||
@@ -2,18 +2,6 @@ _: {
|
||||
# use mirror for pip install
|
||||
xdg.configFile."pip/pip.conf".text = ''
|
||||
[global]
|
||||
index-url = https://mirror.nju.edu.cn/pypi/web/simple
|
||||
format = columns
|
||||
index-url = https://mirrors.bfsu.edu.cn/pypi/web/simple
|
||||
'';
|
||||
|
||||
# xdg.configFile."pip/pip.conf".text = ''
|
||||
# [global]
|
||||
# index-url = https://mirror.nju.edu.cn/pypi/web/simple
|
||||
# format = columns
|
||||
# '';
|
||||
|
||||
# xdg.configFile."pip/pip.conf".text = ''
|
||||
# [global]
|
||||
# index-url = https://mirrors.bfsu.edu.cn/pypi/web/simple
|
||||
# '';
|
||||
}
|
||||
|
||||
@@ -78,9 +78,9 @@ $env.config.recursion_limit = 50
|
||||
$env.config.edit_mode = "vi"
|
||||
|
||||
# Command that will be used to edit the current line buffer with Ctrl+O.
|
||||
# If unset, uses $env.VISUAL and then $env.EDITOR
|
||||
# If unset, uses $env.VISUAL and then $env.EDITOR ($EDITOR is `hx` via session-env).
|
||||
#
|
||||
$env.config.buffer_editor = ["nvim", "--clean"]
|
||||
$env.config.buffer_editor = ["hx"]
|
||||
|
||||
# cursor_shape_* (string)
|
||||
# -----------------------
|
||||
|
||||
@@ -27,7 +27,6 @@ in
|
||||
# NOTE: nushell will be launched in bash, so it can inherit all the eenvironment variables.
|
||||
programs.nushell = {
|
||||
enable = true;
|
||||
# package = pkgs-unstable.nushell;
|
||||
configFile.source = ./config.nu;
|
||||
inherit shellAliases;
|
||||
};
|
||||
|
||||
@@ -6,20 +6,24 @@
|
||||
enableZshIntegration = true;
|
||||
enableNushellIntegration = true;
|
||||
|
||||
# https://starship.rs/config/
|
||||
settings = {
|
||||
# Get editor completions based on the config schema
|
||||
"$schema" = "https://starship.rs/config-schema.json";
|
||||
character = {
|
||||
success_symbol = "[›](bold green)";
|
||||
error_symbol = "[›](bold red)";
|
||||
success_symbol = "[➜](bold green)";
|
||||
error_symbol = "[➜](bold red)";
|
||||
};
|
||||
aws = {
|
||||
symbol = "🅰 ";
|
||||
};
|
||||
gcloud = {
|
||||
# do not show the account/project's info
|
||||
# to avoid the leak of sensitive information when sharing the terminal
|
||||
format = "on [$symbol$active(\($region\))]($style) ";
|
||||
symbol = "🅶 ️";
|
||||
# I never rely on the defaults, so this module is useless to me—disabled.
|
||||
# I prefer adding --project, --region to very gcloud/aws command.
|
||||
aws.disabled = true;
|
||||
gcloud.disabled = true;
|
||||
|
||||
kubernetes = {
|
||||
symbol = "⛵";
|
||||
disabled = false;
|
||||
};
|
||||
os.disabled = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,8 +7,9 @@
|
||||
# Changing working directory when exiting Yazi
|
||||
enableBashIntegration = true;
|
||||
enableNushellIntegration = true;
|
||||
shellWrapperName = "yy";
|
||||
settings = {
|
||||
manager = {
|
||||
mgr = {
|
||||
show_hidden = true;
|
||||
sort_dir_first = true;
|
||||
};
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
{ pkgs, ... }:
|
||||
{ pkgs, llm-agents, ... }:
|
||||
{
|
||||
home.packages =
|
||||
with pkgs;
|
||||
[
|
||||
mitmproxy # http/https proxy tool
|
||||
wireshark # network analyzer
|
||||
|
||||
# IDEs
|
||||
# jetbrains.idea-community
|
||||
|
||||
# AI cli tools
|
||||
k8sgpt
|
||||
kubectl-ai # an ai helper opensourced by google
|
||||
]
|
||||
++ (lib.optionals pkgs.stdenv.isx86_64 [
|
||||
insomnia # REST client
|
||||
# AI Agent Tools
|
||||
++ (with llm-agents.packages.${pkgs.stdenv.hostPlatform.system}; [
|
||||
# Agents
|
||||
codex
|
||||
cursor-cli
|
||||
claude-code
|
||||
opencode
|
||||
|
||||
# Utilities
|
||||
rtk # CLI proxy that reduces LLM token consumption
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ 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-25.05/nixos/modules/config/terminfo.nix#L18)
|
||||
[nixpkgs/nixos/modules/config/terminfo.nix](https://github.com/NixOS/nixpkgs/blob/nixos-25.11/nixos/modules/config/terminfo.nix#L18)
|
||||
|
||||
For nix-darwin, take a look at <https://github.com/LnL7/nix-darwin/wiki/Terminfo-issues>
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
...
|
||||
}:
|
||||
###########################################################
|
||||
@@ -26,7 +25,6 @@
|
||||
{
|
||||
programs.alacritty = {
|
||||
enable = true;
|
||||
# package = pkgs-unstable.alacritty;
|
||||
# https://alacritty.org/config-alacritty.html
|
||||
settings = {
|
||||
window = {
|
||||
@@ -52,7 +50,7 @@
|
||||
bold_italic = {
|
||||
family = "Maple Mono NF CN";
|
||||
};
|
||||
size = if pkgs.stdenv.isDarwin then 14 else 13;
|
||||
size = 13;
|
||||
};
|
||||
terminal = {
|
||||
# Spawn a nushell in login mode via `bash`
|
||||
|
||||
@@ -17,13 +17,19 @@
|
||||
settings = {
|
||||
main = {
|
||||
term = "foot"; # or "xterm-256color" for maximum compatibility
|
||||
font = "Maple Mono NF CN:size=14";
|
||||
font = "Maple Mono NF CN:size=13";
|
||||
dpi-aware = "no"; # scale via window manager instead
|
||||
resize-keep-grid = "no"; # do not resize the window on font resizing
|
||||
|
||||
# Spawn a nushell in login mode via `bash`
|
||||
shell = "${pkgs.bash}/bin/bash --login -c 'nu --login --interactive'";
|
||||
};
|
||||
|
||||
colors-dark = {
|
||||
alpha = 0.93; # background transparency
|
||||
blur = true; # requires foot >= 1.26 and compositor support (e.g. niri v26.04+)
|
||||
};
|
||||
|
||||
mouse = {
|
||||
hide-when-typing = "yes";
|
||||
};
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
pkgs,
|
||||
ghostty,
|
||||
...
|
||||
}:
|
||||
###########################################################
|
||||
@@ -16,7 +15,6 @@
|
||||
pkgs.hello # pkgs.ghostty is currently broken on darwin
|
||||
else
|
||||
pkgs.ghostty; # the stable version
|
||||
# package = ghostty.packages.${pkgs.system}.default; # the latest version
|
||||
enableBashIntegration = false;
|
||||
installBatSyntax = false;
|
||||
# installVimSyntax = true;
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
font = {
|
||||
name = "Maple Mono NF CN";
|
||||
# use different font size on macOS
|
||||
size = if pkgs.stdenv.isDarwin then 14 else 13;
|
||||
size = 13;
|
||||
};
|
||||
|
||||
# consistent with other terminal emulators
|
||||
@@ -34,6 +34,7 @@
|
||||
macos_show_window_title_in = "none";
|
||||
|
||||
background_opacity = "0.93";
|
||||
background_blur = 1; # requires kitty >= 0.46.2 and compositor support (e.g. niri v26.04+)
|
||||
macos_option_as_alt = true; # Option key acts as Alt on macOS
|
||||
enable_audio_bell = false;
|
||||
tab_bar_edge = "top"; # tab bar on top
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
pkgs-2505,
|
||||
nur-ryan4yin,
|
||||
...
|
||||
}:
|
||||
@@ -13,19 +13,23 @@
|
||||
go-containerregistry # provides `crane` & `gcrane`, it's similar to skopeo
|
||||
|
||||
kubectl
|
||||
kustomize
|
||||
kubeconform # FAST Kubernetes manifests validator, with support for Custom Resources
|
||||
kubectx # kubectx & kubens
|
||||
kubie # same as kubectl-ctx, but per-shell (won’t touch kubeconfig).
|
||||
kubectl-view-secret # kubectl view-secret
|
||||
kubectl-tree # kubectl tree
|
||||
kubectl-node-shell # exec into node
|
||||
kubepug # kubernetes pre upgrade checker
|
||||
kubectl-cnpg # cloudnative-pg's cli tool
|
||||
|
||||
kubebuilder
|
||||
istioctl
|
||||
clusterctl # for kubernetes cluster-api
|
||||
kubevirt # virtctl
|
||||
kubernetes-helm
|
||||
pkgs-2505.kubernetes-helm
|
||||
fluxcd
|
||||
argocd
|
||||
# argocd
|
||||
|
||||
ko # build go project to container image
|
||||
];
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
pkgs-patched,
|
||||
...
|
||||
}:
|
||||
{
|
||||
@@ -18,8 +18,10 @@
|
||||
home.packages = with pkgs; [
|
||||
colmena # nixos's remote deployment tool
|
||||
|
||||
tokei # count lines of code, alternative to cloc
|
||||
|
||||
# db related
|
||||
mycli
|
||||
# mycli
|
||||
pgcli
|
||||
mongosh
|
||||
sqlite
|
||||
@@ -29,12 +31,13 @@
|
||||
|
||||
# ai related
|
||||
python313Packages.huggingface-hub # huggingface-cli
|
||||
pkgs-patched.python313Packages.modelscope
|
||||
yt-dlp # youtube/bilibili/soundcloud/... video/music downloader
|
||||
|
||||
# misc
|
||||
devbox
|
||||
bfg-repo-cleaner # remove large files from git history
|
||||
k6 # load testing tool
|
||||
protobuf # protocol buffer compiler
|
||||
|
||||
# solve coding extercises - learn by doing
|
||||
exercism
|
||||
|
||||
@@ -1,214 +1,10 @@
|
||||
# Editors
|
||||
# Editor tooling packages (heavy dependencies)
|
||||
|
||||
My editors:
|
||||
This directory intentionally holds **only** [`packages.nix`](./packages.nix): language servers,
|
||||
formatters, compilers, and other editor-adjacent tools that pull in a large closure.
|
||||
|
||||
1. Neovim
|
||||
2. Helix
|
||||
Editor programs, keymaps, `$EDITOR` defaults, and usage docs live under
|
||||
[`../../core/editors/`](../../core/editors/README.md) (Helix, Neovim backup, glossary, cheatsheets).
|
||||
|
||||
And `Zellij` for a smooth and stable terminal experience.
|
||||
|
||||
## 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. 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://neovim.io/doc/user/>: Neovim's official user documentation.
|
||||
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. Two powerful file search & jump tools:
|
||||
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 content**: Useful when you're familiar with the code.
|
||||
|
||||
## Tutorial
|
||||
|
||||
Type `:tutor`(`:Tutor` in Neovim) to learn the basics usage of vim/neovim.
|
||||
|
||||
## VIM's Cheetsheet
|
||||
|
||||
> 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.
|
||||
|
||||
### Terminal Related
|
||||
|
||||
I mainly use Zellij for terminal related operations, here is its terminal shortcuts I use frequently
|
||||
now:
|
||||
|
||||
| Action | Zellij's Shortcut |
|
||||
| ------------------------- | ----------------- |
|
||||
| Floating Terminal | `Ctrl + p + w` |
|
||||
| Horizontal Split Terminal | `Ctrl + p + d` |
|
||||
| Vertical Split Terminal | `Ctrl + p + n` |
|
||||
| Execute a command | `!xxx` |
|
||||
|
||||
### File Management
|
||||
|
||||
> <https://neovim.io/doc/user/usr_22.html>
|
||||
|
||||
> <https://vimhelp.org/editing.txt.html>
|
||||
|
||||
| Action | |
|
||||
| ----------------------------------- | ------------------------------------------------ |
|
||||
| Save selected text to a file | `:w filename` (Will show `:'<,'>w filename`) |
|
||||
| Save and close the current buffer | `:wq` |
|
||||
| Save all buffers | `:wa` |
|
||||
| Save and close all buffers | `:wqa` |
|
||||
| Edit a file | `:e filename`(or `:e <TAB>` to show a file list) |
|
||||
| Browse the file list | `:Ex` or `:e .` |
|
||||
| Discard changes and reread the file | `:e!` |
|
||||
|
||||
### Motion
|
||||
|
||||
> https://vimhelp.org/motion.txt.html
|
||||
|
||||
| Action | Command |
|
||||
| --------------------------------------------------- | -------------------------------------------------- |
|
||||
| Move to the start/end of the buffer | `gg`/`G` |
|
||||
| Move the line number 5 | `5gg` / `5G` |
|
||||
| Move left/down/up/right | h/j/k/l or `5h`/`5j`/`5k`/`5l` or `Ctr-n`/`Ctrl-p` |
|
||||
| Move to the matchpairs, default to `()`, `{}`, `[]` | `%` |
|
||||
| Move to the start/end of the line | `0` / `$` |
|
||||
| Move a sentence forward/backward | `(` / `)` |
|
||||
| Move a paragraph forward/backward | `{` / `}` |
|
||||
| Move a section forward/backward | `[[` / `]]` |
|
||||
| Jump to various positions | `'` + some other keys(neovim has prompt) |
|
||||
|
||||
Text Objects:
|
||||
|
||||
- **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.
|
||||
- **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 useful to find the start of a function in a C/Go/Java/... program.
|
||||
|
||||
### Text Manipulation
|
||||
|
||||
Basics:
|
||||
|
||||
| Action | |
|
||||
| --------------------------------------- | -------------------------- |
|
||||
| Delete the current character | `x` |
|
||||
| Paste the copied text | `p` |
|
||||
| Delete the selection | `d` |
|
||||
| Undo the last word | `CTRL-w`(in insert mode) |
|
||||
| Undo the last line | `CTRL-u`(in insert mode) |
|
||||
| Undo the last change | `u` |
|
||||
| Redo the last change | `Ctrl + r` |
|
||||
| Inserts the text of the previous insert | `Ctrl + a` |
|
||||
| Repeat the last command | `.` |
|
||||
| Toggle text's case | `~` |
|
||||
| Convert to uppercase | `U` (visual mode) |
|
||||
| Convert to lowercase | `u` (visual mode) |
|
||||
| Align the selected content | `:center`/`:left`/`:right` |
|
||||
|
||||
Misc:
|
||||
|
||||
| Action | Shortcut |
|
||||
| ----------------------------- | ---------------------------------------- |
|
||||
| Toggle visual mode | `v` (lower case v) |
|
||||
| Select the current line | `V` (upper case v) |
|
||||
| Toggle visual block mode | `<Ctrl> + v` (select a block vertically) |
|
||||
| Fold the current code block | `zc` |
|
||||
| Unfold the current code block | `zo` |
|
||||
| Jump to Definition | `gd` |
|
||||
| Jump to References | `gD` |
|
||||
| (Un)Comment the current line | `gcc` |
|
||||
|
||||
| Action | |
|
||||
| ------------------------------------------------------------------------- | -------------- |
|
||||
| Sort the selected lines | `:sort` |
|
||||
| Join Selection of Lines With Space | `:join` or `J` |
|
||||
| Join without spaces | `:join!` |
|
||||
| Enter Insert mode at the start/end of the line | `I` / `A` |
|
||||
| Delete from the cursor to the end of the line | `D` |
|
||||
| Delete from the cursor to the end of the line, and then enter insert mode | `C` |
|
||||
|
||||
Advance Techs:
|
||||
|
||||
- Add at the end of multiple lines: `:normal A<text>`
|
||||
|
||||
- Execublock: `:A<text>`
|
||||
- visual block mode(ctrl + v)
|
||||
- Append text at the end of each line in the selected block
|
||||
- If position exceeds line end, neovim adds spaces automatically
|
||||
|
||||
- Delete the last char of multivle lines: `:normal $x`
|
||||
|
||||
- Execute `$x` on each line
|
||||
- visual mode(v)
|
||||
- `$` moves cursor to the end of line
|
||||
- `x` deletes the character under the cursor
|
||||
|
||||
- Delete the last word of multiple lines: `:normal $bD`
|
||||
- Execute `$bD` on each line
|
||||
- visual mode(v)
|
||||
- `$` moves cursor to the end of line
|
||||
- `b` moves cursor to the beginning of the last word
|
||||
|
||||
### Search
|
||||
|
||||
| Action | Command |
|
||||
| ----------------------------------------------------- | --------- |
|
||||
| Search forward/backword for a pattern | `/` / `?` |
|
||||
| Repeat the last search in the same/opposite direction | `n` / `N` |
|
||||
|
||||
### Find and Replace
|
||||
|
||||
| Action | Command |
|
||||
| -------------------------------- | ----------------------------------- |
|
||||
| Replace in selected area | `:s/old/new/g` |
|
||||
| Replace in current line | Same as above |
|
||||
| Replace all the lines | `:% s/old/new/g` |
|
||||
| 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).
|
||||
2. `\1` means the first matched group in the pattern.
|
||||
|
||||
### Replace in the specific lines
|
||||
|
||||
| Action | Command |
|
||||
| ----------------------------------------- | -------------------------------------- |
|
||||
| From the 10th line to the end of the file | `:10,$ s/old/new/g` or `:10,$ s@^@#@g` |
|
||||
| From the 10th line to the 20th line | `:10,20 s/old/new/g` |
|
||||
| Remove the trailing spaces | `:% s/\s\+$//g` |
|
||||
|
||||
The postfix(flags) in the above commands:
|
||||
|
||||
1. `g` means replace all the matched strings in the current line/file.
|
||||
2. `c` means ask for confirmation before replacing.
|
||||
3. `i` means ignore case.
|
||||
|
||||
### Buffers, Windows and Tabs
|
||||
|
||||
> <https://neovim.io/doc/user/usr_08.html>
|
||||
|
||||
> <https://vimhelp.org/windows.txt.html>
|
||||
|
||||
- A buffer is the in-memory text of a file.
|
||||
- A window is a viewport on a buffer.
|
||||
- A tab page is a collection of windows.
|
||||
|
||||
| Action | Command |
|
||||
| ----------------------------------- | ----------------------------------- |
|
||||
| Split the window horizontally | `:sp[lit]` or `:sp filename` |
|
||||
| Split the window horizontally | `:vs[plit]` or `:vs filename` |
|
||||
| Switch to the next/previous window | `Ctrl-w + w` or `Ctrl-w + h/j/k/l` |
|
||||
| Show all buffers | `:ls` |
|
||||
| show next/previous buffer | `]b`/`[b` or `:bn[ext]` / `bp[rev]` |
|
||||
| New Tab(New Workspace in DoomEmacs) | `:tabnew` |
|
||||
| Next/Previews Tab | `gt`/`gy` |
|
||||
|
||||
### History
|
||||
|
||||
| Action | Command |
|
||||
| ------------------------ | ------- |
|
||||
| Show the command history | `q:` |
|
||||
| Show the search history | `q/` |
|
||||
[`default.nix`](./default.nix) imports `./packages.nix` so `home/base/tui` can keep pulling in
|
||||
tooling without mixing it into `core/editors`.
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
# Structured Editing
|
||||
|
||||
## S-expression data(Lisp)
|
||||
|
||||
- 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.
|
||||
- [parinfer(par-in-fer)](https://shaunlebron.github.io/parinfer/): modern, simple, elegant and
|
||||
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:
|
||||
|
||||
- Neovim
|
||||
- [parinfer-rust](https://github.com/eraserhd/parinfer-rust)
|
||||
- <https://github.com/Olical/conjure>
|
||||
- Helix
|
||||
- [parinfer #4090 - Helix](https://github.com/helix-editor/helix/discussions/4090)
|
||||
|
||||
## Other Languages
|
||||
|
||||
1. treesitter
|
||||
1. ...
|
||||
@@ -1,4 +1,4 @@
|
||||
{ mylib, ... }:
|
||||
# Editor-related language servers and heavy tooling — kept out of `core/editors`.
|
||||
{
|
||||
imports = mylib.scanPaths ./.;
|
||||
imports = [ ./packages.nix ];
|
||||
}
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
# 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.
|
||||
|
||||
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. 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
|
||||
|
||||
Use `:tutor` in helix to start the tutorial.
|
||||
|
||||
## Differences between Neovim and Helixer
|
||||
|
||||
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.
|
||||
2. Neovim: delete 2 word: `d`. then `2w`. No visual feedback before you apply the action.
|
||||
1. Helix - Modern builtin features: LSP, tree-sitter, fuzzy finder, multi cursors, surround and
|
||||
more.
|
||||
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 is built in Rust from scratch. The result is a much smaller codebase and a modern set of
|
||||
defaults. No VimScript. No Lua.
|
||||
1. Neovim contains a lot of VimScript, and lua is too dynamic, it's hard to debug.
|
||||
1. Personally I'm glad to take a look at a Rust codebase, but not a VimScript/Lua codebase.
|
||||
1. Neovim have a very activate plugin ecosystem, and it's easy to find plugins for almost
|
||||
everything.
|
||||
1. Helix is still new, and it even don't have a stable plugin system yet. A PR to add a plugin
|
||||
system is still envolving: <https://github.com/helix-editor/helix/pull/8675>
|
||||
1. Neovim has integrated terminal, and it's very powerful. It's quite similar to VSCode's integrated
|
||||
terminal. I use it a lot.
|
||||
1. Helix doesn't have a integrated terminal yet, as it's complicated to implement. Users are
|
||||
recommended to use tmux/Zellij or Wezterm/Kitty to implement this feature instead.
|
||||
1. <https://github.com/helix-editor/helix/issues/1976#issuecomment-1091074719>
|
||||
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.
|
||||
|
||||
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,32 +0,0 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
programs.helix = {
|
||||
enable = true;
|
||||
package = pkgs.helix;
|
||||
settings = {
|
||||
editor = {
|
||||
line-number = "relative";
|
||||
cursorline = true;
|
||||
color-modes = true;
|
||||
lsp.display-messages = true;
|
||||
cursor-shape = {
|
||||
insert = "bar";
|
||||
normal = "block";
|
||||
select = "underline";
|
||||
};
|
||||
indent-guides.render = true;
|
||||
};
|
||||
keys.normal = {
|
||||
space = {
|
||||
space = "file_picker";
|
||||
w = ":w";
|
||||
q = ":q";
|
||||
};
|
||||
esc = [
|
||||
"collapse_selection"
|
||||
"keep_primary_selection"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,190 +0,0 @@
|
||||
# Neovim Editor
|
||||
|
||||
My Neovim config based on [AstroNvim](https://github.com/AstroNvim/AstroNvim). For more details,
|
||||
visit the [AstroNvim website](https://astronvim.com/).
|
||||
|
||||
This document outlines neovim's configuration structure and various shortcuts/commands for efficient
|
||||
usage.
|
||||
|
||||
## Screenshots
|
||||
|
||||
 
|
||||
|
||||
## Configuration Structure
|
||||
|
||||
| Description | Standard Location | My Location |
|
||||
| ------------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------- |
|
||||
| Neovim's config | `~/.config/nvim` | AstroNvim's github repository, referenced as a flake input in this flake. |
|
||||
| AstroNvim's user configuration | `$XDG_CONFIG_HOME/astronvim/lua/user` | [./astronvim_user/](./astronvim_user/) |
|
||||
| Plugins installation directory (lazy.nvim) | `~/.local/share/nvim/` | The same as standard location, generated and managed by lazy.nvim. |
|
||||
| LSP servers, DAP servers, linters, and formatters | `~/.local/share/nvim/mason/`(by mason.nvim) | [./default.nix](./default.nix), installed by nix. |
|
||||
|
||||
## Update/Clean Plugins
|
||||
|
||||
Note that lazy.nvim will not automatically update plugins, so you need to update them manually.
|
||||
|
||||
```bash
|
||||
:Lazy update
|
||||
```
|
||||
|
||||
Remove all unused plugins:
|
||||
|
||||
```bash
|
||||
:Lazy clean
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
> via `Justfile` located at the root of this repo.
|
||||
|
||||
```bash
|
||||
# testing
|
||||
just nvim-test
|
||||
|
||||
# clear test data
|
||||
just nvim-clear
|
||||
```
|
||||
|
||||
## 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.
|
||||
|
||||
### Incremental Selection
|
||||
|
||||
Provided by nvim-treesitter.
|
||||
|
||||
| Action | Shortcut |
|
||||
| ----------------- | -------------- |
|
||||
| init selection | `<Ctrl-space>` |
|
||||
| node incremental | `<Ctrl-space>` |
|
||||
| scope incremental | `<Alt-Space>` |
|
||||
| node decremental | `Backspace` |
|
||||
|
||||
### Search and Jump
|
||||
|
||||
Provided by [flash.nvim](https://github.com/folke/flash.nvim), it's a intelligent search and jump
|
||||
plugin.
|
||||
|
||||
1. It enhances the default search and jump behavior of neovim.(search with prefix `/`)
|
||||
|
||||
| Action | Shortcut |
|
||||
| ----------------- | ------------------------------------------------------------------------------------------------------------ |
|
||||
| Search | `/`(normal search), `s`(disable all code highlight, only highlight matches) |
|
||||
| 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`, (around your matches, all the surrounding Treesitter nodes will be labeled) |
|
||||
|
||||
### Commands & Shortcuts
|
||||
|
||||
| Action | Shortcut |
|
||||
| ----------------------------- | -------------- |
|
||||
| Open file explorer | `<Space> + e` |
|
||||
| Focus Neotree to current file | `<Space> + o` |
|
||||
| Toggle line wrap | `<Space> + uw` |
|
||||
| Show line diagnostics | `gl` |
|
||||
| Show function/variable info | `K` |
|
||||
| References of a symbol | `gr` |
|
||||
| Next tab | `]b` |
|
||||
| Previous tab | `[b` |
|
||||
|
||||
### Window Navigation
|
||||
|
||||
- Switch between windows: `<Ctrl> + h/j/k/l`
|
||||
- Resize windows: `<Ctrl> + Up/Down/Left/Right` (`<Ctrl-w> + -/+/</>`)
|
||||
- Note: On macOS, conflicts with system shortcuts
|
||||
- Disable in System Preferences -> Keyboard -> Shortcuts -> Mission Control
|
||||
|
||||
### Splitting and Buffers
|
||||
|
||||
| Action | Shortcut |
|
||||
| ---------------- | ------------- |
|
||||
| Horizontal Split | `\` |
|
||||
| Vertical Split | `\|` |
|
||||
| Close Buffer | `<Space> + c` |
|
||||
|
||||
### Editing and Formatting
|
||||
|
||||
| Action | Shortcut |
|
||||
| ----------------------------------------------------- | -------------- |
|
||||
| Toggle buffer auto formatting | `<Space> + uf` |
|
||||
| Format Document | `<Space> + lf` |
|
||||
| Code Actions | `<Space> + la` |
|
||||
| Rename | `<Space> + lr` |
|
||||
| Opening LSP symbols | `<Space> + lS` |
|
||||
| Comment Line(support multiple lines) | `<Space> + /` |
|
||||
| Open filepath/URL at cursor(neovim's builtin command) | `gx` |
|
||||
| Find files by name (fzf) | `<Space> + ff` |
|
||||
| Find files by name (include hidden files) | `<Space> + fF` |
|
||||
| Grep string in files (ripgrep) | `<Space> + fw` |
|
||||
| Grep string in files (include hidden files) | `<Space> + fW` |
|
||||
|
||||
### Git
|
||||
|
||||
| Action | Shortcut |
|
||||
| -------------------------- | --------------- |
|
||||
| Git Commits (repository) | `:<Space> + gc` |
|
||||
| Git Commits (current file) | `:<Space> + gC` |
|
||||
| Git Branches | `:<Space> + gb` |
|
||||
| Git Status | `:<Space> + gt` |
|
||||
|
||||
### Sessions
|
||||
|
||||
| Action | Shortcut |
|
||||
| ------------------------------ | -------------- |
|
||||
| Save Session | `<Space> + Ss` |
|
||||
| Last Session | `<Space> + Sl` |
|
||||
| Delete Session | `<Space> + Sd` |
|
||||
| Search Session | `<Space> + Sf` |
|
||||
| Load Current Directory Session | `<Space> + S.` |
|
||||
|
||||
### Debugging
|
||||
|
||||
Press `<Space> + D` to view available bindings and options.
|
||||
|
||||
### Search and Replace Globally
|
||||
|
||||
| Description | Shortcut |
|
||||
| ------------------------------------------ | -------------- |
|
||||
| Open spectre.nvim search and replace panel | `<Space> + ss` |
|
||||
|
||||
Search and replace via cli(fd + sad + delta):
|
||||
|
||||
```bash
|
||||
fd "\\.nix$" . | sad '<pattern>' '<replacement>' | delta
|
||||
```
|
||||
|
||||
### Surrounding Characters
|
||||
|
||||
Provided by mini.surround plugin.
|
||||
|
||||
- Prefix `gz`
|
||||
|
||||
| Action | Shortcut | Description |
|
||||
| ------------------------------ | -------- | ----------------------------------------------- |
|
||||
| Add surrounding characters | `gzaiw'` | Add `'` around the word under cursor |
|
||||
| Delete surrounding characters | `gzd'` | Delete `'` around the word under cursor |
|
||||
| Replace surrounding characters | `gzr'"` | Replace `'` by `"` around the word under cursor |
|
||||
| Highlight surrounding | `gzh'` | Highlight `'` around the word under cursor |
|
||||
|
||||
### Text Manipulation
|
||||
|
||||
| Action | |
|
||||
| -------------------------------------- | ------------- |
|
||||
| Join with LSP intelligence(treesj) | `<Space> + j` |
|
||||
| Split Line into Multiple Lines(treesj) | `<Space> + s` |
|
||||
|
||||
### Miscellaneous
|
||||
|
||||
| Action | |
|
||||
| --------------------------------- | --------------- |
|
||||
| Show all Yank History | `:<Space> + yh` |
|
||||
| Show undo history | `:<Space> + uh` |
|
||||
| Show the path of the current file | `:!echo $%` |
|
||||
|
||||
## Additional Resources
|
||||
|
||||
For more detailed information and advanced usage, refer to:
|
||||
|
||||
1. [AstroNvim walkthrough](https://astronvim.com/Basic%20Usage/walkthrough)
|
||||
2. [./astronvim_user/mapping.lua](./astronvim_user/mappings.lua)
|
||||
3. All the plugins' documentations
|
||||
@@ -1,81 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
pkgs-unstable,
|
||||
...
|
||||
}:
|
||||
###############################################################################
|
||||
#
|
||||
# AstroNvim's configuration and all its dependencies(lsp, formatter, etc.)
|
||||
#
|
||||
#e#############################################################################
|
||||
let
|
||||
shellAliases = {
|
||||
v = "nvim";
|
||||
vdiff = "nvim -d";
|
||||
};
|
||||
# the path to nvim directory
|
||||
# to make this symlink work, we need to git clone this repo to your home directory.
|
||||
configPath = "${config.home.homeDirectory}/nix-config/home/base/tui/editors/neovim/nvim";
|
||||
in
|
||||
{
|
||||
xdg.configFile."nvim".source = config.lib.file.mkOutOfStoreSymlink configPath;
|
||||
# Disable catppuccin to avoid conflict with my non-nix config.
|
||||
catppuccin.nvim.enable = false;
|
||||
|
||||
home.shellAliases = shellAliases;
|
||||
programs.nushell.shellAliases = shellAliases;
|
||||
|
||||
programs.neovim = {
|
||||
enable = true;
|
||||
package = pkgs-unstable.neovim-unwrapped;
|
||||
|
||||
# defaultEditor = true; # set EDITOR at system-wide level
|
||||
viAlias = true;
|
||||
vimAlias = true;
|
||||
|
||||
# These environment variables are needed to build and run binaries
|
||||
# with external package managers like mason.nvim.
|
||||
#
|
||||
# LD_LIBRARY_PATH is also needed to run the non-FHS binaries downloaded by mason.nvim.
|
||||
# it will be set by nix-ld, so we do not need to set it here again.
|
||||
extraWrapperArgs = with pkgs; [
|
||||
# LIBRARY_PATH is used by gcc before compilation to search directories
|
||||
# containing static and shared libraries that need to be linked to your program.
|
||||
"--suffix"
|
||||
"LIBRARY_PATH"
|
||||
":"
|
||||
"${lib.makeLibraryPath [
|
||||
stdenv.cc.cc
|
||||
zlib
|
||||
]}"
|
||||
|
||||
# PKG_CONFIG_PATH is used by pkg-config before compilation to search directories
|
||||
# containing .pc files that describe the libraries that need to be linked to your program.
|
||||
"--suffix"
|
||||
"PKG_CONFIG_PATH"
|
||||
":"
|
||||
"${lib.makeSearchPathOutput "dev" "lib/pkgconfig" [
|
||||
stdenv.cc.cc
|
||||
zlib
|
||||
]}"
|
||||
];
|
||||
|
||||
# Currently we use lazy.nvim as neovim's package manager, so comment this one.
|
||||
#
|
||||
# NOTE: These plugins will not be used by astronvim by default!
|
||||
# We should install packages that will compile locally or download FHS binaries via Nix!
|
||||
# and use lazy.nvim's `dir` option to specify the package directory in nix store.
|
||||
# so that these plugins can work on NixOS.
|
||||
#
|
||||
# related project:
|
||||
# https://github.com/b-src/lazy-nix-helper.nvim
|
||||
plugins = with pkgs.vimPlugins; [
|
||||
# search all the plugins using https://search.nixos.org/packages
|
||||
telescope-fzf-native-nvim
|
||||
|
||||
nvim-treesitter.withAllGrammars
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"neodev": {
|
||||
"library": {
|
||||
"enabled": true,
|
||||
"plugins": true
|
||||
}
|
||||
},
|
||||
"neoconf": {
|
||||
"plugins": {
|
||||
"lua_ls": {
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"lspconfig": {
|
||||
"lua_ls": {
|
||||
"Lua.format.enable": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
column_width = 120
|
||||
line_endings = "Unix"
|
||||
indent_type = "Spaces"
|
||||
indent_width = 2
|
||||
quote_style = "AutoPreferDouble"
|
||||
call_parentheses = "None"
|
||||
collapse_simple_statement = "Always"
|
||||
@@ -1,19 +0,0 @@
|
||||
-- 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"
|
||||
@@ -1,141 +0,0 @@
|
||||
{
|
||||
"AstroNvim": { "branch": "main", "commit": "c5e610f614e74c9dd9bf11760c4d0ad2c98c0abe" },
|
||||
"Comment.nvim": { "branch": "master", "commit": "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
|
||||
"LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" },
|
||||
"aerial.nvim": { "branch": "master", "commit": "3284a2cb858ba009c79da87d5e010ccee3c99c4d" },
|
||||
"alpha-nvim": { "branch": "main", "commit": "de72250e054e5e691b9736ee30db72c65d560771" },
|
||||
"astrocommunity": { "branch": "main", "commit": "2db3ee2ce37f9e2bc9e6ea2c3e2e6292ca4d33bf" },
|
||||
"astrocore": { "branch": "main", "commit": "44a3dc0bf1591022b2a6bc89dccdfac1be17bec9" },
|
||||
"astrolsp": { "branch": "main", "commit": "909fbe64f3f87d089ff3777751261544557117cc" },
|
||||
"astrotheme": { "branch": "main", "commit": "f12dcf64b1f9a05839c3ac2146f550f43bae9dab" },
|
||||
"astroui": { "branch": "main", "commit": "e923a84c488d879a260fc9cfb2dc27dd870fb6ac" },
|
||||
"autosave.nvim": { "branch": "main", "commit": "348f72cf0241e3e736e3396c4834def2f8ef8d10" },
|
||||
"avante.nvim": { "branch": "main", "commit": "508cc4c22c78d565d270df8dec5449db07800296" },
|
||||
"catppuccin": { "branch": "main", "commit": "fa42eb5e26819ef58884257d5ae95dd0552b9a66" },
|
||||
"clangd_extensions.nvim": {
|
||||
"branch": "main",
|
||||
"commit": "db28f29be928d18cbfb86fbfb9f83f584f658feb"
|
||||
},
|
||||
"cmake-tools.nvim": { "branch": "master", "commit": "17244215b1a96e4b2a83a16abd6719197f270f96" },
|
||||
"cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" },
|
||||
"cmp-conjure": { "branch": "master", "commit": "8c9a88efedc0e5bf3165baa6af8a407afe29daf6" },
|
||||
"cmp-dap": { "branch": "master", "commit": "ea92773e84c0ad3288c3bc5e452ac91559669087" },
|
||||
"cmp-nvim-lsp": { "branch": "main", "commit": "99290b3ec1322070bcfb9e846450a46f6efa50f0" },
|
||||
"cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" },
|
||||
"cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" },
|
||||
"conjure": { "branch": "main", "commit": "5f15eb0322b5530eefb16457c061e7c2ccd7cf13" },
|
||||
"crates.nvim": { "branch": "main", "commit": "5d8b1bef686db0fabe5f1bb593744b617e8f1405" },
|
||||
"deno-nvim": { "branch": "master", "commit": "5a2f9205df5539c4a0696e73893bf8d1b0cae406" },
|
||||
"dressing.nvim": { "branch": "master", "commit": "3a45525bb182730fe462325c99395529308f431e" },
|
||||
"flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" },
|
||||
"flit.nvim": { "branch": "main", "commit": "1ef72de6a02458d31b10039372c8a15ab8989e0d" },
|
||||
"friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" },
|
||||
"fzf-lua": { "branch": "main", "commit": "a4404dee0a65d3c2e2b292206d10b16567d088c9" },
|
||||
"gitsigns.nvim": { "branch": "main", "commit": "7010000889bfb6c26065e0b0f7f1e6aa9163edd9" },
|
||||
"gopher.nvim": { "branch": "main", "commit": "de585144ebde9f0516fb9b542dd42e90c7835b59" },
|
||||
"goto-preview": { "branch": "main", "commit": "d1faf6ea992b5bcaaaf2c682e1aba3131a01143e" },
|
||||
"guess-indent.nvim": { "branch": "main", "commit": "6cd61f7a600bb756e558627cd2e740302c58e32d" },
|
||||
"heirline.nvim": { "branch": "master", "commit": "fae936abb5e0345b85c3a03ecf38525b0828b992" },
|
||||
"indent-blankline.nvim": {
|
||||
"branch": "master",
|
||||
"commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba"
|
||||
},
|
||||
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
|
||||
"lazydev.nvim": { "branch": "main", "commit": "f59bd14a852ca43db38e3662395354cb2a9b13e0" },
|
||||
"leap.nvim": { "branch": "main", "commit": "10c14af4ddfb34dbd7721f0bfb2b4d91f0558907" },
|
||||
"lsp_signature.nvim": {
|
||||
"branch": "master",
|
||||
"commit": "2923666d092300e6d03c8d895991d0bef43f1613"
|
||||
},
|
||||
"lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" },
|
||||
"luarocks.nvim": { "branch": "main", "commit": "1db9093915eb16ba2473cfb8d343ace5ee04130a" },
|
||||
"markdown-preview.nvim": {
|
||||
"branch": "main",
|
||||
"commit": "462ce41af003f5cdadab856f3a42dc27e39b89c8"
|
||||
},
|
||||
"mason-lspconfig.nvim": {
|
||||
"branch": "main",
|
||||
"commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245"
|
||||
},
|
||||
"mason-null-ls.nvim": { "branch": "main", "commit": "2b8433f76598397fcc97318d410e0c4f7a4bea6a" },
|
||||
"mason-nvim-dap.nvim": { "branch": "main", "commit": "4c2cdc69d69fe00c15ae8648f7e954d99e5de3ea" },
|
||||
"mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" },
|
||||
"mini.ai": { "branch": "main", "commit": "d172ada7b0281044a06cb9a625a862553c457b6f" },
|
||||
"mini.bufremove": { "branch": "main", "commit": "285bdac9596ee7375db50c0f76ed04336dcd2685" },
|
||||
"mini.surround": { "branch": "main", "commit": "1a2b59c77a0c4713a5bd8972da322f842f4821b1" },
|
||||
"neo-tree.nvim": { "branch": "main", "commit": "f481de16a0eb59c985abac8985e3f2e2f75b4875" },
|
||||
"neoconf.nvim": { "branch": "main", "commit": "f630568a4d04154803886f21ca60923f12709f0f" },
|
||||
"nfnl": { "branch": "main", "commit": "143b595069d98d47b26b80f0e0375420673de4af" },
|
||||
"none-ls.nvim": { "branch": "main", "commit": "a117163db44c256d53c3be8717f3e1a2a28e6299" },
|
||||
"nui.nvim": { "branch": "main", "commit": "a0fd35fcbb4cb479366f1dc5f20145fd718a3733" },
|
||||
"nvim-autopairs": { "branch": "master", "commit": "68f0e5c3dab23261a945272032ee6700af86227a" },
|
||||
"nvim-cmp": { "branch": "main", "commit": "1e1900b0769324a9675ef85b38f99cca29e203b3" },
|
||||
"nvim-colorizer.lua": {
|
||||
"branch": "master",
|
||||
"commit": "517df88cf2afb36652830df2c655df2da416a0ae"
|
||||
},
|
||||
"nvim-dap": { "branch": "master", "commit": "6a5bba0ddea5d419a783e170c20988046376090d" },
|
||||
"nvim-dap-go": { "branch": "main", "commit": "8763ced35b19c8dc526e04a70ab07c34e11ad064" },
|
||||
"nvim-dap-python": { "branch": "master", "commit": "261ce649d05bc455a29f9636dc03f8cdaa7e0e2c" },
|
||||
"nvim-dap-ui": { "branch": "master", "commit": "bc81f8d3440aede116f821114547a476b082b319" },
|
||||
"nvim-jdtls": { "branch": "master", "commit": "4d77ff02063cf88963d5cf10683ab1fd15d072de" },
|
||||
"nvim-lsp-file-operations": {
|
||||
"branch": "master",
|
||||
"commit": "9744b738183a5adca0f916527922078a965515ed"
|
||||
},
|
||||
"nvim-lspconfig": { "branch": "master", "commit": "185b2af444b27d6541c02d662b5b68190e5cf0c4" },
|
||||
"nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
|
||||
"nvim-notify": { "branch": "master", "commit": "a3020c2cf4dfc4c4f390c4a21e84e35e46cf5d17" },
|
||||
"nvim-scrollbar": { "branch": "main", "commit": "5b103ef0fd2e8b9b4be3878ed38d224522192c6c" },
|
||||
"nvim-spectre": { "branch": "master", "commit": "72f56f7585903cd7bf92c665351aa585e150af0f" },
|
||||
"nvim-spider": { "branch": "main", "commit": "d4bdc45eac425e77108f068bd0706ff3ac20be7f" },
|
||||
"nvim-treesitter": { "branch": "master", "commit": "f8aaf5ce4e27cd20de917946b2ae5c968a2c2858" },
|
||||
"nvim-treesitter-textobjects": {
|
||||
"branch": "master",
|
||||
"commit": "9937e5e356e5b227ec56d83d0a9d0a0f6bc9cad4"
|
||||
},
|
||||
"nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" },
|
||||
"nvim-ts-context-commentstring": {
|
||||
"branch": "main",
|
||||
"commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f"
|
||||
},
|
||||
"nvim-ufo": { "branch": "main", "commit": "61463090a4f55f5d080236ea62f09d1cd8976ff3" },
|
||||
"nvim-vtsls": { "branch": "main", "commit": "60b493e641d3674c030c660cabe7a2a3f7a914be" },
|
||||
"nvim-web-devicons": { "branch": "master", "commit": "4c3a5848ee0b09ecdea73adcd2a689190aeb728c" },
|
||||
"nvim-window-picker": { "branch": "main", "commit": "6382540b2ae5de6c793d4aa2e3fe6dbb518505ec" },
|
||||
"orgmode": { "branch": "master", "commit": "b6d14eb0a1553a0ef4114346d67605de82d0f7fb" },
|
||||
"package-info.nvim": { "branch": "master", "commit": "4f1b8287dde221153ec9f2acd46e8237d2d0881e" },
|
||||
"parinfer-rust": { "branch": "master", "commit": "afe6b1176cd805c000713e23b654fbf4b9f4b156" },
|
||||
"plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" },
|
||||
"presence.nvim": { "branch": "main", "commit": "87c857a56b7703f976d3a5ef15967d80508df6e6" },
|
||||
"promise-async": { "branch": "main", "commit": "38a4575da9497326badd3995e768b4ccf0bb153e" },
|
||||
"refactoring.nvim": { "branch": "master", "commit": "74b608dfee827c2372250519d433cc21cb083407" },
|
||||
"render-markdown.nvim": {
|
||||
"branch": "main",
|
||||
"commit": "c809fc129f842a7055c672593d24be6346bcc673"
|
||||
},
|
||||
"resession.nvim": { "branch": "master", "commit": "cc819b0489938d03e4f3532a583354f0287c015b" },
|
||||
"rustaceanvim": { "branch": "master", "commit": "322224d00a731d75eed6b700d38e460fd30f6e3c" },
|
||||
"schemastore.nvim": { "branch": "main", "commit": "e4f80f37cd11ed58a6e914cc30850749f021b6a7" },
|
||||
"sentiment.nvim": { "branch": "main", "commit": "54a6db15b630eccfa98c32a76baf90f21c6f1e40" },
|
||||
"smart-splits.nvim": { "branch": "master", "commit": "ddb23c1a1cf1507bda487cda7f6e4690965ef9f5" },
|
||||
"telescope-fzf-native.nvim": {
|
||||
"branch": "main",
|
||||
"commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55"
|
||||
},
|
||||
"telescope-undo.nvim": { "branch": "main", "commit": "928d0c2dc9606e01e2cc547196f48d2eaecf58e5" },
|
||||
"telescope.nvim": { "branch": "0.1.x", "commit": "a17d611a0e111836a1db5295f04945df407c5135" },
|
||||
"todo-comments.nvim": { "branch": "main", "commit": "ae0a2afb47cf7395dc400e5dc4e05274bf4fb9e0" },
|
||||
"tree-sitter-nu": { "branch": "main", "commit": "d62bb4a0c78e9476a6dd0081761444f6870252ed" },
|
||||
"treesj": { "branch": "main", "commit": "3b4a2bc42738a63de17e7485d4cc5e49970ddbcc" },
|
||||
"tsc.nvim": { "branch": "main", "commit": "8c1b4ec6a48d038a79ced8674cb15e7db6dd8ef0" },
|
||||
"venv-selector.nvim": {
|
||||
"branch": "regexp",
|
||||
"commit": "c677caa1030808a9f90092e522de7cc20c1390dd"
|
||||
},
|
||||
"vim-illuminate": { "branch": "master", "commit": "19cb21f513fc2b02f0c66be70107741e837516a1" },
|
||||
"vim-repeat": { "branch": "master", "commit": "65846025c15494983dafe5e3b46c8f88ab2e9635" },
|
||||
"vim-wakatime": { "branch": "master", "commit": "f39c4a201ae350aaba713b59d4a4fdd88e0811aa" },
|
||||
"which-key.nvim": { "branch": "main", "commit": "fcbf4eea17cb299c02557d576f0d568878e354a4" },
|
||||
"yanky.nvim": { "branch": "main", "commit": "04775cc6e10ef038c397c407bc17f00a2f52b378" }
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
-- 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" },
|
||||
{ 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" },
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
require("lazy").setup({
|
||||
{
|
||||
"AstroNvim/AstroNvim",
|
||||
version = "^4", -- Remove version tracking to elect for nightly 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]])
|
||||
@@ -1,107 +0,0 @@
|
||||
-- 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" },
|
||||
},
|
||||
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -1,228 +0,0 @@
|
||||
-- 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 = true, -- 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
|
||||
-- https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
|
||||
servers = {
|
||||
---- Data & Configuration Languages
|
||||
"jsonls", -- json language server
|
||||
"jsonnet_ls", -- jsonnet language server
|
||||
"yamlls", -- yaml language server
|
||||
"taplo", -- toml language server
|
||||
"dagger", -- cuelsp - cue language server
|
||||
"terraformls", -- terraform hcl
|
||||
"marksman", -- markdown ls
|
||||
"nickel_ls", -- nickel language server
|
||||
-- "nil_ls", -- nix language server
|
||||
"nixd", -- another nix language server
|
||||
"buf_ls", -- protocol buffer language server
|
||||
"dockerls", -- dockerfile
|
||||
"cmake", -- cmake language server
|
||||
"sqls", -- sql language server
|
||||
|
||||
---- General Purpose Languages
|
||||
"clangd", -- c/c++
|
||||
"gopls", -- go
|
||||
"jdtls", -- java language server, provides only basic features
|
||||
"rust_analyzer", -- rust
|
||||
"pyright", -- python
|
||||
"ruff", -- extremely fast Python linter and code transformation
|
||||
-- "julials", -- julia language server
|
||||
-- "zls", -- zig language server
|
||||
"lua_ls", -- lua
|
||||
"bashls", -- bash
|
||||
"nushell", -- nushell language server
|
||||
|
||||
---- Web Development
|
||||
"ts_ls", -- typescript/javascript language server
|
||||
"tailwindcss", -- tailwindcss language server
|
||||
"html", -- html language server
|
||||
"cssls", -- css language server
|
||||
"prismals", -- prisma language server
|
||||
"volar", -- vue language server
|
||||
|
||||
---- Lisp Like
|
||||
"scheme_langserver", -- scheme language server
|
||||
"elixirls", -- elixir language server
|
||||
-- "clojure_lsp", -- clojure language server"
|
||||
|
||||
---- Circuit Design
|
||||
"verible", -- verilog 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,
|
||||
},
|
||||
rust_analyzer = {
|
||||
settings = {
|
||||
-- Make the rust-analyzer use its own profile,
|
||||
-- so you can run cargo build without that being blocked while rust-analyzer runs.
|
||||
["rust-analyzer"] = {
|
||||
cargo = {
|
||||
extraEnv = { CARGO_PROFILE_RUST_ANALYZER_INHERITS = "dev" },
|
||||
extraArgs = { "--profile", "rust-analyzer" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
-- 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,
|
||||
},
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
-- 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 = "⠏",
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
return {
|
||||
"0x00-ketsu/autosave.nvim",
|
||||
-- lazy-loading on events
|
||||
event = { "InsertLeave", "TextChanged" },
|
||||
opts = function(_, opts)
|
||||
opts.prompt_style = "stdout" -- notify or stdout
|
||||
end,
|
||||
}
|
||||
@@ -1,157 +0,0 @@
|
||||
local prefix = "<Leader>A"
|
||||
return {
|
||||
"yetone/avante.nvim",
|
||||
event = "User AstroFile", -- load on file open because Avante manages it's own bindings
|
||||
cmd = {
|
||||
"AvanteAsk",
|
||||
"AvanteBuild",
|
||||
"AvanteEdit",
|
||||
"AvanteRefresh",
|
||||
"AvanteSwitchProvider",
|
||||
"AvanteShowRepoMap",
|
||||
"AvanteModels",
|
||||
"AvanteChat",
|
||||
"AvanteChatNew",
|
||||
"AvanteToggle",
|
||||
"AvanteClear",
|
||||
"AvanteFocus",
|
||||
"AvanteStop",
|
||||
},
|
||||
version = false, -- Never set this value to "*"! Never!
|
||||
opts = {
|
||||
provider = "openrouter_claude_4",
|
||||
cursor_applying_provider = "openrouter_claude_4",
|
||||
behaviour = {
|
||||
-- auto_suggestions = true,
|
||||
enable_cursor_planning_mode = true, -- enable cursor planning mode!
|
||||
},
|
||||
-- WARNING: Since auto-suggestions are a high-frequency operation and therefore expensive,
|
||||
-- currently designating it as `copilot` provider is dangerous because: https://github.com/yetone/avante.nvim/issues/1048
|
||||
-- Of course, you can reduce the request frequency by increasing `suggestion.debounce`.
|
||||
auto_suggestions_provider = "ollama",
|
||||
suggestion = {
|
||||
debounce = 750, -- wait for x ms before suggestion
|
||||
throttle = 1200, -- wait for at least x ms before the next suggestion
|
||||
},
|
||||
web_search_engine = {
|
||||
provider = "google", -- tavily, serpapi, searchapi, google, kagi, brave, or searxng
|
||||
proxy = nil, -- proxy support, e.g., http://127.0.0.1:7890
|
||||
},
|
||||
|
||||
providers = {
|
||||
ollama = {
|
||||
endpoint = "http://192.168.5.100:11434", -- Note that there is no /v1 at the end.
|
||||
model = "modelscope.cn/unsloth/Qwen3-30B-A3B-GGUF",
|
||||
-- model = "modelscope.cn/unsloth/Qwen3-32B-GGUF",
|
||||
},
|
||||
-- ==============================================
|
||||
-- https://aistudio.google.com/prompts/new_chat
|
||||
-- ==============================================
|
||||
gemini = {
|
||||
api_key_name = "GEMINI_API_KEY",
|
||||
model = "gemini-2.5-pro-preview-06-05",
|
||||
timeout = 30000, -- Timeout in milliseconds, increase this for reasoning models
|
||||
temperature = 0,
|
||||
max_completion_tokens = 8192, -- Increase this to include reasoning tokens (for reasoning models)
|
||||
--reasoning_effort = "medium", -- low|medium|high, only used for reasoning models
|
||||
},
|
||||
-- ==============================================
|
||||
-- https://openrouter.ai/rankings
|
||||
-- ==============================================
|
||||
openrouter_claude_4 = {
|
||||
__inherited_from = "openai",
|
||||
endpoint = "https://openrouter.ai/api/v1",
|
||||
api_key_name = "OPENROUTER_API_KEY",
|
||||
model = "anthropic/claude-sonnet-4",
|
||||
},
|
||||
-- ==============================================
|
||||
-- https://bailian.console.aliyun.com/?tab=model
|
||||
-- ==============================================
|
||||
aliyun_qwen3 = {
|
||||
__inherited_from = "openai",
|
||||
api_key_name = "DASHSCOPE_API_KEY",
|
||||
endpoint = "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
||||
-- model = "qwen-coder-plus-latest",
|
||||
model = "qwen3-235b-a22b",
|
||||
-- disable_tools = true,
|
||||
},
|
||||
aliyun_dpr1 = {
|
||||
__inherited_from = "openai",
|
||||
api_key_name = "DASHSCOPE_API_KEY",
|
||||
endpoint = "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
||||
model = "deepseek-r1-0528",
|
||||
disable_tools = true,
|
||||
},
|
||||
-- ==============================================
|
||||
-- https://console.volcengine.com/ark/region:ark+cn-beijing/model?feature=&vendor=DeepSeek&view=VENDOR_VIEW
|
||||
-- ==============================================
|
||||
ark_dpr1 = {
|
||||
__inherited_from = "openai",
|
||||
api_key_name = "ARK_API_KEY",
|
||||
endpoint = "https://ark.cn-beijing.volces.com/api/v3",
|
||||
model = "deepseek-r1-250528",
|
||||
-- disable_tools = true,
|
||||
},
|
||||
-- ==============================================
|
||||
-- https://cloud.siliconflow.cn/models
|
||||
-- ==============================================
|
||||
sflow_dpr1 = {
|
||||
__inherited_from = "openai",
|
||||
api_key_name = "SILICONFLOW_API_KEY",
|
||||
endpoint = "https://api.siliconflow.cn/v1",
|
||||
model = "Pro/deepseek-ai/DeepSeek-R1",
|
||||
-- disable_tools = true,
|
||||
},
|
||||
-- ==============================================
|
||||
-- https://platform.deepseek.com/usage
|
||||
-- ==============================================
|
||||
dp_coder = {
|
||||
__inherited_from = "openai",
|
||||
api_key_name = "DEEPSEEK_API_KEY",
|
||||
endpoint = "https://api.deepseek.com",
|
||||
model = "deepseek-coder",
|
||||
},
|
||||
-- deepseek chat v3
|
||||
dp_chat = {
|
||||
__inherited_from = "openai",
|
||||
api_key_name = "DEEPSEEK_API_KEY",
|
||||
endpoint = "https://api.deepseek.com",
|
||||
model = "deepseek-chat",
|
||||
-- disable_tools = true,
|
||||
},
|
||||
-- deepseek r1
|
||||
dp_r1 = {
|
||||
__inherited_from = "openai",
|
||||
api_key_name = "DEEPSEEK_API_KEY",
|
||||
endpoint = "https://api.deepseek.com",
|
||||
model = "deepseek-reasoner",
|
||||
-- disable_tools = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
-- if you want to build from source then do `make BUILD_FROM_SOURCE=true`
|
||||
build = "make",
|
||||
-- build = "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false" -- for windows
|
||||
dependencies = {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
{ "stevearc/dressing.nvim", optional = true },
|
||||
"nvim-lua/plenary.nvim",
|
||||
"MunifTanjim/nui.nvim",
|
||||
{ "AstroNvim/astrocore", opts = function(_, opts) opts.mappings.n[prefix] = { desc = " Avante" } end },
|
||||
--- The below dependencies are optional,
|
||||
-- "echasnovski/mini.pick", -- for file_selector provider mini.pick
|
||||
"nvim-telescope/telescope.nvim", -- for file_selector provider telescope
|
||||
"hrsh7th/nvim-cmp", -- autocompletion for avante commands and mentions
|
||||
"ibhagwan/fzf-lua", -- for file_selector provider fzf
|
||||
"nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons
|
||||
-- "zbirenbaum/copilot.lua", -- for providers='copilot'
|
||||
{
|
||||
-- Make sure to set this up properly if you have lazy=true
|
||||
"MeanderingProgrammer/render-markdown.nvim",
|
||||
opts = {
|
||||
file_types = { "markdown", "Avante" },
|
||||
},
|
||||
ft = { "markdown", "Avante" },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
return {
|
||||
"catppuccin/nvim",
|
||||
name = "catppuccin",
|
||||
opts = function(_, opts)
|
||||
opts.flavour = "mocha" -- latte, frappe, macchiato, mocha
|
||||
opts.transparent_background = true -- setting the background color.
|
||||
end,
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
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,
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
return { "folke/flash.nvim", vscode = false }
|
||||
@@ -1,5 +0,0 @@
|
||||
-- implementation/definition preview
|
||||
return {
|
||||
"rmagatti/goto-preview",
|
||||
config = function() require("goto-preview").setup {} end,
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
-- 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,
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
-- Customize Mason plugins
|
||||
--
|
||||
-- NOTE: Issue - mason.nvim does not support NixOS:
|
||||
-- https://github.com/williamboman/mason.nvim/issues/428
|
||||
|
||||
---@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,
|
||||
},
|
||||
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
opts = function(_, opts)
|
||||
-- Where Mason should put its bin location in your PATH. Can be one of:
|
||||
-- - "prepend" (default, Mason's bin location is put first in PATH)
|
||||
-- - "append" (Mason's bin location is put at the end of PATH)
|
||||
-- - "skip" (doesn't modify PATH)
|
||||
---@type '"prepend"' | '"append"' | '"skip"'
|
||||
opts.PATH = "append" -- use mason's package only when no other package is found
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
-- File explorer(Custom configs)
|
||||
return {
|
||||
"nvim-neo-tree/neo-tree.nvim",
|
||||
opts = function(_, opts)
|
||||
opts.filesystem.filtered_items = {
|
||||
visible = true, -- visible by default
|
||||
hide_dotfiles = false,
|
||||
hide_gitignored = false,
|
||||
}
|
||||
opts.filesystem.follow_current_file = {
|
||||
enabled = true, -- This will find and focus the file in the active buffer every time
|
||||
leave_dirs_open = false, -- `false` closes auto expanded dirs, such as with `:Neotree reveal`
|
||||
}
|
||||
end,
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
-- full signature help, docs and completion for the nvim lua API.
|
||||
return { "folke/neodev.nvim", opts = {} }
|
||||
@@ -1 +0,0 @@
|
||||
return { "Olical/nfnl", ft = "fennel" }
|
||||
@@ -1,53 +0,0 @@
|
||||
-- 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,
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
-- The plugin offers the abilibty to search and replace.
|
||||
return {
|
||||
"nvim-pack/nvim-spectre",
|
||||
dependencies = {
|
||||
{ "nvim-lua/plenary.nvim" },
|
||||
},
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
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,
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
return {
|
||||
"eraserhd/parinfer-rust",
|
||||
build = "cargo build --release",
|
||||
ft = { "scm", "scheme" },
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
-- The plugin offers the alibity to refactor code.
|
||||
return {
|
||||
"ThePrimeagen/refactoring.nvim",
|
||||
dependencies = {
|
||||
{ "nvim-lua/plenary.nvim" },
|
||||
{ "nvim-treesitter/nvim-treesitter" },
|
||||
},
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
-- 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,
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
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,
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
-- disable toggleterm.nvim, zellij's terminal is far better than neovim's one
|
||||
return { "akinsho/toggleterm.nvim", enabled = false }
|
||||
@@ -1,42 +0,0 @@
|
||||
-- Customize Treesitter
|
||||
|
||||
---@type LazySpec
|
||||
return {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
dependencies = {
|
||||
-- NOTE: additional parser
|
||||
{ "nushell/tree-sitter-nu" }, -- nushell scripts
|
||||
},
|
||||
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", "wing" }
|
||||
|
||||
-- add more things to the ensure_installed table protecting against community packs modifying it
|
||||
-- https://github.com/nvim-treesitter/nvim-treesitter/tree/master
|
||||
opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||
-- please add only the tree-sitters that are not available in nixpkgs here
|
||||
|
||||
"just",
|
||||
"kdl",
|
||||
"csv",
|
||||
"xml",
|
||||
|
||||
---- Misc
|
||||
"diff",
|
||||
"git_config",
|
||||
"git_rebase",
|
||||
"gitignore",
|
||||
"gitcommit",
|
||||
"gitattributes",
|
||||
"ssh_config",
|
||||
})
|
||||
end,
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
-- 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,
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
-- Undo tree
|
||||
return { "debugloop/telescope-undo.nvim" }
|
||||
@@ -1,83 +0,0 @@
|
||||
-- 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,
|
||||
},
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
-- 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" },
|
||||
},
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
-- 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",
|
||||
-- },
|
||||
-- }
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
base: lua51
|
||||
|
||||
globals:
|
||||
vim:
|
||||
any: true
|
||||