commit 5057e1effa7af05e55c0fe1d29979d06c939d092 Author: GarandPLG Date: Sat Sep 13 23:16:22 2025 +0200 init diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..6b847f3 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,25 @@ +# 📜 License + +### ZaneyOS is licensed under the MIT License. + +## MIT License + +**Copyright (c) 2025 Tyler Kelley** + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software" ), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** diff --git a/cheatsheets/README.md b/cheatsheets/README.md new file mode 100644 index 0000000..23eee44 --- /dev/null +++ b/cheatsheets/README.md @@ -0,0 +1,66 @@ +# Cheatsheets Index (ddubsOS) + +These documents cover both general usage and the specific configuration as defined in the NixOS configuration "ddubsOS". + +- General use: Practical, task-focused tips and top workflows. +- ddubsOS specifics: Notes reflecting how tools are configured in this repository (modules/home/*) so behavior matches your system. + +## 🔗 Quick Links +- Emacs + - [Getting Started Top 10](emacs/emacs.getting-started.top10.md) + - [File Explorer](emacs/emacs.file-explorer.cheatsheet.md) + - [Code Completion](emacs/emacs.code-completion.cheatsheet.md) + - [Magit (Git)](emacs/emacs.magit.cheatsheet.md) + - [Markdown](emacs/emacs.markdown.cheatsheet.md) +- Ghostty + - [Ghostty Cheatsheet](ghostty/ghostty.cheatsheet.md) +- Tmux + - [Tmux Cheatsheet](tmux/tmux.cheatsheet.md) +- Alacritty + - [Alacritty Cheatsheet](alacritty/alacritty.cheatsheet.md) +- Kitty + - [Kitty Cheatsheet](kitty/kitty.cheatsheet.md) +- WezTerm + - [WezTerm Cheatsheet](wezterm/wezterm.cheatsheet.md) +- Hyprland + - [Keybindings](hyprland/hyprland.binds.cheatsheet.md) + - [Window Rules](hyprland/hyprland.windowrules.cheatsheet.md) +- Yazi + - [Keymap](yazi/yazi.keymap.cheatsheet.md) + +## 📚 How to use +- Browse the area you care about (e.g., Emacs, Ghostty). +- Start with the “getting started” or “top tips” docs for quick wins. +- Refer to tool-specific cheatsheets for day-to-day commands, then cross-check any ddubsOS-specific settings. + +## 📂 Directory Tree + +``` +cheatsheets/ +├── emacs/ +│ ├── emacs.code-completion.cheatsheet.md +│ ├── emacs.file-explorer.cheatsheet.md +│ ├── emacs.getting-started.top10.md +│ ├── emacs.magit.cheatsheet.md +│ └── emacs.markdown.cheatsheet.md +├── ghostty/ +│ └── ghostty.cheatsheet.md +├── tmux/ +│ └── tmux.cheatsheet.md +├── alacritty/ +│ └── alacritty.cheatsheet.md +├── kitty/ +│ └── kitty.cheatsheet.md +├── wezterm/ +│ └── wezterm.cheatsheet.md +├── hyprland/ +│ ├── hyprland.binds.cheatsheet.md +│ └── hyprland.windowrules.cheatsheet.md +└── yazi/ + └── yazi.keymap.cheatsheet.md +``` + +## 🛠️ Notes +- Ghostty cheatsheet reflects bindings from modules/home/terminals/ghostty.nix (ddubsOS). +- Emacs docs follow the same markdown style for consistency and quick scanning. + diff --git a/cheatsheets/alacritty/alacritty.cheatsheet.md b/cheatsheets/alacritty/alacritty.cheatsheet.md new file mode 100644 index 0000000..84164f0 --- /dev/null +++ b/cheatsheets/alacritty/alacritty.cheatsheet.md @@ -0,0 +1,23 @@ +# Alacritty on ddubsOS — Summary & Cheatsheet + +## 🚀 Summary of modules/home/terminals/alacritty.nix + +- Program + - Alacritty enabled. + - Font family (default): Maple NF; size: 15. + - Styles configured: Regular, Bold, Italic, Bold Italic. + +--- + +## ⚙️ Default Options (as configured) + +Font +- normal: Maple NF Regular +- bold: Maple NF Bold +- italic: Maple NF Italic +- bold_italic: Maple NF Bold Italic +- size: 15 + +Notes +- Uses lib.mkDefault for font family, so other modules can override. + diff --git a/cheatsheets/emacs/emacs.code-completion.cheatsheet.md b/cheatsheets/emacs/emacs.code-completion.cheatsheet.md new file mode 100644 index 0000000..d1c074a --- /dev/null +++ b/cheatsheets/emacs/emacs.code-completion.cheatsheet.md @@ -0,0 +1,128 @@ +# Doom Emacs Code Completion & Lookup Cheatsheet + +## 🚀 **What You Have (Like nvim-cmp + blink.cmp)** + +If your Doom config includes: +- **Company Mode** - Auto-completion framework +- **LSP Mode** - Language Server Protocol support +- **Tree-sitter** - Advanced syntax parsing +- **Lookup tools** - Documentation and definition lookup + +## ⌨️ **Code Completion (Company)** + +### **Auto-completion Controls:** +- `TAB` or `C-SPC` - **Accept completion** +- `C-n` / `j` - **Next completion** (evil mode) +- `C-p` / `k` - **Previous completion** (evil mode) +- `C-w` - **Show documentation** for completion +- `C-s` - **Search/filter completions** +- `ESC` or `C-g` - **Cancel completion** + +### **Manual Completion:** +- `M-/` - **Complete at point** (manual trigger) +- `C-M-/` - **Expand abbreviation** + +## 🔍 **Code Lookup & Navigation** + +### **Go to Definition/References:** +- `gd` - **Go to definition** (evil mode) +- `gD` - **Go to declaration** +- `gr` - **Go to references** +- `SPC c d` - **Find definition** +- `SPC c D` - **Find references** +- `SPC c i` - **Find implementations** + +### **Documentation Lookup:** +- `K` - **Lookup documentation** (evil mode) +- `SPC c k` - **Lookup documentation** +- `SPC c K` - **Lookup in docsets** +- `C-h f` - **Describe function** +- `C-h v` - **Describe variable** + +### **Symbol Navigation:** +- `SPC c j` - **Jump to symbol in buffer** +- `SPC c J` - **Jump to symbol in project** +- `SPC s i` - **Search for symbol** + +## 🛠️ **LSP Features (Language Server)** + +### **LSP Actions:** +- `SPC c a` - **Code actions** (refactor, fix, etc.) +- `SPC c r` - **Rename symbol** +- `SPC c f` - **Format buffer/region** +- `SPC c o` - **Organize imports** + +### **Error Navigation:** +- `]e` - **Next error** +- `[e` - **Previous error** +- `SPC c x` - **List errors** + +### **LSP Info:** +- `SPC c l` - **LSP menu** +- `SPC c h` - **Show hover info** +- `SPC c s` - **Show signature** + +## 🎯 **Language-Specific Features** + +### **C/C++ (clang-tools)** +- Full completion for functions, variables, types +- Go to definition across files +- Error checking and diagnostics +- Code formatting with clang-format + +### **Nix (nil LSP)** +- Nix language completion +- Function documentation +- Syntax checking +- Go to definition for Nix expressions + +### **JSON (vscode-json-languageserver)** +- Schema-based completion +- Validation and error checking +- Go to definition in JSON files + +## ⚡ **Pro Tips** + +### **Fuzzy Search Everything:** +- `SPC f f` - **Find files** +- `SPC /` - **Search in project** +- `SPC s s` - **Search buffer** +- `SPC p p` - **Switch projects** + +### **Better Navigation:** +- `C-o` - **Go back** (after jumping to definition) +- `C-i` - **Go forward** +- `SPC j j` - **Jump to character** (like easymotion) + +### **Completion Tweaks:** +- Completions appear after 0.2 seconds of typing +- Minimum 1 character to trigger +- Shows documentation in popup +- Works with both Company and LSP + +## 🔧 **Troubleshooting** + +### **If completion isn't working:** +1. Check if LSP server is running: `SPC c l` +2. Restart LSP: `SPC c l r` +3. Check syntax errors: `SPC c x` + +### **Performance:** +- LSP servers auto-start when you open supported files +- Completion is optimized for fast response +- Use `SPC h r r` to reload Doom config after changes + +## 🚀 **Quick Start Workflow** + +1. **Open a code file** (`.c`, `.nix`, `.json`) +2. **Start typing** - completions appear automatically +3. **Navigate with `j/k`** and **accept with `TAB`** +4. **Use `gd`** to jump to definitions +5. **Use `K`** to see documentation +6. **Use `SPC c a`** for code actions + +## 📚 **Language Servers Included** +- **C/C++**: `clang-tools` (clangd) +- **Nix**: `nil` +- **JSON**: `vscode-json-languageserver` +- More can be added per language as needed! diff --git a/cheatsheets/emacs/emacs.file-explorer.cheatsheet.md b/cheatsheets/emacs/emacs.file-explorer.cheatsheet.md new file mode 100644 index 0000000..b33bd75 --- /dev/null +++ b/cheatsheets/emacs/emacs.file-explorer.cheatsheet.md @@ -0,0 +1,305 @@ +# Doom Emacs File Explorer Cheatsheet + +## 🗂️ **What is Dired?** + +Dired (Directory Editor) is Emacs' built-in file manager that allows you to navigate, manage, and manipulate files and directories efficiently. +- Browse directories with keyboard navigation +- Mark, copy, move, and delete files +- Execute commands on multiple files at once +- Integrate with other Emacs tools and buffers + +## 📋 **Requirements** +- Doom Emacs (Dired is built-in) +- **Treemacs**: Must be enabled in `~/.doom.d/init.el` (uncomment `treemacs` line) +- Optional tools for enhanced functionality: + - `rsync` - Fast file synchronization and copying + - `fd` or `find` - Enhanced file finding + - `rg` (ripgrep) or `ag` (the_silver_searcher) - Fast text search + - `exa` or `lsd` - Enhanced directory listings + - `trash-cli` - Safe file deletion to trash + - `zip`/`unzip`, `tar`, `gzip` - Archive handling + +## ⌨️ **Opening File Explorers** + +### **Dired (Built-in File Manager):** +- `SPC .` - **Open Dired** in current directory +- `SPC f d` - **Find directory** (open Dired in specific path) +- `C-x d` - **Open Dired** (classic Emacs binding) + +### **Project File Navigation:** +- `SPC SPC` - **Find file** in project +- `SPC f f` - **Find file** anywhere +- `SPC f r` - **Recent files** +- `SPC p f` - **Find file** in project + +### **Tree-style Explorers:** +- `SPC o p` - **Toggle project sidebar** (Treemacs) +- `SPC f t` - **Find file** in tree + +## 🧭 **Navigation in Dired** + +### **Basic Movement:** +- `j/k` or `n/p` - **Move up/down** between files +- `h` - **Go up** one directory (parent) +- `l` or `RET` - **Enter directory** or open file +- `^` - **Go to parent directory** +- `g` - **Refresh** directory listing + +### **Jumping Around:** +- `gg` - **Go to top** of listing +- `G` - **Go to bottom** of listing +- `/` - **Search** for file/directory name +- `SPC s s` - **Search within** directory + +### **File Information:** +- `(` - **Toggle details** (show/hide file info) +- `s` - **Sort** files (by name, date, size) +- `C-h m` - **Show help** for current mode + +## 📁 **File Operations** + +### **Opening Files:** +- `RET` - **Open file** in current window +- `o` - **Open file** in other window +- `C-o` - **Open file** in other window (keep cursor in Dired) +- `v` - **View file** (read-only) +- `f` - **Find file** (same as RET) + +### **Creating Files & Directories:** +- `+` - **Create directory** +- `SPC f c` - **Create file** (when in Dired buffer) +- `C-x C-f` - **Find/create file** (from Dired) + +## 🏷️ **Marking Files** + +### **Basic Marking:** +- `m` - **Mark file** for operations +- `u` - **Unmark file** +- `U` - **Unmark all** files +- `t` - **Toggle marks** (mark unmarked, unmark marked) +- `* %` - **Mark by regex** pattern + +### **Quick Marking:** +- `* .` - **Mark by extension** (e.g., *.txt) +- `* /` - **Mark directories** +- `* @` - **Mark symlinks** +- `* *` - **Mark executables** + +### **Advanced Marking:** +- `% m` - **Mark files** matching regex +- `% d` - **Mark for deletion** files matching regex +- `* c` - **Change marks** (change one mark to another) + +## ✂️ **File Management Operations** + +### **Copy, Move, Delete:** +- `C` - **Copy** marked files (or file under cursor) +- `R` - **Rename/Move** marked files +- `D` - **Delete** marked files immediately +- `d` - **Mark for deletion** (use `x` to execute) +- `x` - **Execute deletions** (delete files marked with `d`) + +### **Deletion Options:** +- `d` then `x` - **Safe deletion** (mark first, then execute) +- `D` - **Immediate deletion** (bypass mark step) +- **Trash integration**: If `trash-cli` is installed, files go to trash instead of permanent deletion + +### **Advanced Operations:** +- `Z` - **Compress/uncompress** files (uses `gzip`, `zip`, `tar` automatically) +- `A` - **Search** in marked files (uses `grep` or `rg` if available) +- `Q` - **Query replace** in marked files +- `!` - **Run shell command** on marked files +- `&` - **Run async shell command** on marked files + +## 📋 **Copying & Moving** + +### **Copy Operations:** +- `C` - **Copy files** (prompts for destination) +- Works with marked files or single file under cursor +- Uses `rsync` if available for faster, resumable copying +- Supports copying to different drives/partitions + +### **Move/Rename Operations:** +- `R` - **Rename/Move** files +- Can rename single files or move multiple marked files +- Supports moving across directories + +### **Tips for Copy/Move:** +- Mark multiple files first, then use `C` or `R` +- Tab completion works for destination paths +- Use relative paths (`.`, `..`) for quick navigation + +## 🔍 **Search & Filter** + +### **Finding Files:** +- `/` - **Search** file names in current listing +- `n/N` - **Next/previous** search match + +### **Enhanced Search (with external tools):** +- `A` - **Search inside files** (uses `rg` > `ag` > `grep` in priority order) +- Much faster with `ripgrep` or `the_silver_searcher` +- Supports regex patterns and file type filtering + +### **Filtering Display:** +- `(` - **Toggle** detailed view +- `s` - **Sort** by different criteria +- `C-u s` - **Sort** with custom options + +### **Content Search:** +- `A` - **Search inside** marked files +- `Q` - **Query replace** across marked files + +## 🔧 **Advanced Features** + +### **Wdired (Writable Dired):** +- `C-x C-q` - **Edit filenames** directly (like renaming) +- Edit filenames as text, then `C-c C-c` to apply changes +- `C-c C-k` to cancel edits + +### **Multiple Windows:** +- `o` - **Open in other window** +- `C-o` - **Display in other window** (stay in Dired) +- `2` - **Split window** vertically for two Dired views + +### **Subdirectories:** +- `i` - **Insert subdirectory** in same buffer +- `$` - **Hide/show** subdirectory contents +- `M-$` - **Hide all** subdirectories + +## 📊 **File Comparison** + +### **Diff Operations:** +- `=` - **Diff file** with another +- `M-=` - **Diff** marked files against each other +- Works with external diff tools + +## 🗜️ **Archive Operations** + +### **Compression & Archives:** +- `Z` - **Compress/decompress** automatically detects format +- Supports: `.gz`, `.zip`, `.tar`, `.tar.gz`, `.tar.xz`, `.7z` +- Uses appropriate tools: `gzip`, `zip`, `tar`, `7z` + +### **Archive Viewing:** +- Open `.zip`, `.tar`, etc. files directly to browse contents +- Extract specific files from archives + +## 🎛️ **Customization & Settings** + +### **View Options:** +- `(` - **Toggle** between simple and detailed view +- `s` - **Cycle** through sort orders (name, date, size) +- Enhanced listings with `exa` or `lsd` if available + +### **Useful Settings:** +- Dired reuses buffers by default in Doom +- Auto-refresh on file changes +- Integration with Evil mode keybindings + +## ⚡ **Treemacs (Tree Explorer)** + +### **Basic Treemacs:** +- `SPC o p` - **Toggle** Treemacs sidebar +- `j/k` - **Navigate** up/down in tree +- `RET` - **Open file** or expand/collapse directory +- `TAB` - **Expand/collapse** directory + +### **Treemacs File Operations:** +- `cf` - **Create file** +- `cd` - **Create directory** +- `R` - **Rename** +- `d` - **Delete** +- `yy` - **Copy** path to clipboard + +## 🚀 **Quick Start Workflow** + +### **Basic File Management:** +1. **Press `SPC .`** - Open Dired in current directory +2. **Navigate with `j/k`** - Move between files +3. **Mark files with `m`** - Select multiple files +4. **Use `C` to copy** or `R` to move/rename +5. **Press `g`** to refresh when done + +### **Efficient File Operations:** +1. **Mark multiple files** with `m` +2. **Execute batch operations** (`C` for copy, `R` for move) +3. **Use `!`** to run shell commands on marked files +4. **Toggle details with `(`** for more/less information + +## 📚 **Essential Keybind Summary** + +| Action | Key | Description | +|--------|-----|-------------| +| Open Dired | `SPC .` | Open file explorer | +| Navigate | `j/k` | Move up/down | +| Enter/Open | `RET` or `l` | Open file/directory | +| Parent Dir | `h` or `^` | Go up one directory | +| Mark | `m` | Mark file for operations | +| Copy | `C` | Copy marked files | +| Move/Rename | `R` | Move or rename files | +| Delete | `d` then `x` | Mark for deletion, execute | +| Create Dir | `+` | Create new directory | +| Compress | `Z` | Compress/decompress | +| Search Files | `A` | Search inside files | +| Refresh | `g` | Refresh directory listing | +| Help | `?` | Show available commands | + +## 🔧 **Troubleshooting** + +### **Common Issues:** +- **Dired buffer not updating?** Press `g` to refresh +- **Can't see file details?** Press `(` to toggle detailed view +- **Operations feel slow?** Use marking (`m`) for batch operations +- **Wrong sort order?** Press `s` to cycle through sort options + +### **Performance Tips:** +- Install `fd` for faster file finding +- Install `rg` (ripgrep) for faster text search +- Use `rsync` for efficient file copying +- Consider `exa` or `lsd` for enhanced directory listings + +### **Getting Help:** +- `?` - **Context help** in any Dired buffer +- `C-h m` - **Mode-specific help** +- `SPC h d f dired` - **Full Dired documentation** + +## 📋 **Comparison: Dired vs Treemacs** + +### **Use Dired when:** +- Managing multiple files at once +- Need detailed file information +- Performing batch operations +- Working with file permissions/ownership + +### **Use Treemacs when:** +- Quick project overview +- Simple file navigation +- Prefer visual tree structure +- Need persistent sidebar + +## 🛠️ **External Tool Integration** + +### **Recommended Tools:** +- **`rsync`** - Fast, reliable file copying with resume capability +- **`ripgrep` (rg)** - Extremely fast text search, much faster than grep +- **`fd`** - Fast alternative to find with better defaults +- **`exa`** - Modern replacement for ls with colors and git integration +- **`trash-cli`** - Safe deletion to trash instead of permanent removal +- **`7z`** - Handle 7zip archives and other compression formats + +### **Installation (Debian/Ubuntu):** +```bash +sudo apt install rsync ripgrep fd-find exa trash-cli p7zip-full +``` + +## 🎯 **Pro Tips** + +- **Batch operations**: Mark files first (`m`), then execute operations +- **Quick navigation**: Use `/` to search for files by name +- **Edit filenames**: Use `C-x C-q` for Wdired mode to rename multiple files +- **Shell integration**: Use `!` to run shell commands on files +- **Multiple directories**: Use `i` to show subdirectories in same buffer +- **Safe deletion**: Install `trash-cli` to send files to trash instead of permanent deletion +- **Fast search**: Install `ripgrep` for lightning-fast text search in files + +Dired provides a comprehensive file management experience that integrates well with external Linux tools, making file operations both efficient and powerful. diff --git a/cheatsheets/emacs/emacs.getting-started.top10.md b/cheatsheets/emacs/emacs.getting-started.top10.md new file mode 100644 index 0000000..3405622 --- /dev/null +++ b/cheatsheets/emacs/emacs.getting-started.top10.md @@ -0,0 +1,294 @@ +# Top 10 Things New Doom Emacs Users Should Know + +## 🚀 **Getting Started with Doom Emacs** + +Welcome to Doom Emacs! Here are the 10 most essential things every new user +should master to get productive quickly. + +--- + +## 1. 🗝️ **Master the Leader Key: `SPC`** + +**The Space key is your gateway to everything in Doom Emacs.** + +- `SPC` is called the "leader key" - it opens menus for almost every action +- After pressing `SPC`, you'll see helpful hints showing available commands +- Commands are organized logically: `SPC f` for files, `SPC g` for git, `SPC p` + for projects + +**Essential starter commands:** + +- `SPC f f` - Find/open files +- `SPC f s` - Save current file +- `SPC q q` - Quit Emacs +- `SPC h` - Help menu (very important!) + +**Pro Tip:** If you forget what comes next, just press `SPC` and wait - Doom +will show you the options! + +--- + +## 2. 📁 **Navigate Files Like a Pro** + +**File navigation is fundamental to productivity.** + +- `SPC .` - **Open file explorer** (Dired) in current directory +- `SPC f f` - **Find file** anywhere on your system +- `SPC f r` - **Recent files** you've worked on +- `SPC SPC` - **Find file in current project** (super useful!) + +📋 _See the complete guide: `emacs.file-explorer.cheatsheet.md`_ + +**Quick workflow:** + +1. Open your project directory in terminal +2. Start Emacs: `emacs` or `doom run` +3. Use `SPC .` to browse files or `SPC SPC` to quickly find files + +--- + +## 3. ⌨️ **Understand Evil Mode (Vim Keybindings)** + +**Doom Emacs uses Vim-style keybindings by default.** + +**Basic movement (in Normal mode):** + +- `h j k l` - Left, down, up, right +- `w` - Jump to next word +- `b` - Jump back one word +- `gg` - Go to top of file +- `G` - Go to bottom of file + +**Mode switching:** + +- `i` - Enter Insert mode (to type text) +- `ESC` - Return to Normal mode +- `v` - Visual mode (to select text) + +**If you're not familiar with Vim:** Don't panic! You can learn gradually. The +basics above will get you started. + +--- + +## 4. 🔍 **Search and Replace Efficiently** + +**Finding and changing text is a daily task.** + +- `/` - Search forward in current buffer +- `?` - Search backward in current buffer +- `n/N` - Next/previous search result +- `SPC s s` - Search in current buffer (interactive) +- `SPC s p` - Search in entire project +- `SPC s r` - Search and replace in current buffer + +**For project-wide search:** `SPC s p` is incredibly powerful for finding code +across your entire project. + +--- + +## 5. 🗂️ **Work with Buffers and Windows** + +**Buffers are open files, windows are how you view them.** + +**Buffer management:** + +- `SPC b b` - Switch between open buffers +- `SPC b k` - Kill (close) current buffer +- `SPC b s` - Save current buffer + +**Window management:** + +- `SPC w v` - Split window vertically +- `SPC w s` - Split window horizontally +- `SPC w c` - Close current window +- `SPC w w` - Switch between windows +- `C-h j/k/h/l` - Navigate between windows (Vim-style) + +**Think of it this way:** You can have many files open (buffers) but only see +some of them at once (windows). + +--- + +## 6. 🛠️ **Configure and Customize Doom** + +**Doom is highly configurable, but start simple.** + +**Key files to know about:** + +- `~/.doom.d/config.el` - Your personal configuration +- `~/.doom.d/init.el` - Enable/disable Doom modules +- `~/.doom.d/packages.el` - Add extra packages + +**Essential commands:** + +- `SPC h r r` - Reload Doom configuration +- `SPC h d h` - Doom help and documentation +- `doom doctor` - Check for configuration issues (run in terminal) +- `doom upgrade` - Update Doom (run in terminal) + +**Start small:** Don't try to customize everything at once. Use Doom's defaults +first, then gradually tweak things. + +--- + +## 7. 📝 **Master Text Editing Basics** + +**Essential editing commands that work in any mode.** + +**In Normal mode (Evil):** + +- `x` - Delete character under cursor +- `dd` - Delete entire line +- `yy` - Copy (yank) entire line +- `p` - Paste after cursor +- `u` - Undo +- `C-r` - Redo + +**In Insert mode:** + +- `C-w` - Delete word backward +- `C-u` - Delete to beginning of line + +**Selection and manipulation:** + +- `v` - Start visual selection +- `V` - Select entire line +- `d` - Delete selected text +- `y` - Copy selected text + +--- + +## 8. 💻 **Use Code Completion and Language Features** + +**Doom comes with excellent code support out of the box.** + +**Auto-completion:** + +- Just start typing - completions appear automatically +- `TAB` - Accept completion +- `C-n/C-p` or `j/k` - Navigate completion options + +**Code navigation:** + +- `gd` - Go to definition +- `gr` - Find references +- `K` - Show documentation +- `SPC c a` - Code actions (refactor, fix, etc.) + +📋 _See the complete guide: `emacs.code-completion.cheatsheet.md`_ + +**Languages supported:** Most popular languages work out of the box (Python, +JavaScript, C/C++, Rust, Go, etc.) + +--- + +## 9. 📚 **Use Built-in Help System** + +**Doom has excellent built-in documentation.** + +- `SPC h` - **Main help menu** +- `SPC h d h` - **Doom-specific help** +- `SPC h k` - **Describe key** (what does this key do?) +- `SPC h f` - **Describe function** +- `SPC h v` - **Describe variable** +- `C-h m` - **Show help for current mode** + +**When you're lost:** Press `SPC h` and explore. The help system is +comprehensive and always available. + +**Pro Tip:** If you press a key combination and don't know what happened, use +`SPC h l` to see recent commands. + +--- + +## 10. 🔧 **Learn Git Integration (Magit)** + +**Magit is one of the best Git interfaces available anywhere.** + +- `SPC g g` - Open Magit status (your main Git command!) +- `s` - Stage files or hunks +- `c c` - Commit changes +- `P P` - Push to remote +- `F F` - Pull from remote + +📋 _See the complete guide: `emacs.magit.cheatsheet.md`_ + +**Basic workflow:** + +1. `SPC g g` - See what's changed +2. `s` on files to stage them +3. `c c` to commit (write message, then `C-c C-c`) +4. `P P` to push + +**Why it's essential:** If you work with Git, Magit will transform your +workflow. It's visual, fast, and incredibly powerful. + +--- + +## 🎯 **Quick Start Checklist** + +Once you've read through the above, try this 5-minute workflow: + +1. ✅ **Open Doom:** `emacs` in terminal +2. ✅ **Find a file:** `SPC f f` and open any text file +3. ✅ **Edit something:** Press `i`, type text, press `ESC` +4. ✅ **Save:** `SPC f s` +5. ✅ **Open file explorer:** `SPC .` +6. ✅ **Get help:** `SPC h` +7. ✅ **Split window:** `SPC w v` +8. ✅ **Switch buffers:** `SPC b b` +9. ✅ **Search project:** `SPC s p` (if in a project) +10. ✅ **Quit:** `SPC q q` + +--- + +## 📖 **Next Steps: Dive Deeper** + +Once you're comfortable with the basics above: + +1. **Read the specific cheatsheets:** + - `emacs.file-explorer.cheatsheet.md` - File management + - `emacs.code-completion.cheatsheet.md` - Coding features + - `emacs.magit.cheatsheet.md` - Git integration + - `emacs.markdown.cheatsheet.md` - Markdown editing + +2. **Customize gradually:** Start tweaking your `config.el` +3. **Learn your language:** Explore language-specific features +4. **Join the community:** Doom Discord, Reddit, GitHub discussions + +--- + +## 🆘 **When You're Stuck** + +**Emergency commands:** + +- `C-g` - Cancel current command (like pressing ESC) +- `SPC q q` - Quit Emacs +- `SPC h d h` - Doom help +- `:q` - Quit current buffer (Vim command) + +**Remember:** Every expert was once a beginner. Don't try to learn everything at +once. Master these 10 things first, then gradually explore more advanced +features. + +**Most important tip:** Use `SPC` and explore the menus. Doom is designed to be +discoverable - let it guide you! + +--- + +## 🎓 **Learning Philosophy** + +**Start with workflows, not features:** Instead of memorizing every keybinding, +learn complete workflows for tasks you do daily (editing files, committing code, +searching projects). + +**Use the defaults first:** Doom's defaults are excellent. Resist the urge to +customize everything immediately. + +**One thing at a time:** Master file navigation before diving into advanced code +features. Build your skills incrementally. + +**Practice daily:** Use Doom for real work, even if you're slower at first. +Muscle memory develops with practice. + +Welcome to Doom Emacs! 🚀 diff --git a/cheatsheets/emacs/emacs.magit.cheatsheet.md b/cheatsheets/emacs/emacs.magit.cheatsheet.md new file mode 100644 index 0000000..0ccc062 --- /dev/null +++ b/cheatsheets/emacs/emacs.magit.cheatsheet.md @@ -0,0 +1,276 @@ +# Doom Emacs Magit Cheatsheet + +## 🚀 **What is Magit?** + +Magit is an extremely powerful tool for managing your Git project + +- Visual, interactive Git workflows +- Stage hunks, lines, or entire files with ease +- Commit, push, pull, merge, rebase - all from intuitive menus +- See your repo status at a glance + +## 📋 **Requirements** + +- Git installed on your system +- Doom Emacs with Magit enabled (included by default) +- Working inside a Git repository + +## ⌨️ **Opening Magit** + +### **Main Magit Interface:** + +- `SPC g g` - **Magit status** (your main command!) +- `SPC g d` - **Magit file dispatch** +- `SPC g f` - **Magit file commands** +- `SPC g l` - **Magit log** +- `SPC g b` - **Magit blame** + +## 🎯 **The Magit Status Buffer** (Your Command Center) + +### **Navigation:** + +- `j/k` or `n/p` - **Move up/down** between sections +- `TAB` - **Expand/collapse** section under cursor +- `M-TAB` - **Expand/collapse** all sections +- `g` - **Refresh** status buffer + +### **Section Overview:** + +``` +Untracked files - Files not in Git +Unstaged changes - Modified files not staged +Staged changes - Files ready to commit +Recent commits - Your commit history +Stashes - Your saved work-in-progress +``` + +## 📝 **Staging & Unstaging** + +### **Stage Files:** + +- `s` - **Stage** file/hunk under cursor +- `S` - **Stage all** unstaged changes +- `i` - **Ignore** file (add to .gitignore) + +### **Unstage Files:** + +- `u` - **Unstage** file/hunk under cursor +- `U` - **Unstage all** staged changes + +### **Discard Changes:** + +- `k` - **Discard** changes in file/hunk under cursor +- `K` - **Discard all** changes in working directory + +### **Staging Hunks & Lines:** + +- `RET` or `SPC` - **Show diff** of file under cursor +- In diff view: + - `s` - **Stage hunk** under cursor + - `u` - **Unstage hunk** under cursor + - `k` - **Discard hunk** under cursor + - `+/-` - **Show more/less context** lines + +## 💾 **Committing** + +### **Create Commits:** + +- `c c` - **Commit** (opens commit message buffer) +- `c a` - **Amend** last commit +- `c e` - **Extend** last commit (no message change) +- `c w` - **Reword** last commit message +- `c f` - **Fixup** commit +- `c s` - **Squash** commit + +### **In Commit Message Buffer:** + +- `C-c C-c` - **Finish commit** +- `C-c C-k` - **Cancel commit** +- `M-p/M-n` - **Previous/next** commit message from history + +## 🌿 **Branching & Switching** + +### **Branch Operations:** + +- `b b` - **Switch branch** (checkout) +- `b c` - **Create new branch** +- `b n` - **Create branch** from current HEAD +- `b s` - **Create branch** and switch to it +- `b r` - **Rename branch** +- `b k` - **Delete branch** + +### **Remote Branches:** + +- `b a` - **Set upstream** for current branch +- `b u` - **Set upstream** and push + +## 🔄 **Remote Operations** + +### **Fetch & Pull:** + +- `f f` - **Fetch** from default remote +- `f a` - **Fetch from all** remotes +- `F F` - **Pull** from upstream +- `F u` - **Pull from upstream** (rebase) + +### **Push:** + +- `P P` - **Push** to upstream +- `P u` - **Push and set upstream** +- `P f` - **Force push** (use carefully!) +- `P t` - **Push tags** + +## 📚 **Viewing History & Logs** + +### **Log Views:** + +- `l l` - **Show log** for current branch +- `l o` - **Show log** for other branches +- `l h` - **Show log** for HEAD +- `l a` - **Show log** for all branches +- `l f` - **Show log** for file under cursor + +### **In Log View:** + +- `RET` - **Show commit** details +- `d d` - **Show diff** for commit +- `c c` - **Create new commit** +- `r r` - **Revert commit** + +## 🔍 **Diffs & Comparisons** + +### **Diff Commands:** + +- `d d` - **Diff working directory** vs staged +- `d s` - **Diff staged** vs HEAD +- `d u` - **Diff unstaged** changes +- `d r` - **Diff range** between commits + +### **In Diff Views:** + +- `j/k` - **Navigate** between hunks +- `n/p` - **Next/previous** file +- `TAB` - **Toggle** visibility of diff section +- `+/-` - **Increase/decrease** context lines + +## 🔧 **Rebasing & Merging** + +### **Merge:** + +- `m m` - **Merge** branch +- `m a` - **Abort merge** +- `m c` - **Continue merge** + +### **Rebase:** + +- `r i` - **Interactive rebase** +- `r r` - **Rebase** branch +- `r a` - **Abort rebase** +- `r c` - **Continue rebase** + +### **During Interactive Rebase:** + +- `j/k` - **Move** between commits +- `p` - **Pick** commit (default) +- `r` - **Reword** commit message +- `e` - **Edit** commit +- `s` - **Squash** commit +- `f` - **Fixup** commit +- `d` - **Drop** commit + +## 📦 **Stashing** + +### **Stash Operations:** + +- `z z` - **Stash** current changes +- `z i` - **Stash** with message +- `z a` - **Apply stash** +- `z p` - **Pop stash** (apply and delete) +- `z k` - **Drop stash** +- `z l` - **List stashes** + +## 🏷️ **Tags** + +### **Tag Operations:** + +- `t t` - **Create tag** +- `t a` - **Create annotated tag** +- `t k` - **Delete tag** +- `t p` - **Push tag** + +## ⚡ **Pro Tips & Workflows** + +### **Daily Git Workflow:** + +1. `SPC g g` - **Open Magit status** +2. Review changes, stage with `s` +3. `c c` - **Commit changes** +4. `P P` - **Push to remote** + +### **Power User Tricks:** + +- Use `M-x magit-find-file` to quickly open files from Git history +- `SPC g f s` - **Stage current file** without opening Magit +- `SPC g f u` - **Unstage current file** +- `SPC g f d` - **Show file diff** + +### **Staging Granularity:** + +- Stage entire files with `s` in status buffer +- Stage individual hunks by entering diff view (`RET`) then `s` +- Stage individual lines by selecting region in diff then `s` + +### **Commit Best Practices:** + +- Use `c c` for normal commits +- Use `c a` to fix up your last commit +- Use `c f` to create fixup commits for interactive rebase later + +## 🔧 **Troubleshooting** + +### **Common Issues:** + +- **Magit won't open?** Make sure you're in a Git repository +- **Performance slow?** Try `M-x magit-refresh` or restart Emacs +- **Merge conflicts?** Magit highlights conflicts - resolve them and use `m c` + +### **Getting Help:** + +- `?` - **Show help** in any Magit buffer +- `C-h m` - **Show mode help** +- `SPC h d m magit` - **Full Magit documentation** + +## 🚀 **Quick Start Workflow** + +1. **Navigate to your Git repo** in Doom Emacs +2. **Press `SPC g g`** - Opens Magit status +3. **Stage files** with `s`, review diffs with `RET` +4. **Commit** with `c c`, write message, finish with `C-c C-c` +5. **Push** with `P P` + +## 📚 **Essential Keybind Summary** + +| Action | Key | Description | +| ------- | --------- | ------------------ | +| Status | `SPC g g` | Open Magit status | +| Stage | `s` | Stage file/hunk | +| Unstage | `u` | Unstage file/hunk | +| Commit | `c c` | Create commit | +| Push | `P P` | Push to upstream | +| Pull | `F F` | Pull from upstream | +| Branch | `b b` | Switch branch | +| Log | `l l` | Show log | +| Diff | `d d` | Show diff | +| Stash | `z z` | Stash changes | +| Help | `?` | Show context help | + +## 🎉 **Why Magit is Amazing** + +- **Visual**: See your entire repo state at a glance +- **Interactive**: Stage hunks, lines, or files with simple keystrokes +- **Fast**: Navigate Git operations faster than any CLI +- **Powerful**: Access every Git feature through intuitive menus +- **Integrated**: Works seamlessly with Doom Emacs and Evil mode + +**Pro Tip**: Once you learn Magit, you'll never want to use Git from the command +line again! 🚀 diff --git a/cheatsheets/emacs/emacs.markdown.cheatsheet.md b/cheatsheets/emacs/emacs.markdown.cheatsheet.md new file mode 100644 index 0000000..0e91631 --- /dev/null +++ b/cheatsheets/emacs/emacs.markdown.cheatsheet.md @@ -0,0 +1,85 @@ +# Doom Emacs Markdown Cheatsheet + +## 📝 **Getting Started** +- Open any `.md` file - Doom automatically enables `markdown-mode` +- You'll get syntax highlighting, proper indentation, and markdown-specific features + +## ⌨️ **Key Markdown Commands** (with Evil/Vim bindings) + +### **Formatting Text:** +- `SPC m b` - **Bold** text +- `SPC m i` - *Italic* text +- `SPC m c` - `Inline code` +- `SPC m C` - Code block +- `SPC m s` - ~~Strikethrough~~ + +### **Headers:** +- `SPC m h` - Insert header (prompts for level 1-6) +- `SPC m H` - Insert header with underline style + +### **Lists:** +- `SPC m l` - Insert unordered list item +- `SPC m L` - Insert ordered list item + +### **Links & Images:** +- `SPC m l l` - Insert link +- `SPC m l i` - Insert image +- `SPC m l u` - Insert URL + +### **Navigation:** +- `]]` - Next header +- `[[` - Previous header +- `SPC m o` - Open outline/table of contents + +## 👁️ **Live Preview** +- `SPC m p` - Preview in browser +- `SPC m P` - Export to HTML + +## 📊 **Tables** +- `SPC m t` - Table commands +- `SPC m t t` - Insert table +- `TAB` - Navigate between cells +- `S-TAB` - Navigate backward between cells + +## 🎯 **Useful Evil Bindings in Markdown** +- `TAB` - Cycle folding of headers +- `S-TAB` - Cycle folding globally +- `RET` - Follow links +- `M-RET` - Insert new list item + +## 🧪 **Test Examples** + +### Sample Formatting +This is **bold text** and this is *italic text*. + +Here's some `inline code` and a code block: + +```bash +# Code block example +echo "Hello from markdown!" +``` + +### Sample List +- [ ] Checkbox item 1 +- [x] Completed checkbox +- Regular bullet point + +### Sample Table +| Feature | Shortcut | Description | +|---------|----------|-------------| +| Bold | SPC m b | Make text bold | +| Italic | SPC m i | Make text italic | +| Preview | SPC m p | Preview in browser | + +## 🚀 **Pro Tips** +1. Use `SPC m o` to get an outline view for navigation +2. `TAB` on headers to fold/unfold sections +3. `RET` on links to follow them +4. Use `SPC m p` to preview your markdown in a browser +5. Create checklists with `- [ ]` syntax + +## 📚 **Quick Reference** +- All markdown commands start with `SPC m` +- Use `SPC m ?` or `C-h m` to see all available commands +- Navigation between headers: `]]` (next) and `[[` (previous) +- Toggle folding: `TAB` (local) and `S-TAB` (global) diff --git a/cheatsheets/ghostty/ghostty.cheatsheet.md b/cheatsheets/ghostty/ghostty.cheatsheet.md new file mode 100644 index 0000000..f7c069f --- /dev/null +++ b/cheatsheets/ghostty/ghostty.cheatsheet.md @@ -0,0 +1,122 @@ +# Ghostty on ddubsOS — Summary & Cheatsheet + +## 🚀 Summary of modules/home/terminals/ghostty.nix + +- Program + - Ghostty enabled with Nix package: pkgs.ghostty + - Shell integrations: Fish, Zsh, Bash + - clearDefaultKeybinds = true (all bindings are explicitly defined below) + +- Appearance + - Title: ddubsOS-GhosTTY + - TERM: xterm-256color + - Theme: dark: catppuccin-mocha; light: catppuccin-mocha + - Window theme: dark + - Font: Maple Mono NF, size 12 + - Cell height adjustment: +10% + - Background opacity: 1.00 (opaque) + - Background blur radius: 60 + - Cursor style: bar + - Selection colors: bg #2d3f76, fg #c8d3f5 + - Unfocused split opacity: 0.5 + - Quick terminal position: center + +- Window and Behavior + - Default window size: 110x32 (cols x rows) + - Confirm close surface: false + - Wait after command: false + - Shell integration: detect; features: cursor, sudo + - Window save state: always + - GTK single instance: true + - Mouse: hide while typing: true + +- Keybindings (Super/Alt prefix scheme) + - Custom leader-like chord uses Alt+s then key, e.g. alt+s>c + - Standard clipboard and font size with Ctrl+Shift chords + - Tabs, splits, navigation, zoom, equalize defined below + +--- + +## 🗝️ Keybindings Cheatsheet + +Clipboard +- Ctrl+Shift+C — copy_to_clipboard +- Ctrl+Shift+V — paste_from_clipboard + +Font size +- Ctrl+Shift+= (plus) — increase_font_size:1 +- Ctrl+Shift+- (minus) — decrease_font_size:1 +- Ctrl+Shift+0 — reset_font_size + +Session +- Alt+s r — reload_config +- Alt+s x — close_surface +- Alt+s n — new_window + +Tabs +- Alt+s c — new_tab +- Alt+s Shift+L — next_tab +- Alt+s Shift+H — previous_tab +- Alt+s , — move_tab:-1 +- Alt+s . — move_tab:+1 +- Alt+s 1..9 — goto_tab:N + +Splits +- Alt+s \ — new_split:right +- Alt+s - — new_split:down +- Alt+s j — goto_split:bottom +- Alt+s k — goto_split:top +- Alt+s h — goto_split:left +- Alt+s l — goto_split:right +- Alt+s z — toggle_split_zoom +- Alt+s e — equalize_splits + +Notes +- clearDefaultKeybinds = true means only the above are active. +- The Alt+s> notation denotes a two-key chord: hold Alt, press s, then the next key. + +--- + +## ⚙️ Default Options Reference (as configured) + +Terminal and window +- term: xterm-256color +- window-width: 110 +- window-height: 32 +- window-theme: dark +- window-save-state: always +- gtk-single-instance: true +- quick-terminal-position: center + +Appearance +- theme: catppuccin-mocha (dark and light mapped to mocha) +- font-family: Maple Mono NF +- font-size: 12 +- adjust-cell-height: 10% +- background-opacity: 1.00 +- background-blur-radius: 60 +- selection-background: #2d3f76 +- selection-foreground: #c8d3f5 +- cursor-style: bar +- unfocused-split-opacity: 0.5 + +Behavior +- confirm-close-surface: false +- mouse-hide-while-typing: true +- wait-after-command: false +- shell-integration: detect +- shell-integration-features: cursor,sudo + +Integrations +- Fish, Zsh, Bash integrations enabled + +--- + +## 📝 Style/Formatting Notes + +This cheatsheet mirrors your Emacs cheatsheets style: +- Clear section headers with emoji +- Bulleted lists with concise descriptions +- Short “Notes” blocks for special behaviors + +If you’d like, I can link this from a central index or add more Ghostty tips (themes, performance flags, troubleshooting). diff --git a/cheatsheets/hyprland-customization-guide.es.md b/cheatsheets/hyprland-customization-guide.es.md new file mode 100644 index 0000000..4c45e75 --- /dev/null +++ b/cheatsheets/hyprland-customization-guide.es.md @@ -0,0 +1,164 @@ +# Guía de Personalización de Hyprland en ZaneyOS + +Esta guía ofrece una visión práctica para personalizar tu experiencia con Hyprland en ZaneyOS. Veremos los archivos más relevantes, qué hacen y pequeños cambios seguros que puedes aplicar. + +Nota: Estos archivos están escritos en Nix. Un pequeño error de sintaxis puede romper las compilaciones. Realiza un cambio a la vez y mantén tus ediciones bajo control de versiones. + +## Aplicar tus cambios + +Preferido (específico de ZaneyOS): +- `zcli rebuild` + - Nota: el alias `fr` está obsoleto. + +Método manual de respaldo (funciona en cualquier instalación): +- Desde la raíz del repo, reemplaza PROFILE por tu perfil (intel, nvidia, nvidia-laptop, vm): + - `sudo nixos-rebuild switch --flake .#PROFILE` + +--- + +### `binds.nix` — Atajos de teclado + +Controla atajos de teclado y ratón. + +Ubicación: `modules/home/hyprland/binds.nix` + +Formato: `MODIFICADOR, TECLA, DISPATCHER, VALOR` + +Ejemplo: Cambiar la terminal de Super+Return a Super+T + +```nix +# ... + bind = [ + # ... + "$modifier,T,exec, ${terminal}" + # ... + ]; +# ... +``` + +--- + +### `exec-once.nix` — Aplicaciones al iniciar + +Comandos que se ejecutan automáticamente con Hyprland. + +Ubicación: `modules/home/hyprland/exec-once.nix` + +Ejemplo: Añadir copyq al inicio + +```nix +# ... + exec-once = [ + # ... + "pypr &" + "copyq" + ]; +# ... +``` + +--- + +### `decoration.nix` — Bordes, sombras, desenfoque + +Ubicación: `modules/home/hyprland/decoration.nix` + +Ejemplo: Esquinas redondeadas + +```nix +# ... + decoration = { + rounding = 10; + }; +# ... +``` + +--- + +### `env.nix` — Variables de entorno + +Ubicación: `modules/home/hyprland/env.nix` + +Ejemplo: Habilitar Wayland para Firefox + +```nix +# ... + env = [ + "SDL_VIDEODRIVER, wayland" + "MOZ_ENABLE_WAYLAND, 1" + ]; +# ... +``` + +--- + +### `gestures.nix` — Gestos del touchpad + +Ubicación: `modules/home/hyprland/gestures.nix` + +Ejemplo: Desactivar deslizamiento entre espacios + +```nix +# ... + gestures = { + workspace_swipe = 0; + }; +# ... +``` + +--- + +### `misc.nix` — Ajustes varios + +Ubicación: `modules/home/hyprland/misc.nix` + +Ejemplo: Activar Frecuencia de Actualización Variable (VRR) + +```nix +# ... + misc = { + vrr = 1; + }; +# ... +``` + +--- + +### `hyprland.nix` — Configuración principal + +Ubicación: `modules/home/hyprland/hyprland.nix` + +Ejemplo: Distribución del teclado + +```nix +# ... + input = { + kb_layout = "us"; + }; +# ... +``` + +--- + +### `windowrules.nix` — Reglas de ventanas + +Ubicación: `modules/home/hyprland/windowrules.nix` + +Ejemplo: Hacer que Thunar flote siempre + +```nix +# ... + windowrule = [ + "float, class:^(foot-floating)$" + "float, class:^(Thunar)$" + ]; +# ... +``` + +--- + +## Consejos útiles + +- Realiza un cambio a la vez y recompila para validar. +- Mantén una terminal abierta mientras experimentas por si cambias el atajo del lanzador. +- Si algo se rompe, reinicia y elige una generación anterior en el menú de arranque. + diff --git a/cheatsheets/hyprland-customization-guide.md b/cheatsheets/hyprland-customization-guide.md new file mode 100644 index 0000000..a6dc93d --- /dev/null +++ b/cheatsheets/hyprland-customization-guide.md @@ -0,0 +1,163 @@ +# A Guide to Customizing Hyprland in ZaneyOS + +This guide provides a practical overview for customizing your Hyprland experience in ZaneyOS. We’ll cover the most relevant files, what they do, and small, safe edits you can make. + +Note: These files are written in Nix. A small syntax error can break builds. Make one change at a time and keep your edits under version control. + +## Applying your changes + +Preferred (ZaneyOS-specific): +- `zcli rebuild` + - Note: The `fr` alias is deprecated. + +Manual backup method (works anywhere): +- From the repo root, replace PROFILE with your profile (intel, nvidia, nvidia-laptop, vm): + - `sudo nixos-rebuild switch --flake .#PROFILE` + +--- + +### `binds.nix` — Keybindings + +Controls keyboard and mouse shortcuts. + +Location: `modules/home/hyprland/binds.nix` + +Format: `MODIFIER, KEY, DISPATCHER, VALUE` + +Example: Change terminal from Super+Return to Super+T + +```nix +# ... + bind = [ + # ... + "$modifier,T,exec, ${terminal}" + # ... + ]; +# ... +``` + +--- + +### `exec-once.nix` — Startup applications + +Commands that start automatically with Hyprland. + +Location: `modules/home/hyprland/exec-once.nix` + +Example: Add copyq to autostart + +```nix +# ... + exec-once = [ + # ... + "pypr &" + "copyq" + ]; +# ... +``` + +--- + +### `decoration.nix` — Borders, shadows, blur + +Location: `modules/home/hyprland/decoration.nix` + +Example: Rounded corners + +```nix +# ... + decoration = { + rounding = 10; + }; +# ... +``` + +--- + +### `env.nix` — Environment variables + +Location: `modules/home/hyprland/env.nix` + +Example: Enable Wayland for Firefox + +```nix +# ... + env = [ + "SDL_VIDEODRIVER, wayland" + "MOZ_ENABLE_WAYLAND, 1" + ]; +# ... +``` + +--- + +### `gestures.nix` — Touchpad gestures + +Location: `modules/home/hyprland/gestures.nix` + +Example: Disable workspace swipe + +```nix +# ... + gestures = { + workspace_swipe = 0; + }; +# ... +``` + +--- + +### `misc.nix` — Misc settings + +Location: `modules/home/hyprland/misc.nix` + +Example: Enable Variable Refresh Rate + +```nix +# ... + misc = { + vrr = 1; + }; +# ... +``` + +--- + +### `hyprland.nix` — Main configuration + +Location: `modules/home/hyprland/hyprland.nix` + +Example: Keyboard layout + +```nix +# ... + input = { + kb_layout = "us"; + }; +# ... +``` + +--- + +### `windowrules.nix` — Window rules + +Location: `modules/home/hyprland/windowrules.nix` + +Example: Float Thunar always + +```nix +# ... + windowrule = [ + "float, class:^(foot-floating)$" + "float, class:^(Thunar)$" + ]; +# ... +``` + +--- + +## Helpful tips + +- Make one change at a time and rebuild to validate. +- Keep a terminal open during experiments in case your launcher keybind changes. +- If something breaks, reboot and choose a previous generation in the boot menu. diff --git a/cheatsheets/hyprland/hyprland.binds.cheatsheet.md b/cheatsheets/hyprland/hyprland.binds.cheatsheet.md new file mode 100644 index 0000000..c024232 --- /dev/null +++ b/cheatsheets/hyprland/hyprland.binds.cheatsheet.md @@ -0,0 +1,91 @@ +# Hyprland Keybindings — ddubsOS + +## 🗝️ Conventions +- SUPERKEY = Mod key (Hyprland `$modifier`) +- SHIFT, CTRL, ALT used as shown +- Arrows and hjkl are both supported for movement + +--- + +## 🚀 Applications +- SUPERKEY+Return — Launch default terminal (${terminal}) +- SUPERKEY+SHIFT+Return — Launch foot (floating) +- SUPERKEY+ALT+Return — Launch WezTerm +- SUPERKEY+CTRL+Return — Launch Ghostty +- SUPERKEY+W — Launch browser (${browser}) +- SUPERKEY+Y — Kitty running Yazi (file manager) +- SUPERKEY+T — Thunar (also another mapping present: "exec, exec, thunar") +- SUPERKEY+M — Pavucontrol (audio) +- SUPERKEY+G — VS Code +- SUPERKEY+O — OBS Studio +- SUPERKEY+E — Emoji picker (emopicker9000) +- SUPERKEY+V — Clipboard menu (cliphist via rofi) +- SUPERKEY+D — Rofi menu +- SUPERKEY+SHIFT+D — Dock +- SUPERKEY+CTRL+D — Sherlock (alt menu) +- SUPERKEY+SHIFT+W — Web search +- SUPERKEY+ALT+W — Warp terminal (commented alternative: wallsetter) +- SUPERKEY+CTRL+W — Waypaper +- SUPERKEY+N — Note from clipboard +- SUPERKEY+SHIFT+N — SwayNC reset +- SUPERKEY+ALT+D — Discord Canary +- SUPERKEY+C — Hyprpicker (color picker) +- SHIFT+ALT+S — Hyprshot region (non-SUPER shortcut) + +## 🧭 Hyprland UI/Plugins +- SUPERKEY+TAB — Hyprspace Overview toggle (all) +- SUPERKEY+SHIFT+TAB — Hyprspace Overview close (all) +- ALT+Space — Hyprexpo toggle +- SUPERKEY+A — AGS Overview toggle + +## 📸 Screenshots +- SUPERKEY+S — screenshootin +- SUPERKEY+SHIFT+S — screenshootin-satty +- SUPERKEY+ALT+S — hyprpanel toggleWindow settings-dialog + +## 🪟 Window Management +- SUPERKEY+Q — Kill active window +- SUPERKEY+P — Pseudo tile +- SUPERKEY+SHIFT+I — Toggle split +- SUPERKEY+F — Fullscreen +- SUPERKEY+SHIFT+F — Toggle floating +- SUPERKEY+ALT+F — Workspace option: allfloat +- SUPERKEY+SHIFT+C — Exit Hyprland +- SUPERKEY+SPACE — Toggle floating +- SUPERKEY+SHIFT+SPACE — Workspace option: allfloat +- SUPERKEY+SHIFT+M — swap_layout + +### Move Window +- SUPERKEY+SHIFT+Left/Right/Up/Down — Move window L/R/U/D +- SUPERKEY+SHIFT+H/J/K/L — Move window L/D/U/R + +### Swap Window +- SUPERKEY+ALT+Left/Right/Up/Down — Swap window L/R/U/D +- SUPERKEY+ALT+[, . , - , ,] — Swap window L/R/U/D (keycodes 43,46,45,44) + +### Focus Movement +- SUPERKEY+Left/Right/Up/Down — Focus L/R/U/D +- SUPERKEY+H/J/K/L — Focus L/D/U/R + +### Workspace Navigation +- SUPERKEY+1..9,0 — Go to workspace 1..10 +- SUPERKEY+SHIFT+1..9,0 — Move window to workspace 1..10 +- SUPERKEY+CTRL+Right/Left — Next/Previous workspace (relative) +- SUPERKEY+Mouse Wheel Down/Up — Workspace e+1 / e-1 + +### Alt-Tab +- ALT+Tab — Cycle next +- ALT+Tab — Bring active to top (runs twice to ensure raise) + +## 🔊 Media & Brightness +- XF86AudioRaiseVolume — wpctl set-volume +5% +- XF86AudioLowerVolume — wpctl set-volume -5% +- XF86AudioMute — toggle sink mute +- XF86AudioPlay/Pause — playerctl play-pause +- XF86AudioNext/Prev — playerctl next/previous +- XF86MonBrightnessDown/Up — brightnessctl -5% / +5% + +## 🖱️ Mouse Bindings +- SUPERKEY + Left Mouse — Move window +- SUPERKEY + Right Mouse — Resize window + diff --git a/cheatsheets/hyprland/hyprland.windowrules.cheatsheet.md b/cheatsheets/hyprland/hyprland.windowrules.cheatsheet.md new file mode 100644 index 0000000..01667f0 --- /dev/null +++ b/cheatsheets/hyprland/hyprland.windowrules.cheatsheet.md @@ -0,0 +1,59 @@ +# Hyprland Window Rules — ddubsOS + +## 🧩 Tags and Classification +- file-manager — Thunar, Nautilus, PCManFM-Qt +- terminal — Ghostty, WezTerm, Alacritty, Kitty, kitty-dropterm +- browser — Brave, Firefox, Chrome, Thorium/Cachy +- video — VLC, mpv, Clapper +- projects — VSCodium/VSCode +- im — Discord, WebCord, Vesktop, Ferdium, WhatsApp, Telegram, Teams +- obs — OBS Studio +- games — gamescope, steam_app_* +- gamestore — Steam, Lutris, Heroic +- settings — various settings apps (nm-applet, pavucontrol, file-roller, rofi, etc.) + +## 🪟 Floating, Size, and Position +- foot-floating — float, size 60% x 60%, center +- Picture-in-Picture — float, 95%/75% opacity, pinned, keep aspect ratio, position at ~72%/7% +- Authentication Required dialogs — float, center +- Settings-tagged windows — float, size 70% x 70% +- Ferdium — float, center, size 60% x 70% +- Clapper — float +- VSCodium setup dialogs — float (title negative rules) +- Steam/Heroic non-main dialogs — float (title negative rules) +- File chooser dialogs — float; size 70% x 60% (Open Files); float on save prompts + +## 🎨 Visual Effects +- noblur — games +- content none — mpv (prevent black screen on maximize) +- Opacity by tag: + - browser: 1.0 / 1.0 + - video: 1.0 / 1.0 + - projects: 0.9 / 0.8 + - im: 0.94 / 0.86 + - file-manager: 0.9 / 0.8 + - terminal: 1.0 / 0.8 + - settings: 0.8 / 0.7 +- Extra opacity tweaks: + - gedit/GNOME Text Editor/mousepad: 0.8 / 0.7 + - seahorse: 0.9 / 0.8 + +## 🧭 Workspace Assignment +- im* — workspace 3 +- browser* — workspace 2 +- obs* — workspace 10 + +## 🧪 XWayland and Special Cases +- Example targeted xwayland rule: noblur for class “resolve” on xwayland:1 + +## 🌱 Environment (set via Hyprland) +- NIXOS_OZONE_WL=1, NIXPKGS_ALLOW_UNFREE=1 +- XDG_CURRENT_DESKTOP=Hyprland, XDG_SESSION_TYPE=wayland, XDG_SESSION_DESKTOP=Hyprland +- GDK_BACKEND=wayland,x11, CLUTTER_BACKEND=wayland +- QT_QPA_PLATFORM=wayland;xcb, QT_WAYLAND_DISABLE_WINDOWDECORATION=1, QT_AUTO_SCREEN_SCALE_FACTOR=1 +- SDL_VIDEODRIVER=x11 (explicit) +- MOZ_ENABLE_WAYLAND=1 +- AQ_DRM_DEVICES=/dev/dri/card0:/dev/dri/card1 +- GDK_SCALE=1, QT_SCALE_FACTOR=1 +- EDITOR=nvim + diff --git a/cheatsheets/kitty/kitty.cheatsheet.md b/cheatsheets/kitty/kitty.cheatsheet.md new file mode 100644 index 0000000..d7e8c35 --- /dev/null +++ b/cheatsheets/kitty/kitty.cheatsheet.md @@ -0,0 +1,61 @@ +# Kitty on ddubsOS — Summary & Cheatsheet + +## 🚀 Summary of modules/home/terminals/kitty.nix + +- Program + - Kitty enabled with package pkgs.kitty + - Shell integrations: Zsh, Fish, Bash (mode: enabled) + +- Appearance & Behavior + - Font: Maple Mono NF, size 12 + - Scrollback: 10,000 lines; wheel min lines: 1; padding: 4px + - Confirm close: 0 (no confirm); audio bell: disabled; mouse hide wait: 60 + - Cursor trail: 1; tab fade: 1; active/inactive tab font style: bold + - Tab bar: top, powerline style + - Layouts: splits enabled + - URL handling: open with default; detect URLs: true; allow_remote_control: true + +- Theme (Catppuccin Mocha manual config in extraConfig) + - Foreground/background, selection, cursor, borders, tab bar, and 16-color palette explicitly set + +--- + +## 🗝️ Keybindings Cheatsheet (extraConfig) + +Clipboard +- Ctrl+Shift+V — paste_from_selection +- Shift+Insert — paste_from_selection + +Scrollback +- Ctrl+Shift+Up / k — scroll_line_up +- Ctrl+Shift+Down / j — scroll_line_down +- Ctrl+Shift+PageUp — scroll_page_up +- Ctrl+Shift+PageDown — scroll_page_down +- Ctrl+Shift+Home — scroll_home +- Ctrl+Shift+End — scroll_end +- Ctrl+Shift+H — show_scrollback + +Windows/Tabs/Layout +- Alt+N — new_window_with_cwd +- Alt+W — close_window +- Ctrl+Shift+Enter — split horizontal (hsplit) +- Ctrl+Shift+S — split vertical (vsplit) +- Ctrl+Shift+] / [ — next_window / previous_window +- Ctrl+Shift+F — move_window_forward +- Ctrl+Shift+B — move_window_backward +- Ctrl+Shift+` — move_window_to_top +- Ctrl+Shift+1..0 — first..tenth_window +- Ctrl+Shift+Right/Left — next_tab / previous_tab +- Ctrl+Shift+T — new_tab +- Ctrl+Shift+Q — close_tab +- Ctrl+Shift+L — next_layout +- Ctrl+Shift+. / , — move_tab_forward / move_tab_backward + +Font Size +- Ctrl+Shift+Up — increase_font_size +- Ctrl+Shift+Down — decrease_font_size +- Ctrl+Shift+Backspace — restore_font_size + +Notes +- Color scheme is embedded; Stylix support disabled in this config. + diff --git a/cheatsheets/nix-beginner-guide.es.md b/cheatsheets/nix-beginner-guide.es.md new file mode 100644 index 0000000..3ec70b1 --- /dev/null +++ b/cheatsheets/nix-beginner-guide.es.md @@ -0,0 +1,67 @@ +# Guía para Principiantes de ZaneyOS: Personalización Básica + +¡Bienvenido! Esta guía es para quienes son nuevos en Nix y quieren realizar personalizaciones comunes y seguras en su instalación de ZaneyOS. Mantendremos todo simple y al grano. + +## Diseño del repositorio (dónde cambiar las cosas) + +- `flake.nix`: Punto de entrada del sistema. Normalmente no necesitas editarlo para ajustes cotidianos. +- `hosts/`: Configuración por máquina. + - `hosts//` + - `variables.nix`: Tu panel principal (activar/desactivar funciones, establecer opciones). + - `host-packages.nix`: Paquetes extra solo para esta máquina. +- `modules/`: Bloques reutilizables para el sistema y Home Manager. + - `modules/core/global-packages.nix`: Paquetes instalados en todas las máquinas. + - `modules/home/hyprland/binds.nix`: Atajos de Hyprland. + +## Instalar paquetes + +Dos patrones comunes: + +### 1) Solo en esta máquina +Edita `hosts//host-packages.nix` y añade el nombre del paquete: + +```nix +[ + brave + (catppuccin-vsc.override { + variant = "mocha"; + }) + cowsay +] +``` + +### 2) En todas las máquinas +Edita `modules/core/global-packages.nix` y añade el paquete a la lista. + +## Ajustes de monitores (por host) + +Edita `hosts//variables.nix` y define la(s) línea(s) extra del monitor: + +```nix +# Ejemplo: 1080p a 144 Hz en DP-1 +extraMonitorSettings = "monitor=DP-1,1920x1080@144"; +``` + +## Cambiar atajos de Hyprland + +Edita `modules/home/hyprland/binds.nix`. Por ejemplo, cambiar la terminal de Super+Return a Super+T: + +```nix +"SUPER, T, exec, ${terminal}" +``` + +## Aplicar y probar tus cambios + +Preferido (específico de ZaneyOS): +- `zcli rebuild` + - Nota: el alias `fr` está obsoleto. + +Método manual de respaldo (funciona en cualquier instalación): +- Desde la raíz del repo, reemplaza PROFILE por tu perfil (intel, nvidia, nvidia-laptop, vm): + - `sudo nixos-rebuild switch --flake .#PROFILE` + +Consejos +- Si un rebuild falla, lee el error cerca del final: suele apuntar al archivo/línea exacta. +- Si un cambio rompe tu sesión tras reiniciar, elige una “generación” anterior en el menú de arranque. +- Usa Git para versionar tus cambios y poder revertir fácilmente. + diff --git a/cheatsheets/nix-beginner-guide.md b/cheatsheets/nix-beginner-guide.md new file mode 100644 index 0000000..cc88d20 --- /dev/null +++ b/cheatsheets/nix-beginner-guide.md @@ -0,0 +1,66 @@ +# ZaneyOS Beginner’s Guide to Customization + +Welcome! This guide is for users who are new to Nix and want to make common, safe customizations to their ZaneyOS setup. We’ll keep it simple and focus on essentials. + +## Repository layout (where to change things) + +- `flake.nix`: Entry point for the whole system. You generally don’t need to edit this for day‑to‑day tweaks. +- `hosts/`: Per‑machine configuration. + - `hosts//` + - `variables.nix`: Your main control panel (enable/disable features, set options). + - `host-packages.nix`: Extra packages only for this one machine. +- `modules/`: Reusable building blocks for the system and Home Manager. + - `modules/core/global-packages.nix`: Packages installed on all machines. + - `modules/home/hyprland/binds.nix`: Hyprland keybindings. + +## Installing packages + +Two common patterns: + +### 1) Only on this machine +Edit `hosts//host-packages.nix` and add the package name: + +```nix +[ + brave + (catppuccin-vsc.override { + variant = "mocha"; + }) + cowsay +] +``` + +### 2) On all machines +Edit `modules/core/global-packages.nix` and add the package to the list. + +## Monitor settings (per host) + +Edit `hosts//variables.nix` and set the extra monitor line(s): + +```nix +# Example: 1080p at 144 Hz on DP-1 +extraMonitorSettings = "monitor=DP-1,1920x1080@144"; +``` + +## Change Hyprland keybindings + +Edit `modules/home/hyprland/binds.nix`. For example, change terminal from Super+Return to Super+T: + +```nix +"SUPER, T, exec, ${terminal}" +``` + +## Apply and test your changes + +Preferred (ZaneyOS-specific): +- `zcli rebuild` + - Note: The `fr` alias is deprecated. + +Manual backup method (works anywhere): +- From the repo root, replace PROFILE with your profile (intel, nvidia, nvidia-laptop, vm): + - `sudo nixos-rebuild switch --flake .#PROFILE` + +Tips +- If a rebuild fails, read the error near the bottom of the output—it usually points to the exact file/line. +- If a change breaks your session after a reboot, pick an older “generation” from the boot menu to roll back. +- Use Git to track your edits so you can revert easily. diff --git a/cheatsheets/project-guide.md b/cheatsheets/project-guide.md new file mode 100644 index 0000000..b7b17a2 --- /dev/null +++ b/cheatsheets/project-guide.md @@ -0,0 +1,93 @@ +# Project Guide — ZaneyOS + +Scope +- A reproducible NixOS flake tailored for desktop systems with per-host overrides, GPU/VM profiles, and an integrated Home Manager layer (Hyprland, Waybar, shells, scripts). +- Repo location is expected at ~/zaneyos. If you place it elsewhere, update modules/core/nh.nix (programs.nh.flake) to the new path. + +Quick commands +- Build and switch (preferred: nh/zcli) + - fr → nh os switch --hostname # alias provided by zsh/bash modules + - fu → nh os switch --hostname --update + - zcli rebuild + - zcli update +- Build for next boot (safer for larger changes) + - zcli rebuild-boot + - or: sudo nixos-rebuild boot --flake .# +- Direct NixOS (if you prefer without nh/zcli) + - sudo nixos-rebuild switch --flake .# +- Validate the flake + - nix flake check +- Format Nix files (nixfmt-rfc-style is included) + - find . -name "*.nix" -print0 | xargs -0 nixfmt +- Host management + - zcli update-host [hostname] [profile] # edits flake.nix host/profile + - zcli add-host [profile] # copies hosts/default and guides hardware.nix +- Diagnostics and maintenance + - zcli diag # writes ~/diag.txt + - zcli cleanup # prunes older generations (prompts for retention) + +zcli advanced options (for rebuild/update) +- --dry (-n) preview only +- --ask (-a) confirm before proceeding +- --cores N cap build CPU usage +- --verbose (-v) more logs +- --no-nom disable nix-output-monitor + +Profiles and when to use them +- amd, intel, nvidia, nvidia-laptop (hybrid), vm +- Choose with the argument in nh/nixos-rebuild commands (e.g., .#vm) + +High-level architecture +- flake.nix + - Inputs: nixpkgs 25.05, home-manager 25.05, stylix, nvf, nix-flatpak + - Local constants: system, host, profile, username + - nixosConfigurations: one per GPU/VM profile via mkNixosConfig + - Each configuration imports profiles/ +- profiles//default.nix + - Imports the active host and the system module stacks: + - ../../hosts/${host} + - ../../modules/drivers + - ../../modules/core + - Flips toggles: drivers.*.enable and vm.guest-services.enable + - Hybrid laptops: profiles/nvidia-laptop pulls intel/nvidia Bus IDs from the host’s variables.nix and wires nvidia-prime +- hosts// + - default.nix imports hardware.nix and host-packages.nix + - variables.nix is the control panel for UX + feature toggles: + - displayManager (greetd vs sddm) + - terminal/browser defaults (enable per-terminal via flags) + - waybarChoice, animChoice, stylixImage + - 24h clock, thunarEnable, printEnable, NFS + - intelID/nvidiaID for Prime offload +- modules/core + - default.nix composes focused NixOS modules: boot, flatpak, fonts, hardware, network, nfs, nh, packages, printing, display manager (conditional greetd/sddm), security, services (PipeWire, SSH, Bluetooth, fstrim; smartd conditional on profile), steam, stylix, syncthing, system (nix settings, locales, env vars), thunar, user (Home Manager), virtualisation, xserver + - user.nix integrates Home Manager and creates users.${username}; passes extraSpecialArgs { inputs, username, host, profile } to the home layer + - nh.nix enables nh, configures GC, and pins programs.nh.flake = /home/${username}/zaneyos +- modules/drivers + - Aggregates AMD, Intel, NVIDIA, NVIDIA Prime, and VM guest services + - nvidia-prime-drivers.nix exposes options.drivers.nvidia-prime.{enable,intelBusID,nvidiaBusID} consumed by the nvidia-laptop profile + - vm-guest-services.nix enables qemu-guest, spice agents when vm.guest-services.enable = true +- modules/home + - default.nix composes the user environment (Hyprland, Waybar via waybarChoice, Rofi, Yazi, Kitty/WezTerm/Ghostty/Alacritty toggles, Zsh/Bash config, Git, NVF/Neovim, OBS, swaync, scripts, Stylix, optional Doom Emacs/VSCodium/Helix) + - scripts/default.nix installs user-space tools including zcli; zcli wraps rebuild/update/boot builds, cleanup, diagnostics, host management, and Doom Emacs lifecycle + +Where to change what +- flake.nix: set username, host, profile; add inputs; wire outputs +- hosts//{variables.nix,hardware.nix,host-packages.nix}: per-machine behavior, theming, and hardware +- modules/core/*: system-level settings, services, packages +- modules/home/*: user apps, shell, window manager, UI + +Common workflows +- Small UX tweaks: edit hosts//variables.nix → fr +- Theme swap: edit stylixImage/waybarChoice in variables.nix → fr (or zcli rebuild-boot) +- GPU/VM switch: choose nixos-rebuild/nh profile (e.g., nh os switch --hostname vm) and optionally update host/profile constants with zcli update-host + +Validation and troubleshooting +- nix flake check for a quick sanity test +- zcli diag to produce a detailed hardware/system report +- If the repo is not under ~/zaneyos, update modules/core/nh.nix so zcli/nh operate on the correct path + +Documentation pointers +- README.md: requirements, first-time install methods, upgrade overview +- zcli.md: full CLI documentation, commands, options, and examples +- cheatsheets/: quick-reference guides for Hyprland, terminals, editors, etc. + diff --git a/cheatsheets/tmux/tmux.cheatsheet.md b/cheatsheets/tmux/tmux.cheatsheet.md new file mode 100644 index 0000000..4c73daa --- /dev/null +++ b/cheatsheets/tmux/tmux.cheatsheet.md @@ -0,0 +1,88 @@ +# Tmux on ddubsOS — Summary & Cheatsheet + +## 🚀 Summary of modules/home/terminals/tmux.nix + +### ⌨️ What is the Tmux Prefix? +- The prefix is a special key you press before most tmux commands, so tmux can tell them apart from regular typing. +- Notation guide used below: + - C-x = hold Control and press x (e.g., C-a means Control+a) + - M-x = hold Alt/Meta and press x (sometimes shown as Alt+x) + - S-x = hold Shift and press x (often implicit for uppercase letters) +- Tmux default prefix is C-b (Control+b). In this config it’s changed to C-a (Control+a), which mirrors the historical GNU Screen workflow many users prefer. + +Quick examples (with prefix = C-a): +- New window: press C-a then c +- Next window: press C-a then n +- Split horizontally: press C-a then | +- Split vertically: press C-a then - +- Resize left: press C-a then C-h (hold Control and press h) + +- Program + - tmux enabled; prefix: C-a; key mode: vi; baseIndex: 1; pane-base-index: 1 + - baseIndex: window numbering starts at 1 instead of 0 + - pane-base-index: pane numbering inside a window starts at 1 instead of 0 + - Terminal overrides RGB; terminal set to "kitty"; shell: zsh + - Mouse: enabled; 12-hour clock; history-limit: 5000; renumber-windows: on + +- Status/UX + - Status bar at top; passthrough: on; confirmations reduced (kill-pane without prompt) + +- Plugins + - vim-tmux-navigator, sensible, catppuccin + +--- + +## 🗝️ Keybindings Cheatsheet + +Navigation +- Prefix h/j/k/l — select-pane Left/Down/Up/Right +- Prefix o — select next pane +- C-Tab — next-window +- C-S-Tab — previous-window +- M-Tab — new-window + +Splits +- Prefix | — split-window -h (cwd) +- Prefix \ — split-window -fh (cwd) +- Prefix - — split-window -v (cwd) +- Prefix _ — split-window -fv (cwd) + +Resize +- Prefix C-h/C-j/C-k/C-l — resize-pane 15 cols/rows in direction +- Prefix m — toggle zoom (resize-pane -Z) + +Windows +- Prefix c — new-window +- Prefix n — next-window +- Prefix p — previous-window (note: config binds 'n' twice; intended p for previous) +- Prefix t — clock-mode +- Prefix q — display-panes +- Prefix u — refresh-client + +Session/Reload +- Prefix r — source-file ~/.config/tmux/tmux.conf +- Prefix x — kill-pane (no prompt) + +Popups (display-popup) +- Prefix C-y — lazygit (80%x80% at cwd) +- Prefix C-n — prompt for session name; create and switch +- Prefix C-j — switch session via fzf +- Prefix C-r — yazi (90%x90% at cwd) +- Prefix C-z — nvim ~/ddubsos/flake.nix (90%x90%) +- Prefix C-t — zsh (75%x75% at cwd) + +Menu (display-menu) +- Prefix d — Dotfiles menu with quick-open entries: + - f: flake.nix (ddubsOS) + - c: core packages (ddubsOS) + - g: global packages (ddubsOS) + - k: keybinds (Hyprland) + - w: window rules (Hyprland) + - z: ZaneyOS flake.nix + - p: ZaneyOS packages + - q: Exit + +Notes +- Pane/Window indices start at 1. +- Terminal passthrough and RGB enabled for truecolor. + diff --git a/cheatsheets/wezterm/wezterm.cheatsheet.md b/cheatsheets/wezterm/wezterm.cheatsheet.md new file mode 100644 index 0000000..9a8b9dd --- /dev/null +++ b/cheatsheets/wezterm/wezterm.cheatsheet.md @@ -0,0 +1,41 @@ +# WezTerm on ddubsOS — Summary & Cheatsheet + +## 🚀 Summary of modules/home/terminals/wezterm.nix + +- Program + - WezTerm enabled with package pkgs.wezterm + - Lua config provided at ~/.config/wezterm/wezterm.lua + +- Appearance & Behavior + - Hide tab bar if only one tab + - Font fallback chain: Maple Mono NF (thin), Fira Code, JetBrains Mono, Hack + - Font: FiraCode Regular (window frame: JetBrainsMono Nerd Font Mono); size: 12 + - Color scheme: Catppuccin Mocha; custom tab bar colors + - Window background opacity: 0.75; padding: 10 on all sides + - Fancy tab bar enabled; custom window_frame font + - Cursor: BlinkingUnderline, blink rate 500 + - Term: xterm-256color + - Performance: max_fps 120; animation_fps 30 + - Wayland: enable_wayland = true + - Missing glyph warnings: disabled + +--- + +## 🗝️ Keybindings Cheatsheet + +Tabs +- Alt+t — Spawn tab (CurrentPaneDomain) +- Alt+w — Close current tab (no confirm) +- Alt+n — Next tab +- Alt+p — Previous tab + +Panes +- Alt+v — Split vertical +- Alt+h — Split horizontal +- Alt+q — Close current pane (no confirm) +- Alt+Arrow keys — Activate pane in arrow direction + +Notes +- Lua contains optional NVIDIA-related tuning commented out. +- default_prog can be enabled if Starship prompt has startup issues. + diff --git a/cheatsheets/yazi/yazi.keymap.cheatsheet.md b/cheatsheets/yazi/yazi.keymap.cheatsheet.md new file mode 100644 index 0000000..e4c636f --- /dev/null +++ b/cheatsheets/yazi/yazi.keymap.cheatsheet.md @@ -0,0 +1,110 @@ +# Yazi Keymap — ddubsOS (Human-friendly) + +## 🧭 Navigation +- k / Up — Move up +- j / Down — Move down +- Ctrl+u / Shift+PageUp — Half page up +- Ctrl+d / Shift+PageDown — Half page down +- Ctrl+b / PageUp — Page up +- Ctrl+f / PageDown — Page down +- g g — Go to top +- G — Go to bottom +- h / Left — Go to parent directory +- l / Right — Enter child directory +- H — Back (previous directory) +- L — Forward (next directory) + +## 🧰 Selection & Visual Mode +- Space — Toggle current, then move down +- Ctrl+a — Select all +- Ctrl+r — Invert selection +- v — Enter visual (select) mode +- V — Visual unset mode + +## 🔎 Search & Filter +- s — Search by name (fd) +- S — Search by content (ripgrep) +- Ctrl+s — Cancel search +- f — Filter files (smart) +- / — Find next (smart) +- ? — Find previous (smart) +- n — Next found +- N — Previous found + +## 📂 Open & Preview +- o / Enter — Open +- O / Shift+Enter — Open interactively +- Tab — Spot hovered file +- K / J — Seek up/down in preview (±5) + +## 📋 Clipboard (Yank/Copy/Move) +- y — Yank (copy) +- x — Yank cut (move) +- p — Paste +- P — Paste (overwrite) +- - — Symlink absolute path of yanked +- _ — Symlink relative path of yanked +- Ctrl+- — Hardlink yanked +- Y / X — Unyank (cancel yank) + +## 🗑️ Delete +- d — Trash selected +- D — Delete permanently + +## ✏️ Create & Rename +- a — Create file/dir (use trailing / for folders) +- r — Rename (cursor before extension) + +## 🖥️ Shell +- ; — Run shell command (interactive) +- : — Run shell command (block until done) + +## 👀 Hidden Files +- . — Toggle hidden + +## 🧭 Quick Jumps +- g h — Go to $HOME +- g c — Go to ~/.config +- g d — Go to ~/Downloads +- g Space — Jump interactively +- z — Zoxide jump +- Z — FZF jump (file/dir) + +## 🧾 Linemode (Metadata View) +- m s — Size +- m p — Permissions +- m b — Birth time +- m m — Modified time +- m o — Owner +- m n — None + +## 🔤 Sorting +- , m / , M — Sort by mtime (asc/desc) +- , b / , B — Sort by btime (asc/desc) +- , e / , E — Sort by extension (asc/desc) +- , a / , A — Sort alphabetically (asc/desc) +- , n / , N — Sort naturally (asc/desc) +- , s / , S — Sort by size (asc/desc) +- , r — Sort randomly + +## 🗂️ Tabs +- t — New tab (current dir) +- 1..9 — Switch to tab 1..9 +- [ / ] — Previous / Next tab +- { / } — Swap tab left / right + +## 🧮 Tasks & Help +- w — Show tasks (task manager) +- ~ / F1 — Open help + +## 🧩 Plugins (Prepend) +- g i — LazyGit (plugin) +- l — Smart enter (dir enter or open file) + +## 🧰 Spot, Pick, Input, Confirm, Completion (Modes) +- Spot mode: Esc/C-[/Ctrl+c/Tab to close; k/j/Up/Down navigate; h/l or Left/Right to swipe; c c copy cell; ~ / F1 for help +- Pick mode: Esc/C-[/Ctrl+c to cancel; Enter to submit; k/j/Up/Down navigate; ~ / F1 help +- Input mode: Esc/C-[ to escape; i/I/a/A enter insert/append (with BOL/EOL moves); visual selections (v, V, Ctrl-A/E); movement (h/l/Left/Right/C-b/C-f/b/B/w/W/e/E/Alt-b/Alt-f); delete/backspace/kill words; cut/copy/paste (d/D/c/C/x/y/p/P); undo/redo (u/C-r); ~ / F1 help +- Confirm mode: Esc/C-[/Ctrl+c/n to cancel; Enter/y to submit; k/j/Up/Down navigate; ~ / F1 help +- Completion mode: Ctrl+c cancel; Tab submit; Enter submit completion + input; Alt-k/j or Up/Down/C-p/C-n navigate; ~ / F1 help + diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..7c7ce3f --- /dev/null +++ b/flake.lock @@ -0,0 +1,474 @@ +{ + "nodes": { + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, + "locked": { + "lastModified": 1746562888, + "narHash": "sha256-YgNJQyB5dQiwavdDFBMNKk1wyS77AtdgDk/VtU6wEaI=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "806a1777a5db2a1ef9d5d6f493ef2381047f2b89", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "base16-fish": { + "flake": false, + "locked": { + "lastModified": 1622559957, + "narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=", + "owner": "tomyun", + "repo": "base16-fish", + "rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe", + "type": "github" + }, + "original": { + "owner": "tomyun", + "repo": "base16-fish", + "type": "github" + } + }, + "base16-helix": { + "flake": false, + "locked": { + "lastModified": 1748408240, + "narHash": "sha256-9M2b1rMyMzJK0eusea0x3lyh3mu5nMeEDSc4RZkGm+g=", + "owner": "tinted-theming", + "repo": "base16-helix", + "rev": "6c711ab1a9db6f51e2f6887cc3345530b33e152e", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-helix", + "type": "github" + } + }, + "base16-vim": { + "flake": false, + "locked": { + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", + "type": "github" + } + }, + "firefox-gnome-theme": { + "flake": false, + "locked": { + "lastModified": 1748383148, + "narHash": "sha256-pGvD/RGuuPf/4oogsfeRaeMm6ipUIznI2QSILKjKzeA=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "4eb2714fbed2b80e234312611a947d6cb7d70caf", + "type": "github" + }, + "original": { + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1751685974, + "narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=", + "ref": "refs/heads/main", + "rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1", + "revCount": 92, + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + }, + "original": { + "type": "git", + "url": "https://git.lix.systems/lix-project/flake-compat.git" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "nvf", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1754487366, + "narHash": "sha256-pHYj8gUBapuUzKV/kN/tR3Zvqc7o6gdFB9XKXIp1SQ8=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "af66ad14b28a127c5c0f3bbb298218fc63528a18", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "fromYaml": { + "flake": false, + "locked": { + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "fromYaml", + "type": "github" + } + }, + "gnome-shell": { + "flake": false, + "locked": { + "lastModified": 1748186689, + "narHash": "sha256-UaD7Y9f8iuLBMGHXeJlRu6U1Ggw5B9JnkFs3enZlap0=", + "owner": "GNOME", + "repo": "gnome-shell", + "rev": "8c88f917db0f1f0d80fa55206c863d3746fa18d0", + "type": "github" + }, + "original": { + "owner": "GNOME", + "ref": "48.2", + "repo": "gnome-shell", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1757784838, + "narHash": "sha256-6aHo1++bAFdW1z+0tfuxM9EmxHvon90mHo8/+izXMcY=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "6e28513cf2ee9a985c339fcef24d44f43d23456b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "home-manager", + "type": "github" + } + }, + "mnw": { + "locked": { + "lastModified": 1748710831, + "narHash": "sha256-eZu2yH3Y2eA9DD3naKWy/sTxYS5rPK2hO7vj8tvUCSU=", + "owner": "Gerg-L", + "repo": "mnw", + "rev": "cff958a4e050f8d917a6ff3a5624bc4681c6187d", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "mnw", + "type": "github" + } + }, + "nix-flatpak": { + "locked": { + "lastModified": 1739444422, + "narHash": "sha256-iAVVHi7X3kWORftY+LVbRiStRnQEob2TULWyjMS6dWg=", + "owner": "gmodena", + "repo": "nix-flatpak", + "rev": "5e54c3ca05a7c7d968ae1ddeabe01d2a9bc1e177", + "type": "github" + }, + "original": { + "owner": "gmodena", + "ref": "latest", + "repo": "nix-flatpak", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1757487488, + "narHash": "sha256-zwE/e7CuPJUWKdvvTCB7iunV4E/+G0lKfv4kk/5Izdg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ab0f3607a6c7486ea22229b92ed2d355f1482ee0", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nur": { + "inputs": { + "flake-parts": [ + "stylix", + "flake-parts" + ], + "nixpkgs": [ + "stylix", + "nixpkgs" + ], + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1751320053, + "narHash": "sha256-3m6RMw0FbbaUUa01PNaMLoO7D99aBClmY5ed9V3vz+0=", + "owner": "nix-community", + "repo": "NUR", + "rev": "cbde1735782f9c2bb2c63d5e05fba171a14a4670", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, + "nvf": { + "inputs": { + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "mnw": "mnw", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1755463179, + "narHash": "sha256-5Ggb1Mhf7ZlRgGi2puCa2PvWs6KbMnWBlW6KW7Vf79Y=", + "owner": "notashelf", + "repo": "nvf", + "rev": "03833118267ad32226b014b360692bdce9d6e082", + "type": "github" + }, + "original": { + "owner": "notashelf", + "repo": "nvf", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "nix-flatpak": "nix-flatpak", + "nixpkgs": "nixpkgs", + "nvf": "nvf", + "stylix": "stylix" + } + }, + "stylix": { + "inputs": { + "base16": "base16", + "base16-fish": "base16-fish", + "base16-helix": "base16-helix", + "base16-vim": "base16-vim", + "firefox-gnome-theme": "firefox-gnome-theme", + "flake-parts": "flake-parts_2", + "gnome-shell": "gnome-shell", + "nixpkgs": [ + "nixpkgs" + ], + "nur": "nur", + "systems": "systems_2", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" + }, + "locked": { + "lastModified": 1757360005, + "narHash": "sha256-VwzdFEQCpYMU9mc7BSQGQe5wA1MuTYPJnRc9TQCTMcM=", + "owner": "danth", + "repo": "stylix", + "rev": "834a743c11d66ea18e8c54872fbcc72ce48bc57f", + "type": "github" + }, + "original": { + "owner": "danth", + "repo": "stylix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "tinted-foot": { + "flake": false, + "locked": { + "lastModified": 1726913040, + "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + } + }, + "tinted-kitty": { + "flake": false, + "locked": { + "lastModified": 1735730497, + "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=", + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-kitty", + "type": "github" + } + }, + "tinted-schemes": { + "flake": false, + "locked": { + "lastModified": 1750770351, + "narHash": "sha256-LI+BnRoFNRa2ffbe3dcuIRYAUcGklBx0+EcFxlHj0SY=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "5a775c6ffd6e6125947b393872cde95867d85a2a", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1751159871, + "narHash": "sha256-UOHBN1fgHIEzvPmdNMHaDvdRMgLmEJh2hNmDrp3d3LE=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "bded5e24407cec9d01bd47a317d15b9223a1546c", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-tmux", + "type": "github" + } + }, + "tinted-zed": { + "flake": false, + "locked": { + "lastModified": 1751158968, + "narHash": "sha256-ksOyv7D3SRRtebpXxgpG4TK8gZSKFc4TIZpR+C98jX8=", + "owner": "tinted-theming", + "repo": "base16-zed", + "rev": "86a470d94204f7652b906ab0d378e4231a5b3384", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-zed", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "stylix", + "nur", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1733222881, + "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "49717b5af6f80172275d47a418c9719a31a78b53", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..a4d61fe --- /dev/null +++ b/flake.nix @@ -0,0 +1,67 @@ +{ + description = "GarandOS"; + + inputs = { + home-manager = { + url = "github:nix-community/home-manager/master"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + nvf = { + url = "github:notashelf/nvf"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + stylix = { + url = "github:danth/stylix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + nix-flatpak.url = "github:gmodena/nix-flatpak?ref=latest"; + + # Hypersysinfo (Optional) + #hyprsysteminfo.url = "github:hyprwm/hyprsysteminfo"; + + # QuickShell (optional add quickshell to outputs to enable) + #quickshell = { + # url = "git+https://git.outfoxxed.me/outfoxxed/quickshell"; + # inputs.nixpkgs.follows = "nixpkgs"; + #}; + }; + + outputs = + { + nixpkgs, + home-manager, + nix-flatpak, + ... + }@inputs: + let + system = "x86_64-linux"; + host = "Garand-Desktop"; + profile = "nvidia"; + username = "garand_plg"; + + # Deduplicate nixosConfigurations while preserving the top-level 'profile' + mkNixosConfig = gpuProfile: nixpkgs.lib.nixosSystem { + inherit system; + specialArgs = { + inherit inputs; + inherit username; + inherit host; + inherit profile; # keep using the let-bound profile for modules/scripts + }; + modules = [ + ./profiles/${gpuProfile} + nix-flatpak.nixosModules.nix-flatpak + ]; + }; + in + { + nixosConfigurations = { + amd = mkNixosConfig "amd"; + nvidia = mkNixosConfig "nvidia"; + nvidia-laptop = mkNixosConfig "nvidia-laptop"; + intel = mkNixosConfig "intel"; + vm = mkNixosConfig "vm"; + }; + }; +} diff --git a/hosts/Garand-Desktop/default.nix b/hosts/Garand-Desktop/default.nix new file mode 100644 index 0000000..1ef7d77 --- /dev/null +++ b/hosts/Garand-Desktop/default.nix @@ -0,0 +1,6 @@ +{ ... }: { + imports = [ + ./hardware.nix + ./host-packages.nix + ]; +} diff --git a/hosts/Garand-Desktop/hardware.nix b/hosts/Garand-Desktop/hardware.nix new file mode 100644 index 0000000..e6878f9 --- /dev/null +++ b/hosts/Garand-Desktop/hardware.nix @@ -0,0 +1,49 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ "dm-snapshot" ]; + boot.initrd.luks.devices = { + cryptroot = { + device = "/dev/disk/by-uuid/7c018698-d35c-4ee6-92a8-5e4edf914065"; + preLVM = true; + }; + }; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/e3ac1df3-ce8f-44cd-901f-a8cd3f6955b7"; + fsType = "ext4"; + }; + + fileSystems."/home" = + { device = "/dev/disk/by-uuid/0713b82c-bf8c-424f-96e1-5d883e50b451"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/783D-A507"; + fsType = "vfat"; + options = [ "fmask=0022" "dmask=0022" ]; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp5s0.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/Garand-Desktop/host-packages.nix b/hosts/Garand-Desktop/host-packages.nix new file mode 100644 index 0000000..f44b200 --- /dev/null +++ b/hosts/Garand-Desktop/host-packages.nix @@ -0,0 +1,7 @@ +{pkgs, ...}: { + environment.systemPackages = with pkgs; [ + audacity + discord + nodejs + ]; +} diff --git a/hosts/Garand-Desktop/variables.nix b/hosts/Garand-Desktop/variables.nix new file mode 100644 index 0000000..a4b9aa9 --- /dev/null +++ b/hosts/Garand-Desktop/variables.nix @@ -0,0 +1,109 @@ +{ + # Git Configuration ( For Pulling Software Repos ) + gitUsername = "GarandPLG"; + gitEmail = "garandplg@garandplg.com"; + + # Set Displau Manager + # `tui` for Text login + # `sddm` for graphical GUI (default) + # SDDM background is set with stylixImage + displayManager = "tui"; + + # Emable/disable bundled applications + tmuxEnable = false; + alacrittyEnable = false; + weztermEnable = false; + ghosttyEnable = false; + vscodeEnable = true; + # Note: This is evil-helix with VIM keybindings by default + helixEnable = false; + #To install: Enable here, zcli rebuild, then run zcli doom install + doomEmacsEnable = false; + + # Hyprland Settings + # Examples: + # extraMonitorSettings = "monitor = Virtual-1,1920x1080@60,auto,1"; + # extraMonitorSettings = "monitor = HDMI-A-1,1920x1080@60,auto,1"; + # You can configure multiple monitors. + # Inside the quotes, create a new line for each monitor. + extraMonitorSettings = "monitor = DP-1,1920x1080@144,auto,1"; + + # Waybar Settings + clock24h = true; + + # Program Options + # Set Default Browser (google-chrome-stable for google-chrome) + # This does NOT install your browser + # You need to install it by adding it to the `packages.nix` + # or as a flatpak + browser = "librewolf"; + + # Available Options: + # Kitty, ghostty, wezterm, aalacrity + # Note: kitty, wezterm, alacritty have to be enabled in `variables.nix` + # Setting it here does not enable it. Kitty is installed by default + terminal = "kitty"; # Set Default System Terminal + + keyboardLayout = "pl"; + consoleKeyMap = "pl"; + + # For Nvidia Prime support + intelID = "PCI:1:0:0"; + nvidiaID = "PCI:0:2:0"; + + # Enable NFS + enableNFS = true; + + # Enable Printing Support + printEnable = true; + + # Enable Thunar GUI File Manager + # Yazi is default File Manager + thunarEnable = true; + + # Themes, waybar and animation. + # Only uncomment your selection + # The others much be commented out. + + # Set Stylix Image + # This will set your color palette + # Default background + # Add new images to ~/zaneyos/wallpapers + stylixImage = ../../wallpapers/attack-on-titan-mikasa-ackerman.jpg; + #stylixImage = ../../wallpapers/mountainscapedark.jpg; + #stylixImage = ../../wallpapers/AnimeGirlNightSky.jpg; + #stylixImage = ../../wallpapers/Anime-Purple-eyes.png; + #stylixImage = ../../wallpapers/Rainnight.jpg; + #stylixImage = ../../wallpapers/zaney-wallpaper.jpg; + #stylixImage = ../../wallpapers/nix-wallpapers-strips-logo.jpg; + #stylixImage = ../../wallpapers/beautifulmountainscape.jpg; + + # Set Waybar + # Available Options: + waybarChoice = ../../modules/home/waybar/waybar-curved.nix; + #waybarChoice = ../../modules/home/waybar/waybar-ddubs.nix; + #waybarChoice = ../../modules/home/waybar/waybar-ddubs-2.nix; + #waybarChoice = ../../modules/home/waybar/waybar-simple.nix; + # Throwback to ZaneyOS v1.0 + #waybarChoice = ../../modules/home/waybar/waybar-jerry.nix; + # Very colorful and bright colors + #waybarChoice = ../../modules/home/waybar/waybar-nekodyke.nix; + # DWM styled waybars from Matt at TheLinuxCast + #waybarChoice = ../../modules/home/waybar/waybar-dwm.nix; + #waybarChoice = ../../modules/home/waybar/waybar-dwm-2.nix; + + # Set Animation style + # Available options are: + # animations-def.nix (default) + # animations-end4.nix (end-4 project very fluid) + # animations-dynamic.nix (ml4w project) + # animations-moving.nix (ml4w project) + animChoice = ../../modules/home/hyprland/animations-def.nix; + #animChoice = ../../modules/home/hyprland/animations-end4.nix; + #animChoice = ../../modules/home/hyprland/animations-dynamic.nix; + #animChoice = ../../modules/home/hyprland/animations-moving.nix; + + # Set network hostId if required (needed for zfs) + # Otherwise leave as-is + hostId = "5ab03f50"; +} diff --git a/hosts/default/default.nix b/hosts/default/default.nix new file mode 100644 index 0000000..1ef7d77 --- /dev/null +++ b/hosts/default/default.nix @@ -0,0 +1,6 @@ +{ ... }: { + imports = [ + ./hardware.nix + ./host-packages.nix + ]; +} diff --git a/hosts/default/hardware.nix b/hosts/default/hardware.nix new file mode 100644 index 0000000..a662432 --- /dev/null +++ b/hosts/default/hardware.nix @@ -0,0 +1,45 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { + device = "/dev/disk/by-uuid/dd005850-6230-40c4-9d70-8c8cf443658d"; + fsType = "ext4"; + }; + + boot.initrd.luks.devices."luks-b7565781-148e-4c94-9c76-36c84dd93dc8".device = "/dev/disk/by-uuid/b7565781-148e-4c94-9c76-36c84dd93dc8"; + + fileSystems."/boot" = + { + device = "/dev/disk/by-uuid/C2A6-DF56"; + fsType = "vfat"; + options = [ "fmask=0077" "dmask=0077" ]; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.docker0.useDHCP = lib.mkDefault true; + # networking.interfaces.eno2.useDHCP = lib.mkDefault true; + # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/hosts/default/host-packages.nix b/hosts/default/host-packages.nix new file mode 100644 index 0000000..f44b200 --- /dev/null +++ b/hosts/default/host-packages.nix @@ -0,0 +1,7 @@ +{pkgs, ...}: { + environment.systemPackages = with pkgs; [ + audacity + discord + nodejs + ]; +} diff --git a/hosts/default/variables.nix b/hosts/default/variables.nix new file mode 100644 index 0000000..05993d4 --- /dev/null +++ b/hosts/default/variables.nix @@ -0,0 +1,110 @@ +{ + # Git Configuration ( For Pulling Software Repos ) + gitUsername = "Tyler Kelley"; + gitEmail = "tylerzanekelley@gmail.com"; + + # Set Displau Manager + # `tui` for Text login + # `sddm` for graphical GUI (default) + # SDDM background is set with stylixImage + displayManager = "sddm"; + + # Emable/disable bundled applications + tmuxEnable = false; + alacrittyEnable = false; + weztermEnable = false; + ghosttyEnable = false; + vscodeEnable = false; + # Note: This is evil-helix with VIM keybindings by default + helixEnable = false; + #To install: Enable here, zcli rebuild, then run zcli doom install + doomEmacsEnable = false; + + # Hyprland Settings + # Examples: + # extraMonitorSettings = "monitor = Virtual-1,1920x1080@60,auto,1"; + # extraMonitorSettings = "monitor = HDMI-A-1,1920x1080@60,auto,1"; + # You can configure multiple monitors. + # Inside the quotes, create a new line for each monitor. + extraMonitorSettings = " + + "; + + # Waybar Settings + clock24h = false; + + # Program Options + # Set Default Browser (google-chrome-stable for google-chrome) + # This does NOT install your browser + # You need to install it by adding it to the `packages.nix` + # or as a flatpak + browser = "brave"; + + # Available Options: + # Kitty, ghostty, wezterm, aalacrity + # Note: kitty, wezterm, alacritty have to be enabled in `variables.nix` + # Setting it here does not enable it. Kitty is installed by default + terminal = "kitty"; # Set Default System Terminal + + keyboardLayout = "us"; + consoleKeyMap = "us"; + + # For Nvidia Prime support + intelID = "PCI:1:0:0"; + nvidiaID = "PCI:0:2:0"; + + # Enable NFS + enableNFS = true; + + # Enable Printing Support + printEnable = false; + + # Enable Thunar GUI File Manager + # Yazi is default File Manager + thunarEnable = false; + + # Themes, waybar and animation. + # Only uncomment your selection + # The others much be commented out. + + # Set Stylix Image + # This will set your color palette + # Default background + # Add new images to ~/zaneyos/wallpapers + stylixImage = ../../wallpapers/mountainscapedark.jpg; + #stylixImage = ../../wallpapers/AnimeGirlNightSky.jpg; + #stylixImage = ../../wallpapers/Anime-Purple-eyes.png; + #stylixImage = ../../wallpapers/Rainnight.jpg; + #stylixImage = ../../wallpapers/zaney-wallpaper.jpg; + #stylixImage = ../../wallpapers/nix-wallpapers-strips-logo.jpg; + #stylixImage = ../../wallpapers/beautifulmountainscape.jpg; + + # Set Waybar + # Available Options: + waybarChoice = ../../modules/home/waybar/waybar-curved.nix; + #waybarChoice = ../../modules/home/waybar/waybar-ddubs.nix; + #waybarChoice = ../../modules/home/waybar/waybar-ddubs-2.nix; + #waybarChoice = ../../modules/home/waybar/waybar-simple.nix; + # Throwback to ZaneyOS v1.0 + #waybarChoice = ../../modules/home/waybar/waybar-jerry.nix; + # Very colorful and bright colors + #waybarChoice = ../../modules/home/waybar/waybar-nekodyke.nix; + # DWM styled waybars from Matt at TheLinuxCast + #waybarChoice = ../../modules/home/waybar/waybar-dwm.nix; + #waybarChoice = ../../modules/home/waybar/waybar-dwm-2.nix; + + # Set Animation style + # Available options are: + # animations-def.nix (default) + # animations-end4.nix (end-4 project very fluid) + # animations-dynamic.nix (ml4w project) + # animations-moving.nix (ml4w project) + animChoice = ../../modules/home/hyprland/animations-def.nix; + #animChoice = ../../modules/home/hyprland/animations-end4.nix; + #animChoice = ../../modules/home/hyprland/animations-dynamic.nix; + #animChoice = ../../modules/home/hyprland/animations-moving.nix; + + # Set network hostId if required (needed for zfs) + # Otherwise leave as-is + hostId = "5ab03f50"; +} diff --git a/img/1.jpg b/img/1.jpg new file mode 100644 index 0000000..17963cd Binary files /dev/null and b/img/1.jpg differ diff --git a/img/2.jpg b/img/2.jpg new file mode 100644 index 0000000..d8e6230 Binary files /dev/null and b/img/2.jpg differ diff --git a/img/3.jpg b/img/3.jpg new file mode 100644 index 0000000..27b26aa Binary files /dev/null and b/img/3.jpg differ diff --git a/img/4.jpg b/img/4.jpg new file mode 100644 index 0000000..4e94902 Binary files /dev/null and b/img/4.jpg differ diff --git a/img/demo-img2.png b/img/demo-img2.png new file mode 100644 index 0000000..6d80d4e Binary files /dev/null and b/img/demo-img2.png differ diff --git a/img/demo-img3.png b/img/demo-img3.png new file mode 100644 index 0000000..6b41907 Binary files /dev/null and b/img/demo-img3.png differ diff --git a/img/demo.png b/img/demo.png new file mode 100644 index 0000000..8e4ee0e Binary files /dev/null and b/img/demo.png differ diff --git a/img/first-install-cmd.jpg b/img/first-install-cmd.jpg new file mode 100644 index 0000000..369d45e Binary files /dev/null and b/img/first-install-cmd.jpg differ diff --git a/img/initial-session.png b/img/initial-session.png new file mode 100644 index 0000000..230cec1 Binary files /dev/null and b/img/initial-session.png differ diff --git a/img/install-script.jpg b/img/install-script.jpg new file mode 100644 index 0000000..7b01f80 Binary files /dev/null and b/img/install-script.jpg differ diff --git a/img/nwg-displays.png b/img/nwg-displays.png new file mode 100644 index 0000000..222ee2a Binary files /dev/null and b/img/nwg-displays.png differ diff --git a/modules/core/boot.nix b/modules/core/boot.nix new file mode 100644 index 0000000..61095d3 --- /dev/null +++ b/modules/core/boot.nix @@ -0,0 +1,22 @@ +{ pkgs, config, ... }: + +{ + boot = { + kernelPackages = pkgs.linuxPackages_zen; + kernelModules = [ "v4l2loopback" ]; + extraModulePackages = [ config.boot.kernelPackages.v4l2loopback ]; + kernel.sysctl = { "vm.max_map_count" = 2147483642; }; + loader.systemd-boot.enable = true; + loader.efi.canTouchEfiVariables = true; + # Appimage Support + binfmt.registrations.appimage = { + wrapInterpreterInShell = false; + interpreter = "${pkgs.appimage-run}/bin/appimage-run"; + recognitionType = "magic"; + offset = 0; + mask = ''\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff''; + magicOrExtension = ''\x7fELF....AI\x02''; + }; + plymouth.enable = true; + }; +} diff --git a/modules/core/default.nix b/modules/core/default.nix new file mode 100644 index 0000000..cdbb723 --- /dev/null +++ b/modules/core/default.nix @@ -0,0 +1,36 @@ +{ + inputs, + host, + ... +}: +let + # Import the host-specific variables.nix + vars = import ../../hosts/${host}/variables.nix; +in +{ + imports = [ + ./boot.nix + ./flatpak.nix + ./fonts.nix + ./hardware.nix + ./network.nix + ./nfs.nix + ./nh.nix + #./quickshell.nix #Disabled for now not using it yet + ./packages.nix + ./printing.nix + # Conditionally import the display manager module + (if vars.displayManager == "tui" then ./greetd.nix else ./sddm.nix) + ./security.nix + ./services.nix + ./steam.nix + ./stylix.nix + ./syncthing.nix + ./system.nix + ./thunar.nix + ./user.nix + ./virtualisation.nix + ./xserver.nix + inputs.stylix.nixosModules.stylix + ]; +} diff --git a/modules/core/flatpak.nix b/modules/core/flatpak.nix new file mode 100644 index 0000000..9c8692c --- /dev/null +++ b/modules/core/flatpak.nix @@ -0,0 +1,31 @@ +{ pkgs, ... }: { + xdg.portal = { + enable = true; + extraPortals = [ pkgs.xdg-desktop-portal-hyprland ]; + configPackages = [ pkgs.hyprland ]; + }; + services = { + flatpak = { + enable = true; + + # List the Flatpak applications you want to install + # Use the official Flatpak application ID (e.g., from flathub.org) + # Examples: + packages = [ + #"com.github.tchx84.Flatseal" #Manage flatpak permissions - should always have this + #"com.rtosta.zapzap" # WhatsApp client + #"io.github.flattool.Warehouse" # Manage flatpaks, clean data, remove flatpaks and deps + #"it.mijorus.gearlever" # Manage and support AppImages + #"io.github.freedoom.Phase1" # Classic Doom FPS 1 + #"io.github.freedoom.Phase2" # Classic Doom FPS 2 + #"io.github.dvlv.boxbuddyrs" # Manage distroboxes + #"de.schmidhuberj.tubefeeder" #watch YT videos + + # Add other Flatpak IDs here, e.g., "org.mozilla.firefox" + ]; + + # Optional: Automatically update Flatpaks when you run nixos-rebuild swit ch + update.onActivation = true; + }; + }; +} diff --git a/modules/core/fonts.nix b/modules/core/fonts.nix new file mode 100644 index 0000000..2703381 --- /dev/null +++ b/modules/core/fonts.nix @@ -0,0 +1,29 @@ +{pkgs, ...}: { + fonts = { + packages = with pkgs; [ + dejavu_fonts + fira-code + fira-code-symbols + font-awesome + hackgen-nf-font + ibm-plex + inter + jetbrains-mono + material-icons + maple-mono.NF + minecraftia + nerd-fonts.im-writing + nerd-fonts.blex-mono + noto-fonts + noto-fonts-emoji + noto-fonts-cjk-sans + noto-fonts-cjk-serif + noto-fonts-monochrome-emoji + powerline-fonts + roboto + roboto-mono + #symbola + terminus_font + ]; + }; +} diff --git a/modules/core/greetd.nix b/modules/core/greetd.nix new file mode 100644 index 0000000..f69bbfd --- /dev/null +++ b/modules/core/greetd.nix @@ -0,0 +1,15 @@ +{ pkgs +, username +, ... +}: { + services.greetd = { + enable = true; + #vt = 3; + settings = { + default_session = { + user = username; + command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland"; # start Hyprland with a TUI login manager + }; + }; + }; +} diff --git a/modules/core/hardware.nix b/modules/core/hardware.nix new file mode 100644 index 0000000..5c6ec61 --- /dev/null +++ b/modules/core/hardware.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: +{ + hardware = { + sane = { + enable = true; + extraBackends = [ pkgs.sane-airscan ]; + disabledDefaultBackends = [ "escl" ]; + }; + logitech.wireless.enable = false; + logitech.wireless.enableGraphical = false; + graphics.enable = true; + enableRedistributableFirmware = true; + keyboard.qmk.enable = true; + bluetooth.enable = true; + bluetooth.powerOnBoot = true; + }; + local.hardware-clock.enable = false; +} diff --git a/modules/core/network.nix b/modules/core/network.nix new file mode 100644 index 0000000..e6f0b59 --- /dev/null +++ b/modules/core/network.nix @@ -0,0 +1,41 @@ +{ pkgs +, host +, options +, ... +}: +let + inherit (import ../../hosts/${host}/variables.nix) hostId; +in +{ + # Defensive assertion for hostname validity (clearer message at eval time) + assertions = [ + { + assertion = builtins.match "^[[:alnum:]]([[:alnum:]_-]{0,61}[[:alnum:]])?$" host != null; + message = "Invalid hostname '${host}'. Must be 1-63 chars, start/end alphanumeric; allowed middle chars: letters, digits, '-' or '_'."; + } + ]; + + networking = { + hostName = "${host}"; + hostId = hostId; + networkmanager.enable = true; + timeServers = options.networking.timeServers.default ++ [ "pool.ntp.org" ]; + firewall = { + enable = true; + allowedTCPPorts = [ + 22 + 80 + 443 + 59010 + 59011 + 8080 + ]; + allowedUDPPorts = [ + 59010 + 59011 + ]; + }; + }; + + environment.systemPackages = with pkgs; [ networkmanagerapplet ]; +} diff --git a/modules/core/nfs.nix b/modules/core/nfs.nix new file mode 100644 index 0000000..7999158 --- /dev/null +++ b/modules/core/nfs.nix @@ -0,0 +1,10 @@ +{ host, ... }: +let + inherit (import ../../hosts/${host}/variables.nix) enableNFS; +in +{ + services = { + rpcbind.enable = enableNFS; + nfs.server.enable = enableNFS; + }; +} diff --git a/modules/core/nh.nix b/modules/core/nh.nix new file mode 100644 index 0000000..edfa10d --- /dev/null +++ b/modules/core/nh.nix @@ -0,0 +1,18 @@ +{ pkgs +, username +, ... +}: { + programs.nh = { + enable = true; + clean = { + enable = true; + extraArgs = "--keep-since 7d --keep 5"; + }; + flake = "/home/${username}/garandos"; + }; + + environment.systemPackages = with pkgs; [ + nix-output-monitor + nvd + ]; +} diff --git a/modules/core/packages.nix b/modules/core/packages.nix new file mode 100644 index 0000000..5e35dd4 --- /dev/null +++ b/modules/core/packages.nix @@ -0,0 +1,85 @@ +{ + pkgs, + inputs, + ... +}: +{ + programs = { + neovim = { + enable = true; + defaultEditor = true; + }; + firefox.enable = false; # Firefox is not installed by default + hyprland = { + enable = true; # set this so desktop file is created + withUWSM = false; + }; + dconf.enable = true; + seahorse.enable = true; + fuse.userAllowOther = true; + mtr.enable = true; + adb.enable = true; + hyprlock.enable = true; + gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; + }; + + nixpkgs.config.allowUnfree = true; + + environment.systemPackages = with pkgs; [ + # Hyprland systeminfo QT (Optional) + #inputs.hyprsysteminfo.packages.${pkgs.system}.default + + amfora # Fancy Terminal Browser For Gemini Protocol + appimage-run # Needed For AppImage Support + brave # Brave Browser + brightnessctl # For Screen Brightness Control + cliphist # Clipboard manager using rofi menu + cmatrix # Matrix Movie Effect In Terminal + cowsay # Great Fun Terminal Program + docker-compose # Allows Controlling Docker From A Single File + duf # Utility For Viewing Disk Usage In Terminal + dysk # Disk space util nice formattting + eza # Beautiful ls Replacement + ffmpeg # Terminal Video / Audio Editing + file-roller # Archive Manager + gedit # Simple Graphical Text Editor + #gemini-cli # CLI AI client ONLY (optional) + gimp # Great Photo Editor + glxinfo # needed for inxi diag util + greetd.tuigreet # The Login Manager (Sometimes Referred To As Display Manager) + htop # Simple Terminal Based System Monitor + hyprpicker # Color Picker + eog # For Image Viewing + inxi # CLI System Information Tool + killall # For Killing All Instances Of Programs + libnotify # For Notifications + lm_sensors # Used For Getting Hardware Temps + lolcat # Add Colors To Your Terminal Command Output + lshw # Detailed Hardware Information + mpv # Incredible Video Player + ncdu # Disk Usage Analyzer With Ncurses Interface + nixfmt-rfc-style # Nix Formatter + nwg-displays # configure monitor configs via GUI + onefetch # provides zsaneyos build info on current system + pavucontrol # For Editing Audio Levels & Devices + pciutils # Collection Of Tools For Inspecting PCI Devices + picard # For Changing Music Metadata & Getting Cover Art + pkg-config # Wrapper Script For Allowing Packages To Get Info On Others + playerctl # Allows Changing Media Volume Through Scripts + rhythmbox # audio player + ripgrep # Improved Grep + socat # Needed For Screenshots + unrar # Tool For Handling .rar Files + unzip # Tool For Handling .zip Files + usbutils # Good Tools For USB Devices + uwsm # Universal Wayland Session Manager (optional must be enabled) + v4l-utils # Used For Things Like OBS Virtual Camera + waypaper # wallpaper changer + warp-terminal # Terminal with AI support build in + wget # Tool For Fetching Files With Links + ytmdl # Tool For Downloading Audio From YouTube + ]; +} diff --git a/modules/core/printing.nix b/modules/core/printing.nix new file mode 100644 index 0000000..a6d5e1b --- /dev/null +++ b/modules/core/printing.nix @@ -0,0 +1,20 @@ +{ host, ... }: +let + inherit (import ../../hosts/${host}/variables.nix) printEnable; +in +{ + services = { + printing = { + enable = printEnable; + drivers = [ + # pkgs.hplipWithPlugin + ]; + }; + avahi = { + enable = printEnable; + nssmdns4 = true; + openFirewall = true; + }; + ipp-usb.enable = printEnable; + }; +} diff --git a/modules/core/quickshell.nix b/modules/core/quickshell.nix new file mode 100644 index 0000000..33e4a49 --- /dev/null +++ b/modules/core/quickshell.nix @@ -0,0 +1,31 @@ +{ pkgs, inputs, ... }: +{ + environment.systemPackages = with pkgs; [ + inputs.quickshell.packages.${pkgs.system}.default + + # Qt6 related kits(for slove Qt5Compat problem) + qt6.qt5compat + qt6.qtbase + qt6.qtquick3d + qt6.qtwayland + qt6.qtdeclarative + qt6.qtsvg + + # alternate options + # libsForQt5.qt5compat + kdePackages.qt5compat + libsForQt5.qt5.qtgraphicaleffects + ]; + + # necessary environment variables + environment.variables = { + QML_IMPORT_PATH = "${pkgs.qt6.qt5compat}/lib/qt-6/qml:${pkgs.qt6.qtbase}/lib/qt-6/qml"; + QML2_IMPORT_PATH = "${pkgs.qt6.qt5compat}/lib/qt-6/qml:${pkgs.qt6.qtbase}/lib/qt-6/qml"; + }; + + # make sure the Qt application is working properly + environment.sessionVariables = { + QT_QPA_PLATFORM = "wayland;xcb"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + }; +} diff --git a/modules/core/sddm.nix b/modules/core/sddm.nix new file mode 100644 index 0000000..dbc0293 --- /dev/null +++ b/modules/core/sddm.nix @@ -0,0 +1,72 @@ +# SDDM is a display manager for X11 and Wayland +{ + pkgs, + config, + lib, + ... +}: let + foreground = config.stylix.base16Scheme.base00; + textColor = config.stylix.base16Scheme.base05; + sddm-astronaut = pkgs.sddm-astronaut.override { + embeddedTheme = "pixel_sakura"; + themeConfig = + if lib.hasSuffix "sakura_static.png" config.stylix.image + then { + FormPosition = "left"; + Blur = "2.0"; + } + else if lib.hasSuffix "studio.png" config.stylix.image + then { + Background = pkgs.fetchurl { + url = "https://raw.githubusercontent.com/anotherhadi/nixy-wallpapers/refs/heads/main/wallpapers/studio.gif"; + sha256 = "sha256-qySDskjmFYt+ncslpbz0BfXiWm4hmFf5GPWF2NlTVB8="; + }; + HeaderTextColor = "#${textColor}"; + DateTextColor = "#${textColor}"; + TimeTextColor = "#${textColor}"; + LoginFieldTextColor = "#${textColor}"; + PasswordFieldTextColor = "#${textColor}"; + UserIconColor = "#${textColor}"; + PasswordIconColor = "#${textColor}"; + WarningColor = "#${textColor}"; + LoginButtonBackgroundColor = "#${foreground}"; + SystemButtonsIconsColor = "#${foreground}"; + SessionButtonTextColor = "#${textColor}"; + VirtualKeyboardButtonTextColor = "#${textColor}"; + DropdownBackgroundColor = "#${foreground}"; + HighlightBackgroundColor = "#${textColor}"; + } + else { + FormPosition = "left"; + Blur = "4.0"; + Background = "${toString config.stylix.image}"; + HeaderTextColor = "#${textColor}"; + DateTextColor = "#${textColor}"; + TimeTextColor = "#${textColor}"; + LoginFieldTextColor = "#${textColor}"; + PasswordFieldTextColor = "#${textColor}"; + UserIconColor = "#${textColor}"; + PasswordIconColor = "#${textColor}"; + WarningColor = "#${textColor}"; + LoginButtonBackgroundColor = "#${config.stylix.base16Scheme.base01}"; + SystemButtonsIconsColor = "#${textColor}"; + SessionButtonTextColor = "#${textColor}"; + VirtualKeyboardButtonTextColor = "#${textColor}"; + DropdownBackgroundColor = "#${config.stylix.base16Scheme.base01}"; + HighlightBackgroundColor = "#${textColor}"; + FormBackgroundColor = "#${config.stylix.base16Scheme.base01}"; + }; + }; +in { + services.displayManager = { + sddm = { + package = pkgs.kdePackages.sddm; + extraPackages = [sddm-astronaut]; + enable = true; + wayland.enable = true; + theme = "sddm-astronaut-theme"; + }; + }; + + environment.systemPackages = [sddm-astronaut]; +} diff --git a/modules/core/security.nix b/modules/core/security.nix new file mode 100644 index 0000000..6b93b39 --- /dev/null +++ b/modules/core/security.nix @@ -0,0 +1,22 @@ +_: { + security = { + rtkit.enable = true; + polkit = { + enable = true; + extraConfig = '' + polkit.addRule(function(action, subject) { + if ( subject.isInGroup("users") && ( + action.id == "org.freedesktop.login1.reboot" || + action.id == "org.freedesktop.login1.reboot-multiple-sessions" || + action.id == "org.freedesktop.login1.power-off" || + action.id == "org.freedesktop.login1.power-off-multiple-sessions" + )) + { return polkit.Result.YES; } + }) + ''; + }; + pam.services.swaylock = { + text = ''auth include login ''; + }; + }; +} diff --git a/modules/core/services.nix b/modules/core/services.nix new file mode 100644 index 0000000..9420305 --- /dev/null +++ b/modules/core/services.nix @@ -0,0 +1,57 @@ +{ profile, ... }: { + # Services to start + services = { + libinput.enable = true; # Input Handling + fstrim.enable = true; # SSD Optimizer + gvfs.enable = true; # For Mounting USB & More + openssh = { + enable = true; # Enable SSH + settings = { + PermitRootLogin = "no"; # Prevent root from SSH login + PasswordAuthentication = true; #Users can SSH using kb and password + KbdInteractiveAuthentication = true; + }; + ports = [ 22 ]; + }; + blueman.enable = true; # Bluetooth Support + tumbler.enable = true; # Image/video preview + gnome.gnome-keyring.enable = true; + + smartd = { + enable = + if profile == "vm" + then false + else true; + autodetect = true; + }; + pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + extraConfig.pipewire."92-low-latency" = { + "context.properties" = { + "default.clock.rate" = 48000; + "default.clock.quantum" = 256; + "default.clock.min-quantum" = 256; + "default.clock.max-quantum" = 256; + }; + }; + extraConfig.pipewire-pulse."92-low-latency" = { + context.modules = [ + { + name = "libpipewire-module-protocol-pulse"; + args = { + pulse.min.req = "256/48000"; + pulse.default.req = "256/48000"; + pulse.max.req = "256/48000"; + pulse.min.quantum = "256/48000"; + pulse.max.quantum = "256/48000"; + }; + } + ]; + }; + }; + }; +} diff --git a/modules/core/starfish.nix b/modules/core/starfish.nix new file mode 100644 index 0000000..48564f1 --- /dev/null +++ b/modules/core/starfish.nix @@ -0,0 +1,73 @@ +{ ... }: { + programs = { + starship = { + enable = false; + settings = { + add_newline = false; + buf = { + symbol = " "; + }; + c = { + symbol = " "; + }; + directory = { + read_only = " 󰌾"; + }; + docker_context = { + symbol = " "; + }; + fossil_branch = { + symbol = " "; + }; + git_branch = { + symbol = " "; + }; + golang = { + symbol = " "; + }; + hg_branch = { + symbol = " "; + }; + hostname = { + ssh_symbol = " "; + }; + lua = { + symbol = " "; + }; + memory_usage = { + symbol = "󰍛 "; + }; + meson = { + symbol = "󰔷 "; + }; + nim = { + symbol = "󰆥 "; + }; + nix_shell = { + symbol = " "; + }; + nodejs = { + symbol = " "; + }; + ocaml = { + symbol = " "; + }; + package = { + symbol = "󰏗 "; + }; + python = { + symbol = " "; + }; + rust = { + symbol = " "; + }; + swift = { + symbol = " "; + }; + zig = { + symbol = " "; + }; + }; + }; + }; +} diff --git a/modules/core/steam.nix b/modules/core/steam.nix new file mode 100644 index 0000000..8b5ad37 --- /dev/null +++ b/modules/core/steam.nix @@ -0,0 +1,20 @@ +{ pkgs, ... }: { + programs = { + steam = { + enable = true; + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + gamescopeSession.enable = true; + extraCompatPackages = [ pkgs.proton-ge-bin ]; + }; + + gamescope = { + enable = true; + capSysNice = true; + args = [ + "--rt" + "--expose-wayland" + ]; + }; + }; +} diff --git a/modules/core/stylix.nix b/modules/core/stylix.nix new file mode 100644 index 0000000..800d070 --- /dev/null +++ b/modules/core/stylix.nix @@ -0,0 +1,59 @@ +{ pkgs +, host +, ... +}: +let + inherit (import ../../hosts/${host}/variables.nix) stylixImage; +in +{ + # Styling Options + stylix = { + enable = true; + image = stylixImage; + # base16Scheme = { + # base00 = "282936"; + # base01 = "3a3c4e"; + # base02 = "4d4f68"; + # base03 = "626483"; + # base04 = "62d6e8"; + # base05 = "e9e9f4"; + # base06 = "f1f2f8"; + # base07 = "f7f7fb"; + # base08 = "ea51b2"; + # base09 = "b45bcf"; + # base0A = "00f769"; + # base0B = "ebff87"; + # base0C = "a1efe4"; + # base0D = "62d6e8"; + # base0E = "b45bcf"; + # base0F = "00f769"; + # }; + polarity = "dark"; + opacity.terminal = 1.0; + cursor = { + package = pkgs.bibata-cursors; + name = "Bibata-Modern-Ice"; + size = 24; + }; + fonts = { + monospace = { + package = pkgs.nerd-fonts.jetbrains-mono; + name = "JetBrains Mono"; + }; + sansSerif = { + package = pkgs.montserrat; + name = "Montserrat"; + }; + serif = { + package = pkgs.montserrat; + name = "Montserrat"; + }; + sizes = { + applications = 12; + terminal = 15; + desktop = 11; + popups = 12; + }; + }; + }; +} diff --git a/modules/core/syncthing.nix b/modules/core/syncthing.nix new file mode 100644 index 0000000..b214716 --- /dev/null +++ b/modules/core/syncthing.nix @@ -0,0 +1,8 @@ +{ username, ... }: { + services.syncthing = { + enable = false; + user = "${username}"; + dataDir = "/home/${username}"; + configDir = "/home/${username}/.config/syncthing"; + }; +} diff --git a/modules/core/system.nix b/modules/core/system.nix new file mode 100644 index 0000000..1f19ff9 --- /dev/null +++ b/modules/core/system.nix @@ -0,0 +1,38 @@ +{ host, ... }: +let + inherit (import ../../hosts/${host}/variables.nix) consoleKeyMap; +in +{ + nix = { + settings = { + download-buffer-size = 200000000; + auto-optimise-store = true; + experimental-features = [ + "nix-command" + "flakes" + ]; + substituters = [ "https://hyprland.cachix.org" ]; + trusted-public-keys = [ "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" ]; + }; + }; + time.timeZone = "Europe/Warsaw"; + i18n.defaultLocale = "pl_PL.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "pl_PL.UTF-8"; + LC_IDENTIFICATION = "pl_PL.UTF-8"; + LC_MEASUREMENT = "pl_PL.UTF-8"; + LC_MONETARY = "pl_PL.UTF-8"; + LC_NAME = "pl_PL.UTF-8"; + LC_NUMERIC = "pl_PL.UTF-8"; + LC_PAPER = "pl_PL.UTF-8"; + LC_TELEPHONE = "pl_PL.UTF-8"; + LC_TIME = "pl_PL.UTF-8"; + }; + environment.variables = { + NIXOS_OZONE_WL = "1"; + ZANEYOS_VERSION = "2.4"; + ZANEYOS = "true"; + }; + console.keyMap = "${consoleKeyMap}"; + system.stateVersion = "23.11"; # Do not change! +} diff --git a/modules/core/thunar.nix b/modules/core/thunar.nix new file mode 100644 index 0000000..ea1229b --- /dev/null +++ b/modules/core/thunar.nix @@ -0,0 +1,21 @@ +{ host +, pkgs +, ... +}: +let + inherit (import ../../hosts/${host}/variables.nix) thunarEnable; +in +{ + programs = { + thunar = { + enable = thunarEnable; + plugins = with pkgs.xfce; [ + thunar-archive-plugin + thunar-volman + ]; + }; + }; + environment.systemPackages = with pkgs; [ + ffmpegthumbnailer # Need For Video / Image Preview + ]; +} diff --git a/modules/core/user.nix b/modules/core/user.nix new file mode 100644 index 0000000..8e48582 --- /dev/null +++ b/modules/core/user.nix @@ -0,0 +1,45 @@ +{ pkgs +, inputs +, username +, host +, profile +, ... +}: +let + inherit (import ../../hosts/${host}/variables.nix) gitUsername; +in +{ + imports = [ inputs.home-manager.nixosModules.home-manager ]; + home-manager = { + useUserPackages = true; + useGlobalPkgs = false; + backupFileExtension = "backup"; + extraSpecialArgs = { inherit inputs username host profile; }; + users.${username} = { + imports = [ ./../home ]; + home = { + username = "${username}"; + homeDirectory = "/home/${username}"; + stateVersion = "23.11"; + }; + }; + }; + users.mutableUsers = true; + users.users.${username} = { + isNormalUser = true; + description = "${gitUsername}"; + extraGroups = [ + "adbusers" + "docker" #access to docker as non-root + "libvirtd" #Virt manager/QEMU access + "lp" + "networkmanager" + "scanner" + "wheel" #subdo access + "vboxusers" #Virtual Box + ]; + shell = pkgs.zsh; + ignoreShellProgramCheck = true; + }; + nix.settings.allowed-users = [ "${username}" ]; +} diff --git a/modules/core/virtualisation.nix b/modules/core/virtualisation.nix new file mode 100644 index 0000000..09fd5dd --- /dev/null +++ b/modules/core/virtualisation.nix @@ -0,0 +1,29 @@ +{ pkgs, ... }: { + # Only enable either docker or podman -- Not both + virtualisation = { + docker = { + enable = true; + }; + + podman.enable = false; + + libvirtd = { + enable = true; + }; + + virtualbox.host = { + enable = false; + enableExtensionPack = true; + }; + }; + + programs = { + virt-manager.enable = false; + }; + + environment.systemPackages = with pkgs; [ + virt-viewer # View Virtual Machines + lazydocker + docker-client + ]; +} diff --git a/modules/core/xserver.nix b/modules/core/xserver.nix new file mode 100644 index 0000000..d99dd41 --- /dev/null +++ b/modules/core/xserver.nix @@ -0,0 +1,13 @@ +{ host, ... }: +let + inherit (import ../../hosts/${host}/variables.nix) keyboardLayout; +in +{ + services.xserver = { + enable = false; + xkb = { + layout = "${keyboardLayout}"; + variant = ""; + }; + }; +} diff --git a/modules/drivers/amd-drivers.nix b/modules/drivers/amd-drivers.nix new file mode 100644 index 0000000..b0a51dd --- /dev/null +++ b/modules/drivers/amd-drivers.nix @@ -0,0 +1,19 @@ +{ lib +, pkgs +, config +, ... +}: +with lib; +let + cfg = config.drivers.amdgpu; +in +{ + options.drivers.amdgpu = { + enable = mkEnableOption "Enable AMD Drivers"; + }; + + config = mkIf cfg.enable { + systemd.tmpfiles.rules = [ "L+ /opt/rocm/hip - - - - ${pkgs.rocmPackages.clr}" ]; + services.xserver.videoDrivers = [ "amdgpu" ]; + }; +} diff --git a/modules/drivers/default.nix b/modules/drivers/default.nix new file mode 100644 index 0000000..6e3449e --- /dev/null +++ b/modules/drivers/default.nix @@ -0,0 +1,12 @@ +{ ... +}: +{ + imports = [ + ./amd-drivers.nix + ./intel-drivers.nix + ./local-hardware-clock.nix + ./nvidia-drivers.nix + ./nvidia-prime-drivers.nix + ./vm-guest-services.nix + ]; +} diff --git a/modules/drivers/intel-drivers.nix b/modules/drivers/intel-drivers.nix new file mode 100644 index 0000000..d50ab3e --- /dev/null +++ b/modules/drivers/intel-drivers.nix @@ -0,0 +1,25 @@ +{ lib +, pkgs +, config +, ... +}: +with lib; let + cfg = config.drivers.intel; +in +{ + options.drivers.intel = { + enable = mkEnableOption "Enable Intel Graphics Drivers"; + }; + + config = mkIf cfg.enable { + # OpenGL + hardware.graphics = { + extraPackages = with pkgs; [ + intel-media-driver + vaapiIntel + vaapiVdpau + libvdpau-va-gl + ]; + }; + }; +} diff --git a/modules/drivers/local-hardware-clock.nix b/modules/drivers/local-hardware-clock.nix new file mode 100644 index 0000000..cf4e73f --- /dev/null +++ b/modules/drivers/local-hardware-clock.nix @@ -0,0 +1,16 @@ +{ lib +, pkgs +, config +, ... +}: +with lib; +let + cfg = config.local.hardware-clock; +in +{ + options.local.hardware-clock = { + enable = mkEnableOption "Change Hardware Clock To Local Time"; + }; + + config = mkIf cfg.enable { time.hardwareClockInLocalTime = true; }; +} diff --git a/modules/drivers/nvidia-drivers.nix b/modules/drivers/nvidia-drivers.nix new file mode 100644 index 0000000..2c30be9 --- /dev/null +++ b/modules/drivers/nvidia-drivers.nix @@ -0,0 +1,40 @@ +{ lib +, pkgs +, config +, ... +}: +with lib; +let + cfg = config.drivers.nvidia; +in +{ + options.drivers.nvidia = { + enable = mkEnableOption "Enable Nvidia Drivers"; + }; + + config = mkIf cfg.enable { + services.xserver.videoDrivers = [ "nvidia" ]; + hardware.nvidia = { + # Modesetting is required. + modesetting.enable = true; + # Nvidia power management. Experimental, and can cause sleep/suspend to fail. + powerManagement.enable = false; + # Fine-grained power management. Turns off GPU when not in use. + # Experimental and only works on modern Nvidia GPUs (Turing or newer). + powerManagement.finegrained = false; + # Use the NVidia open source kernel module (not to be confused with the + # independent third-party "nouveau" open source driver). + # Support is limited to the Turing and later architectures. Full list of + # supported GPUs is at: + # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus + # Only available from driver 515.43.04+ + # Currently alpha-quality/buggy, so false is currently the recommended setting. + open = false; + # Enable the Nvidia settings menu, + # accessible via `nvidia-settings`. + nvidiaSettings = true; + # Optionally, you may need to select the appropriate driver version for your specific GPU. + package = config.boot.kernelPackages.nvidiaPackages.stable; + }; + }; +} diff --git a/modules/drivers/nvidia-prime-drivers.nix b/modules/drivers/nvidia-prime-drivers.nix new file mode 100644 index 0000000..147df1a --- /dev/null +++ b/modules/drivers/nvidia-prime-drivers.nix @@ -0,0 +1,36 @@ +{ lib +, pkgs +, config +, ... +}: +with lib; +let + cfg = config.drivers.nvidia-prime; +in +{ + options.drivers.nvidia-prime = { + enable = mkEnableOption "Enable Nvidia Prime Hybrid GPU Offload"; + intelBusID = mkOption { + type = types.str; + default = "PCI:1:0:0"; + }; + nvidiaBusID = mkOption { + type = types.str; + default = "PCI:0:2:0"; + }; + }; + + config = mkIf cfg.enable { + hardware.nvidia = { + prime = { + offload = { + enable = true; + enableOffloadCmd = true; + }; + # Make sure to use the correct Bus ID values for your system! + intelBusId = "${cfg.intelBusID}"; + nvidiaBusId = "${cfg.nvidiaBusID}"; + }; + }; + }; +} diff --git a/modules/drivers/vm-guest-services.nix b/modules/drivers/vm-guest-services.nix new file mode 100644 index 0000000..d14229d --- /dev/null +++ b/modules/drivers/vm-guest-services.nix @@ -0,0 +1,20 @@ +{ lib +, pkgs +, config +, ... +}: +with lib; +let + cfg = config.vm.guest-services; +in +{ + options.vm.guest-services = { + enable = mkEnableOption "Enable Virtual Machine Guest Services"; + }; + + config = mkIf cfg.enable { + services.qemuGuest.enable = true; + services.spice-vdagentd.enable = true; + services.spice-webdavd.enable = false; #Causes navfs2 build failure invalid neon version 9-12-25 + }; +} diff --git a/modules/home/alacritty.nix b/modules/home/alacritty.nix new file mode 100644 index 0000000..b8a8f4c --- /dev/null +++ b/modules/home/alacritty.nix @@ -0,0 +1,30 @@ +{ lib, ... }: { + programs.alacritty = + let + font_family = lib.mkForce "Maple Mono NF"; + in + { + enable = true; + settings = { + font = { + normal = { + family = font_family; + style = "Regular"; + }; + bold = { + family = font_family; + style = "Bold"; + }; + italic = { + family = font_family; + style = "Italic"; + }; + bold_italic = { + family = font_family; + style = "Bold Italic"; + }; + size = 15; + }; + }; + }; +} diff --git a/modules/home/amfora.nix b/modules/home/amfora.nix new file mode 100644 index 0000000..4c4a941 --- /dev/null +++ b/modules/home/amfora.nix @@ -0,0 +1,107 @@ +_: { + home.file = { + ".config/amfora/config.toml".text = '' + [a-general] + home = "gemini://gem.zaney.org" + color = true + ansi = true + bullets = true + show_link = false + scrollbar = "never" + auto_redirect = false + http = 'brave' + search = "gemini://gus.guru/search" + max_width = 140 + page_max_size = 2097152 # 2 MiB + page_max_time = 10 + highlight_code = true + highlight_style = "dracula" + downloads = '~/Downloads/' + underline = true + [auth] + [auth.certs] + [auth.keys] + [commands] + [keybindings] + bind_bottom = ":" + bind_quit = "Q" + bind_reload = "R" + bind_back = "h" + bind_forward = "l" + bind_moveup = "k" + bind_movedown = "j" + bind_moveleft = "H" + bind_moveright = "L" + bind_next_tab = "J" + bind_prev_tab = "K" + bind_edit = "o" + bind_new_tab = "O" + bind_close_tab = "q" + bind_save = "S" + bind_home = "Ctrl-h" + bind_bookmarks = "b" + bind_add_bookmark = "B" + bind_copy_page_url = "c" + bind_copy_target_url = "C" + bind_search = "/" + bind_next_match = "n" + bind_prev_match = "N" + [url-handlers] + [url-prompts] + [cache] + max_size = 0 # Size in bytes + max_pages = 30 # The maximum number of pages the cache will store + timeout = 1800 # 30 mins + [proxies] + [subscriptions] + popup = true + update_interval = 1800 # 30 mins + workers = 3 + entries_per_page = 20 + header = true + [theme] + bg = "#282a36" + tab_num = "#bd93f9" + tab_divider = "#f8f8f2" + bottombar_label = "#bd93f9" + bottombar_text = "#8be9fd" + bottombar_bg = "#44475a" + scrollbar = "#44475a" + hdg_1 = "#bd93f9" + hdg_2 = "#7cafc2" + hdg_3 = "#a16946" + amfora_link = "#ff79c6" + foreign_link = "#ffb86c" + link_number = "#8be9fd" + regular_text = "#f8f8f2" + quote_text = "#f1fa8c" + preformatted_text = "#ffb86c" + list_text = "#f8f8f2" + btn_bg = "#44475a" + btn_text = "#f8f8f2" + dl_choice_modal_bg = "#6272a4" + dl_choice_modal_text = "#f8f8f2" + dl_modal_bg = "#6272a4" + dl_modal_text = "#f8f8f2" + info_modal_bg = "#6272a4" + info_modal_text = "#f8f8f2" + error_modal_bg = "#ff5555" + error_modal_text = "#f8f8f2" + yesno_modal_bg = "#6272a4" + yesno_modal_text = "#f8f8f2" + tofu_modal_bg = "#6272a4" + tofu_modal_text = "#f8f8f2" + subscription_modal_bg = "#6272a4" + subscription_modal_text = "#f8f8f2" + input_modal_bg = "#6272a4" + input_modal_text = "#f8f8f2" + input_modal_field_bg = "#44475a" + input_modal_field_text = "#f8f8f2" + bkmk_modal_bg = "#6272a4" + bkmk_modal_text = "#f8f8f2" + bkmk_modal_label = "#f8f8f2" + bkmk_modal_field_bg = "#44475a" + bkmk_modal_field_text = "#f8f8f2" + ''; + }; +} diff --git a/modules/home/bash.nix b/modules/home/bash.nix new file mode 100644 index 0000000..0712618 --- /dev/null +++ b/modules/home/bash.nix @@ -0,0 +1,22 @@ +{ profile, ... }: { + programs.bash = { + enable = false; + enableCompletion = true; + initExtra = '' + fastfetch + if [ -f $HOME/.bashrc-personal ]; then + source $HOME/.bashrc-personal + fi + ''; + shellAliases = { + sv = "sudo nvim"; + fr = "nh os switch --hostname ${profile}"; + fu = "nh os switch --hostname ${profile} --update"; + zu = "sh <(curl -L https://gitlab.com/Zaney/zaneyos/-/releases/latest/download/install-zaneyos.sh)"; + ncg = "nix-collect-garbage --delete-old && sudo nix-collect-garbage -d && sudo /run/current-system/bin/switch-to-configuration boot"; + v = "nvim"; + cat = "bat"; + ".." = "cd .."; + }; + }; +} diff --git a/modules/home/bashrc-personal.nix b/modules/home/bashrc-personal.nix new file mode 100644 index 0000000..386597b --- /dev/null +++ b/modules/home/bashrc-personal.nix @@ -0,0 +1,20 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ bash ]; + + home.file."./.bashrc-personal".text = '' + + # This file allows you to define your own aliases, functions, etc + # below are just some examples of what you can use this file for + + #!/usr/bin/env bash + # Set defaults + # + #export EDITOR="nvim" + #export VISUAL="nvim" + + #alias c="clear" + #eval "$(zoxide init bash)" + #eval "$(oh-my-posh init bash --config $HOME/.config/powerlevel10k_rainbow.omp.json)" + + ''; +} diff --git a/modules/home/bat.nix b/modules/home/bat.nix new file mode 100644 index 0000000..d63242a --- /dev/null +++ b/modules/home/bat.nix @@ -0,0 +1,26 @@ +{ pkgs +, lib +, ... +}: { + programs.bat = { + enable = true; + config = { + pager = "less -FR"; + # other styles available and cane be combined + # style = "numbers,changes,headers,rule,grid"; + style = "full"; + # Bat has other thems as well + # ansi,Catppuccin,base16,base16-256,GitHub,Nord,etc + theme = lib.mkForce "Dracula"; + }; + extraPackages = with pkgs.bat-extras; [ + batman + batpipe + batgrep + ]; + }; + home.sessionVariables = { + MANPAGER = "sh -c 'col -bx | bat -l man -p'"; + MANROFFOPT = "-c"; + }; +} diff --git a/modules/home/bottom.nix b/modules/home/bottom.nix new file mode 100644 index 0000000..3b24f84 --- /dev/null +++ b/modules/home/bottom.nix @@ -0,0 +1,35 @@ +{ ... }: { + programs.bottom = { + enable = true; + settings = { + enable_gpu = true; + theme = "nord"; + flags.group_processes = true; + row = [ + { + ratio = 2; + child = [ + { type = "cpu"; } + { type = "temp"; } + ]; + } + { + ratio = 2; + child = [ + { type = "network"; } + ]; + } + { + ratio = 3; + child = [ + { + type = "proc"; + ratio = 1; + default = true; + } + ]; + } + ]; + }; + }; +} diff --git a/modules/home/btop.nix b/modules/home/btop.nix new file mode 100644 index 0000000..0f20db1 --- /dev/null +++ b/modules/home/btop.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: { + programs.btop = { + enable = true; + package = pkgs.btop.override { + rocmSupport = true; + cudaSupport = true; + }; + settings = { + vim_keys = true; + rounded_corners = true; + proc_tree = true; + show_gpu_info = "on"; + show_uptime = true; + show_coretemp = true; + cpu_sensor = "auto"; + show_disks = true; + only_physical = true; + io_mode = true; + io_graph_combined = false; + }; + }; +} diff --git a/modules/home/cava.nix b/modules/home/cava.nix new file mode 100644 index 0000000..e3c23cd --- /dev/null +++ b/modules/home/cava.nix @@ -0,0 +1,43 @@ +{ config, ... }: { + programs.cava = { + enable = true; + settings = { + general = { + bar_spacing = 1; + bar_width = 2; + frame_rate = 60; + }; + color = { + #gradient = 1; + #gradient_color_1 = "'#011f30'"; + #gradient_color_2 = "'#09465b'"; + #gradient_color_3 = "'#045a93'"; + #gradient_color_4 = "'#00aa00'"; + #gradient_color_5 = "'#ffff00'"; + #gradient_color_6 = "'#cc8033'"; + #gradient_color_7 = "'#aa0000'"; + #gradient_color_8 = "'#ff00ff'"; + # Old config + #gradient = 1; + #gradient_color_1 = "'#8bd5ca'"; + #gradient_color_2 = "'#91d7e3'"; + #gradient_color_3 = "'#7dc4e4'"; + #gradient_color_4 = "'#8aadf4'"; + #gradient_color_5 = "'#c6a0f6'"; + #gradient_color_6 = "'#f5bde6'"; + #gradient_color_7 = "'#ee99a0'"; + #gradient_color_8 = "'#ed8796'"; + # Dracula + gradient = 1; + gradient_color_1 = "'#8BE9FD'"; + gradient_color_2 = "'#9AEDFE'"; + gradient_color_3 = "'#CAA9FA'"; + gradient_color_4 = "'#BD93F9'"; + gradient_color_5 = "'#FF92D0'"; + gradient_color_6 = "'#FF79C6'"; + gradient_color_7 = "'#FF6E67'"; + gradient_color_8 = "'#FF5555'"; + }; + }; + }; +} diff --git a/modules/home/default.nix b/modules/home/default.nix new file mode 100644 index 0000000..4a498e9 --- /dev/null +++ b/modules/home/default.nix @@ -0,0 +1,70 @@ +{ host, ... }: +let + inherit (import ../../hosts/${host}/variables.nix) + alacrittyEnable + ghosttyEnable + tmuxEnable + waybarChoice + weztermEnable + vscodeEnable + helixEnable + doomEmacsEnable + ; +in +{ + imports = [ + ./amfora.nix + ./bash.nix + ./bashrc-personal.nix + ./bat.nix + ./btop.nix + ./bottom.nix + ./cava.nix + ./emoji.nix + ./eza.nix + ./fastfetch + ./fzf.nix + ./gh.nix + ./git.nix + ./gtk.nix + ./htop.nix + ./hyprland + ./kitty.nix + ./lazygit.nix + ./obs-studio.nix + ./nvf.nix + ./obs-studio.nix + ./rofi + ./qt.nix + ./scripts + ./scripts/gemini-cli.nix + #./starship.nix + #./starship-ddubs-1.nix + ./stylix.nix + ./swappy.nix + ./swaync.nix + ./tealdeer.nix + ./virtmanager.nix + waybarChoice + ./wlogout + ./xdg.nix + ./yazi + ./zoxide.nix + ./zsh + ] + ++ (if helixEnable then [ ./evil-helix.nix ] else [ ]) + ++ (if vscodeEnable then [ ./vscode.nix ] else [ ]) + ++ ( + if doomEmacsEnable then + [ + ./editors/doom-emacs-install.nix + ./editors/doom-emacs.nix + ] + else + [ ] + ) + ++ (if weztermEnable then [ ./wezterm.nix ] else [ ]) + ++ (if ghosttyEnable then [ ./ghostty.nix ] else [ ]) + ++ (if tmuxEnable then [ ./tmux.nix ] else [ ]) + ++ (if alacrittyEnable then [ ./alacritty.nix ] else [ ]); +} diff --git a/modules/home/editors/doom-emacs-install.nix b/modules/home/editors/doom-emacs-install.nix new file mode 100644 index 0000000..dc45b0f --- /dev/null +++ b/modules/home/editors/doom-emacs-install.nix @@ -0,0 +1,78 @@ +{ pkgs, ... }: + +let + doom-icon = pkgs.fetchurl { + url = "https://raw.githubusercontent.com/jeetelongname/doom-banners/master/splashes/doom/doom-emacs-color2.svg"; + sha256 = "1xxi5ra1z8njsqaqiaq96wyn1sc967l42kvjzbji1zrjj8za6bgq"; + }; +in +{ + # 1. Create a script to install Doom Emacs + home.packages = [ + (pkgs.writeShellScriptBin "get-doom" '' + #!/usr/bin/env bash + set -e + + # --- Icons --- + ICON_CHECK="✔" + ICON_INFO="ℹ" + ICON_ROCKET="🚀" + + # --- Helper Functions --- + print_status() { + echo + echo "--- $ICON_INFO $1 ---" + } + + print_success() { + echo "--- $ICON_CHECK $1 ---" + } + + print_banner() { + echo "===============================" + echo " Doom Emacs Installer $ICON_ROCKET" + echo "===============================" + } + + # --- Main Script --- + print_banner + EMACSDIR="$HOME/.emacs.d" + + if [ -d "$EMACSDIR" ]; then + print_success "Doom Emacs is already installed." + exit 0 + fi + + print_status "Cloning Doom Emacs..." + git clone --depth 1 https://github.com/doomemacs/doomemacs "$EMACSDIR" + print_success "Doom Emacs cloned." + + print_status "Running Doom install..." + "$EMACSDIR/bin/doom" install + print_success "Doom install complete." + + print_status "Running doom sync..." + "$EMACSDIR/bin/doom" sync + print_success "Doom sync complete." + + echo + print_success "All done! Doom Emacs is ready to use." + '') + ]; + + # 2. Add the bin directory to the PATH + home.sessionPath = [ + "$HOME/.emacs.d/bin" + ]; + + # 3. Create a desktop file + xdg.desktopEntries.doom-emacs = { + name = "Doom Emacs"; + comment = "A configuration framework for GNU Emacs"; + exec = "emacs"; + icon = doom-icon; + terminal = false; + type = "Application"; + categories = [ "Development" "TextEditor" ]; + }; +} diff --git a/modules/home/editors/doom-emacs.nix b/modules/home/editors/doom-emacs.nix new file mode 100644 index 0000000..e9cd845 --- /dev/null +++ b/modules/home/editors/doom-emacs.nix @@ -0,0 +1,162 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + emacs-gtk + git + lazygit + ripgrep + libtool + cmake + pkg-config + # Spell checking + hunspell + hunspellDicts.en_US + hunspellDicts.en_AU + hunspellDicts.es_ES + # LSP servers + clang-tools # C/C++ LSP + nil # Nix LSP + ]; + + home.file.".doom.d/init.el".text = '' + ;;; init.el -*- lexical-binding: t; -*- + + (doom! + :completion + (company +auto) + (vertico +icons) + + :ui + doom + doom-dashboard + doom-quit + hl-todo + modeline + nav-flash + ophints + (popup +defaults) + (ligatures +extra) + tabs + treemacs + vi-tilde-fringe + window-select + + :editor + (evil +everywhere) + file-templates + fold + multiple-cursors + snippets + word-wrap + + :emacs + (dired +icons) + electric + (ibuffer +icons) + (undo +tree) + vc + + :term + vterm + + :checkers + (syntax +flymake) + (spell +flyspell) + grammar + + :tools + (eval +overlay) + (lookup +docsets) + lsp + (magit +forge) + pdf + tree-sitter + + :lang + bash + (c +lsp) + css + docker + html + (json +lsp) + markdown + (nix +tree-sitter +lsp) + toml + yaml + + :config + (default +bindings +smartparens)) + ''; + + home.file.".doom.d/config.el".text = '' + ;;; config.el -*- lexical-binding: t; -*- + + (setq doom-theme 'doom-one) + (setq display-line-numbers-type 'relative) + (setq nerd-icons-font-family "JetBrainsMono Nerd Font") + + ;; Git configuration + (after! magit + ;; Set default git editor to emacsclient + (setq with-editor-emacsclient-executable "emacsclient") + ;; Show word-granularity differences within diff hunks + (setq magit-diff-refine-hunk t) + ;; Auto-refresh magit buffers + (setq magit-refresh-status-buffer t)) + + ;; Lazygit integration + (defun my/lazygit () + "Open lazygit in a terminal." + (interactive) + (if (fboundp 'vterm) + (let ((default-directory (magit-toplevel))) + (vterm "*lazygit*") + (vterm-send-string "lazygit") + (vterm-send-return)) + (async-shell-command "lazygit" "*lazygit*"))) + + ;; LSP configuration + (after! lsp-mode + (setq lsp-signature-auto-activate t + lsp-signature-render-documentation t + lsp-completion-provider :company-capf + lsp-idle-delay 0.1)) + + ;; Nix LSP (nil) configuration + (with-eval-after-load 'lsp-nix-nil + (setq lsp-nix-nil-auto-eval-inputs t)) + + ;; Company completion settings + (after! company + (setq company-idle-delay 0.2 + company-minimum-prefix-length 1 + company-tooltip-align-annotations t + company-require-match 'never)) + + ;; Spell checking configuration + (after! ispell + (setq ispell-program-name "hunspell") + (setq ispell-local-dictionary "en_US") + (setq ispell-local-dictionary-alist + '(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_US") nil utf-8)))) + + ;; Git keybindings + (map! :leader + (:prefix-map ("g" . "git") + :desc "Magit status" "g" #'magit-status + :desc "Magit dispatch" "d" #'magit-dispatch + :desc "Magit file dispatch" "f" #'magit-file-dispatch + :desc "Magit blame" "b" #'magit-blame-addition + :desc "Git time machine" "t" #'git-timemachine-toggle + :desc "Lazygit" "l" #'my/lazygit + :desc "Git stage file" "s" #'magit-stage-file + :desc "Git unstage file" "u" #'magit-unstage-file)) + ''; + + home.file.".doom.d/packages.el".text = '' + ;;; packages.el -*- lexical-binding: t; -*- + + ;; Git-related packages + (package! git-timemachine) + ''; +} diff --git a/modules/home/emoji.nix b/modules/home/emoji.nix new file mode 100644 index 0000000..f53d31b --- /dev/null +++ b/modules/home/emoji.nix @@ -0,0 +1,1853 @@ +{ ... }: { + home.file.".config/.emoji".text = '' + 😀 grinning face face smile happy joy :D grin + 😃 grinning face with big eyes face happy joy haha :D :) smile funny + 😄 grinning face with smiling eyes face happy joy funny haha laugh like :D :) smile + 😁 beaming face with smiling eyes face happy smile joy kawaii + 😆 grinning squinting face happy joy lol satisfied haha face glad XD laugh + 😅 grinning face with sweat face hot happy laugh sweat smile relief + 🤣 rolling on the floor laughing face rolling floor laughing lol haha rofl + 😂 face with tears of joy face cry tears weep happy happytears haha + 🙂 slightly smiling face face smile + 🙃 upside down face face flipped silly smile + 😉 winking face face happy mischievous secret ;) smile eye + 😊 smiling face with smiling eyes face smile happy flushed crush embarrassed shy joy + 😇 smiling face with halo face angel heaven halo + 🥰 smiling face with hearts face love like affection valentines infatuation crush hearts adore + 😍 smiling face with heart eyes face love like affection valentines infatuation crush heart + 🤩 star struck face smile starry eyes grinning + 😘 face blowing a kiss face love like affection valentines infatuation kiss + 😗 kissing face love like face 3 valentines infatuation kiss + ☺️ smiling face face blush massage happiness + 😚 kissing face with closed eyes face love like affection valentines infatuation kiss + 😙 kissing face with smiling eyes face affection valentines infatuation kiss + 😋 face savoring food happy joy tongue smile face silly yummy nom delicious savouring + 😛 face with tongue face prank childish playful mischievous smile tongue + 😜 winking face with tongue face prank childish playful mischievous smile wink tongue + 🤪 zany face face goofy crazy + 😝 squinting face with tongue face prank playful mischievous smile tongue + 🤑 money mouth face face rich dollar money + 🤗 hugging face face smile hug + 🤭 face with hand over mouth face whoops shock surprise + 🤫 shushing face face quiet shhh + 🤔 thinking face face hmmm think consider + 🤐 zipper mouth face face sealed zipper secret + 🤨 face with raised eyebrow face distrust scepticism disapproval disbelief surprise + 😐 neutral face indifference meh :| neutral + 😑 expressionless face face indifferent - - meh deadpan + 😶 face without mouth face hellokitty + 😏 smirking face face smile mean prank smug sarcasm + 😒 unamused face indifference bored straight face serious sarcasm unimpressed skeptical dubious side eye + 🙄 face with rolling eyes face eyeroll frustrated + 😬 grimacing face face grimace teeth + 🤥 lying face face lie pinocchio + 😌 relieved face face relaxed phew massage happiness + 😔 pensive face face sad depressed upset + 😪 sleepy face face tired rest nap + 🤤 drooling face face + 😴 sleeping face face tired sleepy night zzz + 😷 face with medical mask face sick ill disease + 🤒 face with thermometer sick temperature thermometer cold fever + 🤕 face with head bandage injured clumsy bandage hurt + 🤢 nauseated face face vomit gross green sick throw up ill + 🤮 face vomiting face sick + 🤧 sneezing face face gesundheit sneeze sick allergy + 🥵 hot face face feverish heat red sweating + 🥶 cold face face blue freezing frozen frostbite icicles + 🥴 woozy face face dizzy intoxicated tipsy wavy + 😵 dizzy face spent unconscious xox dizzy + 🤯 exploding head face shocked mind blown + 🤠 cowboy hat face face cowgirl hat + 🥳 partying face face celebration woohoo + 😎 smiling face with sunglasses face cool smile summer beach sunglass + 🤓 nerd face face nerdy geek dork + 🧐 face with monocle face stuffy wealthy + 😕 confused face face indifference huh weird hmmm :/ + 😟 worried face face concern nervous :( + 🙁 slightly frowning face face frowning disappointed sad upset + ☹️ frowning face face sad upset frown + 😮 face with open mouth face surprise impressed wow whoa :O + 😯 hushed face face woo shh + 😲 astonished face face xox surprised poisoned + 😳 flushed face face blush shy flattered + 🥺 pleading face face begging mercy + 😦 frowning face with open mouth face aw what + 😧 anguished face face stunned nervous + 😨 fearful face face scared terrified nervous oops huh + 😰 anxious face with sweat face nervous sweat + 😥 sad but relieved face face phew sweat nervous + 😢 crying face face tears sad depressed upset :'( + 😭 loudly crying face face cry tears sad upset depressed + 😱 face screaming in fear face munch scared omg + 😖 confounded face face confused sick unwell oops :S + 😣 persevering face face sick no upset oops + 😞 disappointed face face sad upset depressed :( + 😓 downcast face with sweat face hot sad tired exercise + 😩 weary face face tired sleepy sad frustrated upset + 😫 tired face sick whine upset frustrated + 🥱 yawning face tired sleepy + 😤 face with steam from nose face gas phew proud pride + 😡 pouting face angry mad hate despise + 😠 angry face mad face annoyed frustrated + 🤬 face with symbols on mouth face swearing cursing cussing profanity expletive + 😈 smiling face with horns devil horns + 👿 angry face with horns devil angry horns + 💀 skull dead skeleton creepy death + ☠️ skull and crossbones poison danger deadly scary death pirate evil + 💩 pile of poo hankey shitface fail turd shit + 🤡 clown face face + 👹 ogre monster red mask halloween scary creepy devil demon japanese ogre + 👺 goblin red evil mask monster scary creepy japanese goblin + 👻 ghost halloween spooky scary + 👽 alien UFO paul weird outer space + 👾 alien monster game arcade play + 🤖 robot computer machine bot + 😺 grinning cat animal cats happy smile + 😸 grinning cat with smiling eyes animal cats smile + 😹 cat with tears of joy animal cats haha happy tears + 😻 smiling cat with heart eyes animal love like affection cats valentines heart + 😼 cat with wry smile animal cats smirk + 😽 kissing cat animal cats kiss + 🙀 weary cat animal cats munch scared scream + 😿 crying cat animal tears weep sad cats upset cry + 😾 pouting cat animal cats + 🙈 see no evil monkey monkey animal nature haha + 🙉 hear no evil monkey animal monkey nature + 🙊 speak no evil monkey monkey animal nature omg + 💋 kiss mark face lips love like affection valentines + 💌 love letter email like affection envelope valentines + 💘 heart with arrow love like heart affection valentines + 💝 heart with ribbon love valentines + 💖 sparkling heart love like affection valentines + 💗 growing heart like love affection valentines pink + 💓 beating heart love like affection valentines pink heart + 💞 revolving hearts love like affection valentines + 💕 two hearts love like affection valentines heart + 💟 heart decoration purple-square love like + ❣️ heart exclamation decoration love + 💔 broken heart sad sorry break heart heartbreak + ❤️ red heart love like valentines + 🧡 orange heart love like affection valentines + 💛 yellow heart love like affection valentines + 💚 green heart love like affection valentines + 💙 blue heart love like affection valentines + 💜 purple heart love like affection valentines + 🤎 brown heart coffee + 🖤 black heart evil + 🤍 white heart pure + 💯 hundred points score perfect numbers century exam quiz test pass hundred + 💢 anger symbol angry mad + 💥 collision bomb explode explosion collision blown + 💫 dizzy star sparkle shoot magic + 💦 sweat droplets water drip oops + 💨 dashing away wind air fast shoo fart smoke puff + 🕳️ hole embarrassing + 💣 bomb boom explode explosion terrorism + 💬 speech balloon bubble words message talk chatting + 👁️‍🗨️ eye in speech bubble info + 🗨️ left speech bubble words message talk chatting + 🗯️ right anger bubble caption speech thinking mad + 💭 thought balloon bubble cloud speech thinking dream + 💤 zzz sleepy tired dream + 👋 waving hand hands gesture goodbye solong farewell hello hi palm + 🤚 raised back of hand fingers raised backhand + 🖐️ hand with fingers splayed hand fingers palm + ✋ raised hand fingers stop highfive palm ban + 🖖 vulcan salute hand fingers spock star trek + 👌 ok hand fingers limbs perfect ok okay + 🤏 pinching hand tiny small size + ✌️ victory hand fingers ohyeah hand peace victory two + 🤞 crossed fingers good lucky + 🤟 love you gesture hand fingers gesture + 🤘 sign of the horns hand fingers evil eye sign of horns rock on + 🤙 call me hand hands gesture shaka + 👈 backhand index pointing left direction fingers hand left + 👉 backhand index pointing right fingers hand direction right + 👆 backhand index pointing up fingers hand direction up + 🖕 middle finger hand fingers rude middle flipping + 👇 backhand index pointing down fingers hand direction down + ☝️ index pointing up hand fingers direction up + 👍 thumbs up thumbsup yes awesome good agree accept cool hand like +1 + 👎 thumbs down thumbsdown no dislike hand -1 + ✊ raised fist fingers hand grasp + 👊 oncoming fist angry violence fist hit attack hand + 🤛 left facing fist hand fistbump + 🤜 right facing fist hand fistbump + 👏 clapping hands hands praise applause congrats yay + 🙌 raising hands gesture hooray yea celebration hands + 👐 open hands fingers butterfly hands open + 🤲 palms up together hands gesture cupped prayer + 🤝 handshake agreement shake + 🙏 folded hands please hope wish namaste highfive pray + ✍️ writing hand lower left ballpoint pen stationery write compose + 💅 nail polish beauty manicure finger fashion nail + 🤳 selfie camera phone + 💪 flexed biceps arm flex hand summer strong biceps + 🦾 mechanical arm accessibility + 🦿 mechanical leg accessibility + 🦵 leg kick limb + 🦶 foot kick stomp + 👂 ear face hear sound listen + 🦻 ear with hearing aid accessibility + 👃 nose smell sniff + 🧠 brain smart intelligent + 🦷 tooth teeth dentist + 🦴 bone skeleton + 👀 eyes look watch stalk peek see + 👁️ eye face look see watch stare + 👅 tongue mouth playful + 👄 mouth mouth kiss + 👶 baby child boy girl toddler + 🧒 child gender-neutral young + 👦 boy man male guy teenager + 👧 girl female woman teenager + 🧑 person gender-neutral person + 👱 person blond hair hairstyle + 👨 man mustache father dad guy classy sir moustache + 🧔 man beard person bewhiskered + 👨‍🦰 man red hair hairstyle + 👨‍🦱 man curly hair hairstyle + 👨‍🦳 man white hair old elder + 👨‍🦲 man bald hairless + 👩 woman female girls lady + 👩‍🦰 woman red hair hairstyle + 🧑‍🦰 person red hair hairstyle + 👩‍🦱 woman curly hair hairstyle + 🧑‍🦱 person curly hair hairstyle + 👩‍🦳 woman white hair old elder + 🧑‍🦳 person white hair elder old + 👩‍🦲 woman bald hairless + 🧑‍🦲 person bald hairless + 👱‍♀️ woman blond hair woman female girl blonde person + 👱‍♂️ man blond hair man male boy blonde guy person + 🧓 older person human elder senior gender-neutral + 👴 old man human male men old elder senior + 👵 old woman human female women lady old elder senior + 🙍 person frowning worried + 🙍‍♂️ man frowning male boy man sad depressed discouraged unhappy + 🙍‍♀️ woman frowning female girl woman sad depressed discouraged unhappy + 🙎 person pouting upset + 🙎‍♂️ man pouting male boy man + 🙎‍♀️ woman pouting female girl woman + 🙅 person gesturing no decline + 🙅‍♂️ man gesturing no male boy man nope + 🙅‍♀️ woman gesturing no female girl woman nope + 🙆 person gesturing ok agree + 🙆‍♂️ man gesturing ok men boy male blue human man + 🙆‍♀️ woman gesturing ok women girl female pink human woman + 💁 person tipping hand information + 💁‍♂️ man tipping hand male boy man human information + 💁‍♀️ woman tipping hand female girl woman human information + 🙋 person raising hand question + 🙋‍♂️ man raising hand male boy man + 🙋‍♀️ woman raising hand female girl woman + 🧏 deaf person accessibility + 🧏‍♂️ deaf man accessibility + 🧏‍♀️ deaf woman accessibility + 🙇 person bowing respectiful + 🙇‍♂️ man bowing man male boy + 🙇‍♀️ woman bowing woman female girl + 🤦 person facepalming disappointed + 🤦‍♂️ man facepalming man male boy disbelief + 🤦‍♀️ woman facepalming woman female girl disbelief + 🤷 person shrugging regardless + 🤷‍♂️ man shrugging man male boy confused indifferent doubt + 🤷‍♀️ woman shrugging woman female girl confused indifferent doubt + 🧑‍⚕️ health worker hospital + 👨‍⚕️ man health worker doctor nurse therapist healthcare man human + 👩‍⚕️ woman health worker doctor nurse therapist healthcare woman human + 🧑‍🎓 student learn + 👨‍🎓 man student graduate man human + 👩‍🎓 woman student graduate woman human + 🧑‍🏫 teacher professor + 👨‍🏫 man teacher instructor professor man human + 👩‍🏫 woman teacher instructor professor woman human + 🧑‍⚖️ judge law + 👨‍⚖️ man judge justice court man human + 👩‍⚖️ woman judge justice court woman human + 🧑‍🌾 farmer crops + 👨‍🌾 man farmer rancher gardener man human + 👩‍🌾 woman farmer rancher gardener woman human + 🧑‍🍳 cook food kitchen culinary + 👨‍🍳 man cook chef man human + 👩‍🍳 woman cook chef woman human + 🧑‍🔧 mechanic worker technician + 👨‍🔧 man mechanic plumber man human wrench + 👩‍🔧 woman mechanic plumber woman human wrench + 🧑‍🏭 factory worker labor + 👨‍🏭 man factory worker assembly industrial man human + 👩‍🏭 woman factory worker assembly industrial woman human + 🧑‍💼 office worker business + 👨‍💼 man office worker business manager man human + 👩‍💼 woman office worker business manager woman human + 🧑‍🔬 scientist chemistry + 👨‍🔬 man scientist biologist chemist engineer physicist man human + 👩‍🔬 woman scientist biologist chemist engineer physicist woman human + 🧑‍💻 technologist computer + 👨‍💻 man technologist coder developer engineer programmer software man human laptop computer + 👩‍💻 woman technologist coder developer engineer programmer software woman human laptop computer + 🧑‍🎤 singer song artist performer + 👨‍🎤 man singer rockstar entertainer man human + 👩‍🎤 woman singer rockstar entertainer woman human + 🧑‍🎨 artist painting draw creativity + 👨‍🎨 man artist painter man human + 👩‍🎨 woman artist painter woman human + 🧑‍✈️ pilot fly plane airplane + 👨‍✈️ man pilot aviator plane man human + 👩‍✈️ woman pilot aviator plane woman human + 🧑‍🚀 astronaut outerspace + 👨‍🚀 man astronaut space rocket man human + 👩‍🚀 woman astronaut space rocket woman human + 🧑‍🚒 firefighter fire + 👨‍🚒 man firefighter fireman man human + 👩‍🚒 woman firefighter fireman woman human + 👮 police officer cop + 👮‍♂️ man police officer man police law legal enforcement arrest 911 + 👮‍♀️ woman police officer woman police law legal enforcement arrest 911 female + 🕵️ detective human spy detective + 🕵️‍♂️ man detective crime + 🕵️‍♀️ woman detective human spy detective female woman + 💂 guard protect + 💂‍♂️ man guard uk gb british male guy royal + 💂‍♀️ woman guard uk gb british female royal woman + 👷 construction worker labor build + 👷‍♂️ man construction worker male human wip guy build construction worker labor + 👷‍♀️ woman construction worker female human wip build construction worker labor woman + 🤴 prince boy man male crown royal king + 👸 princess girl woman female blond crown royal queen + 👳 person wearing turban headdress + 👳‍♂️ man wearing turban male indian hinduism arabs + 👳‍♀️ woman wearing turban female indian hinduism arabs woman + 👲 man with skullcap male boy chinese + 🧕 woman with headscarf female hijab mantilla tichel + 🤵 man in tuxedo couple marriage wedding groom + 👰 bride with veil couple marriage wedding woman bride + 🤰 pregnant woman baby + 🤱 breast feeding nursing baby + 👼 baby angel heaven wings halo + 🎅 santa claus festival man male xmas father christmas + 🤶 mrs claus woman female xmas mother christmas + 🦸 superhero marvel + 🦸‍♂️ man superhero man male good hero superpowers + 🦸‍♀️ woman superhero woman female good heroine superpowers + 🦹 supervillain marvel + 🦹‍♂️ man supervillain man male evil bad criminal hero superpowers + 🦹‍♀️ woman supervillain woman female evil bad criminal heroine superpowers + 🧙 mage magic + 🧙‍♂️ man mage man male mage sorcerer + 🧙‍♀️ woman mage woman female mage witch + 🧚 fairy wings magical + 🧚‍♂️ man fairy man male + 🧚‍♀️ woman fairy woman female + 🧛 vampire blood twilight + 🧛‍♂️ man vampire man male dracula + 🧛‍♀️ woman vampire woman female + 🧜 merperson sea + 🧜‍♂️ merman man male triton + 🧜‍♀️ mermaid woman female merwoman ariel + 🧝 elf magical + 🧝‍♂️ man elf man male + 🧝‍♀️ woman elf woman female + 🧞 genie magical wishes + 🧞‍♂️ man genie man male + 🧞‍♀️ woman genie woman female + 🧟 zombie dead + 🧟‍♂️ man zombie man male dracula undead walking dead + 🧟‍♀️ woman zombie woman female undead walking dead + 💆 person getting massage relax + 💆‍♂️ man getting massage male boy man head + 💆‍♀️ woman getting massage female girl woman head + 💇 person getting haircut hairstyle + 💇‍♂️ man getting haircut male boy man + 💇‍♀️ woman getting haircut female girl woman + 🚶 person walking move + 🚶‍♂️ man walking human feet steps + 🚶‍♀️ woman walking human feet steps woman female + 🧍 person standing still + 🧍‍♂️ man standing still + 🧍‍♀️ woman standing still + 🧎 person kneeling pray respectful + 🧎‍♂️ man kneeling pray respectful + 🧎‍♀️ woman kneeling respectful pray + 🧑‍🦯 person with probing cane blind + 👨‍🦯 man with probing cane blind + 👩‍🦯 woman with probing cane blind + 🧑‍🦼 person in motorized wheelchair disability accessibility + 👨‍🦼 man in motorized wheelchair disability accessibility + 👩‍🦼 woman in motorized wheelchair disability accessibility + 🧑‍🦽 person in manual wheelchair disability accessibility + 👨‍🦽 man in manual wheelchair disability accessibility + 👩‍🦽 woman in manual wheelchair disability accessibility + 🏃 person running move + 🏃‍♂️ man running man walking exercise race running + 🏃‍♀️ woman running woman walking exercise race running female + 💃 woman dancing female girl woman fun + 🕺 man dancing male boy fun dancer + 🕴️ man in suit levitating suit business levitate hover jump + 👯 people with bunny ears perform costume + 👯‍♂️ men with bunny ears male bunny men boys + 👯‍♀️ women with bunny ears female bunny women girls + 🧖 person in steamy room relax spa + 🧖‍♂️ man in steamy room male man spa steamroom sauna + 🧖‍♀️ woman in steamy room female woman spa steamroom sauna + 🧗 person climbing sport + 🧗‍♂️ man climbing sports hobby man male rock + 🧗‍♀️ woman climbing sports hobby woman female rock + 🤺 person fencing sports fencing sword + 🏇 horse racing animal betting competition gambling luck + ⛷️ skier sports winter snow + 🏂 snowboarder sports winter + 🏌️ person golfing sports business + 🏌️‍♂️ man golfing sport + 🏌️‍♀️ woman golfing sports business woman female + 🏄 person surfing sport sea + 🏄‍♂️ man surfing sports ocean sea summer beach + 🏄‍♀️ woman surfing sports ocean sea summer beach woman female + 🚣 person rowing boat sport move + 🚣‍♂️ man rowing boat sports hobby water ship + 🚣‍♀️ woman rowing boat sports hobby water ship woman female + 🏊 person swimming sport pool + 🏊‍♂️ man swimming sports exercise human athlete water summer + 🏊‍♀️ woman swimming sports exercise human athlete water summer woman female + ⛹️ person bouncing ball sports human + ⛹️‍♂️ man bouncing ball sport + ⛹️‍♀️ woman bouncing ball sports human woman female + 🏋️ person lifting weights sports training exercise + 🏋️‍♂️ man lifting weights sport + 🏋️‍♀️ woman lifting weights sports training exercise woman female + 🚴 person biking sport move + 🚴‍♂️ man biking sports bike exercise hipster + 🚴‍♀️ woman biking sports bike exercise hipster woman female + 🚵 person mountain biking sport move + 🚵‍♂️ man mountain biking transportation sports human race bike + 🚵‍♀️ woman mountain biking transportation sports human race bike woman female + 🤸 person cartwheeling sport gymnastic + 🤸‍♂️ man cartwheeling gymnastics + 🤸‍♀️ woman cartwheeling gymnastics + 🤼 people wrestling sport + 🤼‍♂️ men wrestling sports wrestlers + 🤼‍♀️ women wrestling sports wrestlers + 🤽 person playing water polo sport + 🤽‍♂️ man playing water polo sports pool + 🤽‍♀️ woman playing water polo sports pool + 🤾 person playing handball sport + 🤾‍♂️ man playing handball sports + 🤾‍♀️ woman playing handball sports + 🤹 person juggling performance balance + 🤹‍♂️ man juggling juggle balance skill multitask + 🤹‍♀️ woman juggling juggle balance skill multitask + 🧘 person in lotus position meditate + 🧘‍♂️ man in lotus position man male meditation yoga serenity zen mindfulness + 🧘‍♀️ woman in lotus position woman female meditation yoga serenity zen mindfulness + 🛀 person taking bath clean shower bathroom + 🛌 person in bed bed rest + 🧑‍🤝‍🧑 people holding hands friendship + 👭 women holding hands pair friendship couple love like female people human + 👫 woman and man holding hands pair people human love date dating like affection valentines marriage + 👬 men holding hands pair couple love like bromance friendship people human + 💏 kiss pair valentines love like dating marriage + 👩‍❤️‍💋‍👨 kiss woman man love + 👨‍❤️‍💋‍👨 kiss man man pair valentines love like dating marriage + 👩‍❤️‍💋‍👩 kiss woman woman pair valentines love like dating marriage + 💑 couple with heart pair love like affection human dating valentines marriage + 👩‍❤️‍👨 couple with heart woman man love + 👨‍❤️‍👨 couple with heart man man pair love like affection human dating valentines marriage + 👩‍❤️‍👩 couple with heart woman woman pair love like affection human dating valentines marriage + 👪 family home parents child mom dad father mother people human + 👨‍👩‍👦 family man woman boy love + 👨‍👩‍👧 family man woman girl home parents people human child + 👨‍👩‍👧‍👦 family man woman girl boy home parents people human children + 👨‍👩‍👦‍👦 family man woman boy boy home parents people human children + 👨‍👩‍👧‍👧 family man woman girl girl home parents people human children + 👨‍👨‍👦 family man man boy home parents people human children + 👨‍👨‍👧 family man man girl home parents people human children + 👨‍👨‍👧‍👦 family man man girl boy home parents people human children + 👨‍👨‍👦‍👦 family man man boy boy home parents people human children + 👨‍👨‍👧‍👧 family man man girl girl home parents people human children + 👩‍👩‍👦 family woman woman boy home parents people human children + 👩‍👩‍👧 family woman woman girl home parents people human children + 👩‍👩‍👧‍👦 family woman woman girl boy home parents people human children + 👩‍👩‍👦‍👦 family woman woman boy boy home parents people human children + 👩‍👩‍👧‍👧 family woman woman girl girl home parents people human children + 👨‍👦 family man boy home parent people human child + 👨‍👦‍👦 family man boy boy home parent people human children + 👨‍👧 family man girl home parent people human child + 👨‍👧‍👦 family man girl boy home parent people human children + 👨‍👧‍👧 family man girl girl home parent people human children + 👩‍👦 family woman boy home parent people human child + 👩‍👦‍👦 family woman boy boy home parent people human children + 👩‍👧 family woman girl home parent people human child + 👩‍👧‍👦 family woman girl boy home parent people human children + 👩‍👧‍👧 family woman girl girl home parent people human children + 🗣️ speaking head user person human sing say talk + 👤 bust in silhouette user person human + 👥 busts in silhouette user person human group team + 👣 footprints feet tracking walking beach + 🐵 monkey face animal nature circus + 🐒 monkey animal nature banana circus + 🦍 gorilla animal nature circus + 🦧 orangutan animal + 🐶 dog face animal friend nature woof puppy pet faithful + 🐕 dog animal nature friend doge pet faithful + 🦮 guide dog animal blind + 🐕‍🦺 service dog blind animal + 🐩 poodle dog animal 101 nature pet + 🐺 wolf animal nature wild + 🦊 fox animal nature face + 🦝 raccoon animal nature + 🐱 cat face animal meow nature pet kitten + 🐈 cat animal meow pet cats + 🦁 lion animal nature + 🐯 tiger face animal cat danger wild nature roar + 🐅 tiger animal nature roar + 🐆 leopard animal nature + 🐴 horse face animal brown nature + 🐎 horse animal gamble luck + 🦄 unicorn animal nature mystical + 🦓 zebra animal nature stripes safari + 🦌 deer animal nature horns venison + 🐮 cow face beef ox animal nature moo milk + 🐂 ox animal cow beef + 🐃 water buffalo animal nature ox cow + 🐄 cow beef ox animal nature moo milk + 🐷 pig face animal oink nature + 🐖 pig animal nature + 🐗 boar animal nature + 🐽 pig nose animal oink + 🐏 ram animal sheep nature + 🐑 ewe animal nature wool shipit + 🐐 goat animal nature + 🐪 camel animal hot desert hump + 🐫 two hump camel animal nature hot desert hump + 🦙 llama animal nature alpaca + 🦒 giraffe animal nature spots safari + 🐘 elephant animal nature nose th circus + 🦏 rhinoceros animal nature horn + 🦛 hippopotamus animal nature + 🐭 mouse face animal nature cheese wedge rodent + 🐁 mouse animal nature rodent + 🐀 rat animal mouse rodent + 🐹 hamster animal nature + 🐰 rabbit face animal nature pet spring magic bunny + 🐇 rabbit animal nature pet magic spring + 🐿️ chipmunk animal nature rodent squirrel + 🦔 hedgehog animal nature spiny + 🦇 bat animal nature blind vampire + 🐻 bear animal nature wild + 🐨 koala animal nature + 🐼 panda animal nature panda + 🦥 sloth animal + 🦦 otter animal + 🦨 skunk animal + 🦘 kangaroo animal nature australia joey hop marsupial + 🦡 badger animal nature honey + 🐾 paw prints animal tracking footprints dog cat pet feet + 🦃 turkey animal bird + 🐔 chicken animal cluck nature bird + 🐓 rooster animal nature chicken + 🐣 hatching chick animal chicken egg born baby bird + 🐤 baby chick animal chicken bird + 🐥 front facing baby chick animal chicken baby bird + 🐦 bird animal nature fly tweet spring + 🐧 penguin animal nature + 🕊️ dove animal bird + 🦅 eagle animal nature bird + 🦆 duck animal nature bird mallard + 🦢 swan animal nature bird + 🦉 owl animal nature bird hoot + 🦩 flamingo animal + 🦚 peacock animal nature peahen bird + 🦜 parrot animal nature bird pirate talk + 🐸 frog animal nature croak toad + 🐊 crocodile animal nature reptile lizard alligator + 🐢 turtle animal slow nature tortoise + 🦎 lizard animal nature reptile + 🐍 snake animal evil nature hiss python + 🐲 dragon face animal myth nature chinese green + 🐉 dragon animal myth nature chinese green + 🦕 sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct + 🦖 t rex animal nature dinosaur tyrannosaurus extinct + 🐳 spouting whale animal nature sea ocean + 🐋 whale animal nature sea ocean + 🐬 dolphin animal nature fish sea ocean flipper fins beach + 🐟 fish animal food nature + 🐠 tropical fish animal swim ocean beach nemo + 🐡 blowfish animal nature food sea ocean + 🦈 shark animal nature fish sea ocean jaws fins beach + 🐙 octopus animal creature ocean sea nature beach + 🐚 spiral shell nature sea beach + 🐌 snail slow animal shell + 🦋 butterfly animal insect nature caterpillar + 🐛 bug animal insect nature worm + 🐜 ant animal insect nature bug + 🐝 honeybee animal insect nature bug spring honey + 🐞 lady beetle animal insect nature ladybug + 🦗 cricket animal cricket chirp + 🕷️ spider animal arachnid + 🕸️ spider web animal insect arachnid silk + 🦂 scorpion animal arachnid + 🦟 mosquito animal nature insect malaria + 🦠 microbe amoeba bacteria germs virus + 💐 bouquet flowers nature spring + 🌸 cherry blossom nature plant spring flower + 💮 white flower japanese spring + 🏵️ rosette flower decoration military + 🌹 rose flowers valentines love spring + 🥀 wilted flower plant nature flower + 🌺 hibiscus plant vegetable flowers beach + 🌻 sunflower nature plant fall + 🌼 blossom nature flowers yellow + 🌷 tulip flowers plant nature summer spring + 🌱 seedling plant nature grass lawn spring + 🌲 evergreen tree plant nature + 🌳 deciduous tree plant nature + 🌴 palm tree plant vegetable nature summer beach mojito tropical + 🌵 cactus vegetable plant nature + 🌾 sheaf of rice nature plant + 🌿 herb vegetable plant medicine weed grass lawn + ☘️ shamrock vegetable plant nature irish clover + 🍀 four leaf clover vegetable plant nature lucky irish + 🍁 maple leaf nature plant vegetable ca fall + 🍂 fallen leaf nature plant vegetable leaves + 🍃 leaf fluttering in wind nature plant tree vegetable grass lawn spring + 🍇 grapes fruit food wine + 🍈 melon fruit nature food + 🍉 watermelon fruit food picnic summer + 🍊 tangerine food fruit nature orange + 🍋 lemon fruit nature + 🍌 banana fruit food monkey + 🍍 pineapple fruit nature food + 🥭 mango fruit food tropical + 🍎 red apple fruit mac school + 🍏 green apple fruit nature + 🍐 pear fruit nature food + 🍑 peach fruit nature food + 🍒 cherries food fruit + 🍓 strawberry fruit food nature + 🥝 kiwi fruit fruit food + 🍅 tomato fruit vegetable nature food + 🥥 coconut fruit nature food palm + 🥑 avocado fruit food + 🍆 eggplant vegetable nature food aubergine + 🥔 potato food tuber vegatable starch + 🥕 carrot vegetable food orange + 🌽 ear of corn food vegetable plant + 🌶️ hot pepper food spicy chilli chili + 🥒 cucumber fruit food pickle + 🥬 leafy green food vegetable plant bok choy cabbage kale lettuce + 🥦 broccoli fruit food vegetable + 🧄 garlic food spice cook + 🧅 onion cook food spice + 🍄 mushroom plant vegetable + 🥜 peanuts food nut + 🌰 chestnut food squirrel + 🍞 bread food wheat breakfast toast + 🥐 croissant food bread french + 🥖 baguette bread food bread french + 🥨 pretzel food bread twisted + 🥯 bagel food bread bakery schmear + 🥞 pancakes food breakfast flapjacks hotcakes + 🧇 waffle food breakfast + 🧀 cheese wedge food chadder + 🍖 meat on bone good food drumstick + 🍗 poultry leg food meat drumstick bird chicken turkey + 🥩 cut of meat food cow meat cut chop lambchop porkchop + 🥓 bacon food breakfast pork pig meat + 🍔 hamburger meat fast food beef cheeseburger mcdonalds burger king + 🍟 french fries chips snack fast food + 🍕 pizza food party + 🌭 hot dog food frankfurter + 🥪 sandwich food lunch bread + 🌮 taco food mexican + 🌯 burrito food mexican + 🥙 stuffed flatbread food flatbread stuffed gyro + 🧆 falafel food + 🥚 egg food chicken breakfast + 🍳 cooking food breakfast kitchen egg + 🥘 shallow pan of food food cooking casserole paella + 🍲 pot of food food meat soup + 🥣 bowl with spoon food breakfast cereal oatmeal porridge + 🥗 green salad food healthy lettuce + 🍿 popcorn food movie theater films snack + 🧈 butter food cook + 🧂 salt condiment shaker + 🥫 canned food food soup + 🍱 bento box food japanese box + 🍘 rice cracker food japanese + 🍙 rice ball food japanese + 🍚 cooked rice food china asian + 🍛 curry rice food spicy hot indian + 🍜 steaming bowl food japanese noodle chopsticks + 🍝 spaghetti food italian noodle + 🍠 roasted sweet potato food nature + 🍢 oden food japanese + 🍣 sushi food fish japanese rice + 🍤 fried shrimp food animal appetizer summer + 🍥 fish cake with swirl food japan sea beach narutomaki pink swirl kamaboko surimi ramen + 🥮 moon cake food autumn + 🍡 dango food dessert sweet japanese barbecue meat + 🥟 dumpling food empanada pierogi potsticker + 🥠 fortune cookie food prophecy + 🥡 takeout box food leftovers + 🦀 crab animal crustacean + 🦞 lobster animal nature bisque claws seafood + 🦐 shrimp animal ocean nature seafood + 🦑 squid animal nature ocean sea + 🦪 oyster food + 🍦 soft ice cream food hot dessert summer + 🍧 shaved ice hot dessert summer + 🍨 ice cream food hot dessert + 🍩 doughnut food dessert snack sweet donut + 🍪 cookie food snack oreo chocolate sweet dessert + 🎂 birthday cake food dessert cake + 🍰 shortcake food dessert + 🧁 cupcake food dessert bakery sweet + 🥧 pie food dessert pastry + 🍫 chocolate bar food snack dessert sweet + 🍬 candy snack dessert sweet lolly + 🍭 lollipop food snack candy sweet + 🍮 custard dessert food + 🍯 honey pot bees sweet kitchen + 🍼 baby bottle food container milk + 🥛 glass of milk beverage drink cow + ☕ hot beverage beverage caffeine latte espresso coffee + 🍵 teacup without handle drink bowl breakfast green british + 🍶 sake wine drink drunk beverage japanese alcohol booze + 🍾 bottle with popping cork drink wine bottle celebration + 🍷 wine glass drink beverage drunk alcohol booze + 🍸 cocktail glass drink drunk alcohol beverage booze mojito + 🍹 tropical drink beverage cocktail summer beach alcohol booze mojito + 🍺 beer mug relax beverage drink drunk party pub summer alcohol booze + 🍻 clinking beer mugs relax beverage drink drunk party pub summer alcohol booze + 🥂 clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast + 🥃 tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky glass shot + 🥤 cup with straw drink soda + 🧃 beverage box drink + 🧉 mate drink tea beverage + 🧊 ice water cold + 🥢 chopsticks food + 🍽️ fork and knife with plate food eat meal lunch dinner restaurant + 🍴 fork and knife cutlery kitchen + 🥄 spoon cutlery kitchen tableware + 🔪 kitchen knife knife blade cutlery kitchen weapon + 🏺 amphora vase jar + 🌍 globe showing europe africa globe world international + 🌎 globe showing americas globe world USA international + 🌏 globe showing asia australia globe world east international + 🌐 globe with meridians earth international world internet interweb i18n + 🗺️ world map location direction + 🗾 map of japan nation country japanese asia + 🧭 compass magnetic navigation orienteering + 🏔️ snow capped mountain photo nature environment winter cold + ⛰️ mountain photo nature environment + 🌋 volcano photo nature disaster + 🗻 mount fuji photo mountain nature japanese + 🏕️ camping photo outdoors tent + 🏖️ beach with umbrella weather summer sunny sand mojito + 🏜️ desert photo warm saharah + 🏝️ desert island photo tropical mojito + 🏞️ national park photo environment nature + 🏟️ stadium photo place sports concert venue + 🏛️ classical building art culture history + 🏗️ building construction wip working progress + 🧱 brick bricks + 🏘️ houses buildings photo + 🏚️ derelict house abandon evict broken building + 🏠 house building home + 🏡 house with garden home plant nature + 🏢 office building building bureau work + 🏣 japanese post office building envelope communication + 🏤 post office building email + 🏥 hospital building health surgery doctor + 🏦 bank building money sales cash business enterprise + 🏨 hotel building accomodation checkin + 🏩 love hotel like affection dating + 🏪 convenience store building shopping groceries + 🏫 school building student education learn teach + 🏬 department store building shopping mall + 🏭 factory building industry pollution smoke + 🏯 japanese castle photo building + 🏰 castle building royalty history + 💒 wedding love like affection couple marriage bride groom + 🗼 tokyo tower photo japanese + 🗽 statue of liberty american newyork + ⛪ church building religion christ + 🕌 mosque islam worship minaret + 🛕 hindu temple religion + 🕍 synagogue judaism worship temple jewish + ⛩️ shinto shrine temple japan kyoto + 🕋 kaaba mecca mosque islam + ⛲ fountain photo summer water fresh + ⛺ tent photo camping outdoors + 🌁 foggy photo mountain + 🌃 night with stars evening city downtown + 🏙️ cityscape photo night life urban + 🌄 sunrise over mountains view vacation photo + 🌅 sunrise morning view vacation photo + 🌆 cityscape at dusk photo evening sky buildings + 🌇 sunset photo good morning dawn + 🌉 bridge at night photo sanfrancisco + ♨️ hot springs bath warm relax + 🎠 carousel horse photo carnival + 🎡 ferris wheel photo carnival londoneye + 🎢 roller coaster carnival playground photo fun + 💈 barber pole hair salon style + 🎪 circus tent festival carnival party + 🚂 locomotive transportation vehicle train + 🚃 railway car transportation vehicle + 🚄 high speed train transportation vehicle + 🚅 bullet train transportation vehicle speed fast public travel + 🚆 train transportation vehicle + 🚇 metro transportation blue-square mrt underground tube + 🚈 light rail transportation vehicle + 🚉 station transportation vehicle public + 🚊 tram transportation vehicle + 🚝 monorail transportation vehicle + 🚞 mountain railway transportation vehicle + 🚋 tram car transportation vehicle carriage public travel + 🚌 bus car vehicle transportation + 🚍 oncoming bus vehicle transportation + 🚎 trolleybus bart transportation vehicle + 🚐 minibus vehicle car transportation + 🚑 ambulance health 911 hospital + 🚒 fire engine transportation cars vehicle + 🚓 police car vehicle cars transportation law legal enforcement + 🚔 oncoming police car vehicle law legal enforcement 911 + 🚕 taxi uber vehicle cars transportation + 🚖 oncoming taxi vehicle cars uber + 🚗 automobile red transportation vehicle + 🚘 oncoming automobile car vehicle transportation + 🚙 sport utility vehicle transportation vehicle + 🚚 delivery truck cars transportation + 🚛 articulated lorry vehicle cars transportation express + 🚜 tractor vehicle car farming agriculture + 🏎️ racing car sports race fast formula f1 + 🏍️ motorcycle race sports fast + 🛵 motor scooter vehicle vespa sasha + 🦽 manual wheelchair accessibility + 🦼 motorized wheelchair accessibility + 🛺 auto rickshaw move transportation + 🚲 bicycle sports bicycle exercise hipster + 🛴 kick scooter vehicle kick razor + 🛹 skateboard board + 🚏 bus stop transportation wait + 🛣️ motorway road cupertino interstate highway + 🛤️ railway track train transportation + 🛢️ oil drum barrell + ⛽ fuel pump gas station petroleum + 🚨 police car light police ambulance 911 emergency alert error pinged law legal + 🚥 horizontal traffic light transportation signal + 🚦 vertical traffic light transportation driving + 🛑 stop sign stop + 🚧 construction wip progress caution warning + ⚓ anchor ship ferry sea boat + ⛵ sailboat ship summer transportation water sailing + 🛶 canoe boat paddle water ship + 🚤 speedboat ship transportation vehicle summer + 🛳️ passenger ship yacht cruise ferry + ⛴️ ferry boat ship yacht + 🛥️ motor boat ship + 🚢 ship transportation titanic deploy + ✈️ airplane vehicle transportation flight fly + 🛩️ small airplane flight transportation fly vehicle + 🛫 airplane departure airport flight landing + 🛬 airplane arrival airport flight boarding + 🪂 parachute fly glide + 💺 seat sit airplane transport bus flight fly + 🚁 helicopter transportation vehicle fly + 🚟 suspension railway vehicle transportation + 🚠 mountain cableway transportation vehicle ski + 🚡 aerial tramway transportation vehicle ski + 🛰️ satellite communication gps orbit spaceflight NASA ISS + 🚀 rocket launch ship staffmode NASA outer space outer space fly + 🛸 flying saucer transportation vehicle ufo + 🛎️ bellhop bell service + 🧳 luggage packing travel + ⌛ hourglass done time clock oldschool limit exam quiz test + ⏳ hourglass not done oldschool time countdown + ⌚ watch time accessories + ⏰ alarm clock time wake + ⏱️ stopwatch time deadline + ⏲️ timer clock alarm + 🕰️ mantelpiece clock time + 🕛 twelve o clock time noon midnight midday late early schedule + 🕧 twelve thirty time late early schedule + 🕐 one o clock time late early schedule + 🕜 one thirty time late early schedule + 🕑 two o clock time late early schedule + 🕝 two thirty time late early schedule + 🕒 three o clock time late early schedule + 🕞 three thirty time late early schedule + 🕓 four o clock time late early schedule + 🕟 four thirty time late early schedule + 🕔 five o clock time late early schedule + 🕠 five thirty time late early schedule + 🕕 six o clock time late early schedule dawn dusk + 🕡 six thirty time late early schedule + 🕖 seven o clock time late early schedule + 🕢 seven thirty time late early schedule + 🕗 eight o clock time late early schedule + 🕣 eight thirty time late early schedule + 🕘 nine o clock time late early schedule + 🕤 nine thirty time late early schedule + 🕙 ten o clock time late early schedule + 🕥 ten thirty time late early schedule + 🕚 eleven o clock time late early schedule + 🕦 eleven thirty time late early schedule + 🌑 new moon nature twilight planet space night evening sleep + 🌒 waxing crescent moon nature twilight planet space night evening sleep + 🌓 first quarter moon nature twilight planet space night evening sleep + 🌔 waxing gibbous moon nature night sky gray twilight planet space evening sleep + 🌕 full moon nature yellow twilight planet space night evening sleep + 🌖 waning gibbous moon nature twilight planet space night evening sleep waxing gibbous moon + 🌗 last quarter moon nature twilight planet space night evening sleep + 🌘 waning crescent moon nature twilight planet space night evening sleep + 🌙 crescent moon night sleep sky evening magic + 🌚 new moon face nature twilight planet space night evening sleep + 🌛 first quarter moon face nature twilight planet space night evening sleep + 🌜 last quarter moon face nature twilight planet space night evening sleep + 🌡️ thermometer weather temperature hot cold + ☀️ sun weather nature brightness summer beach spring + 🌝 full moon face nature twilight planet space night evening sleep + 🌞 sun with face nature morning sky + 🪐 ringed planet outerspace + ⭐ star night yellow + 🌟 glowing star night sparkle awesome good magic + 🌠 shooting star night photo + 🌌 milky way photo space stars + ☁️ cloud weather sky + ⛅ sun behind cloud weather nature cloudy morning fall spring + ⛈️ cloud with lightning and rain weather lightning + 🌤️ sun behind small cloud weather + 🌥️ sun behind large cloud weather + 🌦️ sun behind rain cloud weather + 🌧️ cloud with rain weather + 🌨️ cloud with snow weather + 🌩️ cloud with lightning weather thunder + 🌪️ tornado weather cyclone twister + 🌫️ fog weather + 🌬️ wind face gust air + 🌀 cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon + 🌈 rainbow nature happy unicorn face photo sky spring + 🌂 closed umbrella weather rain drizzle + ☂️ umbrella weather spring + ☔ umbrella with rain drops rainy weather spring + ⛱️ umbrella on ground weather summer + ⚡ high voltage thunder weather lightning bolt fast + ❄️ snowflake winter season cold weather christmas xmas + ☃️ snowman winter season cold weather christmas xmas frozen + ⛄ snowman without snow winter season cold weather christmas xmas frozen without snow + ☄️ comet space + 🔥 fire hot cook flame + 💧 droplet water drip faucet spring + 🌊 water wave sea water wave nature tsunami disaster + 🎃 jack o lantern halloween light pumpkin creepy fall + 🎄 christmas tree festival vacation december xmas celebration + 🎆 fireworks photo festival carnival congratulations + 🎇 sparkler stars night shine + 🧨 firecracker dynamite boom explode explosion explosive + ✨ sparkles stars shine shiny cool awesome good magic + 🎈 balloon party celebration birthday circus + 🎉 party popper party congratulations birthday magic circus celebration tada + 🎊 confetti ball festival party birthday circus + 🎋 tanabata tree plant nature branch summer + 🎍 pine decoration plant nature vegetable panda pine decoration + 🎎 japanese dolls japanese toy kimono + 🎏 carp streamer fish japanese koinobori carp banner + 🎐 wind chime nature ding spring bell + 🎑 moon viewing ceremony photo japan asia tsukimi + 🧧 red envelope gift + 🎀 ribbon decoration pink girl bowtie + 🎁 wrapped gift present birthday christmas xmas + 🎗️ reminder ribbon sports cause support awareness + 🎟️ admission tickets sports concert entrance + 🎫 ticket event concert pass + 🎖️ military medal award winning army + 🏆 trophy win award contest place ftw ceremony + 🏅 sports medal award winning + 🥇 1st place medal award winning first + 🥈 2nd place medal award second + 🥉 3rd place medal award third + ⚽ soccer ball sports football + ⚾ baseball sports balls + 🥎 softball sports balls + 🏀 basketball sports balls NBA + 🏐 volleyball sports balls + 🏈 american football sports balls NFL + 🏉 rugby football sports team + 🎾 tennis sports balls green + 🥏 flying disc sports frisbee ultimate + 🎳 bowling sports fun play + 🏏 cricket game sports + 🏑 field hockey sports + 🏒 ice hockey sports + 🥍 lacrosse sports ball stick + 🏓 ping pong sports pingpong + 🏸 badminton sports + 🥊 boxing glove sports fighting + 🥋 martial arts uniform judo karate taekwondo + 🥅 goal net sports + ⛳ flag in hole sports business flag hole summer + ⛸️ ice skate sports + 🎣 fishing pole food hobby summer + 🤿 diving mask sport ocean + 🎽 running shirt play pageant + 🎿 skis sports winter cold snow + 🛷 sled sleigh luge toboggan + 🥌 curling stone sports + 🎯 direct hit game play bar target bullseye + 🪀 yo yo toy + 🪁 kite wind fly + 🎱 pool 8 ball pool hobby game luck magic + 🔮 crystal ball disco party magic circus fortune teller + 🧿 nazar amulet bead charm + 🎮 video game play console PS4 controller + 🕹️ joystick game play + 🎰 slot machine bet gamble vegas fruit machine luck casino + 🎲 game die dice random tabletop play luck + 🧩 puzzle piece interlocking puzzle piece + 🧸 teddy bear plush stuffed + ♠️ spade suit poker cards suits magic + ♥️ heart suit poker cards magic suits + ♦️ diamond suit poker cards magic suits + ♣️ club suit poker cards magic suits + ♟️ chess pawn expendable + 🃏 joker poker cards game play magic + 🀄 mahjong red dragon game play chinese kanji + 🎴 flower playing cards game sunset red + 🎭 performing arts acting theater drama + 🖼️ framed picture photography + 🎨 artist palette design paint draw colors + 🧵 thread needle sewing spool string + 🧶 yarn ball crochet knit + 👓 glasses fashion accessories eyesight nerdy dork geek + 🕶️ sunglasses face cool accessories + 🥽 goggles eyes protection safety + 🥼 lab coat doctor experiment scientist chemist + 🦺 safety vest protection + 👔 necktie shirt suitup formal fashion cloth business + 👕 t shirt fashion cloth casual shirt tee + 👖 jeans fashion shopping + 🧣 scarf neck winter clothes + 🧤 gloves hands winter clothes + 🧥 coat jacket + 🧦 socks stockings clothes + 👗 dress clothes fashion shopping + 👘 kimono dress fashion women female japanese + 🥻 sari dress + 🩱 one piece swimsuit fashion + 🩲 briefs clothing + 🩳 shorts clothing + 👙 bikini swimming female woman girl fashion beach summer + 👚 woman s clothes fashion shopping bags female + 👛 purse fashion accessories money sales shopping + 👜 handbag fashion accessory accessories shopping + 👝 clutch bag bag accessories shopping + 🛍️ shopping bags mall buy purchase + 🎒 backpack student education bag backpack + 👞 man s shoe fashion male + 👟 running shoe shoes sports sneakers + 🥾 hiking boot backpacking camping hiking + 🥿 flat shoe ballet slip-on slipper + 👠 high heeled shoe fashion shoes female pumps stiletto + 👡 woman s sandal shoes fashion flip flops + 🩰 ballet shoes dance + 👢 woman s boot shoes fashion + 👑 crown king kod leader royalty lord + 👒 woman s hat fashion accessories female lady spring + 🎩 top hat magic gentleman classy circus + 🎓 graduation cap school college degree university graduation cap hat legal learn education + 🧢 billed cap cap baseball + ⛑️ rescue worker s helmet construction build + 📿 prayer beads dhikr religious + 💄 lipstick female girl fashion woman + 💍 ring wedding propose marriage valentines diamond fashion jewelry gem engagement + 💎 gem stone blue ruby diamond jewelry + 🔇 muted speaker sound volume silence quiet + 🔈 speaker low volume sound volume silence broadcast + 🔉 speaker medium volume volume speaker broadcast + 🔊 speaker high volume volume noise noisy speaker broadcast + 📢 loudspeaker volume sound + 📣 megaphone sound speaker volume + 📯 postal horn instrument music + 🔔 bell sound notification christmas xmas chime + 🔕 bell with slash sound volume mute quiet silent + 🎼 musical score treble clef compose + 🎵 musical note score tone sound + 🎶 musical notes music score + 🎙️ studio microphone sing recording artist talkshow + 🎚️ level slider scale + 🎛️ control knobs dial + 🎤 microphone sound music PA sing talkshow + 🎧 headphone music score gadgets + 📻 radio communication music podcast program + 🎷 saxophone music instrument jazz blues + 🎸 guitar music instrument + 🎹 musical keyboard piano instrument compose + 🎺 trumpet music brass + 🎻 violin music instrument orchestra symphony + 🪕 banjo music instructment + 🥁 drum music instrument drumsticks snare + 📱 mobile phone technology apple gadgets dial + 📲 mobile phone with arrow iphone incoming + ☎️ telephone technology communication dial telephone + 📞 telephone receiver technology communication dial + 📟 pager bbcall oldschool 90s + 📠 fax machine communication technology + 🔋 battery power energy sustain + 🔌 electric plug charger power + 💻 laptop technology laptop screen display monitor + 🖥️ desktop computer technology computing screen + 🖨️ printer paper ink + ⌨️ keyboard technology computer type input text + 🖱️ computer mouse click + 🖲️ trackball technology trackpad + 💽 computer disk technology record data disk 90s + 💾 floppy disk oldschool technology save 90s 80s + 💿 optical disk technology dvd disk disc 90s + 📀 dvd cd disk disc + 🧮 abacus calculation + 🎥 movie camera film record + 🎞️ film frames movie + 📽️ film projector video tape record movie + 🎬 clapper board movie film record + 📺 television technology program oldschool show television + 📷 camera gadgets photography + 📸 camera with flash photography gadgets + 📹 video camera film record + 📼 videocassette record video oldschool 90s 80s + 🔍 magnifying glass tilted left search zoom find detective + 🔎 magnifying glass tilted right search zoom find detective + 🕯️ candle fire wax + 💡 light bulb light electricity idea + 🔦 flashlight dark camping sight night + 🏮 red paper lantern light paper halloween spooky + 🪔 diya lamp lighting + 📔 notebook with decorative cover classroom notes record paper study + 📕 closed book read library knowledge textbook learn + 📖 open book book read library knowledge literature learn study + 📗 green book read library knowledge study + 📘 blue book read library knowledge learn study + 📙 orange book read library knowledge textbook study + 📚 books literature library study + 📓 notebook stationery record notes paper study + 📒 ledger notes paper + 📃 page with curl documents office paper + 📜 scroll documents ancient history paper + 📄 page facing up documents office paper information + 📰 newspaper press headline + 🗞️ rolled up newspaper press headline + 📑 bookmark tabs favorite save order tidy + 🔖 bookmark favorite label save + 🏷️ label sale tag + 💰 money bag dollar payment coins sale + 💴 yen banknote money sales japanese dollar currency + 💵 dollar banknote money sales bill currency + 💶 euro banknote money sales dollar currency + 💷 pound banknote british sterling money sales bills uk england currency + 💸 money with wings dollar bills payment sale + 💳 credit card money sales dollar bill payment shopping + 🧾 receipt accounting expenses + 💹 chart increasing with yen green-square graph presentation stats + 💱 currency exchange money sales dollar travel + 💲 heavy dollar sign money sales payment currency buck + ✉️ envelope letter postal inbox communication + 📧 e mail communication inbox + 📨 incoming envelope email inbox + 📩 envelope with arrow email communication + 📤 outbox tray inbox email + 📥 inbox tray email documents + 📦 package mail gift cardboard box moving + 📫 closed mailbox with raised flag email inbox communication + 📪 closed mailbox with lowered flag email communication inbox + 📬 open mailbox with raised flag email inbox communication + 📭 open mailbox with lowered flag email inbox + 📮 postbox email letter envelope + 🗳️ ballot box with ballot election vote + ✏️ pencil stationery write paper writing school study + ✒️ black nib pen stationery writing write + 🖋️ fountain pen stationery writing write + 🖊️ pen stationery writing write + 🖌️ paintbrush drawing creativity art + 🖍️ crayon drawing creativity + 📝 memo write documents stationery pencil paper writing legal exam quiz test study compose + 💼 briefcase business documents work law legal job career + 📁 file folder documents business office + 📂 open file folder documents load + 🗂️ card index dividers organizing business stationery + 📅 calendar calendar schedule + 📆 tear off calendar schedule date planning + 🗒️ spiral notepad memo stationery + 🗓️ spiral calendar date schedule planning + 📇 card index business stationery + 📈 chart increasing graph presentation stats recovery business economics money sales good success + 📉 chart decreasing graph presentation stats recession business economics money sales bad failure + 📊 bar chart graph presentation stats + 📋 clipboard stationery documents + 📌 pushpin stationery mark here + 📍 round pushpin stationery location map here + 📎 paperclip documents stationery + 🖇️ linked paperclips documents stationery + 📏 straight ruler stationery calculate length math school drawing architect sketch + 📐 triangular ruler stationery math architect sketch + ✂️ scissors stationery cut + 🗃️ card file box business stationery + 🗄️ file cabinet filing organizing + 🗑️ wastebasket bin trash rubbish garbage toss + 🔒 locked security password padlock + 🔓 unlocked privacy security + 🔏 locked with pen security secret + 🔐 locked with key security privacy + 🔑 key lock door password + 🗝️ old key lock door password + 🔨 hammer tools build create + 🪓 axe tool chop cut + ⛏️ pick tools dig + ⚒️ hammer and pick tools build create + 🛠️ hammer and wrench tools build create + 🗡️ dagger weapon + ⚔️ crossed swords weapon + 🔫 pistol violence weapon pistol revolver + 🏹 bow and arrow sports + 🛡️ shield protection security + 🔧 wrench tools diy ikea fix maintainer + 🔩 nut and bolt handy tools fix + ⚙️ gear cog + 🗜️ clamp tool + ⚖️ balance scale law fairness weight + 🦯 probing cane accessibility + 🔗 link rings url + ⛓️ chains lock arrest + 🧰 toolbox tools diy fix maintainer mechanic + 🧲 magnet attraction magnetic + ⚗️ alembic distilling science experiment chemistry + 🧪 test tube chemistry experiment lab science + 🧫 petri dish bacteria biology culture lab + 🧬 dna biologist genetics life + 🔬 microscope laboratory experiment zoomin science study + 🔭 telescope stars space zoom science astronomy + 📡 satellite antenna communication future radio space + 💉 syringe health hospital drugs blood medicine needle doctor nurse + 🩸 drop of blood period hurt harm wound + 💊 pill health medicine doctor pharmacy drug + 🩹 adhesive bandage heal + 🩺 stethoscope health + 🚪 door house entry exit + 🛏️ bed sleep rest + 🛋️ couch and lamp read chill + 🪑 chair sit furniture + 🚽 toilet restroom wc washroom bathroom potty + 🚿 shower clean water bathroom + 🛁 bathtub clean shower bathroom + 🪒 razor cut + 🧴 lotion bottle moisturizer sunscreen + 🧷 safety pin diaper + 🧹 broom cleaning sweeping witch + 🧺 basket laundry + 🧻 roll of paper roll + 🧼 soap bar bathing cleaning lather + 🧽 sponge absorbing cleaning porous + 🧯 fire extinguisher quench + 🛒 shopping cart trolley + 🚬 cigarette kills tobacco cigarette joint smoke + ⚰️ coffin vampire dead die death rip graveyard cemetery casket funeral box + ⚱️ funeral urn dead die death rip ashes + 🗿 moai rock easter island moai + 🏧 atm sign money sales cash blue-square payment bank + 🚮 litter in bin sign blue-square sign human info + 🚰 potable water blue-square liquid restroom cleaning faucet + ♿ wheelchair symbol blue-square disabled accessibility + 🚹 men s room toilet restroom wc blue-square gender male + 🚺 women s room purple-square woman female toilet loo restroom gender + 🚻 restroom blue-square toilet refresh wc gender + 🚼 baby symbol orange-square child + 🚾 water closet toilet restroom blue-square + 🛂 passport control custom blue-square + 🛃 customs passport border blue-square + 🛄 baggage claim blue-square airport transport + 🛅 left luggage blue-square travel + ⚠️ warning exclamation wip alert error problem issue + 🚸 children crossing school warning danger sign driving yellow-diamond + ⛔ no entry limit security privacy bad denied stop circle + 🚫 prohibited forbid stop limit denied disallow circle + 🚳 no bicycles cyclist prohibited circle + 🚭 no smoking cigarette blue-square smell smoke + 🚯 no littering trash bin garbage circle + 🚱 non potable water drink faucet tap circle + 🚷 no pedestrians rules crossing walking circle + 📵 no mobile phones iphone mute circle + 🔞 no one under eighteen 18 drink pub night minor circle + ☢️ radioactive nuclear danger + ☣️ biohazard danger + ⬆️ up arrow blue-square continue top direction + ↗️ up right arrow blue-square point direction diagonal northeast + ➡️ right arrow blue-square next + ↘️ down right arrow blue-square direction diagonal southeast + ⬇️ down arrow blue-square direction bottom + ↙️ down left arrow blue-square direction diagonal southwest + ⬅️ left arrow blue-square previous back + ↖️ up left arrow blue-square point direction diagonal northwest + ↕️ up down arrow blue-square direction way vertical + ↔️ left right arrow shape direction horizontal sideways + ↩️ right arrow curving left back return blue-square undo enter + ↪️ left arrow curving right blue-square return rotate direction + ⤴️ right arrow curving up blue-square direction top + ⤵️ right arrow curving down blue-square direction bottom + 🔃 clockwise vertical arrows sync cycle round repeat + 🔄 counterclockwise arrows button blue-square sync cycle + 🔙 back arrow arrow words return + 🔚 end arrow words arrow + 🔛 on arrow arrow words + 🔜 soon arrow arrow words + 🔝 top arrow words blue-square + 🛐 place of worship religion church temple prayer + ⚛️ atom symbol science physics chemistry + 🕉️ om hinduism buddhism sikhism jainism + ✡️ star of david judaism + ☸️ wheel of dharma hinduism buddhism sikhism jainism + ☯️ yin yang balance + ✝️ latin cross christianity + ☦️ orthodox cross suppedaneum religion + ☪️ star and crescent islam + ☮️ peace symbol hippie + 🕎 menorah hanukkah candles jewish + 🔯 dotted six pointed star purple-square religion jewish hexagram + ♈ aries sign purple-square zodiac astrology + ♉ taurus purple-square sign zodiac astrology + ♊ gemini sign zodiac purple-square astrology + ♋ cancer sign zodiac purple-square astrology + ♌ leo sign purple-square zodiac astrology + ♍ virgo sign zodiac purple-square astrology + ♎ libra sign purple-square zodiac astrology + ♏ scorpio sign zodiac purple-square astrology scorpio + ♐ sagittarius sign zodiac purple-square astrology + ♑ capricorn sign zodiac purple-square astrology + ♒ aquarius sign purple-square zodiac astrology + ♓ pisces purple-square sign zodiac astrology + ⛎ ophiuchus sign purple-square constellation astrology + 🔀 shuffle tracks button blue-square shuffle music random + 🔁 repeat button loop record + 🔂 repeat single button blue-square loop + ▶️ play button blue-square right direction play + ⏩ fast forward button blue-square play speed continue + ⏭️ next track button forward next blue-square + ⏯️ play or pause button blue-square play pause + ◀️ reverse button blue-square left direction + ⏪ fast reverse button play blue-square + ⏮️ last track button backward + 🔼 upwards button blue-square triangle direction point forward top + ⏫ fast up button blue-square direction top + 🔽 downwards button blue-square direction bottom + ⏬ fast down button blue-square direction bottom + ⏸️ pause button pause blue-square + ⏹️ stop button blue-square + ⏺️ record button blue-square + ⏏️ eject button blue-square + 🎦 cinema blue-square record film movie curtain stage theater + 🔅 dim button sun afternoon warm summer + 🔆 bright button sun light + 📶 antenna bars blue-square reception phone internet connection wifi bluetooth bars + 📳 vibration mode orange-square phone + 📴 mobile phone off mute orange-square silence quiet + ♀️ female sign woman women lady girl + ♂️ male sign man boy men + ⚕️ medical symbol health hospital + ♾️ infinity forever + ♻️ recycling symbol arrow environment garbage trash + ⚜️ fleur de lis decorative scout + 🔱 trident emblem weapon spear + 📛 name badge fire forbid + 🔰 japanese symbol for beginner badge shield + ⭕ hollow red circle circle round + ✅ check mark button green-square ok agree vote election answer tick + ☑️ check box with check ok agree confirm black-square vote election yes tick + ✔️ check mark ok nike answer yes tick + ✖️ multiplication sign math calculation + ❌ cross mark no delete remove cancel red + ❎ cross mark button x green-square no deny + ➕ plus sign math calculation addition more increase + ➖ minus sign math calculation subtract less + ➗ division sign divide math calculation + ➰ curly loop scribble draw shape squiggle + ➿ double curly loop tape cassette + 〽️ part alternation mark graph presentation stats business economics bad + ✳️ eight spoked asterisk star sparkle green-square + ✴️ eight pointed star orange-square shape polygon + ❇️ sparkle stars green-square awesome good fireworks + ‼️ double exclamation mark exclamation surprise + ⁉️ exclamation question mark wat punctuation surprise + ❓ question mark doubt confused + ❔ white question mark doubts gray huh confused + ❕ white exclamation mark surprise punctuation gray wow warning + ❗ exclamation mark heavy exclamation mark danger surprise punctuation wow warning + 〰️ wavy dash draw line moustache mustache squiggle scribble + ©️ copyright ip license circle law legal + ®️ registered alphabet circle + ™️ trade mark trademark brand law legal + ycap symbol blue-square twitter + *️⃣ keycap star keycap + 0️⃣ keycap 0 0 numbers blue-square null + 1️⃣ keycap 1 blue-square numbers 1 + 2️⃣ keycap 2 numbers 2 prime blue-square + 3️⃣ keycap 3 3 numbers prime blue-square + 4️⃣ keycap 4 4 numbers blue-square + 5️⃣ keycap 5 5 numbers blue-square prime + 6️⃣ keycap 6 6 numbers blue-square + 7️⃣ keycap 7 7 numbers blue-square prime + 8️⃣ keycap 8 8 blue-square numbers + 9️⃣ keycap 9 blue-square numbers 9 + 🔟 keycap 10 numbers 10 blue-square + 🔠 input latin uppercase alphabet words blue-square + 🔡 input latin lowercase blue-square alphabet + 🔢 input numbers numbers blue-square + 🔣 input symbols blue-square music note ampersand percent glyphs characters + 🔤 input latin letters blue-square alphabet + 🅰️ a button red-square alphabet letter + 🆎 ab button red-square alphabet + 🅱️ b button red-square alphabet letter + 🆑 cl button alphabet words red-square + 🆒 cool button words blue-square + 🆓 free button blue-square words + ℹ️ information blue-square alphabet letter + 🆔 id button purple-square words + Ⓜ️ circled m alphabet blue-circle letter + 🆕 new button blue-square words start + 🆖 ng button blue-square words shape icon + 🅾️ o button alphabet red-square letter + 🆗 ok button good agree yes blue-square + 🅿️ p button cars blue-square alphabet letter + 🆘 sos button help red-square words emergency 911 + 🆙 up button blue-square above high + 🆚 vs button words orange-square + 🈁 japanese here button blue-square here katakana japanese destination + 🈂️ japanese service charge button japanese blue-square katakana + 🈷️ japanese monthly amount button chinese month moon japanese orange-square kanji + 🈶 japanese not free of charge button orange-square chinese have kanji + 🈯 japanese reserved button chinese point green-square kanji + 🉐 japanese bargain button chinese kanji obtain get circle + 🈹 japanese discount button cut divide chinese kanji pink-square + 🈚 japanese free of charge button nothing chinese kanji japanese orange-square + 🈲 japanese prohibited button kanji japanese chinese forbidden limit restricted red-square + 🉑 japanese acceptable button ok good chinese kanji agree yes orange-circle + 🈸 japanese application button chinese japanese kanji orange-square + 🈴 japanese passing grade button japanese chinese join kanji red-square + 🈳 japanese vacancy button kanji japanese chinese empty sky blue-square + ㊗️ japanese congratulations button chinese kanji japanese red-circle + ㊙️ japanese secret button privacy chinese sshh kanji red-circle + 🈺 japanese open for business button japanese opening hours orange-square + 🈵 japanese no vacancy button full chinese japanese red-square kanji + 🔴 red circle shape error danger + 🟠 orange circle round + 🟡 yellow circle round + 🟢 green circle round + 🔵 blue circle shape icon button + 🟣 purple circle round + 🟤 brown circle round + ⚫ black circle shape button round + ⚪ white circle shape round + 🟥 red square + 🟧 orange square + 🟨 yellow square + 🟩 green square + 🟦 blue square + 🟪 purple square + 🟫 brown square + ⬛ black large square shape icon button + ⬜ white large square shape icon stone button + ◼️ black medium square shape button icon + ◻️ white medium square shape stone icon + ◾ black medium small square icon shape button + ◽ white medium small square shape stone icon button + ▪️ black small square shape icon + ▫️ white small square shape icon + 🔶 large orange diamond shape jewel gem + 🔷 large blue diamond shape jewel gem + 🔸 small orange diamond shape jewel gem + 🔹 small blue diamond shape jewel gem + 🔺 red triangle pointed up shape direction up top + 🔻 red triangle pointed down shape direction bottom + 💠 diamond with a dot jewel blue gem crystal fancy + 🔘 radio button input old music circle + 🔳 white square button shape input + 🔲 black square button shape input frame + 🏁 chequered flag contest finishline race gokart + 🚩 triangular flag mark milestone place + 🎌 crossed flags japanese nation country border + 🏴 black flag pirate + 🏳️ white flag losing loser lost surrender give up fail + 🏳️‍🌈 rainbow flag flag rainbow pride gay lgbt glbt queer homosexual lesbian bisexual transgender + 🏴‍☠️ pirate flag skull crossbones flag banner + 🇦🇨 flag ascension island + 🇦🇩 flag andorra ad flag nation country banner andorra + 🇦🇪 flag united arab emirates united arab emirates flag nation country banner united arab emirates + 🇦🇫 flag afghanistan af flag nation country banner afghanistan + 🇦🇬 flag antigua barbuda antigua barbuda flag nation country banner antigua barbuda + 🇦🇮 flag anguilla ai flag nation country banner anguilla + 🇦🇱 flag albania al flag nation country banner albania + 🇦🇲 flag armenia am flag nation country banner armenia + 🇦🇴 flag angola ao flag nation country banner angola + 🇦🇶 flag antarctica aq flag nation country banner antarctica + 🇦🇷 flag argentina ar flag nation country banner argentina + 🇦🇸 flag american samoa american ws flag nation country banner american samoa + 🇦🇹 flag austria at flag nation country banner austria + 🇦🇺 flag australia au flag nation country banner australia + 🇦🇼 flag aruba aw flag nation country banner aruba + 🇦🇽 flag aland islands Åland islands flag nation country banner aland islands + 🇦🇿 flag azerbaijan az flag nation country banner azerbaijan + 🇧🇦 flag bosnia herzegovina bosnia herzegovina flag nation country banner bosnia herzegovina + 🇧🇧 flag barbados bb flag nation country banner barbados + 🇧🇩 flag bangladesh bd flag nation country banner bangladesh + 🇧🇪 flag belgium be flag nation country banner belgium + 🇧🇫 flag burkina faso burkina faso flag nation country banner burkina faso + 🇧🇬 flag bulgaria bg flag nation country banner bulgaria + 🇧🇭 flag bahrain bh flag nation country banner bahrain + 🇧🇮 flag burundi bi flag nation country banner burundi + 🇧🇯 flag benin bj flag nation country banner benin + 🇧🇱 flag st barthelemy saint barthélemy flag nation country banner st barthelemy + 🇧🇲 flag bermuda bm flag nation country banner bermuda + 🇧🇳 flag brunei bn darussalam flag nation country banner brunei + 🇧🇴 flag bolivia bo flag nation country banner bolivia + 🇧🇶 flag caribbean netherlands bonaire flag nation country banner caribbean netherlands + 🇧🇷 flag brazil br flag nation country banner brazil + 🇧🇸 flag bahamas bs flag nation country banner bahamas + 🇧🇹 flag bhutan bt flag nation country banner bhutan + 🇧🇻 flag bouvet island norway + 🇧🇼 flag botswana bw flag nation country banner botswana + 🇧🇾 flag belarus by flag nation country banner belarus + 🇧🇿 flag belize bz flag nation country banner belize + 🇨🇦 flag canada ca flag nation country banner canada + 🇨🇨 flag cocos islands cocos keeling islands flag nation country banner cocos islands + 🇨🇩 flag congo kinshasa congo democratic republic flag nation country banner congo kinshasa + 🇨🇫 flag central african republic central african republic flag nation country banner central african republic + 🇨🇬 flag congo brazzaville congo flag nation country banner congo brazzaville + 🇨🇭 flag switzerland ch flag nation country banner switzerland + 🇨🇮 flag cote d ivoire ivory coast flag nation country banner cote d ivoire + 🇨🇰 flag cook islands cook islands flag nation country banner cook islands + 🇨🇱 flag chile flag nation country banner chile + 🇨🇲 flag cameroon cm flag nation country banner cameroon + 🇨🇳 flag china china chinese prc flag country nation banner china + 🇨🇴 flag colombia co flag nation country banner colombia + 🇨🇵 flag clipperton island + 🇨🇷 flag costa rica costa rica flag nation country banner costa rica + 🇨🇺 flag cuba cu flag nation country banner cuba + 🇨🇻 flag cape verde cabo verde flag nation country banner cape verde + 🇨🇼 flag curacao curaçao flag nation country banner curacao + 🇨🇽 flag christmas island christmas island flag nation country banner christmas island + 🇨🇾 flag cyprus cy flag nation country banner cyprus + 🇨🇿 flag czechia cz flag nation country banner czechia + 🇩🇪 flag germany german nation flag country banner germany + 🇩🇬 flag diego garcia + 🇩🇯 flag djibouti dj flag nation country banner djibouti + 🇩🇰 flag denmark dk flag nation country banner denmark + 🇩🇲 flag dominica dm flag nation country banner dominica + 🇩🇴 flag dominican republic dominican republic flag nation country banner dominican republic + 🇩🇿 flag algeria dz flag nation country banner algeria + 🇪🇦 flag ceuta melilla + 🇪🇨 flag ecuador ec flag nation country banner ecuador + 🇪🇪 flag estonia ee flag nation country banner estonia + 🇪🇬 flag egypt eg flag nation country banner egypt + 🇪🇭 flag western sahara western sahara flag nation country banner western sahara + 🇪🇷 flag eritrea er flag nation country banner eritrea + 🇪🇸 flag spain spain flag nation country banner spain + 🇪🇹 flag ethiopia et flag nation country banner ethiopia + 🇪🇺 flag european union european union flag banner + 🇫🇮 flag finland fi flag nation country banner finland + 🇫🇯 flag fiji fj flag nation country banner fiji + 🇫🇰 flag falkland islands falkland islands malvinas flag nation country banner falkland islands + 🇫🇲 flag micronesia micronesia federated states flag nation country banner micronesia + 🇫🇴 flag faroe islands faroe islands flag nation country banner faroe islands + 🇫🇷 flag france banner flag nation france french country france + 🇬🇦 flag gabon ga flag nation country banner gabon + 🇬🇧 flag united kingdom united kingdom great britain northern ireland flag nation country banner british UK english england union jack united kingdom + 🇬🇩 flag grenada gd flag nation country banner grenada + 🇬🇪 flag georgia ge flag nation country banner georgia + 🇬🇫 flag french guiana french guiana flag nation country banner french guiana + 🇬🇬 flag guernsey gg flag nation country banner guernsey + 🇬🇭 flag ghana gh flag nation country banner ghana + 🇬🇮 flag gibraltar gi flag nation country banner gibraltar + 🇬🇱 flag greenland gl flag nation country banner greenland + 🇬🇲 flag gambia gm flag nation country banner gambia + 🇬🇳 flag guinea gn flag nation country banner guinea + 🇬🇵 flag guadeloupe gp flag nation country banner guadeloupe + 🇬🇶 flag equatorial guinea equatorial gn flag nation country banner equatorial guinea + 🇬🇷 flag greece gr flag nation country banner greece + 🇬🇸 flag south georgia south sandwich islands south georgia sandwich islands flag nation country banner south georgia south sandwich islands + 🇬🇹 flag guatemala gt flag nation country banner guatemala + 🇬🇺 flag guam gu flag nation country banner guam + 🇬🇼 flag guinea bissau gw bissau flag nation country banner guinea bissau + 🇬🇾 flag guyana gy flag nation country banner guyana + 🇭🇰 flag hong kong sar china hong kong flag nation country banner hong kong sar china + 🇭🇲 flag heard mcdonald islands + 🇭🇳 flag honduras hn flag nation country banner honduras + 🇭🇷 flag croatia hr flag nation country banner croatia + 🇭🇹 flag haiti ht flag nation country banner haiti + 🇭🇺 flag hungary hu flag nation country banner hungary + 🇮🇨 flag canary islands canary islands flag nation country banner canary islands + 🇮🇩 flag indonesia flag nation country banner indonesia + 🇮🇪 flag ireland ie flag nation country banner ireland + 🇮🇱 flag israel il flag nation country banner israel + 🇮🇲 flag isle of man isle man flag nation country banner isle of man + 🇮🇳 flag india in flag nation country banner india + 🇮🇴 flag british indian ocean territory british indian ocean territory flag nation country banner british indian ocean territory + 🇮🇶 flag iraq iq flag nation country banner iraq + 🇮🇷 flag iran iran islamic republic flag nation country banner iran + 🇮🇸 flag iceland is flag nation country banner iceland + 🇮🇹 flag italy italy flag nation country banner italy + 🇯🇪 flag jersey je flag nation country banner jersey + 🇯🇲 flag jamaica jm flag nation country banner jamaica + 🇯🇴 flag jordan jo flag nation country banner jordan + 🇯🇵 flag japan japanese nation flag country banner japan + 🇰🇪 flag kenya ke flag nation country banner kenya + 🇰🇬 flag kyrgyzstan kg flag nation country banner kyrgyzstan + 🇰🇭 flag cambodia kh flag nation country banner cambodia + 🇰🇮 flag kiribati ki flag nation country banner kiribati + 🇰🇲 flag comoros km flag nation country banner comoros + 🇰🇳 flag st kitts nevis saint kitts nevis flag nation country banner st kitts nevis + 🇰🇵 flag north korea north korea nation flag country banner north korea + 🇰🇷 flag south korea south korea nation flag country banner south korea + 🇰🇼 flag kuwait kw flag nation country banner kuwait + 🇰🇾 flag cayman islands cayman islands flag nation country banner cayman islands + 🇰🇿 flag kazakhstan kz flag nation country banner kazakhstan + 🇱🇦 flag laos lao democratic republic flag nation country banner laos + 🇱🇧 flag lebanon lb flag nation country banner lebanon + 🇱🇨 flag st lucia saint lucia flag nation country banner st lucia + 🇱🇮 flag liechtenstein li flag nation country banner liechtenstein + 🇱🇰 flag sri lanka sri lanka flag nation country banner sri lanka + 🇱🇷 flag liberia lr flag nation country banner liberia + 🇱🇸 flag lesotho ls flag nation country banner lesotho + 🇱🇹 flag lithuania lt flag nation country banner lithuania + 🇱🇺 flag luxembourg lu flag nation country banner luxembourg + 🇱🇻 flag latvia lv flag nation country banner latvia + 🇱🇾 flag libya ly flag nation country banner libya + 🇲🇦 flag morocco ma flag nation country banner morocco + 🇲🇨 flag monaco mc flag nation country banner monaco + 🇲🇩 flag moldova moldova republic flag nation country banner moldova + 🇲🇪 flag montenegro me flag nation country banner montenegro + 🇲🇫 flag st martin + 🇲🇬 flag madagascar mg flag nation country banner madagascar + 🇲🇭 flag marshall islands marshall islands flag nation country banner marshall islands + 🇲🇰 flag north macedonia macedonia flag nation country banner north macedonia + 🇲🇱 flag mali ml flag nation country banner mali + 🇲🇲 flag myanmar mm flag nation country banner myanmar + 🇲🇳 flag mongolia mn flag nation country banner mongolia + 🇲🇴 flag macao sar china macao flag nation country banner macao sar china + 🇲🇵 flag northern mariana islands northern mariana islands flag nation country banner northern mariana islands + 🇲🇶 flag martinique mq flag nation country banner martinique + 🇲🇷 flag mauritania mr flag nation country banner mauritania + 🇲🇸 flag montserrat ms flag nation country banner montserrat + 🇲🇹 flag malta mt flag nation country banner malta + 🇲🇺 flag mauritius mu flag nation country banner mauritius + 🇲🇻 flag maldives mv flag nation country banner maldives + 🇲🇼 flag malawi mw flag nation country banner malawi + 🇲🇽 flag mexico mx flag nation country banner mexico + 🇲🇾 flag malaysia my flag nation country banner malaysia + 🇲🇿 flag mozambique mz flag nation country banner mozambique + 🇳🇦 flag namibia na flag nation country banner namibia + 🇳🇨 flag new caledonia new caledonia flag nation country banner new caledonia + 🇳🇪 flag niger ne flag nation country banner niger + 🇳🇫 flag norfolk island norfolk island flag nation country banner norfolk island + 🇳🇬 flag nigeria flag nation country banner nigeria + 🇳🇮 flag nicaragua ni flag nation country banner nicaragua + 🇳🇱 flag netherlands nl flag nation country banner netherlands + 🇳🇴 flag norway no flag nation country banner norway + 🇳🇵 flag nepal np flag nation country banner nepal + 🇳🇷 flag nauru nr flag nation country banner nauru + 🇳🇺 flag niue nu flag nation country banner niue + 🇳🇿 flag new zealand new zealand flag nation country banner new zealand + 🇴🇲 flag oman om symbol flag nation country banner oman + 🇵🇦 flag panama pa flag nation country banner panama + 🇵🇪 flag peru pe flag nation country banner peru + 🇵🇫 flag french polynesia french polynesia flag nation country banner french polynesia + 🇵🇬 flag papua new guinea papua new guinea flag nation country banner papua new guinea + 🇵🇭 flag philippines ph flag nation country banner philippines + 🇵🇰 flag pakistan pk flag nation country banner pakistan + 🇵🇱 flag poland pl flag nation country banner poland + 🇵🇲 flag st pierre miquelon saint pierre miquelon flag nation country banner st pierre miquelon + 🇵🇳 flag pitcairn islands pitcairn flag nation country banner pitcairn islands + 🇵🇷 flag puerto rico puerto rico flag nation country banner puerto rico + 🇵🇸 flag palestinian territories palestine palestinian territories flag nation country banner palestinian territories + 🇵🇹 flag portugal pt flag nation country banner portugal + 🇵🇼 flag palau pw flag nation country banner palau + 🇵🇾 flag paraguay py flag nation country banner paraguay + 🇶🇦 flag qatar qa flag nation country banner qatar + 🇷🇪 flag reunion réunion flag nation country banner reunion + 🇷🇴 flag romania ro flag nation country banner romania + 🇷🇸 flag serbia rs flag nation country banner serbia + 🇷🇺 flag russia russian federation flag nation country banner russia + 🇷🇼 flag rwanda rw flag nation country banner rwanda + 🇸🇦 flag saudi arabia flag nation country banner saudi arabia + 🇸🇧 flag solomon islands solomon islands flag nation country banner solomon islands + 🇸🇨 flag seychelles sc flag nation country banner seychelles + 🇸🇩 flag sudan sd flag nation country banner sudan + 🇸🇪 flag sweden se flag nation country banner sweden + 🇸🇬 flag singapore sg flag nation country banner singapore + 🇸🇭 flag st helena saint helena ascension tristan cunha flag nation country banner st helena + 🇸🇮 flag slovenia si flag nation country banner slovenia + 🇸🇯 flag svalbard jan mayen + 🇸🇰 flag slovakia sk flag nation country banner slovakia + 🇸🇱 flag sierra leone sierra leone flag nation country banner sierra leone + 🇸🇲 flag san marino san marino flag nation country banner san marino + 🇸🇳 flag senegal sn flag nation country banner senegal + 🇸🇴 flag somalia so flag nation country banner somalia + 🇸🇷 flag suriname sr flag nation country banner suriname + 🇸🇸 flag south sudan south sd flag nation country banner south sudan + 🇸🇹 flag sao tome principe sao tome principe flag nation country banner sao tome principe + 🇸🇻 flag el salvador el salvador flag nation country banner el salvador + 🇸🇽 flag sint maarten sint maarten dutch flag nation country banner sint maarten + 🇸🇾 flag syria syrian arab republic flag nation country banner syria + 🇸🇿 flag eswatini sz flag nation country banner eswatini + 🇹🇦 flag tristan da cunha + 🇹🇨 flag turks caicos islands turks caicos islands flag nation country banner turks caicos islands + 🇹🇩 flag chad td flag nation country banner chad + 🇹🇫 flag french southern territories french southern territories flag nation country banner french southern territories + 🇹🇬 flag togo tg flag nation country banner togo + 🇹🇭 flag thailand th flag nation country banner thailand + 🇹🇯 flag tajikistan tj flag nation country banner tajikistan + 🇹🇰 flag tokelau tk flag nation country banner tokelau + 🇹🇱 flag timor leste timor leste flag nation country banner timor leste + 🇹🇲 flag turkmenistan flag nation country banner turkmenistan + 🇹🇳 flag tunisia tn flag nation country banner tunisia + 🇹🇴 flag tonga to flag nation country banner tonga + 🇹🇷 flag turkey turkey flag nation country banner turkey + 🇹🇹 flag trinidad tobago trinidad tobago flag nation country banner trinidad tobago + 🇹🇻 flag tuvalu flag nation country banner tuvalu + 🇹🇼 flag taiwan tw flag nation country banner taiwan + 🇹🇿 flag tanzania tanzania united republic flag nation country banner tanzania + 🇺🇦 flag ukraine ua flag nation country banner ukraine + 🇺🇬 flag uganda ug flag nation country banner uganda + 🇺🇲 flag u s outlying islands + 🇺🇳 flag united nations un flag banner + 🇺🇸 flag united states united states america flag nation country banner united states + 🇺🇾 flag uruguay uy flag nation country banner uruguay + 🇺🇿 flag uzbekistan uz flag nation country banner uzbekistan + 🇻🇦 flag vatican city vatican city flag nation country banner vatican city + 🇻🇨 flag st vincent grenadines saint vincent grenadines flag nation country banner st vincent grenadines + 🇻🇪 flag venezuela ve bolivarian republic flag nation country banner venezuela + 🇻🇬 flag british virgin islands british virgin islands bvi flag nation country banner british virgin islands + 🇻🇮 flag u s virgin islands virgin islands us flag nation country banner u s virgin islands + 🇻🇳 flag vietnam viet nam flag nation country banner vietnam + 🇻🇺 flag vanuatu vu flag nation country banner vanuatu + 🇼🇫 flag wallis futuna wallis futuna flag nation country banner wallis futuna + 🇼🇸 flag samoa ws flag nation country banner samoa + 🇽🇰 flag kosovo xk flag nation country banner kosovo + 🇾🇪 flag yemen ye flag nation country banner yemen + 🇾🇹 flag mayotte yt flag nation country banner mayotte + 🇿🇦 flag south africa south africa flag nation country banner south africa + 🇿🇲 flag zambia zm flag nation country banner zambia + 🇿🇼 flag zimbabwe zw flag nation country banner zimbabwe + 🏴󠁧󠁢󠁥󠁮󠁧󠁿 flag england flag english + 🏴󠁧󠁢󠁳󠁣󠁴󠁿 flag scotland flag scottish + 🏴󠁧󠁢󠁷󠁬󠁳󠁿 flag wales flag welsh + 🥲 smiling face with tear sad cry pretend + 🥸 disguised face pretent brows glasses moustache + 🤌 pinched fingers size tiny small + 🫀 anatomical heart health heartbeat + 🫁 lungs breathe + 🥷 ninja ninjutsu skills japanese + 🤵‍♂️ man in tuxedo formal fashion + 🤵‍♀️ woman in tuxedo formal fashion + 👰‍♂️ man with veil wedding marriage + 👰‍♀️ woman with veil wedding marriage + 👩‍🍼 woman feeding baby birth food + 👨‍🍼 man feeding baby birth food + 🧑‍🍼 person feeding baby birth food + 🧑‍🎄 mx claus christmas + 🫂 people hugging care + 🐈‍⬛ black cat superstition luck + 🦬 bison ox + 🦣 mammoth elephant tusks + 🦫 beaver animal rodent + 🐻‍❄️ polar bear animal arctic + 🦤 dodo animal bird + 🪶 feather bird fly + 🦭 seal animal creature sea + 🪲 beetle insect + 🪳 cockroach insect pests + 🪰 fly insect + 🪱 worm animal + 🪴 potted plant greenery house + 🫐 blueberries fruit + 🫒 olive fruit + 🫑 bell pepper fruit plant + 🫓 flatbread flour food + 🫔 tamale food masa + 🫕 fondue cheese pot food + 🫖 teapot drink hot + 🧋 bubble tea taiwan boba milk tea straw + 🪨 rock stone + 🪵 wood nature timber trunk + 🛖 hut house structure + 🛻 pickup truck car transportation + 🛼 roller skate footwear sports + 🪄 magic wand supernature power + 🪅 pinata mexico candy celebration + 🪆 nesting dolls matryoshka toy + 🪡 sewing needle stitches + 🪢 knot rope scout + 🩴 thong sandal footwear summer + 🪖 military helmet army protection + 🪗 accordion music + 🪘 long drum music + 🪙 coin money currency + 🪃 boomerang weapon + 🪚 carpentry saw cut chop + 🪛 screwdriver tools + 🪝 hook tools + 🪜 ladder tools + 🛗 elevator lift + 🪞 mirror reflection + 🪟 window scenery + 🪠 plunger toilet + 🪤 mouse trap cheese + 🪣 bucket water container + 🪥 toothbrush hygiene dental + 🪦 headstone death rip grave + 🪧 placard announcement + ⚧️ transgender symbol lgbtq + 🏳️‍⚧️ transgender flag lgbtq + 😶‍🌫️ face in clouds shower steam dream + 😮‍💨 face exhaling relieve relief tired sigh + 😵‍💫 face with spiral eyes sick ill confused nauseous nausea + ❤️‍🔥 heart on fire passionate enthusiastic + ❤️‍🩹 mending heart broken heart bandage wounded + 🧔‍♂️ man beard facial hair + 🧔‍♀️ woman beard facial hair + 🫠 melting face hot heat + 🫢 face with open eyes and hand over mouth silence secret shock surprise + 🫣 face with peeking eye scared frightening embarrassing + 🫡 saluting face respect salute + 🫥 dotted line face invisible lonely isolation depression + 🫤 face with diagonal mouth skeptic confuse frustrated indifferent + 🥹 face holding back tears touched gratitude + 🫱 rightwards hand palm offer + 🫲 leftwards hand palm offer + 🫳 palm down hand palm drop + 🫴 palm up hand lift offer demand + 🫰 hand with index finger and thumb crossed heart love money expensive + 🫵 index pointing at the viewer you recruit + 🫶 heart hands love appreciation support + 🫦 biting lip flirt sexy pain worry + 🫅 person with crown royalty power + 🫃 pregnant man baby belly + 🫄 pregnant person baby belly + 🧌 troll mystical monster + 🪸 coral ocean sea reef + 🪷 lotus flower calm meditation + 🪹 empty nest bird + 🪺 nest with eggs bird + 🫘 beans food + 🫗 pouring liquid cup water + 🫙 jar container sauce + 🛝 playground slide fun park + 🛞 wheel car transport + 🛟 ring buoy life saver life preserver + 🪬 hamsa religion protection + 🪩 mirror ball disco dance party + 🪫 low battery drained dead + 🩼 crutch accessibility assist + 🩻 x-ray skeleton medicine + 🫧 bubbles soap fun carbonation sparkling + 🪪 identification card document + 🟰 heavy equals sign math + ''; +} diff --git a/modules/home/evil-helix.nix b/modules/home/evil-helix.nix new file mode 100644 index 0000000..911cca7 --- /dev/null +++ b/modules/home/evil-helix.nix @@ -0,0 +1,89 @@ +{ pkgs, ... }: +let + enableEvilHelix = true; # Set to true to enable the configuration +in +{ + home.packages = with pkgs; ( + if enableEvilHelix + then [ + evil-helix + cmake-language-server + jsonnet-language-server + luaformatter + lua-language-server + marksman + taplo + nil + jq-lsp + vscode-langservers-extracted + bash-language-server + awk-language-server + vscode-extensions.llvm-vs-code-extensions.vscode-clangd + clang-tools + docker-compose-language-service + docker-compose + docker-language-server + typescript-language-server + ] + else [ ] + ); + + home.file.".config/helix/languages.toml".text = + if enableEvilHelix + then '' + [language-server.nil] + command = "nil" + + [language-server.lua] + command = "lua-language-server" + + [language-server.json] + command = "vscode-json-languageserver" + + [language-server.markdown] + command = "marksman" + '' + else ""; + + home.file.".config/helix/config.toml".text = + if enableEvilHelix + then '' + theme = "catppuccin_mocha" + #theme = "ao" + + [editor] + evil = true + end-of-line-diagnostics = "hint" + auto-pairs = true + mouse = true + middle-click-paste = true + shell = ["zsh", "-c"] + line-number = "absolute" + auto-completion = true + path-completion = true + auto-info = true + color-modes = true + popup-border = "all" + clipboard-provider = "wayland" + indent-heuristic = "hybrid" + + [editor.statusline] + left = ["mode", "spinner"] + center = ["file-absolute-path", "total-line-numbers", "read-only-indicator", "file-modification-indicator"] + right = ["diagnostics", "selections", "position", "file-encoding", "file-line-ending", "file-type"] + separator = "│" + mode.normal = "NORMAL" + mode.insert = "INSERT" + mode.select = "SELECT" + + [editor.lsp] + enable = true + display-messages = true + display-progress-messages = true + + [editor.inline-diagnostics] + cursor-line = "hint" + other-lines = "hint" + '' + else ""; +} diff --git a/modules/home/eza.nix b/modules/home/eza.nix new file mode 100644 index 0000000..63de65a --- /dev/null +++ b/modules/home/eza.nix @@ -0,0 +1,30 @@ +# Eza is a ls replacement +{ + programs.eza = { + enable = true; + icons = "auto"; + enableBashIntegration = true; + enableZshIntegration = true; + enableFishIntegration = true; + git = true; + + extraOptions = [ + "--group-directories-first" + "--no-quotes" + "--header" # Show header row + "--git-ignore" + "--icons=always" + # "--time-style=long-iso" # ISO 8601 extended format for time + "--classify" # append indicator (/, *, =, @, |) + "--hyperlink" # make paths clickable in some terminals + ]; + }; + # Aliases to make `ls`, `ll`, `la` use eza + home.shellAliases = { + ls = "eza"; + lt = "eza --tree --level=2"; + ll = "eza -lh --no-user --long"; + la = "eza -lah "; + tree = "eza --tree "; + }; +} diff --git a/modules/home/fastfetch/default.nix b/modules/home/fastfetch/default.nix new file mode 100644 index 0000000..ea3675b --- /dev/null +++ b/modules/home/fastfetch/default.nix @@ -0,0 +1,136 @@ +{ + programs.fastfetch = { + enable = true; + + settings = { + display = { + color = { + keys = "35"; + output = "95"; + }; + separator = " ➜ "; + }; + + logo = { + source = ./nixos.png; + type = "kitty-direct"; + height = 10; + width = 20; + padding = { + top = 2; + left = 2; + }; + }; + + modules = [ + "break" + { + type = "os"; + key = "OS"; + keyColor = "31"; + } + { + type = "command"; + key = " ├  ZaneyOS "; + keyColor = "31"; + text = "echo v$" + "{ZANEYOS_VERSION}"; + } + { + type = "kernel"; + key = " ├  "; + keyColor = "31"; + } + { + type = "packages"; + key = " ├ 󰏖 "; + keyColor = "31"; + } + { + type = "shell"; + key = " └  "; + keyColor = "31"; + } + "break" + { + type = "wm"; + key = "WM "; + keyColor = "32"; + } + { + type = "wmtheme"; + key = " ├ 󰉼 "; + keyColor = "32"; + } + { + type = "icons"; + key = " ├ 󰀻 "; + keyColor = "32"; + } + { + type = "cursor"; + key = " ├  "; + keyColor = "32"; + } + { + type = "terminal"; + key = " ├  "; + keyColor = "32"; + } + { + type = "terminalfont"; + key = " └  "; + keyColor = "32"; + } + "break" + { + type = "host"; + format = "{5} {1} Type {2}"; + key = "PC "; + keyColor = "33"; + } + { + type = "cpu"; + format = "{1} ({3}) @ {7} GHz"; + key = " ├  "; + keyColor = "33"; + } + { + type = "gpu"; + format = "{1} {2} @ {12} GHz"; + key = " ├ 󰢮 "; + keyColor = "33"; + } + { + type = "memory"; + key = " ├  "; + keyColor = "33"; + } + { + type = "disk"; + key = " ├ 󰋊 "; + keyColor = "33"; + } + { + type = "monitor"; + key = " ├  "; + keyColor = "33"; + } + { + type = "player"; + key = " ├ 󰥠 "; + keyColor = "33"; + } + { + type = "media"; + key = " └ 󰝚 "; + keyColor = "33"; + } + "break" + { + type = "uptime"; + key = " Uptime "; + } + ]; + }; + }; +} diff --git a/modules/home/fastfetch/nixos.png b/modules/home/fastfetch/nixos.png new file mode 100644 index 0000000..571410a Binary files /dev/null and b/modules/home/fastfetch/nixos.png differ diff --git a/modules/home/fzf.nix b/modules/home/fzf.nix new file mode 100644 index 0000000..0100ad8 --- /dev/null +++ b/modules/home/fzf.nix @@ -0,0 +1,37 @@ +# Fzf is a general-purpose command-line fuzzy finder. +{ config +, lib +, ... +}: +let + accent = "#" + config.lib.stylix.colors.base0D; + foreground = "#" + config.lib.stylix.colors.base05; + muted = "#" + config.lib.stylix.colors.base03; +in +{ + programs.fzf = { + enable = true; + enableZshIntegration = true; + colors = lib.mkForce { + "fg+" = accent; + "bg+" = "-1"; + "fg" = foreground; + "bg" = "-1"; + "prompt" = muted; + "pointer" = accent; + }; + defaultOptions = [ + "--margin=1" + "--layout=reverse" + "--border=none" + "--info='hidden'" + "--header=''" + "--prompt='/ '" + "-i" + "--no-bold" + "--bind='enter:execute(nvim {})'" + "--preview='bat --style=numbers --color=always --line-range :500 {}'" + "--preview-window=right:60%:wrap" + ]; + }; +} diff --git a/modules/home/gh.nix b/modules/home/gh.nix new file mode 100644 index 0000000..0df8cc3 --- /dev/null +++ b/modules/home/gh.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + programs = { + gh.enable = true; + }; +} diff --git a/modules/home/ghostty.nix b/modules/home/ghostty.nix new file mode 100644 index 0000000..be09725 --- /dev/null +++ b/modules/home/ghostty.nix @@ -0,0 +1,100 @@ +{ pkgs, ... }: +let + # A recent issue 7/7/2025 w/ghostty causes it to hang or respond slowly + # This is a workaround until a fix is released + myGhostty = pkgs.ghostty.overrideAttrs (_: { + preBuild = '' + shopt -s globstar + sed -i 's/^const xev = @import("xev");$/const xev = @import("xev").Epoll;/' **/*.zig + shopt -u globstar + ''; + }); +in +{ + programs.ghostty = { + enable = true; + package = myGhostty; # to fix a but in current builds of ghostty + #package = pkgs.ghostty; + }; + home.file."./.config/ghostty/config".text = '' + + #theme = Aura + theme = Dracula + #theme = Aardvark Blue + #theme = GruvboxDarkHard + adjust-cell-height = 10% + window-theme = dark + window-height = 32 + window-width = 110 + background-opacity = 0.95 + background-blur-radius = 60 + selection-background = #2d3f76 + selection-foreground = #c8d3f5 + cursor-style = bar + mouse-hide-while-typing = true + + # keybindings + # Copy/Paste + keybind = ctrl+shift+c=copy_to_clipboard + keybind = ctrl+shift+v=paste_from_clipboard + + keybind = alt+s>r=reload_config + keybind = alt+s>x=close_surface + + keybind = alt+s>n=new_window + + # tabs + keybind = alt+s>c=new_tab + keybind = alt+s>shift+l=next_tab + keybind = alt+s>shift+h=previous_tab + keybind = alt+s>comma=move_tab:-1 + keybind = alt+s>period=move_tab:1 + + # quick tab switch + keybind = alt+s>1=goto_tab:1 + keybind = alt+s>2=goto_tab:2 + keybind = alt+s>3=goto_tab:3 + keybind = alt+s>4=goto_tab:4 + keybind = alt+s>5=goto_tab:5 + keybind = alt+s>6=goto_tab:6 + keybind = alt+s>7=goto_tab:7 + keybind = alt+s>8=goto_tab:8 + keybind = alt+s>9=goto_tab:9 + + # split + keybind = alt+s>\=new_split:right + keybind = alt+s>-=new_split:down + + keybind = alt+s>j=goto_split:bottom + keybind = alt+s>k=goto_split:top + keybind = alt+s>h=goto_split:left + keybind = alt+s>l=goto_split:right + + keybind = alt+s>z=toggle_split_zoom + + keybind = alt+s>e=equalize_splits + + # other + #copy-on-select = clipboard + + font-size = 12 + #font-family = JetBrainsMono Nerd Font Mono + #font-family-bold = JetBrainsMono NFM Bold + #font-family-bold-italic = JetBrainsMono NFM Bold Italic + #font-family-italic = JetBrainsMono NFM Italic + + font-family = BerkeleyMono Nerd Font + #font-family = Iosevka Nerd Font + # font-family = SFMono Nerd Font + + title = "GhosTTY" + + wait-after-command = false + shell-integration = detect + window-save-state = always + gtk-single-instance = true + unfocused-split-opacity = 0.5 + quick-terminal-position = center + shell-integration-features = cursor,sudo + ''; +} diff --git a/modules/home/git.nix b/modules/home/git.nix new file mode 100644 index 0000000..321b250 --- /dev/null +++ b/modules/home/git.nix @@ -0,0 +1,33 @@ +{ host, ... }: +let + inherit (import ../../hosts/${host}/variables.nix) gitUsername gitEmail; +in +{ + programs.git = { + enable = true; + userName = "${gitUsername}"; + userEmail = "${gitEmail}"; + + extraConfig = { + # FOSS-friendly settings + push.default = "simple"; # Match modern push behavior + credential.helper = "cache --timeout=7200"; + init.defaultBranch = "main"; # Set default new branches to 'main' + log.decorate = "full"; # Show branch/tag info in git log + log.date = "iso"; # ISO 8601 date format + # Conflict resolution style for readable diffs + merge.conflictStyle = "diff3"; + }; + # Optional: FOSS-friendly Git aliases + aliases = { + br = "branch --sort=-committerdate"; + co = "checkout"; + df = "diff"; + com = "commit -a"; + gs = "stash"; + gp = "pull"; + lg = "log --graph --pretty=format:'%Cred%h%Creset - %C(yellow)%d%Creset %s %C(green)(%cr)%C(bold blue) <%an>%Creset' --abbrev-commit"; + st = "status"; + }; + }; +} diff --git a/modules/home/gtk.nix b/modules/home/gtk.nix new file mode 100644 index 0000000..f433efa --- /dev/null +++ b/modules/home/gtk.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: + +{ + gtk = { + iconTheme = { + name = "Papirus-Dark"; + package = pkgs.papirus-icon-theme; + }; + gtk3.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + gtk4.extraConfig = { + gtk-application-prefer-dark-theme = 1; + }; + }; +} diff --git a/modules/home/htop.nix b/modules/home/htop.nix new file mode 100644 index 0000000..263697b --- /dev/null +++ b/modules/home/htop.nix @@ -0,0 +1,42 @@ +{ config, ... }: { + programs.htop = { + enable = true; + settings = + { + color_scheme = 6; + cpu_count_from_one = 0; + delay = 15; + fields = with config.lib.htop.fields; [ + PID + USER + PRIORITY + NICE + M_SIZE + M_RESIDENT + M_SHARE + STATE + PERCENT_CPU + PERCENT_MEM + TIME + COMM + ]; + highlight_base_name = 1; + highlight_megabytes = 1; + highlight_threads = 1; + } + // (with config.lib.htop; + leftMeters [ + (bar "AllCPUs2") + (bar "Memory") + (bar "Swap") + (text "Zram") + ]) + // (with config.lib.htop; + rightMeters [ + (text "Tasks") + (text "LoadAverage") + (text "Uptime") + (text "Systemd") + ]); + }; +} diff --git a/modules/home/hyprland/animations-def.nix b/modules/home/hyprland/animations-def.nix new file mode 100644 index 0000000..dbbaea5 --- /dev/null +++ b/modules/home/hyprland/animations-def.nix @@ -0,0 +1,22 @@ +{ ... }: { + wayland.windowManager.hyprland.settings = { + animations = { + enabled = true; + bezier = [ + "wind, -1.05, 0.9, 0.1, 1.05" + "winIn, -1.1, 1.1, 0.1, 1.1" + "winOut, -1.3, -0.3, 0, 1" + "liner, 0, 1, 1, 1" + ]; + animation = [ + "windows, 0, 6, wind, slide" + "windowsIn, 0, 6, winIn, slide" + "windowsOut, 0, 5, winOut, slide" + "windowsMove, 0, 5, wind, slide" + "border, 0, 1, liner" + "fade, 0, 10, default" + "workspaces, 0, 5, wind" + ]; + }; + }; +} diff --git a/modules/home/hyprland/animations-dynamic.nix b/modules/home/hyprland/animations-dynamic.nix new file mode 100644 index 0000000..eb96614 --- /dev/null +++ b/modules/home/hyprland/animations-dynamic.nix @@ -0,0 +1,25 @@ +{ ... }: { + wayland.windowManager.hyprland.settings = { + # name "Dynamic" + # credit https://github.com/mylinuxforwork/dotfiles + animations = { + enabled = true; + bezier = [ + "wind, 0.05, 0.9, 0.1, 1.05" + "winIn, 0.1, 1.1, 0.1, 1.1" + "winOut, 0.3, -0.3, 0, 1" + "liner, 1, 1, 1, 1" + ]; + animation = [ + "windows, 1, 6, wind, slide" + "windowsIn, 1, 6, winIn, slide" + "windowsOut, 1, 5, winOut, slide" + "windowsMove, 1, 5, wind, slide" + "border, 1, 1, liner" + "borderangle, 1, 30, liner, loop" + "fade, 1, 10, default" + "workspaces, 1, 5, wind" + ]; + }; + }; +} diff --git a/modules/home/hyprland/animations-end4.nix b/modules/home/hyprland/animations-end4.nix new file mode 100644 index 0000000..fd8fbce --- /dev/null +++ b/modules/home/hyprland/animations-end4.nix @@ -0,0 +1,37 @@ +{ ... }: { + wayland.windowManager.hyprland.settings = { + # Name: END-4 + # Credit: END-4 project https://github.com/end-4/dots-hyprland + animations = { + enabled = true; + bezier = [ + "linear, 0, 0, 1, 1" + "md3_standard, 0.2, 0, 0, 1" + "md3_decel, 0.05, 0.7, 0.1, 1" + "md3_accel, 0.3, 0, 0.8, 0.15" + "overshot, 0.05, 0.9, 0.1, 1.1" + "crazyshot, 0.1, 1.5, 0.76, 0.92 " + "hyprnostretch, 0.05, 0.9, 0.1, 1.0" + "menu_decel, 0.1, 1, 0, 1" + "menu_accel, 0.38, 0.04, 1, 0.07" + "easeInOutCirc, 0.85, 0, 0.15, 1" + "easeOutCirc, 0, 0.55, 0.45, 1" + "easeOutExpo, 0.16, 1, 0.3, 1" + "softAcDecel, 0.26, 0.26, 0.15, 1" + "md2, 0.4, 0, 0.2, 1 # use with .2s duration" + ]; + animation = [ + "windows, 1, 3, md3_decel, popin 60%" + "windowsIn, 1, 3, md3_decel, popin 60%" + "windowsOut, 1, 3, md3_accel, popin 60%" + "border, 1, 10, default" + "fade, 1, 3, md3_decel" + "layersIn, 1, 3, menu_decel, slide" + "layersOut, 1, 1.6, menu_accel" + "fadeLayersIn, 1, 2, menu_decel" + "fadeLayersOut, 1, 4.5, menu_accel" + "workspaces, 1, 7, menu_decel, slide" + ]; + }; + }; +} diff --git a/modules/home/hyprland/animations-moving.nix b/modules/home/hyprland/animations-moving.nix new file mode 100644 index 0000000..59d8c77 --- /dev/null +++ b/modules/home/hyprland/animations-moving.nix @@ -0,0 +1,24 @@ +{ ... }: { + wayland.windowManager.hyprland.settings = { + # name "moving" + # credit https://github.com/mylinuxforwork/dotfiles + animations = { + enabled = true; + bezier = [ + "overshot, 0.05, 0.9, 0.1, 1.05" + "smoothOut, 0.5, 0, 0.99, 0.99" + "smoothIn, 0.5, -0.5, 0.68, 1.5" + ]; + animation = [ + "windows, 1, 5, overshot, slide" + "windowsOut, 1, 3, smoothOut" + "windowsIn, 1, 3, smoothOut" + "windowsMove, 1, 4, smoothIn, slide" + "border, 1, 5, default" + "fade, 1, 5, smoothIn" + "fadeDim, 1, 5, smoothIn" + "workspaces, 1, 6, default" + ]; + }; + }; +} diff --git a/modules/home/hyprland/binds.nix b/modules/home/hyprland/binds.nix new file mode 100644 index 0000000..025cb08 --- /dev/null +++ b/modules/home/hyprland/binds.nix @@ -0,0 +1,106 @@ +{ host, ... }: +let + inherit + (import ../../../hosts/${host}/variables.nix) + browser + terminal + ; +in +{ + wayland.windowManager.hyprland.settings = { + bind = [ + "$modifier,Return,exec,${terminal}" + "$modifier,K,exec,list-keybinds" + "$modifier SHIFT,Return,exec,rofi-launcher" + "$modifier ,R,exec,rofi-launcher" + "$modifier SHIFT,W,exec,web-search" + "$modifier ALT,W,exec,wallsetter" + "$modifier SHIFT,N,exec,swaync-client -rs" + "$modifier,W,exec,${browser}" + "$modifier,Y,exec,kitty -e yazi" + "$modifier,E,exec,emopicker9000" + "$modifier,S,exec,screenshootin" + "$modifier,D,exec,discord" + "$modifier,O,exec,obs" + "$modifier,C,exec,hyprpicker -a" + "$modifier,G,exec,gimp" + "$modifier shift,T,exec,pypr toggle term" + "$modifier,T,exec, thunar" + "$modifier,M,exec,pavucontrol" + "$modifier,Q,killactive," + "$modifier,P,pseudo," + "$modifier,V,exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy" + "$modifier SHIFT,I,togglesplit," + "$modifier,F,fullscreen," + "$modifier SHIFT,F,togglefloating," + "$modifier ALT,F,workspaceopt, allfloat" + "$modifier SHIFT,C,exit," + "$modifier SHIFT,left,movewindow,l" + "$modifier SHIFT,right,movewindow,r" + "$modifier SHIFT,up,movewindow,u" + "$modifier SHIFT,down,movewindow,d" + "$modifier SHIFT,h,movewindow,l" + "$modifier SHIFT,l,movewindow,r" + "$modifier SHIFT,k,movewindow,u" + "$modifier SHIFT,j,movewindow,d" + "$modifier ALT, left, swapwindow,l" + "$modifier ALT, right, swapwindow,r" + "$modifier ALT, up, swapwindow,u" + "$modifier ALT, down, swapwindow,d" + "$modifier ALT, 43, swapwindow,l" + "$modifier ALT, 46, swapwindow,r" + "$modifier ALT, 45, swapwindow,u" + "$modifier ALT, 44, swapwindow,d" + "$modifier,left,movefocus,l" + "$modifier,right,movefocus,r" + "$modifier,up,movefocus,u" + "$modifier,down,movefocus,d" + "$modifier,h,movefocus,l" + "$modifier,l,movefocus,r" + "$modifier,k,movefocus,u" + "$modifier,j,movefocus,d" + "$modifier,1,workspace,1" + "$modifier,2,workspace,2" + "$modifier,3,workspace,3" + "$modifier,4,workspace,4" + "$modifier,5,workspace,5" + "$modifier,6,workspace,6" + "$modifier,7,workspace,7" + "$modifier,8,workspace,8" + "$modifier,9,workspace,9" + "$modifier,0,workspace,10" + "$modifier SHIFT,SPACE,movetoworkspace,special" + "$modifier,SPACE,togglespecialworkspace" + "$modifier SHIFT,1,movetoworkspace,1" + "$modifier SHIFT,2,movetoworkspace,2" + "$modifier SHIFT,3,movetoworkspace,3" + "$modifier SHIFT,4,movetoworkspace,4" + "$modifier SHIFT,5,movetoworkspace,5" + "$modifier SHIFT,6,movetoworkspace,6" + "$modifier SHIFT,7,movetoworkspace,7" + "$modifier SHIFT,8,movetoworkspace,8" + "$modifier SHIFT,9,movetoworkspace,9" + "$modifier SHIFT,0,movetoworkspace,10" + "$modifier CONTROL,right,workspace,e+1" + "$modifier CONTROL,left,workspace,e-1" + "$modifier,mouse_down,workspace, e+1" + "$modifier,mouse_up,workspace, e-1" + "ALT,Tab,cyclenext" + "ALT,Tab,bringactivetotop" + ",XF86AudioRaiseVolume,exec,wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" + ",XF86AudioLowerVolume,exec,wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + " ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ",XF86AudioPlay, exec, playerctl play-pause" + ",XF86AudioPause, exec, playerctl play-pause" + ",XF86AudioNext, exec, playerctl next" + ",XF86AudioPrev, exec, playerctl previous" + ",XF86MonBrightnessDown,exec,brightnessctl set 5%-" + ",XF86MonBrightnessUp,exec,brightnessctl set +5%" + ]; + + bindm = [ + "$modifier, mouse:272, movewindow" + "$modifier, mouse:273, resizewindow" + ]; + }; +} diff --git a/modules/home/hyprland/default.nix b/modules/home/hyprland/default.nix new file mode 100644 index 0000000..25234de --- /dev/null +++ b/modules/home/hyprland/default.nix @@ -0,0 +1,17 @@ +{ host, ... }: +let + inherit (import ../../../hosts/${host}/variables.nix) animChoice; +in +{ + imports = [ + animChoice + ./binds.nix + ./env.nix + ./exec-once.nix + ./hypridle.nix + ./hyprland.nix + ./hyprlock.nix + ./pyprland.nix + ./windowrules.nix + ]; +} diff --git a/modules/home/hyprland/env.nix b/modules/home/hyprland/env.nix new file mode 100644 index 0000000..134cc58 --- /dev/null +++ b/modules/home/hyprland/env.nix @@ -0,0 +1,36 @@ +{ ... }: { + wayland.windowManager.hyprland = { + settings = { + env = [ + "NIXOS_OZONE_WL, 1" + "NIXPKGS_ALLOW_UNFREE, 1" + "XDG_CURRENT_DESKTOP, Hyprland" + "XDG_SESSION_TYPE, wayland" + "XDG_SESSION_DESKTOP, Hyprland" + "GDK_BACKEND, wayland, x11" + "CLUTTER_BACKEND, wayland" + "QT_QPA_PLATFORM=wayland;xcb" + "QT_WAYLAND_DISABLE_WINDOWDECORATION, 1" + "QT_AUTO_SCREEN_SCALE_FACTOR, 1" + "SDL_VIDEODRIVER, x11" + "MOZ_ENABLE_WAYLAND, 1" + # This is to make electron apps start in wayland + "ELECTRON_OZONE_PLATFORM_HINT,wayland" + # Disabling this by default as it can result in inop cfg + # Added card2 in case this gets enabled. For better coverage + # This is mostly needed by Hybrid laptops. + # but if you have multiple discrete GPUs this will set order + #"AQ_DRM_DEVICES,/dev/dri/card0:/dev/dri/card1:/dev/card2" + "GDK_SCALE,1" + "QT_SCALE_FACTOR,1" + "EDITOR,nvim" + # Set terminal and xdg_terminal_emulator to kitty + # To provent yazi from starting xterm when run from rofi menu + # You can set to your preferred terminal if you you like + # ToDo: Pull default terminal from config + "TERMINAL,kitty" + "XDG_TERMINAL_EMULATOR,kitty" + ]; + }; + }; +} diff --git a/modules/home/hyprland/exec-once.nix b/modules/home/hyprland/exec-once.nix new file mode 100644 index 0000000..3c603fd --- /dev/null +++ b/modules/home/hyprland/exec-once.nix @@ -0,0 +1,27 @@ +{ host, ... }: +let + inherit + (import ../../../hosts/${host}/variables.nix) + stylixImage + ; +in +{ + wayland.windowManager.hyprland.settings = { + exec-once = [ + "wl-paste --type text --watch cliphist store" # Saves text + "wl-paste --type image --watch cliphist store" # Saves images + "dbus-update-activation-environment --all --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP +" + "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" + "systemctl --user start hyprpolkitagent" + + "killall -q swww;sleep .5 && swww-daemon" + "killall -q waybar;sleep .5 && waybar" + "killall -q swaync;sleep .5 && swaync" + "#wallsetter &" + "pypr &" + "nm-applet --indicator" + "sleep 1.0 && swww img ${stylixImage}" + ]; + }; +} diff --git a/modules/home/hyprland/face.jpg b/modules/home/hyprland/face.jpg new file mode 100644 index 0000000..9a5cb7e Binary files /dev/null and b/modules/home/hyprland/face.jpg differ diff --git a/modules/home/hyprland/hypridle.nix b/modules/home/hyprland/hypridle.nix new file mode 100644 index 0000000..21fbf57 --- /dev/null +++ b/modules/home/hyprland/hypridle.nix @@ -0,0 +1,27 @@ +{ ... }: + +{ + services = { + hypridle = { + enable = true; + settings = { + general = { + after_sleep_cmd = "hyprctl dispatch dpms on"; + ignore_dbus_inhibit = false; + lock_cmd = "hyprlock"; + }; + listener = [ + { + timeout = 900; + on-timeout = "hyprlock"; + } + { + timeout = 1200; + on-timeout = "hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on"; + } + ]; + }; + }; + }; +} diff --git a/modules/home/hyprland/hyprland.nix b/modules/home/hyprland/hyprland.nix new file mode 100644 index 0000000..aedb5ff --- /dev/null +++ b/modules/home/hyprland/hyprland.nix @@ -0,0 +1,171 @@ +{ host +, config +, pkgs +, ... +}: +let + inherit + (import ../../../hosts/${host}/variables.nix) + extraMonitorSettings + keyboardLayout + stylixImage + ; +in +{ + home.packages = with pkgs; [ + swww + grim + slurp + wl-clipboard + swappy + ydotool + hyprpolkitagent + hyprland-qtutils # needed for banners and ANR messages + ]; + systemd.user.targets.hyprland-session.Unit.Wants = [ + "xdg-desktop-autostart.target" + ]; + # Place Files Inside Home Directory + home.file = { + "Pictures/Wallpapers" = { + source = ../../../wallpapers; + recursive = true; + }; + ".face.icon".source = ./face.jpg; + ".config/face.jpg".source = ./face.jpg; + }; + wayland.windowManager.hyprland = { + enable = true; + package = pkgs.hyprland; + systemd = { + enable = true; + enableXdgAutostart = true; + variables = [ "--all" ]; + }; + xwayland = { + enable = true; + }; + settings = { + input = { + kb_layout = "${keyboardLayout}"; + kb_options = [ + "grp:alt_caps_toggle" + "caps:super" + ]; + numlock_by_default = true; + repeat_delay = 300; + follow_mouse = 1; + float_switch_override_focus = 0; + sensitivity = 0; + touchpad = { + natural_scroll = true; + disable_while_typing = true; + scroll_factor = 0.8; + }; + }; + + gestures = { + workspace_swipe = 1; + workspace_swipe_fingers = 3; + workspace_swipe_distance = 500; + workspace_swipe_invert = 1; + workspace_swipe_min_speed_to_force = 30; + workspace_swipe_cancel_ratio = 0.5; + workspace_swipe_create_new = 1; + workspace_swipe_forever = 1; + }; + + general = { + "$modifier" = "SUPER"; + layout = "dwindle"; + gaps_in = 6; + gaps_out = 8; + border_size = 2; + resize_on_border = true; + "col.active_border" = "rgb(${config.lib.stylix.colors.base08}) rgb(${config.lib.stylix.colors.base0C}) 45deg"; + "col.inactive_border" = "rgb(${config.lib.stylix.colors.base01})"; + }; + + misc = { + layers_hog_keyboard_focus = true; + initial_workspace_tracking = 0; + mouse_move_enables_dpms = true; + key_press_enables_dpms = false; + disable_hyprland_logo = true; + disable_splash_rendering = true; + enable_swallow = false; + vfr = true; # Variable Frame Rate + vrr = 2; #Variable Refresh Rate Might need to set to 0 for NVIDIA/AQ_DRM_DEVICES + # Screen flashing to black momentarily or going black when app is fullscreen + # Try setting vrr to 0 + + # Application not responding (ANR) settings + enable_anr_dialog = true; + anr_missed_pings = 15; + }; + + dwindle = { + pseudotile = true; + preserve_split = true; + force_split = 2; + }; + + decoration = { + rounding = 10; + blur = { + enabled = true; + size = 5; + passes = 3; + ignore_opacity = false; + new_optimizations = true; + }; + shadow = { + enabled = true; + range = 4; + render_power = 3; + color = "rgba(1a1a1aee)"; + }; + }; + + ecosystem = { + no_donation_nag = true; + no_update_news = false; + }; + + cursor = { + sync_gsettings_theme = true; + no_hardware_cursors = 2; # change to 1 if want to disable + enable_hyprcursor = false; + warp_on_change_workspace = 2; + no_warps = true; + }; + + render = { + # Disabling as no longer supported + #explicit_sync = 1; # Change to 1 to disable + #explicit_sync_kms = 1; + direct_scanout = 0; + }; + + master = { + new_status = "master"; + new_on_top = 1; + mfact = 0.5; + }; + + # Ensure Xwayland windows render at integer scale; compositor scales them + xwayland = { + force_zero_scaling = true; + }; + }; + + extraConfig = " + monitor=,preferred,auto,auto + monitor=Virtual-1,1920x1080@60,auto,1 + ${extraMonitorSettings} + # To enable blur on waybar uncomment the line below + # Thanks to SchotjeChrisman + #layerrule = blur,waybar + "; + }; +} diff --git a/modules/home/hyprland/hyprlock.nix b/modules/home/hyprland/hyprlock.nix new file mode 100644 index 0000000..d2c22b9 --- /dev/null +++ b/modules/home/hyprland/hyprlock.nix @@ -0,0 +1,47 @@ +{ username, ... }: { + programs.hyprlock = { + enable = true; + settings = { + general = { + disable_loading_bar = true; + grace = 10; + hide_cursor = true; + no_fade_in = false; + }; + background = [ + { + path = "/home/${username}/Pictures/Wallpapers/beautifulmountainscape.jpg"; + blur_passes = 3; + blur_size = 8; + } + ]; + image = [ + { + path = "/home/${username}/.config/face.jpg"; + size = 150; + border_size = 4; + border_color = "rgb(0C96F9)"; + rounding = -1; # Negative means circle + position = "0, 200"; + halign = "center"; + valign = "center"; + } + ]; + input-field = [ + { + size = "200, 50"; + position = "0, -80"; + monitor = ""; + dots_center = true; + fade_on_empty = false; + font_color = "rgb(CFE6F4)"; + inner_color = "rgb(657DC2)"; + outer_color = "rgb(0D0E15)"; + outline_thickness = 5; + placeholder_text = "Password..."; + shadow_passes = 2; + } + ]; + }; + }; +} diff --git a/modules/home/hyprland/pyprland.nix b/modules/home/hyprland/pyprland.nix new file mode 100644 index 0000000..490b1c4 --- /dev/null +++ b/modules/home/hyprland/pyprland.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ pyprland ]; + + home.file.".config/hypr/pyprland.toml".text = '' + [pyprland] + plugins = [ + "scratchpads", + ] + + [scratchpads.term] + animation = "fromTop" + command = "kitty --class kitty-dropterm" + class = "kitty-dropterm" + size = "70% 70%" + max_size = "1920px 100%" + position = "150px 150px" + ''; +} diff --git a/modules/home/hyprland/windowrules.nix b/modules/home/hyprland/windowrules.nix new file mode 100644 index 0000000..de846b1 --- /dev/null +++ b/modules/home/hyprland/windowrules.nix @@ -0,0 +1,82 @@ +{host, ...}: let + inherit + (import ../../../hosts/${host}/variables.nix) + extraMonitorSettings + ; +in { + wayland.windowManager.hyprland = { + settings = { + windowrule = [ + #"noblur, xwayland:1" # Helps prevent odd borders/shadows for xwayland apps + # downside it can impact other xwayland apps + # This rule is a template for a more targeted approach + "noblur, class:^(\bresolve\b)$, xwayland:1" # Window rule for just resolve + "tag +file-manager, class:^([Tt]hunar|org.gnome.Nautilus|[Pp]cmanfm-qt)$" + "tag +terminal, class:^(com.mitchellh.ghostty|org.wezfurlong.wezterm|Alacritty|kitty|kitty-dropterm)$" + "tag +browser, class:^(Brave-browser(-beta|-dev|-unstable)?)$" + "tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr)$" + "tag +browser, class:^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$" + "tag +browser, class:^([Tt]horium-browser|[Cc]achy-browser)$" + "tag +projects, class:^(codium|codium-url-handler|VSCodium)$" + "tag +projects, class:^(VSCode|code-url-handler)$" + "tag +im, class:^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$" + "tag +im, class:^([Ff]erdium)$" + "tag +im, class:^([Ww]hatsapp-for-linux)$" + "tag +im, class:^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$" + "tag +im, class:^(teams-for-linux)$" + "tag +games, class:^(gamescope)$" + "tag +games, class:^(steam_app_\d+)$" + "tag +gamestore, class:^([Ss]team)$" + "tag +gamestore, title:^([Ll]utris)$" + "tag +gamestore, class:^(com.heroicgameslauncher.hgl)$" + "tag +settings, class:^(gnome-disks|wihotspot(-gui)?)$" + "tag +settings, class:^([Rr]ofi)$" + "tag +settings, class:^(file-roller|org.gnome.FileRoller)$" + "tag +settings, class:^(nm-applet|nm-connection-editor|blueman-manager)$" + "tag +settings, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$" + "tag +settings, class:^(nwg-look|qt5ct|qt6ct|[Yy]ad)$" + "tag +settings, class:(xdg-desktop-portal-gtk)" + "tag +settings, class:(.blueman-manager-wrapped)" + "tag +settings, class:(nwg-displays)" + "move 72% 7%,title:^(Picture-in-Picture)$" + "center, class:^([Ff]erdium)$" + "float, class:^([Ww]aypaper)$" + "center, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$" + "center, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)" + "center, title:^(Authentication Required)$" + "idleinhibit fullscreen, class:^(*)$" + "idleinhibit fullscreen, title:^(*)$" + "idleinhibit fullscreen, fullscreen:1" + "float, tag:settings*" + "float, class:^([Ff]erdium)$" + "float, title:^(Picture-in-Picture)$" + "float, class:^(mpv|com.github.rafostar.Clapper)$" + "float, title:^(Authentication Required)$" + "float, class:(codium|codium-url-handler|VSCodium), title:negative:(.*codium.*|.*VSCodium.*)" + "float, class:^(com.heroicgameslauncher.hgl)$, title:negative:(Heroic Games Launcher)" + "float, class:^([Ss]team)$, title:negative:^([Ss]team)$" + "float, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)" + "float, initialTitle:(Add Folder to Workspace)" + "float, initialTitle:(Open Files)" + "float, initialTitle:(wants to save)" + "size 70% 60%, initialTitle:(Open Files)" + "size 70% 60%, initialTitle:(Add Folder to Workspace)" + "size 70% 70%, tag:settings*" + "size 60% 70%, class:^([Ff]erdium)$" + "opacity 1.0 1.0, tag:browser*" + "opacity 0.9 0.8, tag:projects*" + "opacity 0.94 0.86, tag:im*" + "opacity 0.9 0.8, tag:file-manager*" + "opacity 0.8 0.7, tag:terminal*" + "opacity 0.8 0.7, tag:settings*" + "opacity 0.8 0.7, class:^(gedit|org.gnome.TextEditor|mousepad)$" + "opacity 0.9 0.8, class:^(seahorse)$ # gnome-keyring gui" + "opacity 0.95 0.75, title:^(Picture-in-Picture)$" + "pin, title:^(Picture-in-Picture)$" + "keepaspectratio, title:^(Picture-in-Picture)$" + "noblur, tag:games*" + "fullscreen, tag:games*" + ]; + }; + }; +} diff --git a/modules/home/install-zaneyos.sh b/modules/home/install-zaneyos.sh new file mode 100755 index 0000000..cbf5bfb --- /dev/null +++ b/modules/home/install-zaneyos.sh @@ -0,0 +1,229 @@ +#!/usr/bin/env bash + +###################################### +# Install script for zaneyos +# Author: Don Williams +# Date: June 27, 2005 +####################################### + +# Define colors +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# Define log file +LOG_DIR="$(dirname "$0")" +LOG_FILE="${LOG_DIR}/install_$(date +"%Y-%m-%d_%H-%M-%S").log" + +mkdir -p "$LOG_DIR" +exec > >(tee -a "$LOG_FILE") 2>&1 + +# Function to print a section header +print_header() { + echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║ ${1} ${NC}" + echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════════════╝${NC}" +} + +# Function to print an error message +print_error() { + echo -e "${RED}Error: ${1}${NC}" +} + +# Function to print a success banner +print_success_banner() { + echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════════════╗${NC}" + echo -e "${GREEN}║ zaneyos Installation Successful! ║${NC}" + echo -e "${GREEN}║ ║${NC}" + echo -e "${GREEN}║ Please reboot your system for changes to take full effect. ║${NC}" + echo -e "${GREEN}║ ║${NC}" + echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════════════╝${NC}" +} + +# Function to print a failure banner +print_failure_banner() { + echo -e "${RED}╔═══════════════════════════════════════════════════════════════════════╗${NC}" + echo -e "${RED}║ zaneyos Installation Failed! ║${NC}" + echo -e "${RED}║ ║${NC}" + echo -e "${RED}║ Please review the log file for details: ║${NC}" + echo -e "${RED}║ ${LOG_FILE} ║${NC}" + echo -e "${RED}║ ║${NC}" + echo -e "${RED}╚═══════════════════════════════════════════════════════════════════════╝${NC}" +} + +print_header "Verifying System Requirements" + +# Check for git +if ! command -v git &> /dev/null; then + print_error "Git is not installed." + echo -e "Please install git and pciutils are installed, then re-run the install script." + echo -e "Example: nix-shell -p git pciutils" + exit 1 +fi + +# Check for lspci (pciutils) +if ! command -v lspci &> /dev/null; then + print_error "pciutils is not installed." + echo -e "Please install git and pciutils, then re-run the install script." + echo -e "Example: nix-shell -p git pciutils" + exit 1 +fi + +if [ -n "$(grep -i nixos < /etc/os-release)" ]; then + echo -e "${GREEN}Verified this is NixOS.${NC}" +else + print_error "This is not NixOS or the distribution information is not available." + exit 1 +fi + +print_header "Initial Setup" + +echo -e "Default options are in brackets []" +echo -e "Just press enter to select the default" +sleep 2 + +print_header "Ensure In Home Directory" +cd "$HOME" || exit 1 +echo -e "${GREEN}Current directory: $(pwd)${NC}" + +print_header "Hostname Configuration" +read -rp "Enter Your New Hostname: [ default ] " hostName +if [ -z "$hostName" ]; then + hostName="default" +fi + +print_header "GPU Profile Detection" + +# Attempt automatic detection +DETECTED_PROFILE="" + +has_nvidia=false +has_intel=false +has_amd=false +has_vm=false + +if lspci | grep -qi 'vga\|3d'; then + while read -r line; do + if echo "$line" | grep -qi 'nvidia'; then + has_nvidia=true + elif echo "$line" | grep -qi 'amd'; then + has_amd=true + elif echo "$line" | grep -qi 'intel'; then + has_intel=true + elif echo "$line" | grep -qi 'virtio\|vmware'; then + has_vm=true + fi + done < <(lspci | grep -i 'vga\|3d') + + if $has_vm; then + DETECTED_PROFILE="vm" + elif $has_nvidia && $has_intel; then + DETECTED_PROFILE="hybrid" + elif $has_nvidia; then + DETECTED_PROFILE="nvidia" + elif $has_amd; then + DETECTED_PROFILE="amd" + elif $has_intel; then + DETECTED_PROFILE="intel" + fi +fi + +# Handle detected profile or fall back to manual input +if [ -n "$DETECTED_PROFILE" ]; then + profile="$DETECTED_PROFILE" + echo -e "${GREEN}Detected GPU profile: $profile${NC}" + read -p "Correct? (Y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo -e "${RED}GPU profile not confirmed. Falling back to manual selection.${NC}" + profile="" # Clear profile to force manual input + fi +fi + +# If profile is still empty (either not detected or not confirmed), prompt manually +if [ -z "$profile" ]; then + echo -e "${RED}Automatic GPU detection failed or no specific profile found.${NC}" + read -rp "Enter Your Hardware Profile (GPU)\nOptions:\n[ amd ]\nnvidia\nnvidia-laptop\nintel\nvm\nPlease type out your choice: " profile + if [ -z "$profile" ]; then + profile="amd" + fi + echo -e "${GREEN}Selected GPU profile: $profile${NC}" +fi + +print_header "Backup Existing zaneyos (if any)" + +backupname=$(date +"%Y-%m-%d-%H-%M-%S") +if [ -d "zaneyos" ]; then + echo -e "${GREEN}zaneyos exists, backing up to .config/zaneyos-backups folder.${NC}" + if [ -d ".config/zaneyos-backups" ]; then + echo -e "${GREEN}Moving current version of zaneyos to backups folder.${NC}" + mv "$HOME"/zaneyos .config/zaneyos-backups/"$backupname" + sleep 1 + else + echo -e "${GREEN}Creating the backups folder & moving zaneyos to it.${NC}" + mkdir -p .config/zaneyos-backups + mv "$HOME"/zaneyos .config/zaneyos-backups/"$backupname" + sleep 1 + fi +else + echo -e "${GREEN}Thank you for choosing zaneyos.${NC}" + echo -e "${GREEN}I hope you find your time here enjoyable!${NC}" +fi + +print_header "Cloning zaneyos Repository" +git clone https://gitlab.com/dwilliam62/zaneyos.git --depth=1 ~/zaneyos +cd ~/zaneyos || exit 1 + +print_header "Configuring Host and Profile" +mkdir -p hosts/"$hostName" +cp hosts/default/*.nix hosts/"$hostName" + +installusername=$(echo $USER) +git config --global user.name "$installusername" +git config --global user.email "$installusername@gmail.com" +git add . +git config --global --unset-all user.name +git config --global --unset-all user.email + +sed -i "/^[[:space:]]*host[[:space:]]*=[[:space:]]*\"/ s/\"[^\"]*\"/\"$hostName\"/" ./flake.nix +sed -i "/^[[:space:]]*profile[[:space:]]*=[[:space:]]*\"/ s/\"[^\"]*\"/\"$profile\"/" ./flake.nix + +print_header "Keyboard Layout Configuration" +read -rp "Enter your keyboard layout: [ us ] " keyboardLayout +if [ -z "$keyboardLayout" ]; then + keyboardLayout="us" +fi +sed -i "/^[[:space:]]*keyboardLayout[[:space:]]*=[[:space:]]*\"/ s/\"[^\"]*\"/\"$keyboardLayout\"/" ./hosts/$hostName/variables.nix + +print_header "Console Keymap Configuration" +read -rp "Enter your console keymap: [ us ] " consoleKeyMap +if [ -z "$consoleKeyMap" ]; then + consoleKeyMap="us" +fi +sed -i "/^[[:space:]]*consoleKeyMap[[:space:]]*=[[:space:]]*\"/ s/\"[^\"]*\"/\"$consoleKeyMap\"/" ./hosts/$hostName/variables.nix + +print_header "Username Configuration" +sed -i "/^[[:space:]]*username[[:space:]]*=[[:space:]]*\"/ s/\"[^\"]*\"/\"$installusername\"/" ./flake.nix + +print_header "Generating Hardware Configuration -- Ignore ERROR: cannot access /bin" +sudo nixos-generate-config --show-hardware-config > ./hosts/$hostName/hardware.nix + +print_header "Setting Nix Configuration" +NIX_CONFIG="experimental-features = nix-command flakes" + +print_header "Initiating NixOS Build" +read -p "Ready to run initial build? (Y/N): " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo -e "${RED}Build cancelled.${NC}" + exit 1 +fi + +sudo nixos-rebuild boot --flake ~/zaneyos/#${profile} + +# Check the exit status of the last command (nixos-rebuild) +if [ $? -eq 0 ]; then + print_success_banner +else + print_failure_banner +fi diff --git a/modules/home/kitty.nix b/modules/home/kitty.nix new file mode 100644 index 0000000..69a4490 --- /dev/null +++ b/modules/home/kitty.nix @@ -0,0 +1,75 @@ +{ pkgs, ... }: { + programs.kitty = { + enable = true; + package = pkgs.kitty; + settings = { + font_size = 12; + wheel_scroll_min_lines = 1; + window_padding_width = 4; + confirm_os_window_close = 0; + scrollback_lines = 10000; + enable_audio_bell = false; + mouse_hide_wait = 60; + cursor_trail = 1; + tab_fade = 1; + active_tab_font_style = "bold"; + inactive_tab_font_style = "bold"; + tab_bar_edge = "top"; + tab_bar_margin_width = 0; + tab_bar_style = "powerline"; + #tab_bar_style = "fade"; + enabled_layouts = "splits"; + }; + extraConfig = '' + + # Clipboard + map ctrl+shift+v paste_from_selection + map shift+insert paste_from_selection + + # Scrolling + map ctrl+shift+up scroll_line_up + map ctrl+shift+down scroll_line_down + map ctrl+shift+k scroll_line_up + map ctrl+shift+j scroll_line_down + map ctrl+shift+page_up scroll_page_up + map ctrl+shift+page_down scroll_page_down + map ctrl+shift+home scroll_home + map ctrl+shift+end scroll_end + map ctrl+shift+h show_scrollback + + # Window management + map alt+n new_window_with_cwd #open in current dir + #map alt+n new_os_window #opens term in $HOME + map alt+w close_window + map ctrl+shift+enter launch --location=hsplit + map ctrl+shift+s launch --location=vsplit + map ctrl+shift+] next_window + map ctrl+shift+[ previous_window + map ctrl+shift+f move_window_forward + map ctrl+shift+b move_window_backward + map ctrl+shift+` move_window_to_top + map ctrl+shift+1 first_window + map ctrl+shift+2 second_window + map ctrl+shift+3 third_window + map ctrl+shift+4 fourth_window + map ctrl+shift+5 fifth_window + map ctrl+shift+6 sixth_window + map ctrl+shift+7 seventh_window + map ctrl+shift+8 eighth_window + map ctrl+shift+9 ninth_window # Tab management + map ctrl+shift+0 tenth_window + map ctrl+shift+right next_tab + map ctrl+shift+left previous_tab + map ctrl+shift+t new_tab + map ctrl+shift+q close_tab + map ctrl+shift+l next_layout + map ctrl+shift+. move_tab_forward + map ctrl+shift+, move_tab_backward + + # Miscellaneous + map ctrl+shift+up increase_font_size + map ctrl+shift+down decrease_font_size + map ctrl+shift+backspace restore_font_size + ''; + }; +} diff --git a/modules/home/lazygit.nix b/modules/home/lazygit.nix new file mode 100644 index 0000000..298c74d --- /dev/null +++ b/modules/home/lazygit.nix @@ -0,0 +1,32 @@ +# Lazygit is a simple terminal UI for git commands. +{ config, lib, ... }: +let + accent = "#${config.lib.stylix.colors.base0D}"; + muted = "#${config.lib.stylix.colors.base03}"; +in +{ + programs.lazygit = { + enable = true; + settings = lib.mkForce { + disableStartupPopups = true; + notARepository = "skip"; + promptToReturnFromSubprocess = false; + update.method = "never"; + git = { + commit.signOff = true; + parseEmoji = true; + }; + gui = { + theme = { + activeBorderColor = [ accent "bold" ]; + inactiveBorderColor = [ muted ]; + }; + showListFooter = false; + showRandomTip = false; + showCommandLog = false; + showBottomLine = false; + nerdFontsVersion = "3"; + }; + }; + }; +} diff --git a/modules/home/nvf.nix b/modules/home/nvf.nix new file mode 100644 index 0000000..5ff7bd5 --- /dev/null +++ b/modules/home/nvf.nix @@ -0,0 +1,268 @@ +{ inputs +, config +, ... +}: { + imports = [ inputs.nvf.homeManagerModules.default ]; + + programs.nvf = { + enable = true; + + settings.vim = { + lsp.enable = true; + vimAlias = true; + viAlias = true; + withNodeJs = true; + lineNumberMode = "relNumber"; + enableLuaLoader = true; + preventJunkFiles = true; + options = { + tabstop = 4; + shiftwidth = 2; + wrap = false; + }; + + clipboard = { + enable = true; + registers = "unnamedplus"; + providers = { + wl-copy.enable = true; + xsel.enable = true; + }; + }; + + maps = { + normal = { + "e" = { + action = "Neotree toggle"; + silent = false; + }; + }; + }; + + diagnostics = { + enable = true; + config = { + virtual_lines.enable = true; + underline = true; + }; + }; + + keymaps = [ + { + key = "jk"; + mode = [ "i" ]; + action = ""; + desc = "Exit insert mode"; + } + { + key = "nh"; + mode = [ "n" ]; + action = ":nohl"; + desc = "Clear search highlights"; + } + { + key = "ff"; + mode = [ "n" ]; + action = "Telescope find_files"; + desc = "Search files by name"; + } + { + key = "lg"; + mode = [ "n" ]; + action = "Telescope live_grep"; + desc = "Search files by contents"; + } + { + key = "fe"; + mode = [ "n" ]; + action = "Neotree toggle"; + desc = "File browser toggle"; + } + { + key = ""; + mode = [ "i" ]; + action = ""; + desc = "Move left in insert mode"; + } + { + key = ""; + mode = [ "i" ]; + action = ""; + desc = "Move down in insert mode"; + } + { + key = ""; + mode = [ "i" ]; + action = ""; + desc = "Move up in insert mode"; + } + { + key = ""; + mode = [ "i" ]; + action = ""; + desc = "Move right in insert mode"; + } + ]; + + telescope.enable = true; + + spellcheck = { + enable = true; + languages = [ "en" ]; + programmingWordlist.enable = true; + }; + + lsp = { + formatOnSave = true; + lspkind.enable = false; + lightbulb.enable = false; + lspsaga.enable = false; + trouble.enable = true; + lspSignature.enable = true; + otter-nvim.enable = false; + nvim-docs-view.enable = false; + }; + + languages = { + enableFormat = true; + enableTreesitter = true; + enableExtraDiagnostics = true; + nix.enable = true; + clang.enable = true; + zig.enable = true; + python.enable = true; + markdown.enable = true; + ts = { + enable = true; + lsp.enable = true; + format.type = "prettierd"; + extensions.ts-error-translator.enable = true; + }; + html.enable = true; + lua.enable = true; + css = { + enable = true; + format.type = "prettierd"; + }; + typst.enable = true; + rust = { + enable = true; + crates.enable = true; + }; + }; + visuals = { + nvim-web-devicons.enable = true; + nvim-cursorline.enable = true; + cinnamon-nvim.enable = true; + fidget-nvim.enable = true; + highlight-undo.enable = true; + indent-blankline.enable = true; + rainbow-delimiters.enable = true; + }; + + statusline.lualine = { + enable = true; + theme = "base16"; + }; + + autopairs.nvim-autopairs.enable = true; + autocomplete.nvim-cmp.enable = true; + snippets.luasnip.enable = true; + tabline.nvimBufferline.enable = true; + treesitter.context.enable = false; + binds = { + whichKey.enable = true; + cheatsheet.enable = true; + }; + git = { + enable = true; + gitsigns.enable = true; + gitsigns.codeActions.enable = false; + }; + projects.project-nvim.enable = true; + dashboard.dashboard-nvim.enable = true; + filetree.neo-tree.enable = true; + notify = { + nvim-notify.enable = true; + nvim-notify.setupOpts.background_colour = "#${config.lib.stylix.colors.base01}"; + }; + utility = { + preview.markdownPreview.enable = true; + ccc.enable = false; + vim-wakatime.enable = false; + icon-picker.enable = true; + surround.enable = true; + diffview-nvim.enable = true; + motion = { + hop.enable = true; + leap.enable = true; + precognition.enable = false; + }; + images = { + image-nvim.enable = false; + }; + }; + ui = { + borders.enable = true; + noice.enable = true; + colorizer.enable = true; + illuminate.enable = true; + breadcrumbs = { + enable = false; + navbuddy.enable = false; + }; + smartcolumn = { + enable = true; + }; + fastaction.enable = true; + }; + + session = { + nvim-session-manager.enable = false; + }; + comments = { + comment-nvim.enable = true; + }; + + luaConfigPost = '' + -- Nix LSP (nil) configuration for auto-eval-inputs + local lspconfig = require('lspconfig') + lspconfig.nil_ls.setup({ + settings = { + ['nil'] = { + nix = { + auto_eval_inputs = true, + }, + }, + }, + }) + + -- Auto-update programming wordlist on first startup + vim.api.nvim_create_autocmd("VimEnter", { + callback = function() + -- Check if dirtytalk dict file exists + local dict_path = vim.fn.stdpath('data') .. '/site/spell/programming.utf-8.add' + if vim.fn.filereadable(dict_path) == 0 then + -- Only run if file doesn't exist to avoid repeated downloads + vim.schedule(function() + vim.cmd('DirtytalkUpdate') + end) + end + end, + }) + ''; + }; + }; + + home.activation = { + dirtytalkUpdate = '' + # Create the spell directory if it doesn't exist + mkdir -p "$HOME/.local/share/nvim/site/spell" + + # Try to run DirtytalkUpdate in headless mode with better error handling + if ! ${config.programs.nvf.finalPackage}/bin/nvim --headless -c "DirtytalkUpdate" -c "qa!" 2>/dev/null; then + echo "Note: DirtytalkUpdate will run automatically on first Neovim startup" + fi + ''; + }; +} diff --git a/modules/home/obs-studio.nix b/modules/home/obs-studio.nix new file mode 100644 index 0000000..d0b610c --- /dev/null +++ b/modules/home/obs-studio.nix @@ -0,0 +1,15 @@ +{ pkgs, ... }: { + programs.obs-studio = { + enable = true; + #enableVirtualCamera = true; + plugins = with pkgs.obs-studio-plugins; [ + wlrobs + obs-pipewire-audio-capture + obs-vkcapture + obs-source-clone + obs-move-transition + obs-composite-blur + obs-backgroundremoval + ]; + }; +} diff --git a/modules/home/qt.nix b/modules/home/qt.nix new file mode 100644 index 0000000..b8df345 --- /dev/null +++ b/modules/home/qt.nix @@ -0,0 +1,6 @@ +{ lib, ... }: { + qt = { + enable = true; + platformTheme.name = lib.mkForce "qtct"; + }; +} diff --git a/modules/home/rofi/config-long.nix b/modules/home/rofi/config-long.nix new file mode 100644 index 0000000..e8e9773 --- /dev/null +++ b/modules/home/rofi/config-long.nix @@ -0,0 +1,49 @@ +{ ... }: { + home.file.".config/rofi/config-long.rasi".text = '' + @import "~/.config/rofi/config.rasi" + window { + width: 750px; + border-radius: 20px; + } + mainbox { + orientation: vertical; + children: [ "inputbar", "listbox" ]; + } + inputbar { + padding: 75px 40px; + background-color: transparent; + background-image: url("~/Pictures/Wallpapers/Rainnight.jpg", width); + text-color: @foreground; + children: [ "textbox-prompt-colon", "entry" ]; + } + textbox-prompt-colon { + padding: 12px 20px; + border-radius: 100%; + background-color: @bg-alt; + text-color: @foreground; + } + entry { + expand: true; + padding: 12px 16px; + border-radius: 100%; + background-color: @bg-alt; + text-color: @foreground; + } + button { + padding: 12px; + border-radius: 100%; + } + element { + spacing: 10px; + padding: 12px; + border-radius: 100%; + } + textbox { + padding: 12px; + border-radius: 100%; + } + error-message { + border-radius: 0px; + } + ''; +} diff --git a/modules/home/rofi/default.nix b/modules/home/rofi/default.nix new file mode 100644 index 0000000..1b6ae5f --- /dev/null +++ b/modules/home/rofi/default.nix @@ -0,0 +1,6 @@ +{ ... }: { + imports = [ + ./config-long.nix + ./rofi.nix + ]; +} diff --git a/modules/home/rofi/rofi.nix b/modules/home/rofi/rofi.nix new file mode 100644 index 0000000..f9bb5a5 --- /dev/null +++ b/modules/home/rofi/rofi.nix @@ -0,0 +1,208 @@ +{ pkgs +, config +, ... +}: { + programs = { + rofi = { + enable = true; + package = pkgs.rofi-wayland; + extraConfig = { + modi = "drun,filebrowser,run"; + show-icons = true; + icon-theme = "Papirus"; + font = "JetBrainsMono Nerd Font Mono 12"; + drun-display-format = "{icon} {name}"; + display-drun = " Apps"; + display-run = " Run"; + display-filebrowser = " File"; + }; + theme = + let + inherit (config.lib.formats.rasi) mkLiteral; + in + { + "*" = { + bg = mkLiteral "#${config.stylix.base16Scheme.base00}"; + bg-alt = mkLiteral "#${config.stylix.base16Scheme.base09}"; + foreground = mkLiteral "#${config.stylix.base16Scheme.base01}"; + selected = mkLiteral "#${config.stylix.base16Scheme.base08}"; + active = mkLiteral "#${config.stylix.base16Scheme.base0B}"; + text-selected = mkLiteral "#${config.stylix.base16Scheme.base00}"; + text-color = mkLiteral "#${config.stylix.base16Scheme.base05}"; + border-color = mkLiteral "#${config.stylix.base16Scheme.base0F}"; + urgent = mkLiteral "#${config.stylix.base16Scheme.base0E}"; + }; + "window" = { + transparency = "real"; + width = mkLiteral "1000px"; + location = mkLiteral "center"; + anchor = mkLiteral "center"; + fullscreen = false; + x-offset = mkLiteral "0px"; + y-offset = mkLiteral "0px"; + cursor = "default"; + enabled = true; + border-radius = mkLiteral "15px"; + background-color = mkLiteral "@bg"; + }; + "mainbox" = { + enabled = true; + spacing = mkLiteral "0px"; + orientation = mkLiteral "horizontal"; + children = map mkLiteral [ + "imagebox" + "listbox" + ]; + background-color = mkLiteral "transparent"; + }; + "imagebox" = { + padding = mkLiteral "20px"; + background-color = mkLiteral "transparent"; + background-image = mkLiteral ''url("~/Pictures/Wallpapers/Rainnight.jpg", height)''; + orientation = mkLiteral "vertical"; + children = map mkLiteral [ + "inputbar" + "dummy" + "mode-switcher" + ]; + }; + "listbox" = { + spacing = mkLiteral "20px"; + padding = mkLiteral "20px"; + background-color = mkLiteral "transparent"; + orientation = mkLiteral "vertical"; + children = map mkLiteral [ + "message" + "listview" + ]; + }; + "dummy" = { + background-color = mkLiteral "transparent"; + }; + "inputbar" = { + enabled = true; + spacing = mkLiteral "10px"; + padding = mkLiteral "10px"; + border-radius = mkLiteral "10px"; + background-color = mkLiteral "@bg-alt"; + text-color = mkLiteral "@foreground"; + children = map mkLiteral [ + "textbox-prompt-colon" + "entry" + ]; + }; + "textbox-prompt-colon" = { + enabled = true; + expand = false; + str = ""; + background-color = mkLiteral "inherit"; + text-color = mkLiteral "inherit"; + }; + "entry" = { + enabled = true; + background-color = mkLiteral "inherit"; + text-color = mkLiteral "inherit"; + cursor = mkLiteral "text"; + placeholder = "Search"; + placeholder-color = mkLiteral "inherit"; + }; + "mode-switcher" = { + enabled = true; + spacing = mkLiteral "20px"; + background-color = mkLiteral "transparent"; + text-color = mkLiteral "@foreground"; + }; + "button" = { + padding = mkLiteral "15px"; + border-radius = mkLiteral "10px"; + background-color = mkLiteral "@bg-alt"; + text-color = mkLiteral "inherit"; + cursor = mkLiteral "pointer"; + }; + "button selected" = { + background-color = mkLiteral "@selected"; + text-color = mkLiteral "@foreground"; + }; + "listview" = { + enabled = true; + columns = 1; + lines = 8; + cycle = true; + dynamic = true; + scrollbar = false; + layout = mkLiteral "vertical"; + reverse = false; + fixed-height = true; + fixed-columns = true; + spacing = mkLiteral "10px"; + background-color = mkLiteral "transparent"; + text-color = mkLiteral "@foreground"; + cursor = "default"; + }; + "element" = { + enabled = true; + spacing = mkLiteral "15px"; + padding = mkLiteral "8px"; + border-radius = mkLiteral "10px"; + background-color = mkLiteral "transparent"; + text-color = mkLiteral "@text-color"; + cursor = mkLiteral "pointer"; + }; + "element normal.normal" = { + background-color = mkLiteral "inherit"; + text-color = mkLiteral "@text-color"; + }; + "element normal.urgent" = { + background-color = mkLiteral "@urgent"; + text-color = mkLiteral "@text-color"; + }; + "element normal.active" = { + background-color = mkLiteral "inherit"; + text-color = mkLiteral "@text-color"; + }; + "element selected.normal" = { + background-color = mkLiteral "@selected"; + text-color = mkLiteral "@foreground"; + }; + "element selected.urgent" = { + background-color = mkLiteral "@urgent"; + text-color = mkLiteral "@text-selected"; + }; + "element selected.active" = { + background-color = mkLiteral "@urgent"; + text-color = mkLiteral "@text-selected"; + }; + "element-icon" = { + background-color = mkLiteral "transparent"; + text-color = mkLiteral "inherit"; + size = mkLiteral "36px"; + cursor = mkLiteral "inherit"; + }; + "element-text" = { + background-color = mkLiteral "transparent"; + text-color = mkLiteral "inherit"; + cursor = mkLiteral "inherit"; + vertical-align = mkLiteral "0.5"; + horizontal-align = mkLiteral "0.0"; + }; + "message" = { + background-color = mkLiteral "transparent"; + }; + "textbox" = { + padding = mkLiteral "15px"; + border-radius = mkLiteral "10px"; + background-color = mkLiteral "@bg-alt"; + text-color = mkLiteral "@foreground"; + vertical-align = mkLiteral "0.5"; + horizontal-align = mkLiteral "0.0"; + }; + "error-message" = { + padding = mkLiteral "15px"; + border-radius = mkLiteral "20px"; + background-color = mkLiteral "@bg"; + text-color = mkLiteral "@foreground"; + }; + }; + }; + }; +} diff --git a/modules/home/scripts/default.nix b/modules/home/scripts/default.nix new file mode 100644 index 0000000..b9859a9 --- /dev/null +++ b/modules/home/scripts/default.nix @@ -0,0 +1,29 @@ +{ pkgs +, username +, profile +, ... +}: { + home.packages = [ + (import ./emopicker9000.nix { inherit pkgs; }) + (import ./hm-find.nix { inherit pkgs; }) + (import ./keybinds.nix { inherit pkgs; }) + (import ./note.nix { inherit pkgs; }) + (import ./note-from-clipboard.nix { inherit pkgs; }) + (import ./nvidia-offload.nix { inherit pkgs; }) + (import ./rofi-launcher.nix { inherit pkgs; }) + (import ./screenshootin.nix { inherit pkgs; }) + (import ./squirtle.nix { inherit pkgs; }) + (import ./task-waybar.nix { inherit pkgs; }) + (import ./wallsetter.nix { + inherit pkgs; + inherit username; + }) + (import ./web-search.nix { inherit pkgs; }) + (import ./zcli.nix { + inherit pkgs profile; + backupFiles = [ + ".config/mimeapps.list.backup" + ]; + }) + ]; +} diff --git a/modules/home/scripts/emopicker9000.nix b/modules/home/scripts/emopicker9000.nix new file mode 100644 index 0000000..3d4346c --- /dev/null +++ b/modules/home/scripts/emopicker9000.nix @@ -0,0 +1,22 @@ +{ pkgs }: +pkgs.writeShellScriptBin "emopicker9000" '' + # check if rofi is already running + if pidof rofi > /dev/null; then + pkill rofi + fi + + # Get user selection via wofi from emoji file. + chosen=$(cat $HOME/.config/.emoji | ${pkgs.rofi-wayland}/bin/rofi -i -dmenu -config ~/.config/rofi/config-long.rasi | awk '{print $1}') + + # Exit if none chosen. + [ -z "$chosen" ] && exit + + # If you run this command with an argument, it will automatically insert the + # character. Otherwise, show a message that the emoji has been copied. + if [ -n "$1" ]; then + ${pkgs.ydotool}/bin/ydotool type "$chosen" + else + printf "$chosen" | ${pkgs.wl-clipboard}/bin/wl-copy + ${pkgs.libnotify}/bin/notify-send "'$chosen' copied to clipboard." & + fi +'' diff --git a/modules/home/scripts/gemini-cli.nix b/modules/home/scripts/gemini-cli.nix new file mode 100644 index 0000000..d39d30c --- /dev/null +++ b/modules/home/scripts/gemini-cli.nix @@ -0,0 +1,37 @@ +{ config, pkgs, ... }: + +let + gemini-launcher = pkgs.writeShellScriptBin "gemini-launcher" '' + #!${pkgs.bash}/bin/bash + + # Define the path to your API key file + KEY_FILE="${config.home.homeDirectory}/gem.key" + + # Check if the key file exists and is readable + if [ -f "$KEY_FILE" ]; then + # Source the API key from the file. + source "$KEY_FILE" + # Launch Gemini directly; it will pick up the exported key. + exec ${pkgs.kitty}/bin/kitty -e ${pkgs.gemini-cli}/bin/gemini + else + # If the key file doesn't exist, launch kitty with an informational message, then start gemini. + exec ${pkgs.kitty}/bin/kitty -e bash -c "echo 'NOTE: Gemini API key file not found at ~/.gem.key.'; echo 'To use a key, create this file with content: export GEMINI_API_KEY=\"YOUR_KEY\"'; echo; echo 'Starting Gemini CLI, which will fall back to web-based login...'; echo; exec ${pkgs.gemini-cli}/bin/gemini" + fi + ''; + +in +{ + home.packages = [ + gemini-launcher + ]; + + xdg.desktopEntries.gemini-cli = { + name = "Gemini CLI"; + comment = "Launch the Gemini CLI in Kitty terminal"; + icon = "utilities-terminal"; + exec = "gemini-launcher"; + terminal = false; + type = "Application"; + categories = [ "Development" "Utility" ]; + }; +} diff --git a/modules/home/scripts/hm-find.nix b/modules/home/scripts/hm-find.nix new file mode 100644 index 0000000..77771d5 --- /dev/null +++ b/modules/home/scripts/hm-find.nix @@ -0,0 +1,60 @@ +{ pkgs }: +pkgs.writeShellScriptBin "hm-find" '' + #!/usr/bin/env bash + + # Script Metadata + #=============================================== + # This script searches recent journalctl entries for Home Manager errors + # It identifies backup files that prevent rebuilds and allows removal. + # Author: Don Williams + # Creation Date: May 6th, 2025 + # Revision History: + #----------------------------------------------- + # 0.1 - 5/6/25 - Initial version + # 0.2 - 5/7/25 - Improved messaging, added log directory check + + # Display WARNING message + echo "===============================================" + echo " ⚠️ WARNING ⚠️ " + echo "===============================================" + echo "*** This script is experimental! ***" + echo "It will attempt to find old backup files that are preventing Home Manager from rebuilding." + echo "If conflicting files are found, you will be prompted to remove them." + echo "A log of any deletions will be stored in \$HOME/hm-logs." + echo "===============================================" + + # Define the time range (default: last 30 minutes) + TIME_RANGE="30m" + LOG_DIR="$HOME/hm-logs" + LOG_FILE="$LOG_DIR/hm-cleanup-$(date +'%Y-%m-%d_%H-%M-%S').log" + + # Ensure the log directory exists + if [ ! -d "$LOG_DIR" ]; then + echo "Creating log directory: $LOG_DIR" + mkdir -p "$LOG_DIR" + fi + + # Search journal logs for backup conflicts and extract file paths + FILES=$(journalctl --since "-$TIME_RANGE" -xe | grep hm-activate | awk -F "'|'" '/would be clobbered by backing up/ {print $2}') + + # Check if any files were found + if [ -z "$FILES" ]; then + echo "No conflicting backup files found in the last $TIME_RANGE." + exit 0 + fi + + # Display found backup files + echo "🚨 The following backup files are preventing Home Manager from rebuilding:" + echo "$FILES" | tr ' ' '\n' + + # Ask for user confirmation before deletion + read -p "❓ Do you want to remove these files? (y/N): " confirm + + if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then + echo "🗑️ Deleting files..." | tee -a "$LOG_FILE" + echo "$FILES" | xargs rm -v | tee -a "$LOG_FILE" + echo "✅ Cleanup completed at $(date)" | tee -a "$LOG_FILE" + else + echo "⛔ No files were removed." | tee -a "$LOG_FILE" + fi +'' diff --git a/modules/home/scripts/keybinds.nix b/modules/home/scripts/keybinds.nix new file mode 100644 index 0000000..5a5a9f3 --- /dev/null +++ b/modules/home/scripts/keybinds.nix @@ -0,0 +1,17 @@ +{ pkgs }: +pkgs.writeShellScriptBin "list-keybinds" '' + # check if rofi is already running + if pidof rofi > /dev/null; then + pkill rofi + fi + + msg='☣️ NOTE ☣️: Clicking with Mouse or Pressing ENTER will have NO function' + keybinds=$(cat ~/.config/hypr/hyprland.conf | grep -E '^bind') + + # replace #modifier with SUPER in the displayed keybinds for rofi + display_keybinds=$(echo "$keybinds" | sed 's/\$modifier/SUPER/g') + + # use rofi to display the keybinds with the modified content + echo "$display_keybinds" | rofi -dmenu -i -config ~/.config/rofi/config-long.rasi -mesg "$msg" + +'' diff --git a/modules/home/scripts/note-from-clipboard.nix b/modules/home/scripts/note-from-clipboard.nix new file mode 100644 index 0000000..3c4546e --- /dev/null +++ b/modules/home/scripts/note-from-clipboard.nix @@ -0,0 +1,20 @@ +{ pkgs, ... }: +pkgs.writeShellScriptBin "note-from-clipboard" '' + #!/usr/bin/env bash + + # Check clipboard content type + clipboard_type=$(${pkgs.wl-clipboard}/bin/wl-paste --list-types | head -n 1) + + if [[ "$clipboard_type" == "text/plain"* ]]; then + # It's text, let's create a note + ${pkgs.wl-clipboard}/bin/wl-paste | note + if [ $? -eq 0 ]; then + ${pkgs.libnotify}/bin/notify-send -t 3000 "📝 Note Created" "Clipboard content added as a new note." + else + ${pkgs.libnotify}/bin/notify-send -t 5000 -u critical "❌ Note Creation Failed" "There was an error creating the note." + fi + else + # It's not text, so we do nothing and notify the user + ${pkgs.libnotify}/bin/notify-send -t 4000 -u low "📋 Note Skipped" "Clipboard does not contain text." + fi +'' diff --git a/modules/home/scripts/note.nix b/modules/home/scripts/note.nix new file mode 100644 index 0000000..3554cb1 --- /dev/null +++ b/modules/home/scripts/note.nix @@ -0,0 +1,244 @@ +{ pkgs, ... }: +pkgs.writeShellScriptBin "note" '' + + # Colors for nice output + RED='\033[0;31m' + GREEN='\033[0;32m' + YELLOW='\033[0;33m' + BLUE='\033[0;34m' + MAGENTA='\033[0;35m' + CYAN='\033[0;36m' + WHITE='\033[1;37m' + GRAY='\033[0;37m' + BOLD='\033[1m' + NC='\033[0m' # No Color + + # XDG-compliant notes directory and file + NOTES_DIR="$HOME/.local/share/notes" + NOTES_FILE="$NOTES_DIR/notes.txt" + + # Create notes directory if it doesn't exist + mkdir -p "$NOTES_DIR" + + # Function to display usage + show_usage() { + echo -e "''${BOLD}''${BLUE}📝 Note Manager''${NC}" + echo -e "''${GRAY}Usage:''${NC}" + echo -e " ''${CYAN}note''${NC} ''${YELLOW}''${NC} - Add a new note" + echo -e " ''${CYAN}note''${NC} - Display all notes" + echo -e " ''${CYAN}note del''${NC} ''${YELLOW}''${NC} - Delete note by number" + echo -e " ''${CYAN}note clear''${NC} - Clear all notes" + echo -e " ''${CYAN}echo 'text' | note''${NC} - Add note from stdin" + echo -e " ''${CYAN}cat file | note''${NC} - Add file contents as note" + echo "" + echo -e "''${GRAY}Examples:''${NC}" + echo -e " ''${GREEN}note call plumber tomorrow''${NC}" + echo -e " ''${GREEN}cat todo.txt | note''${NC}" + echo -e " ''${GREEN}note del 3''${NC}" + } + + # Function to add a note + add_note() { + local note_text="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + local date_only=$(date '+%Y-%m-%d') + + # Create notes file if it doesn't exist + touch "$NOTES_FILE" + + # Get next note number + local note_num=1 + if [ -f "$NOTES_FILE" ] && [ -s "$NOTES_FILE" ]; then + note_num=$(grep -E "^#[0-9]+" "$NOTES_FILE" | sed 's/^#\([0-9]*\).*/\1/' | sort -n | tail -1) + note_num=$((note_num + 1)) + fi + + # Add the note with proper formatting + { + echo "#$note_num [$timestamp]" + echo "$note_text" + echo "" + } >> "$NOTES_FILE" + + echo -e "''${GREEN}✓''${NC} Note #$note_num added ''${GRAY}($date_only)''${NC}" + } + + # Function to display all notes + display_notes() { + if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then + echo -e "''${YELLOW}📝 No notes found''${NC}" + echo -e "''${GRAY}Use ''${CYAN}note ''${GRAY} to add your first note''${NC}" + return + fi + + echo -e "''${BOLD}''${BLUE}📝 Your Notes''${NC}" + echo -e "''${GRAY}📁 $NOTES_FILE''${NC}" + echo -e "''${GRAY}$(printf '%.0s─' {1..50})''${NC}" + + local in_note=false + local note_content="" + + while IFS= read -r line; do + # Check if line starts with # followed by numbers and space and [ + if echo "$line" | grep -q "^#[0-9][0-9]* \["; then + # Print previous note content if exists + if [ "$in_note" = true ] && [ -n "$note_content" ]; then + echo -e "$note_content" + echo "" + fi + + # Extract note number and timestamp + local num=$(echo "$line" | sed 's/^#\([0-9]*\) \[.*/\1/') + local timestamp=$(echo "$line" | sed 's/^#[0-9]* \[\(.*\)\]/\1/') + local date_part=$(echo "$timestamp" | cut -d' ' -f1) + local time_part=$(echo "$timestamp" | cut -d' ' -f2) + + echo -e "''${BOLD}''${CYAN}#$num''${NC} ''${GRAY}[$date_part ''${YELLOW}$time_part''${GRAY}]''${NC}" + in_note=true + note_content="" + elif [ -n "$line" ] && [ "$in_note" = true ]; then + # Accumulate note content + if [ -z "$note_content" ]; then + note_content="''${WHITE}$line''${NC}" + else + note_content="$note_content\n''${WHITE}$line''${NC}" + fi + elif [ -z "$line" ] && [ "$in_note" = true ]; then + # End of current note + if [ -n "$note_content" ]; then + echo -e "$note_content" + echo "" + fi + in_note=false + note_content="" + fi + done < "$NOTES_FILE" + + # Print last note if file doesn't end with empty line + if [ "$in_note" = true ] && [ -n "$note_content" ]; then + echo -e "$note_content" + echo "" + fi + + local total_notes=$(grep -c "^#[0-9]" "$NOTES_FILE") + echo -e "''${GRAY}$(printf '%.0s─' {1..50})''${NC}" + echo -e "''${GRAY}Total: ''${BOLD}$total_notes''${NC} ''${GRAY}notes''${NC}" + } + + # Function to delete a note + delete_note() { + local note_num="$1" + + if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then + echo -e "''${RED}✗''${NC} No notes found" + return 1 + fi + + if ! echo "$note_num" | grep -q "^[0-9][0-9]*$"; then + echo -e "''${RED}✗''${NC} Invalid note number: $note_num" + return 1 + fi + + # Check if note exists + if ! grep -q "^#$note_num " "$NOTES_FILE"; then + echo -e "''${RED}✗''${NC} Note #$note_num not found" + return 1 + fi + + # Create temporary file without the specified note + local temp_file=$(mktemp) + local skip_lines=false + + while IFS= read -r line; do + if echo "$line" | grep -q "^#[0-9][0-9]* "; then + local current_num=$(echo "$line" | sed 's/^#\([0-9]*\) .*/\1/') + if [ "$current_num" = "$note_num" ]; then + skip_lines=true + continue + else + skip_lines=false + fi + fi + + if [ "$skip_lines" = false ]; then + echo "$line" >> "$temp_file" + elif [ -z "$line" ]; then + # Stop skipping when we hit an empty line (end of note) + skip_lines=false + fi + done < "$NOTES_FILE" + + mv "$temp_file" "$NOTES_FILE" + echo -e "''${GREEN}✓''${NC} Note #$note_num deleted" + } + + # Function to clear all notes + clear_notes() { + if [ ! -f "$NOTES_FILE" ] || [ ! -s "$NOTES_FILE" ]; then + echo -e "''${YELLOW}📝 No notes to clear''${NC}" + return + fi + + local total_notes=$(grep -c "^#[0-9]" "$NOTES_FILE") + echo -e "''${YELLOW}⚠''${NC} This will delete all $total_notes notes. Are you sure? ''${GRAY}[y/N]''${NC}" + read -r confirmation + + if echo "$confirmation" | grep -qi "^y"; then + > "$NOTES_FILE" + echo -e "''${GREEN}✓''${NC} All notes cleared" + else + echo -e "''${BLUE}ℹ''${NC} Operation cancelled" + fi + } + + # Main script logic + main() { + # Check if input is being piped + if [ ! -t 0 ]; then + # Read from stdin (pipe) + local piped_content="" + while IFS= read -r line; do + if [ -z "$piped_content" ]; then + piped_content="$line" + else + piped_content="$piped_content"$'\n'"$line" + fi + done + + if [ -n "$piped_content" ]; then + add_note "$piped_content" + else + echo -e "''${RED}✗''${NC} No input received from pipe" + exit 1 + fi + return + fi + + # Handle command line arguments + case "$1" in + "") + display_notes + ;; + "del") + if [ -z "$2" ]; then + echo -e "''${RED}✗''${NC} Please specify note number to delete" + echo -e "''${GRAY}Usage: ''${CYAN}note del ''${NC}" + exit 1 + fi + delete_note "$2" + ;; + "clear") + clear_notes + ;; + "help"|"--help"|"-h") + show_usage + ;; + *) + # Everything else is treated as note content + add_note "$*" + ;; + esac + } + + main "$@" +'' diff --git a/modules/home/scripts/nvidia-offload.nix b/modules/home/scripts/nvidia-offload.nix new file mode 100644 index 0000000..ada00d9 --- /dev/null +++ b/modules/home/scripts/nvidia-offload.nix @@ -0,0 +1,9 @@ +{ pkgs }: + +pkgs.writeShellScriptBin "nvidia-offload" '' + export __NV_PRIME_RENDER_OFFLOAD=1 + export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 + export __GLX_VENDOR_LIBRARY_NAME=nvidia + export __VK_LAYER_NV_optimus=NVIDIA_only + exec "$@" +'' diff --git a/modules/home/scripts/rofi-launcher.nix b/modules/home/scripts/rofi-launcher.nix new file mode 100644 index 0000000..014802d --- /dev/null +++ b/modules/home/scripts/rofi-launcher.nix @@ -0,0 +1,8 @@ +{ pkgs }: +pkgs.writeShellScriptBin "rofi-launcher" '' + # check if rofi is already running + if pidof rofi > /dev/null; then + pkill rofi + fi + rofi -show drun +'' diff --git a/modules/home/scripts/screenshootin.nix b/modules/home/scripts/screenshootin.nix new file mode 100644 index 0000000..15042b4 --- /dev/null +++ b/modules/home/scripts/screenshootin.nix @@ -0,0 +1,5 @@ +{ pkgs }: + +pkgs.writeShellScriptBin "screenshootin" '' + grim -g "$(slurp)" - | swappy -f - +'' diff --git a/modules/home/scripts/squirtle.nix b/modules/home/scripts/squirtle.nix new file mode 100644 index 0000000..c1aeb93 --- /dev/null +++ b/modules/home/scripts/squirtle.nix @@ -0,0 +1,23 @@ +{ pkgs }: + +pkgs.writeShellScriptBin "squirtle" '' + echo " +  ████████ ██████ +  ██████████████ ██████████ +  ████████████████████ ██████████████ +  ████████████████████████ ██████████████ + ██████████████████████████████████████████ + ████████████████████████████████████████ + ██████████████████████████████████████ +  ██████████████████████████████████ +  ████████████████████████████████ +  ██████████████████████████████ +  ██████████████████████████ +  ██████████████████████ +  ██████████████████████ +  ██████████████████████ +  ████ ████████████ +  ██████████ +  ██████  + " +'' diff --git a/modules/home/scripts/task-waybar.nix b/modules/home/scripts/task-waybar.nix new file mode 100644 index 0000000..9ba29d1 --- /dev/null +++ b/modules/home/scripts/task-waybar.nix @@ -0,0 +1,6 @@ +{ pkgs }: + +pkgs.writeShellScriptBin "task-waybar" '' + sleep 0.1 + ${pkgs.swaynotificationcenter}/bin/swaync-client -t & +'' diff --git a/modules/home/scripts/wallsetter.nix b/modules/home/scripts/wallsetter.nix new file mode 100644 index 0000000..6f391a6 --- /dev/null +++ b/modules/home/scripts/wallsetter.nix @@ -0,0 +1,24 @@ +{ pkgs, ... }: + +pkgs.writeShellScriptBin "wallsetter" '' + + TIMEOUT=720 + + for pid in $(pidof -o %PPID -x wallsetter); do + kill $pid + done + + if ! [ -d ~/Pictures/Wallpapers ]; then notify-send -t 5000 "~/Pictures/Wallpapers does not exist" && exit 1; fi + if [ $(ls -1 ~/Pictures/Wallpapers | wc -l) -lt 1 ]; then notify-send -t 9000 "The wallpaper folder is expected to have more than 1 image. Exiting Wallsetter." && exit 1; fi + + while true; do + while [ "$WALLPAPER" == "$PREVIOUS" ]; do + WALLPAPER=$(find ~/Pictures/Wallpapers -name '*' | awk '!/.git/' | tail -n +2 | shuf -n 1) + done + + PREVIOUS=$WALLPAPER + + ${pkgs.swww}/bin/swww img "$WALLPAPER" --transition-type random --transition-step 1 --transition-fps 60 + sleep $TIMEOUT + done +'' diff --git a/modules/home/scripts/web-search.nix b/modules/home/scripts/web-search.nix new file mode 100644 index 0000000..7af6e86 --- /dev/null +++ b/modules/home/scripts/web-search.nix @@ -0,0 +1,47 @@ +{ pkgs }: +pkgs.writeShellScriptBin "web-search" '' + # check if rofi is already running + if pidof rofi > /dev/null; then + pkill rofi + fi + + declare -A URLS + + URLS=( + ["🌎 Search"]="https://search.brave.com/search?q=" + ["❄️ Unstable Packages"]="https://search.nixos.org/packages?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=" + ["🎞️ YouTube"]="https://www.youtube.com/results?search_query=" + ["🦥 Arch Wiki"]="https://wiki.archlinux.org/title/" + ["🐃 Gentoo Wiki"]="https://wiki.gentoo.org/index.php?title=" + ) + + # List for rofi + gen_list() { + for i in "''${!URLS[@]}" + do + echo "$i" + done + } + + main() { + # Pass the list to rofi + platform=$( (gen_list) | ${pkgs.rofi-wayland}/bin/rofi -dmenu -config ~/.config/rofi/config-long.rasi ) + + if [[ -n "$platform" ]]; then + query=$( (echo ) | ${pkgs.rofi-wayland}/bin/rofi -dmenu -config ~/.config/rofi/config-long.rasi ) + + if [[ -n "$query" ]]; then + url=''${URLS[$platform]}$query + xdg-open "$url" + else + exit + fi + else + exit + fi + } + + main + + exit 0 +'' diff --git a/modules/home/scripts/zcli.nix b/modules/home/scripts/zcli.nix new file mode 100644 index 0000000..e04cc88 --- /dev/null +++ b/modules/home/scripts/zcli.nix @@ -0,0 +1,700 @@ +{ pkgs +, profile +, backupFiles ? [ ".config/mimeapps.list.backup" ] +, ... +}: +let + backupFilesString = pkgs.lib.strings.concatStringsSep " " backupFiles; + + # Create the get-doom script as a dependency + get-doom-script = pkgs.writeShellScriptBin "get-doom" '' + #!/usr/bin/env bash + set -euo pipefail + + # --- Icons --- + ICON_CHECK="✔" + ICON_INFO="ℹ" + ICON_ROCKET="🚀" + + # --- Helper Functions --- + print_status() { + echo + echo "--- $ICON_INFO $1 ---" + } + + print_success() { + echo "--- $ICON_CHECK $1 ---" + } + + print_banner() { + echo "===============================" + echo " Doom Emacs Installer $ICON_ROCKET" + echo "===============================" + } + + is_doom_installed() { + local dir="$1" + [[ -x "$dir/bin/doom" ]] && [[ -f "$dir/core/doom.el" ]] + } + + emacsdir_is_empty() { + local dir="$1" + [[ -d "$dir" ]] && [[ -z "$(ls -A "$dir" 2>/dev/null)" ]] + } + + # --- Main Script --- + print_banner + EMACSDIR="$HOME/.emacs.d" + + if is_doom_installed "$EMACSDIR"; then + print_success "Doom Emacs is already installed." + exit 0 + fi + + if [[ -d "$EMACSDIR" ]]; then + if emacsdir_is_empty "$EMACSDIR"; then + print_status "Found empty $EMACSDIR; proceeding to install Doom Emacs into it..." + else + echo "Error: Found $EMACSDIR but it does not look like a Doom Emacs installation." >&2 + echo "Refusing to overwrite a non-empty directory. Move it away and re-run, e.g.:" >&2 + echo " mv \"$EMACSDIR\" \"$EMACSDIR.bak\"" >&2 + exit 1 + fi + fi + + print_status "Cloning Doom Emacs..." + ${pkgs.git}/bin/git clone --depth 1 https://github.com/doomemacs/doomemacs "$EMACSDIR" + print_success "Doom Emacs cloned." + + print_status "Running Doom install..." + "$EMACSDIR/bin/doom" install + print_success "Doom install complete." + + print_status "Running doom sync..." + "$EMACSDIR/bin/doom" sync + print_success "Doom sync complete." + + echo + print_success "All done! Doom Emacs is ready to use." + ''; +in + +pkgs.writeShellScriptBin "zcli" '' + #!${pkgs.bash}/bin/bash + set -euo pipefail + + # --- Program info --- + # + # zcli - NixOS System Management CLI + # ================================== + # + # Purpose: NixOS system management utility for ZaneyOS distribution + # Author: Don Williams (ddubs) & Zaney + # Start Date: June 7th, 2025 + # Version: 1.0.2 + # + # Architecture: + # - Nix-generated shell script using writeShellScriptBin + # - Configuration via Nix parameters (profile, backupFiles) + # - Uses 'nh' tool for NixOS operations, 'inxi' for diagnostics + # - Git integration for host configuration versioning + # + # Helper Functions: + # verify_hostname() - Validates current hostname against flake.nix host variable + # Exits with error if mismatch or missing host directory + # detect_gpu_profile() - Parses lspci output to identify GPU hardware + # Returns: nvidia/nvidia-laptop/amd/intel/vm/empty + # handle_backups() - Removes files listed in BACKUP_FILES array from $HOME + # parse_nh_args() - Parses command-line arguments for nh operations + # print_help() - Outputs command usage and available operations + # + # Command Functions: + # cleanup - Interactive cleanup of old generations via 'nh clean' + # diag - Generate system report using 'inxi --full' + # list-gens - Display user/system generations via nix-env and nix profile + # rebuild - NixOS rebuild using 'nh os switch' + # rebuild-boot - NixOS rebuild for next boot using 'nh os boot' + # trim - SSD optimization via 'sudo fstrim -v /' + # update - Flake update + rebuild using 'nh os switch --update' + # update-host - Modify flake.nix host/profile variables via sed + # add-host - Add new host configuration + # del-host - Delete host configuration + # doom [sub] - Doom Emacs management (install/status/remove/update) + # + # Variables: + # PROJECT - Base directory name (ddubsos/zaneyos) + # PROFILE - Hardware profile from Nix parameter + # BACKUP_FILES - Array of backup file paths to clean + # FLAKE_NIX_PATH - Path to flake.nix for host/profile updates + # + + + # --- Configuration --- + PROJECT="zaneyos" #ddubos or zaneyos + PROFILE="${profile}" + BACKUP_FILES_STR="${backupFilesString}" + VERSION="1.0.2" + FLAKE_NIX_PATH="$HOME/$PROJECT/flake.nix" + + read -r -a BACKUP_FILES <<< "$BACKUP_FILES_STR" + + # --- Helper Functions --- + verify_hostname() { + local current_hostname + local flake_hostname + + current_hostname="$(hostname)" + + # Extract the host value from flake.nix + if [ -f "$FLAKE_NIX_PATH" ]; then + flake_hostname=$(${pkgs.gnugrep}/bin/grep -E '^[[:space:]]*host[[:space:]]*=' "$FLAKE_NIX_PATH" | ${pkgs.gnused}/bin/sed 's/.*=[[:space:]]*"\([^"]*\)".*/\1/') + + if [ -z "$flake_hostname" ]; then + echo "Error: Could not find 'host' variable in $FLAKE_NIX_PATH" >&2 + exit 1 + fi + + if [ "$current_hostname" != "$flake_hostname" ]; then + echo "Error: Hostname mismatch!" >&2 + echo " Current hostname: '$current_hostname'" >&2 + echo " Flake.nix host: '$flake_hostname'" >&2 + echo "" >&2 + echo "Hint: Run 'zcli update-host' to automatically update flake.nix" >&2 + echo " or manually edit $FLAKE_NIX_PATH" >&2 + exit 1 + fi + else + echo "Error: Flake.nix not found at $FLAKE_NIX_PATH" >&2 + exit 1 + fi + + # Also check if host folder exists + local folder="$HOME/$PROJECT/hosts/$current_hostname" + if [ ! -d "$folder" ]; then + echo "Error: Matching host not found in $PROJECT, Missing folder: $folder" >&2 + exit 1 + fi + } + + print_help() { + echo "ZaneyOS CLI Utility -- version $VERSION" + echo "" + echo "Usage: zcli [command] [options]" + echo "" + echo "Commands:" + echo " cleanup - Clean up old system generations. Can specify a number to keep." + echo " diag - Create a system diagnostic report." + echo " (Filename: homedir/diag.txt)" + echo " list-gens - List user and system generations." + echo " rebuild - Rebuild the NixOS system configuration." + echo " rebuild-boot - Rebuild and set as boot default (activates on next restart)." + echo " trim - Trim filesystems to improve SSD performance." + echo " update - Update the flake and rebuild the system." + echo " update-host - Auto set host and profile in flake.nix." + echo " (Opt: zcli update-host [hostname] [profile])" + echo "" + echo "Options for rebuild, rebuild-boot, and update commands:" + echo " --dry, -n - Show what would be done without doing it" + echo " --ask, -a - Ask for confirmation before proceeding" + echo " --cores N - Limit build to N cores (useful for VMs)" + echo " --verbose, -v - Show verbose output" + echo " --no-nom - Don't use nix-output-monitor" + echo "" + echo "Doom Emacs:" + echo " doom install - Install Doom Emacs using get-doom script." + echo " doom status - Check if Doom Emacs is installed." + echo " doom remove - Remove Doom Emacs installation." + echo " doom update - Update Doom Emacs (runs doom sync)." + echo "" + echo " help - Show this help message." + } + + handle_backups() { + if [ ''${#BACKUP_FILES[@]} -eq 0 ]; then + echo "No backup files configured to check." + return + fi + + echo "Checking for backup files to remove..." + for file_path in "''${BACKUP_FILES[@]}"; do + full_path="$HOME/$file_path" + if [ -f "$full_path" ]; then + echo "Removing stale backup file: $full_path" + rm "$full_path" + fi + done + } + + detect_gpu_profile() { + local detected_profile="" + local has_nvidia=false + local has_intel=false + local has_amd=false + local has_vm=false + + if ${pkgs.pciutils}/bin/lspci &> /dev/null; then # Check if lspci is available + if ${pkgs.pciutils}/bin/lspci | ${pkgs.gnugrep}/bin/grep -qi 'vga\|3d'; then + while read -r line; do + if echo "$line" | ${pkgs.gnugrep}/bin/grep -qi 'nvidia'; then + has_nvidia=true + elif echo "$line" | ${pkgs.gnugrep}/bin/grep -qi 'amd'; then + has_amd=true + elif echo "$line" | ${pkgs.gnugrep}/bin/grep -qi 'intel'; then + has_intel=true + elif echo "$line" | ${pkgs.gnugrep}/bin/grep -qi 'virtio\|vmware'; then + has_vm=true + fi + done < <(${pkgs.pciutils}/bin/lspci | ${pkgs.gnugrep}/bin/grep -i 'vga\|3d') + + if "$has_vm"; then + detected_profile="vm" + elif "$has_nvidia" && "$has_intel"; then + detected_profile="nvidia-laptop" + elif "$has_nvidia"; then + detected_profile="nvidia" + elif "$has_amd"; then + detected_profile="amd" + elif "$has_intel"; then + detected_profile="intel" + fi + fi + else + echo "Warning: lspci command not found. Cannot auto-detect GPU profile." >&2 + fi + echo "$detected_profile" # Return the detected profile + } + + # --- Helper function to parse additional arguments --- + parse_nh_args() { + local args_string="" + local options_selected=() + shift # Remove the main command (rebuild, rebuild-boot, update) + + while [[ $# -gt 0 ]]; do + case $1 in + --dry|-n) + args_string="$args_string --dry" + options_selected+=("dry run mode (showing what would be done)") + shift + ;; + --ask|-a) + args_string="$args_string --ask" + options_selected+=("confirmation prompts enabled") + shift + ;; + --cores) + if [[ -n $2 && $2 =~ ^[0-9]+$ ]]; then + args_string="$args_string -- --cores $2" + options_selected+=("limited to $2 CPU cores") + shift 2 + else + echo "Error: --cores requires a numeric argument" >&2 + exit 1 + fi + ;; + --verbose|-v) + args_string="$args_string --verbose" + options_selected+=("verbose output enabled") + shift + ;; + --no-nom) + args_string="$args_string --no-nom" + options_selected+=("nix-output-monitor disabled") + shift + ;; + --) + shift + args_string="$args_string -- $*" + options_selected+=("additional arguments: $*") + break + ;; + -*) + echo "Warning: Unknown flag '$1' - passing through to nh" >&2 + args_string="$args_string $1" + options_selected+=("unknown flag '$1' passed through") + shift + ;; + *) + echo "Error: Unexpected argument '$1'" >&2 + exit 1 + ;; + esac + done + + # Print friendly confirmation of selected options to stderr so it doesn't interfere with return value + if [[ ''${#options_selected[@]} -gt 0 ]]; then + echo "Options selected:" >&2 + for option in "''${options_selected[@]}"; do + echo " ✓ $option" >&2 + done + echo >&2 + fi + + # Return only the args string + echo "$args_string" + } + + # --- Main Logic --- + if [ "$#" -eq 0 ]; then + echo "Error: No command provided." >&2 + print_help + exit 1 + fi + + case "$1" in + cleanup) + echo "Warning! This will remove old generations of your system." + read -p "How many generations to keep (default: all)? " keep_count + + if [ -z "$keep_count" ]; then + read -p "This will remove all but the current generation. Continue (y/N)? " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + ${pkgs.nh}/bin/nh clean all -v + else + echo "Cleanup cancelled." + fi + else + read -p "This will keep the last $keep_count generations. Continue (y/N)? " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + ${pkgs.nh}/bin/nh clean all -k "$keep_count" -v + else + echo "Cleanup cancelled." + fi + fi + + LOG_DIR="$HOME/zcli-cleanup-logs" + mkdir -p "$LOG_DIR" + LOG_FILE="$LOG_DIR/zcli-cleanup-$(${pkgs.coreutils}/bin/date +%Y-%m-%d_%H-%M-%S).log" + echo "Cleaning up old log files..." >> "$LOG_FILE" + ${pkgs.findutils}/bin/find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1 + echo "Cleanup process logged to $LOG_FILE" + ;; + diag) + echo "Generating system diagnostic report..." + ${pkgs.inxi}/bin/inxi --full > "$HOME/diag.txt" + echo "Diagnostic report saved to $HOME/diag.txt" + ;; + help) + print_help + ;; + list-gens) + echo "--- User Generations ---" + ${pkgs.nix}/bin/nix-env --list-generations | ${pkgs.coreutils}/bin/cat || echo "Could not list user generations." + echo "" + echo "--- System Generations ---" + ${pkgs.nix}/bin/nix profile history --profile /nix/var/nix/profiles/system | ${pkgs.coreutils}/bin/cat || echo "Could not list system generations." + ;; + rebuild) + verify_hostname + handle_backups + + # Parse additional arguments + extra_args=$(parse_nh_args "$@") + + echo "Starting NixOS rebuild for host: $(${pkgs.nettools}/bin/hostname)" + if eval "${pkgs.nh}/bin/nh os switch --hostname '$PROFILE' $extra_args"; then + echo "Rebuild finished successfully" + else + echo "Rebuild Failed" >&2 + exit 1 + fi + ;; + rebuild-boot) + verify_hostname + handle_backups + + # Parse additional arguments + extra_args=$(parse_nh_args "$@") + + echo "Starting NixOS rebuild (boot) for host: $(${pkgs.nettools}/bin/hostname)" + echo "Note: Configuration will be activated on next reboot" + if eval "${pkgs.nh}/bin/nh os boot --hostname '$PROFILE' $extra_args"; then + echo "Rebuild-boot finished successfully" + echo "New configuration set as boot default - restart to activate" + else + echo "Rebuild-boot Failed" >&2 + exit 1 + fi + ;; + trim) + echo "Running 'sudo fstrim -v /' may take a few minutes and impact system performance." + read -p "Enter (y/Y) to run now or enter to exit (y/N): " -n 1 -r + echo # move to a new line + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Running fstrim..." + sudo ${pkgs.util-linux}/bin/fstrim -v / + echo "fstrim complete." + else + echo "Trim operation cancelled." + fi + ;; + update) + verify_hostname + handle_backups + + # Parse additional arguments + extra_args=$(parse_nh_args "$@") + + echo "Updating flake and rebuilding system for host: $(${pkgs.nettools}/bin/hostname)" + if eval "${pkgs.nh}/bin/nh os switch --hostname '$PROFILE' --update $extra_args"; then + echo "Update and rebuild finished successfully" + else + echo "Update and rebuild Failed" >&2 + exit 1 + fi + ;; + update-host) + target_hostname="" + target_profile="" + + if [ "$#" -eq 3 ]; then # zcli update-host + target_hostname="$2" + target_profile="$3" + elif [ "$#" -eq 1 ]; then # zcli update-host (auto-detect) + echo "Attempting to auto-detect hostname and GPU profile..." + target_hostname=$(${pkgs.nettools}/bin/hostname) + target_profile=$(detect_gpu_profile) + + if [ -z "$target_profile" ]; then + echo "Error: Could not auto-detect a specific GPU profile. Please provide it manually." >&2 + echo "Usage: zcli update-host [hostname] [profile]" >&2 + exit 1 + fi + echo "Auto-detected Hostname: $target_hostname" + echo "Auto-detected Profile: $target_profile" + else + echo "Error: Invalid number of arguments for 'update-host'." >&2 + echo "Usage: zcli update-host [hostname] [profile]" >&2 + exit 1 + fi + + echo "Updating $FLAKE_NIX_PATH..." + + # Update host + if ${pkgs.gnused}/bin/sed -i "s/^[[:space:]]*host[[:space:]]*=[[:space:]]*\".*\"/ host = \"$target_hostname\"/" "$FLAKE_NIX_PATH"; then + echo "Successfully updated host to: $target_hostname" + else + echo "Error: Failed to update host in $FLAKE_NIX_PATH" >&2 + exit 1 + fi + + # Update profile + if ${pkgs.gnused}/bin/sed -i "s/^[[:space:]]*profile[[:space:]]*=[[:space:]]*\".*\"/ profile = \"$target_profile\"/" "$FLAKE_NIX_PATH"; then + echo "Successfully updated profile to: $target_profile" + else + echo "Error: Failed to update profile in $FLAKE_NIX_PATH" >&2 + exit 1 + fi + + echo "Flake.nix updated successfully!" + ;; + add-host) + hostname="" + profile_arg="" + + if [ "$#" -ge 2 ]; then + hostname="$2" + fi + if [ "$#" -eq 3 ]; then + profile_arg="$3" + fi + + if [ -z "$hostname" ]; then + read -p "Enter the new hostname: " hostname + fi + + if [ -d "$HOME/$PROJECT/hosts/$hostname" ]; then + echo "Error: Host '$hostname' already exists." >&2 + exit 1 + fi + + echo "Copying default host configuration..." + ${pkgs.coreutils}/bin/cp -r "$HOME/$PROJECT/hosts/default" "$HOME/$PROJECT/hosts/$hostname" + + detected_profile="" + if [[ -n "$profile_arg" && "$profile_arg" =~ ^(intel|amd|nvidia|nvidia-hybrid|vm)$ ]]; then + detected_profile="$profile_arg" + else + echo "Detecting GPU profile..." + detected_profile=$(detect_gpu_profile) + echo "Detected GPU profile: $detected_profile" + read -p "Is this correct? (y/n) " -n 1 -r + echo + if [[ $REPLY =~ ^[Nn]$ ]]; then + read -p "Enter the correct profile (intel, amd, nvidia, nvidia-hybrid, vm): " new_profile + while [[ ! "$new_profile" =~ ^(intel|amd|nvidia|nvidia-hybrid|vm)$ ]]; do + echo "Invalid profile. Please enter one of the following: intel, amd, nvidia, nvidia-hybrid, vm" + read -p "Enter the correct profile: " new_profile + done + detected_profile=$new_profile + fi + fi + + echo "Setting profile to '$detected_profile'..." + ${pkgs.gnused}/bin/sed -i "s/profile = .*/profile = \"$detected_profile\";/" "$HOME/$PROJECT/hosts/$hostname/default.nix" + + read -p "Generate new hardware.nix? (y/n) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Generating hardware.nix..." + sudo nixos-generate-config --show-hardware-config > "$HOME/$PROJECT/hosts/$hostname/hardware.nix" + echo "hardware.nix generated." + fi + + echo "Adding new host to git..." + ${pkgs.git}/bin/git -C "$HOME/$PROJECT" add . + echo "hostname: $hostname added" + ;; + del-host) + hostname="" + if [ "$#" -eq 2 ]; then + hostname="$2" + else + read -p "Enter the hostname to delete: " hostname + fi + + if [ ! -d "$HOME/$PROJECT/hosts/$hostname" ]; then + echo "Error: Host '$hostname' does not exist." >&2 + exit 1 + fi + + read -p "Are you sure you want to delete the host '$hostname'? (y/N) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Deleting host '$hostname'..." + ${pkgs.coreutils}/bin/rm -rf "$HOME/$PROJECT/hosts/$hostname" + ${pkgs.git}/bin/git -C "$HOME/$PROJECT" add . + echo "hostname: $hostname removed" + else + echo "Deletion cancelled." + fi + ;; + doom) + if [ "$#" -lt 2 ]; then + echo "Error: doom command requires a subcommand." >&2 + echo "Usage: zcli doom [install|status|remove|update]" >&2 + exit 1 + fi + + # Ensure we're acting on a valid host and we can locate variables.nix + verify_hostname + current_hostname="$(hostname)" + host_vars_file="$HOME/$PROJECT/hosts/$current_hostname/variables.nix" + + if [ ! -f "$host_vars_file" ]; then + echo "Error: Host variables file not found: $host_vars_file" >&2 + echo "Please ensure your host folder exists and contains variables.nix." >&2 + exit 1 + fi + + is_doom_enabled() { + # Return 0 if doomEmacsEnable = true; appears (ignoring leading spaces) + ${pkgs.gnugrep}/bin/grep -Eq '^[[:space:]]*doomEmacsEnable[[:space:]]*=[[:space:]]*true[[:space:]]*;' "$host_vars_file" + } + + ensure_doom_enabled() { + # If the variable is present but false, flip it; if missing, append it + if ${pkgs.gnugrep}/bin/grep -Eq '^[[:space:]]*doomEmacsEnable[[:space:]]*=' "$host_vars_file"; then + ${pkgs.gnused}/bin/sed -i 's/^[[:space:]]*doomEmacsEnable[[:space:]]*=.*/ doomEmacsEnable = true;/' "$host_vars_file" + else + echo "" >> "$host_vars_file" + echo " # Enabled by zcli doom on $(date)" >> "$host_vars_file" + echo " doomEmacsEnable = true;" >> "$host_vars_file" + fi + } + + doom_subcommand="$2" + case "$doom_subcommand" in + install) + if ! is_doom_enabled; then + echo "✗ Doom Emacs is disabled for host '$current_hostname' (doomEmacsEnable = false)." >&2 + echo "To enable, set doomEmacsEnable = true; in:" >&2 + echo " $host_vars_file" >&2 + echo "and rebuild your system before installing Doom." >&2 + echo + read -p "Enable Doom for this host now and rebuild? (y/N) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Enabling Doom Emacs in $host_vars_file..." + ensure_doom_enabled + echo "Rebuilding system so user modules are applied..." + if ${pkgs.nh}/bin/nh os switch --hostname "$PROFILE"; then + echo "Rebuild complete. Proceeding with Doom installation." + else + echo "Error: Rebuild failed. Please fix the build and re-run 'zcli doom install'." >&2 + exit 1 + fi + else + echo "Aborting. Please enable doomEmacsEnable and rebuild before installing." >&2 + exit 1 + fi + fi + echo "Installing Doom Emacs..." + ${get-doom-script}/bin/get-doom + ;; + status) + if [ -x "$HOME/.emacs.d/bin/doom" ] && [ -f "$HOME/.emacs.d/core/doom.el" ]; then + echo "✔ Doom Emacs appears installed at $HOME/.emacs.d" + if [ -f "$HOME/.doom.d/init.el" ]; then + echo " • User config found: $HOME/.doom.d/init.el" + else + echo " • Warning: User config (~/.doom.d) not found" + fi + echo "Version information:" + "$HOME/.emacs.d/bin/doom" version 2>/dev/null || echo "Could not get version information" + else + if [ -d "$HOME/.emacs.d" ]; then + if [ -z "$(ls -A "$HOME/.emacs.d" 2>/dev/null)" ]; then + echo "✗ Found empty ~/.emacs.d (not a valid Doom installation)" + else + echo "✗ ~/.emacs.d exists but Doom was not detected" + fi + else + echo "✗ Doom Emacs is not installed" + fi + echo "Run 'zcli doom install' to install it" + fi + ;; + remove) + if [ ! -d "$HOME/.emacs.d" ]; then + echo "Doom Emacs is not installed" + exit 0 + fi + + echo "Warning: This will completely remove Doom Emacs and all your configuration!" + read -p "Are you sure you want to continue? (y/N) " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + echo "Removing Doom Emacs..." + ${pkgs.coreutils}/bin/rm -rf "$HOME/.emacs.d" + echo "✔ Doom Emacs has been removed" + else + echo "Removal cancelled" + fi + ;; + update) + if [ ! -x "$HOME/.emacs.d/bin/doom" ] || [ ! -f "$HOME/.emacs.d/core/doom.el" ]; then + echo "Error: Doom Emacs is not installed correctly. Run 'zcli doom install' first." >&2 + exit 1 + fi + + echo "Updating Doom Emacs..." + "$HOME/.emacs.d/bin/doom" sync + echo "✔ Doom Emacs update complete" + ;; + *) + echo "Error: Invalid doom subcommand '$doom_subcommand'" >&2 + echo "Usage: zcli doom [install|status|remove|update]" >&2 + exit 1 + ;; + esac + ;; + *) + echo "Error: Invalid command '$1'" >&2 + print_help + exit 1 + ;; + esac +'' diff --git a/modules/home/starship-ddubs-1.nix b/modules/home/starship-ddubs-1.nix new file mode 100644 index 0000000..2faa8b0 --- /dev/null +++ b/modules/home/starship-ddubs-1.nix @@ -0,0 +1,60 @@ +# starship is a minimal, fast, and extremely customizable prompt for any shell! +{ config +, lib +, ... +}: +let + accent = "#${config.lib.stylix.colors.base0D}"; + background-alt = "#${config.lib.stylix.colors.base01}"; +in +{ + programs.starship = { + enable = false; + settings = { + add_newline = false; + format = lib.concatStrings [ + "$nix_shell" + "$hostname" + "$directory" + "$git_branch" + "$git_state" + "$git_status" + "\n" + "$character" + ]; + directory = { style = accent; }; + + character = { + success_symbol = "[❯](${accent})"; + error_symbol = "[❯](red)"; + vimcmd_symbol = "[❮](cyan)"; + }; + + nix_shell = { + format = "[$symbol]($style) "; + symbol = "🐚"; + style = ""; + }; + + git_branch = { + symbol = "[](${background-alt}) "; + style = "fg:${accent} bg:${background-alt}"; + format = "on [$symbol$branch]($style)[](${background-alt}) "; + }; + + git_status = { + format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218)($ahead_behind$stashed)]($style)"; + style = "cyan"; + conflicted = ""; + renamed = ""; + deleted = ""; + stashed = "≡"; + }; + + git_state = { + format = "([$state( $progress_current/$progress_total)]($style)) "; + style = "bright-black"; + }; + }; + }; +} diff --git a/modules/home/starship.nix b/modules/home/starship.nix new file mode 100644 index 0000000..51090b9 --- /dev/null +++ b/modules/home/starship.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: { + programs.starship = { + enable = false; + package = pkgs.starship; + }; +} diff --git a/modules/home/stylix.nix b/modules/home/stylix.nix new file mode 100644 index 0000000..4448304 --- /dev/null +++ b/modules/home/stylix.nix @@ -0,0 +1,13 @@ +_: { + stylix.targets = { + waybar.enable = false; + rofi.enable = false; + hyprland.enable = false; + hyprlock.enable = false; + ghostty.enable = false; + qt = { + enable = true; + platform = "qtct"; + }; + }; +} diff --git a/modules/home/swappy.nix b/modules/home/swappy.nix new file mode 100644 index 0000000..b3b62a3 --- /dev/null +++ b/modules/home/swappy.nix @@ -0,0 +1,16 @@ +{ username, ... }: { + home.file = { + ".config/swappy/config".text = '' + [Default] + save_dir=/home/${username}/Pictures/Screenshots + save_filename_format=swappy-%Y%m%d-%H%M%S.png + show_panel=false + line_size=5 + text_size=20 + text_font=Ubuntu + paint_mode=brush + early_exit=true + fill_shape=false + ''; + }; +} diff --git a/modules/home/swaync.nix b/modules/home/swaync.nix new file mode 100644 index 0000000..2662402 --- /dev/null +++ b/modules/home/swaync.nix @@ -0,0 +1,311 @@ +{ config, ... }: { + services.swaync = { + enable = true; + settings = { + positionX = "right"; + positionY = "top"; + layer = "overlay"; + control-center-margin-top = 10; + control-center-margin-bottom = 10; + control-center-margin-right = 10; + control-center-margin-left = 10; + notification-icon-size = 64; + notification-body-image-height = 100; + notification-body-image-width = 200; + timeout = 10; + timeout-low = 5; + timeout-critical = 0; + fit-to-screen = false; + control-center-width = 500; + control-center-height = 1025; + notification-window-width = 500; + keyboard-shortcuts = true; + image-visibility = "when-available"; + transition-time = 200; + hide-on-clear = false; + hide-on-action = true; + script-fail-notify = true; + widget-config = { + title = { + text = "Notification Center"; + clear-all-button = true; + button-text = "󰆴 Clear All"; + }; + dnd = { + text = "Do Not Disturb"; + }; + label = { + max-lines = 1; + text = "Notification Center"; + }; + mpris = { + image-size = 96; + image-radius = 7; + }; + volume = { + label = "󰕾"; + }; + backlight = { + label = "󰃟"; + }; + }; + widgets = [ + "title" + "mpris" + "volume" + "backlight" + "dnd" + "notifications" + ]; + }; + style = '' + * { + font-family: JetBrainsMono Nerd Font Mono; + font-weight: bold; + } + .control-center .notification-row:focus, + .control-center .notification-row:hover { + opacity: 0.9; + background: #${config.lib.stylix.colors.base00} + } + .notification-row { + outline: none; + margin: 10px; + padding: 0; + } + .notification { + background: transparent; + padding: 0; + margin: 0px; + } + .notification-content { + background: #${config.lib.stylix.colors.base00}; + padding: 10px; + border-radius: 5px; + border: 2px solid #${config.lib.stylix.colors.base0D}; + margin: 0; + } + .notification-default-action { + margin: 0; + padding: 0; + border-radius: 5px; + } + .close-button { + background: #${config.lib.stylix.colors.base08}; + color: #${config.lib.stylix.colors.base00}; + text-shadow: none; + padding: 0; + border-radius: 5px; + margin-top: 5px; + margin-right: 5px; + } + .close-button:hover { + box-shadow: none; + background: #${config.lib.stylix.colors.base0D}; + transition: all .15s ease-in-out; + border: none + } + .notification-action { + border: 2px solid #${config.lib.stylix.colors.base0D}; + border-top: none; + border-radius: 5px; + } + .notification-default-action:hover, + .notification-action:hover { + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base0B} + } + .notification-default-action { + border-radius: 5px; + margin: 0px; + } + .notification-default-action:not(:only-child) { + border-bottom-left-radius: 7px; + border-bottom-right-radius: 7px + } + .notification-action:first-child { + border-bottom-left-radius: 10px; + background: #${config.lib.stylix.colors.base00} + } + .notification-action:last-child { + border-bottom-right-radius: 10px; + background: #${config.lib.stylix.colors.base00} + } + .inline-reply { + margin-top: 8px + } + .inline-reply-entry { + background: #${config.lib.stylix.colors.base00}; + color: #${config.lib.stylix.colors.base05}; + caret-color: #${config.lib.stylix.colors.base05}; + border: 1px solid #${config.lib.stylix.colors.base09}; + border-radius: 5px + } + .inline-reply-button { + margin-left: 4px; + background: #${config.lib.stylix.colors.base00}; + border: 1px solid #${config.lib.stylix.colors.base09}; + border-radius: 5px; + color: #${config.lib.stylix.colors.base05} + } + .inline-reply-button:disabled { + background: initial; + color: #${config.lib.stylix.colors.base03}; + border: 1px solid transparent + } + .inline-reply-button:hover { + background: #${config.lib.stylix.colors.base00} + } + .body-image { + margin-top: 6px; + background-color: #${config.lib.stylix.colors.base05}; + border-radius: 5px + } + .summary { + font-size: 16px; + font-weight: 700; + background: transparent; + color: rgba(158, 206, 106, 1); + text-shadow: none + } + .time { + font-size: 16px; + font-weight: 700; + background: transparent; + color: #${config.lib.stylix.colors.base05}; + text-shadow: none; + margin-right: 18px + } + .body { + font-size: 15px; + font-weight: 400; + background: transparent; + color: #${config.lib.stylix.colors.base05}; + text-shadow: none + } + .control-center { + background: #${config.lib.stylix.colors.base00}; + border: 2px solid #${config.lib.stylix.colors.base0C}; + border-radius: 5px; + } + .control-center-list { + background: transparent + } + .control-center-list-placeholder { + opacity: .5 + } + .floating-notifications { + background: transparent + } + .blank-window { + background: alpha(black, 0) + } + .widget-title { + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base00}; + padding: 5px 10px; + margin: 10px 10px 5px 10px; + font-size: 1.5rem; + border-radius: 5px; + } + .widget-title>button { + font-size: 1rem; + color: #${config.lib.stylix.colors.base05}; + text-shadow: none; + background: #${config.lib.stylix.colors.base00}; + box-shadow: none; + border-radius: 5px; + } + .widget-title>button:hover { + background: #${config.lib.stylix.colors.base08}; + color: #${config.lib.stylix.colors.base00}; + } + .widget-dnd { + background: #${config.lib.stylix.colors.base00}; + padding: 5px 10px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + font-size: large; + color: #${config.lib.stylix.colors.base0B}; + } + .widget-dnd>switch { + border-radius: 5px; + /* border: 1px solid #${config.lib.stylix.colors.base0B}; */ + background: #${config.lib.stylix.colors.base0B}; + } + .widget-dnd>switch:checked { + background: #${config.lib.stylix.colors.base08}; + border: 1px solid #${config.lib.stylix.colors.base08}; + } + .widget-dnd>switch slider { + background: #${config.lib.stylix.colors.base00}; + border-radius: 5px + } + .widget-dnd>switch:checked slider { + background: #${config.lib.stylix.colors.base00}; + border-radius: 5px + } + .widget-label { + margin: 10px 10px 5px 10px; + } + .widget-label>label { + font-size: 1rem; + color: #${config.lib.stylix.colors.base05}; + } + .widget-mpris { + color: #${config.lib.stylix.colors.base05}; + padding: 5px 10px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + } + .widget-mpris > box > button { + border-radius: 5px; + } + .widget-mpris-player { + padding: 5px 10px; + margin: 10px + } + .widget-mpris-title { + font-weight: 700; + font-size: 1.25rem + } + .widget-mpris-subtitle { + font-size: 1.1rem + } + .widget-menubar>box>.menu-button-bar>button { + border: none; + background: transparent + } + .topbar-buttons>button { + border: none; + background: transparent + } + .widget-volume { + background: #${config.lib.stylix.colors.base01}; + padding: 5px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + font-size: x-large; + color: #${config.lib.stylix.colors.base05}; + } + .widget-volume>box>button { + background: #${config.lib.stylix.colors.base0B}; + border: none + } + .per-app-volume { + background-color: #${config.lib.stylix.colors.base00}; + padding: 4px 8px 8px; + margin: 0 8px 8px; + border-radius: 5px; + } + .widget-backlight { + background: #${config.lib.stylix.colors.base01}; + padding: 5px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + font-size: x-large; + color: #${config.lib.stylix.colors.base05} + } + ''; + }; +} diff --git a/modules/home/tealdeer.nix b/modules/home/tealdeer.nix new file mode 100644 index 0000000..1b2c859 --- /dev/null +++ b/modules/home/tealdeer.nix @@ -0,0 +1,10 @@ +{ ... }: { + programs.tealdeer = { + enable = true; + settings = { + display.compact = false; + display.use_pager = true; + updates.auto_update = true; + }; + }; +} diff --git a/modules/home/tmux.nix b/modules/home/tmux.nix new file mode 100644 index 0000000..43d13b1 --- /dev/null +++ b/modules/home/tmux.nix @@ -0,0 +1,118 @@ +# Tmux is a terminal multiplexer that allows you to run multiple terminal sessions in a single window. +{ pkgs, ... }: { + programs.tmux = { + enable = true; + mouse = true; + shell = "${pkgs.zsh}/bin/zsh"; + prefix = "C-a"; + terminal = "kitty"; + keyMode = "vi"; + + extraConfig = '' + set-option -g status-position top + + #set -g default-terminal "screen-256color" + set-option -g history-limit 5000 + unbind % + unbind '"' + + bind-key h select-pane -L + bind-key j select-pane -D + bind-key k select-pane -U + bind-key l select-pane -R + + set -gq allow-passthrough on + bind-key x kill-pane # skip "kill-pane 1? (y/n)" prompt + + bind-key -n C-Tab next-window + bind-key -n C-S-Tab previous-window + bind-key -n M-Tab new-window + + + # Start windows and panes index at 1, not 0. + set -g base-index 1 + setw -g pane-base-index 1 + + + bind-key "|" split-window -h -c "#{pane_current_path}" + bind-key "\\" split-window -fh -c "#{pane_current_path}" + + bind-key "-" split-window -v -c "#{pane_current_path}" + bind-key "_" split-window -fv -c "#{pane_current_path}" + + bind -r C-j resize-pane -D 15 + bind -r C-k resize-pane -U 15 + bind -r C-h resize-pane -L 15 + bind -r C-l resize-pane -R 15 + + # 'c' to new window + bind-key c new-window + + # 'n' next window + bind-key n next-window + + # 'p' next previous + bind-key n previous-window + + unbind r + bind r source-file ~/.config/tmux/tmux.conf + + bind -r m resize-pane -Z + + bind-key t clock-mode + bind-key q display-panes + bind-key u refresh-client + bind-key o select-pane -t :.+ + + + ##### Display Popups ##### + + bind C-y display-popup \ + -d "#{pane_current_path}" \ + -w 80% \ + -h 80% \ + -E "lazygit" + bind C-n display-popup -E 'bash -i -c "read -p \"Session name: \" name; tmux new-session -d -s \$name && tmux switch-client -t \$name"' + bind C-j display-popup -E "tmux list-sessions | sed -E 's/:.*$//' | grep -v \"^$(tmux display-message -p '#S')\$\" | fzf --reverse | xargs tmux switch-client -t" + #bind C-p display-popup -E "ipython" + #bind C-f display-popup \ + # -w 80% \ + # -h 80% \ + # -E 'rmpc' + bind C-r display-popup \ + -d "#{pane_current_path}" \ + -w 90% \ + -h 90% \ + -E "yazi" + bind C-z display-popup \ + -w 90% \ + -h 90% \ + -E 'nvim ~/ddubsos/flake.nix' + #bind C-g display-popup -E "bash -i ~/.tmux/scripts/chat-popup.sh" + bind C-t display-popup \ + -d "#{pane_current_path}" \ + -w 75% \ + -h 75% \ + -E "zsh" + + ##### Display Menu ##### + + bind d display-menu -T "#[align=centre]Dotfiles" -x C -y C \ + "ZaneyOS flake.nix" f "display-popup -E 'nvim ~/garandos/flake.nix'" \ + "ZaneyOS packages" p "display-popup -E 'nvim ~/garandos/modules/core/packages.nix'" \ + "ZaneyOS keybinds" k "display-popup -E 'nvim ~/garandos/modules/home/hyprland/binds.nix'" \ + "ZaneyOS env variables" e "display-popup -E 'nvim ~/garandos/modules/home/hyprland/env.nix'" \ + "ZaneyOS windowrules" w "display-popup -E 'nvim ~/garandos/modules/home/hyprland/windowrules.nix'" \ + "Exit" q "" + + + + ''; + + plugins = with pkgs; [ + tmuxPlugins.vim-tmux-navigator + tmuxPlugins.sensible + tmuxPlugins.tokyo-night-tmux + ]; + }; +} diff --git a/modules/home/virtmanager.nix b/modules/home/virtmanager.nix new file mode 100644 index 0000000..0a885e1 --- /dev/null +++ b/modules/home/virtmanager.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + dconf.settings = { + "org/virt-manager/virt-manager/connections" = { + autoconnect = [ "qemu:///system" ]; + uris = [ "qemu:///system" ]; + }; + }; +} diff --git a/modules/home/vscode.nix b/modules/home/vscode.nix new file mode 100644 index 0000000..2d7b5e8 --- /dev/null +++ b/modules/home/vscode.nix @@ -0,0 +1,39 @@ +{ pkgs, lib, ... }: { + nixpkgs.config.allowUnfree = true; + + programs.vscode = { + enable = true; + package = pkgs.vscodium; + profiles = { + default = { + extensions = with pkgs.vscode-extensions; [ + bbenoist.nix + jeff-hykin.better-nix-syntax + ms-vscode.cpptools-extension-pack + mads-hartmann.bash-ide-vscode + tamasfe.even-better-toml + zainchen.json + shd101wyy.markdown-preview-enhanced + ]; + # userSettings = { + # "chat.editor.fontFamily" = "JetBrains Mono"; + # "chat.editor.fontSize" = 20.0; + # "debug.console.fontFamily" = "JetBrains Mono"; + # "debug.console.fontSize" = 20.0; + # "editor.fontFamily" = "JetBrains Mono"; + # "editor.fontSize" = 20.0; + # "editor.inlayHints.fontFamily" = "JetBrains Mono"; + # "editor.inlineSuggest.fontFamily" = "JetBrains Mono"; + # "editor.minimap.sectionHeaderFontSize" = 12.857142857142858; + # "markdown.preview.fontFamily" = "Montserrat"; + # "markdown.preview.fontSize" = 20.0; + # "scm.inputFontFamily" = "JetBrains Mono"; + # "scm.inputFontSize" = 18.571428571428573; + # "screencastMode.fontSize" = 80.0; + # "terminal.integrated.fontSize" = 20.0; + # "workbench.colorTheme" = "One Dark Pro Monokai Darker"; + # }; + }; + }; + }; +} diff --git a/modules/home/waybar/waybar-curved.nix b/modules/home/waybar/waybar-curved.nix new file mode 100644 index 0000000..09a07e3 --- /dev/null +++ b/modules/home/waybar/waybar-curved.nix @@ -0,0 +1,277 @@ +{ pkgs +, lib +, host +, config +, ... +}: +let + betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)"; + inherit (import ../../../hosts/${host}/variables.nix) clock24h; +in +with lib; { + # Configure & Theme Waybar + programs.waybar = { + enable = true; + package = pkgs.waybar; + settings = [ + { + layer = "top"; + position = "top"; + modules-center = [ "hyprland/workspaces" ]; + modules-left = [ + "custom/startmenu" + "hyprland/window" + "pulseaudio" + "cpu" + "memory" + "idle_inhibitor" + ]; + modules-right = [ + "custom/hyprbindings" + "custom/notification" + "custom/exit" + "battery" + "tray" + "clock" + ]; + + "hyprland/workspaces" = { + format = "{name}"; + format-icons = { + default = " "; + active = " "; + urgent = " "; + }; + on-scroll-up = "hyprctl dispatch workspace e+1"; + on-scroll-down = "hyprctl dispatch workspace e-1"; + }; + "clock" = { + format = + if clock24h == true + then '' {:L%H:%M}'' + else '' {:L%I:%M %p}''; + tooltip = true; + tooltip-format = "{:%A, %d.%B %Y }\n{calendar}"; + }; + "hyprland/window" = { + max-length = 22; + separate-outputs = false; + rewrite = { + "" = " 🙈 No Windows? "; + }; + }; + "memory" = { + interval = 5; + format = " {}%"; + tooltip = true; + }; + "cpu" = { + interval = 5; + format = " {usage:2}%"; + tooltip = true; + }; + "disk" = { + format = " {free}"; + tooltip = true; + }; + "network" = { + format-icons = [ + "󰤯" + "󰤟" + "󰤢" + "󰤥" + "󰤨" + ]; + format-ethernet = " {bandwidthDownOctets}"; + format-wifi = "{icon} {signalStrength}%"; + format-disconnected = "󰤮"; + tooltip = false; + }; + "tray" = { + spacing = 12; + }; + "pulseaudio" = { + format = "{icon} {volume}% {format_source}"; + format-bluetooth = "{volume}% {icon} {format_source}"; + format-bluetooth-muted = " {icon} {format_source}"; + format-muted = " {format_source}"; + format-source = " {volume}%"; + format-source-muted = ""; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ + "" + "" + "" + ]; + }; + on-click = "sleep 0.1 && pavucontrol"; + }; + "custom/exit" = { + tooltip = false; + format = ""; + on-click = "sleep 0.1 && wlogout"; + }; + "custom/startmenu" = { + tooltip = false; + format = ""; + # exec = "rofi -show drun"; + on-click = "sleep 0.1 && rofi-launcher"; + }; + "custom/hyprbindings" = { + tooltip = false; + format = "󱕴"; + on-click = "sleep 0.1 && list-keybinds"; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + tooltip = "true"; + }; + "custom/notification" = { + tooltip = false; + format = "{icon} {}"; + format-icons = { + notification = ""; + none = ""; + dnd-notification = ""; + dnd-none = ""; + inhibited-notification = ""; + inhibited-none = ""; + dnd-inhibited-notification = ""; + dnd-inhibited-none = ""; + }; + return-type = "json"; + exec-if = "which swaync-client"; + exec = "swaync-client -swb"; + on-click = "sleep 0.1 && task-waybar"; + escape = true; + }; + "battery" = { + states = { + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-plugged = "󱘖 {capacity}%"; + format-icons = [ + "󰁺" + "󰁻" + "󰁼" + "󰁽" + "󰁾" + "󰁿" + "󰂀" + "󰂁" + "󰂂" + "󰁹" + ]; + on-click = ""; + tooltip = false; + }; + } + ]; + style = concatStrings [ + '' + * { + font-family: JetBrainsMono Nerd Font Mono; + font-size: 16px; + border-radius: 0px; + border: none; + min-height: 0px; + } + window#waybar { + background: rgba(0,0,0,0); + } + #workspaces { + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base01}; + margin: 4px 4px; + padding: 5px 5px; + border-radius: 16px; + } + #workspaces button { + font-weight: bold; + padding: 0px 5px; + margin: 0px 3px; + border-radius: 16px; + color: #${config.lib.stylix.colors.base00}; + background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + opacity: 0.5; + transition: ${betterTransition}; + } + #workspaces button.active { + font-weight: bold; + padding: 0px 5px; + margin: 0px 3px; + border-radius: 16px; + color: #${config.lib.stylix.colors.base00}; + background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + transition: ${betterTransition}; + opacity: 1.0; + min-width: 40px; + } + #workspaces button:hover { + font-weight: bold; + border-radius: 16px; + color: #${config.lib.stylix.colors.base00}; + background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + opacity: 0.8; + transition: ${betterTransition}; + } + tooltip { + background: #${config.lib.stylix.colors.base00}; + border: 1px solid #${config.lib.stylix.colors.base08}; + border-radius: 12px; + } + tooltip label { + color: #${config.lib.stylix.colors.base08}; + } + #window, #pulseaudio, #cpu, #memory, #idle_inhibitor { + font-weight: bold; + margin: 4px 0px; + margin-left: 7px; + padding: 0px 18px; + background: #${config.lib.stylix.colors.base04}; + color: #${config.lib.stylix.colors.base00}; + border-radius: 24px 10px 24px 10px; + } + #custom-startmenu { + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base02}; + font-size: 28px; + margin: 0px; + padding: 0px 30px 0px 15px; + border-radius: 0px 0px 40px 0px; + } + #custom-hyprbindings, #network, #battery, + #custom-notification, #tray, #custom-exit { + font-weight: bold; + background: #${config.lib.stylix.colors.base0F}; + color: #${config.lib.stylix.colors.base00}; + margin: 4px 0px; + margin-right: 7px; + border-radius: 10px 24px 10px 24px; + padding: 0px 18px; + } + #clock { + font-weight: bold; + color: #0D0E15; + background: linear-gradient(90deg, #${config.lib.stylix.colors.base0E}, #${config.lib.stylix.colors.base0C}); + margin: 0px; + padding: 0px 15px 0px 30px; + border-radius: 0px 0px 0px 40px; + } + '' + ]; + }; +} diff --git a/modules/home/waybar/waybar-ddubs-2.nix b/modules/home/waybar/waybar-ddubs-2.nix new file mode 100644 index 0000000..cbd62fe --- /dev/null +++ b/modules/home/waybar/waybar-ddubs-2.nix @@ -0,0 +1,356 @@ +{ pkgs +, config +, lib +, ... +}: +let + terminal = "kitty"; + base00 = "0F1419"; + base01 = "131721"; + base03 = "3E4B59"; + base05 = "E6E1CF"; + base06 = "E6E1CF"; + base07 = "F3F4F5"; + base08 = "F07178"; + base09 = "FF8F40"; + base0A = "FFB454"; + base0B = "B8CC52"; + base0C = "95E6CB"; + base0D = "59C2FF"; + base0E = "D2A6FF"; + base0F = "E6B673"; +in +with lib; { + # Configure & Theme Waybar + programs.waybar = { + enable = true; + package = pkgs.waybar; + settings = [ + { + layer = "top"; + position = "top"; + + modules-left = [ "custom/startmenu" "tray" "hyprland/window" ]; + modules-center = [ "hyprland/workspaces" ]; + modules-right = [ "idle_inhibitor" "custom/notification" "pulseaudio" "battery" "clock" "custom/exit" ]; + + "hyprland/workspaces" = { + format = "{name}"; + format-icons = { + default = " "; + active = " "; + urgent = " "; + }; + on-scroll-up = "hyprctl dispatch workspace e+1"; + on-scroll-down = "hyprctl dispatch workspace e-1"; + }; + "clock" = { + format = '' {:%H:%M}''; + /* + ''{: %I:%M %p}''; + */ + tooltip = true; + tooltip-format = "{:%A, %d.%B %Y }{calendar}"; + }; + "hyprland/window" = { + max-length = 60; + separate-outputs = false; + }; + "memory" = { + interval = 5; + format = " {}%"; + tooltip = true; + on-click = "${terminal} -e btop"; + }; + "cpu" = { + interval = 5; + format = " {usage:2}%"; + tooltip = true; + on-click = "${terminal} -e btop"; + }; + "disk" = { + format = " {free}"; + tooltip = true; + # Not working with zaneyos window open then closes + #on-click = "${terminal} -e sh -c df -h ; read"; + }; + "network" = { + format-icons = [ "󰤯" "󰤟" "󰤢" "󰤥" "󰤨" ]; + format-ethernet = " {bandwidthDownBits}"; + format-wifi = " {bandwidthDownBits}"; + format-disconnected = "󰤮"; + tooltip = false; + on-click = "${terminal} -e btop"; + }; + "tray" = { + spacing = 12; + }; + "pulseaudio" = { + format = "{icon} {volume}% {format_source}"; + format-bluetooth = "{volume}% {icon} {format_source}"; + format-bluetooth-muted = " {icon} {format_source}"; + format-muted = " {format_source}"; + format-source = " {volume}%"; + format-source-muted = ""; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ "" "" "" ]; + }; + on-click = "pavucontrol"; + }; + "custom/exit" = { + tooltip = false; + format = "⏻"; + on-click = "sleep 0.1 && wlogout"; + }; + "custom/startmenu" = { + tooltip = false; + format = " "; + # exec = "rofi -show drun"; + on-click = "rofi -show drun"; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = " "; + deactivated = " "; + }; + tooltip = "true"; + }; + "custom/notification" = { + tooltip = false; + format = "{icon} {}"; + format-icons = { + notification = ""; + none = ""; + dnd-notification = ""; + dnd-none = ""; + inhibited-notification = ""; + inhibited-none = ""; + dnd-inhibited-notification = ""; + dnd-inhibited-none = ""; + }; + return-type = "json"; + exec-if = "which swaync-client"; + exec = "swaync-client -swb"; + on-click = "swaync-client -t"; + escape = true; + }; + "battery" = { + states = { + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-plugged = "󱘖 {capacity}%"; + format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; + on-click = ""; + tooltip = false; + }; + } + ]; + style = concatStrings [ + '' + * { + font-size: 16px; + font-family: JetBrainsMono Nerd Font, Font Awesome, sans-serif; + font-weight: bold; + } + window#waybar { + /* + + background-color: rgba(26,27,38,0); + border-bottom: 1px solid rgba(26,27,38,0); + border-radius: 0px; + color: #${base0F}; + */ + + background-color: rgba(26,27,38,0); + border-bottom: 1px solid rgba(26,27,38,0); + border-radius: 0px; + color: #${base0F}; + } + #workspaces { + /* + Eternal + background: linear-gradient(180deg, #${base00}, #${base01}); + margin: 5px 5px 5px 0px; + padding: 0px 10px; + border-radius: 0px 15px 15px 0px; + border: 0px; + font-style: normal; + color: #${base00}; + */ + background: linear-gradient(45deg, #${base01}, #${base01}); + margin: 5px; + padding: 0px 1px; + border-radius: 15px; + border: 0px; + font-style: normal; + color: #${base00}; + } + #workspaces button { + padding: 0px 5px; + margin: 4px 3px; + border-radius: 15px; + border: 0px; + color: #${base00}; + background: linear-gradient(45deg, #${base0D}, #${base0E}); + opacity: 0.5; + transition: all 0.3s ease-in-out; + } + #workspaces button.active { + padding: 0px 5px; + margin: 4px 3px; + border-radius: 15px; + border: 0px; + color: #${base00}; + background: linear-gradient(45deg, #${base0D}, #${base0E}); + opacity: 1.0; + min-width: 40px; + transition: all 0.3s ease-in-out; + } + #workspaces button:hover { + border-radius: 15px; + color: #${base00}; + background: linear-gradient(45deg, #${base0D}, #${base0E}); + opacity: 0.8; + } + tooltip { + background: #${base00}; + border: 1px solid #${base0E}; + border-radius: 10px; + } + tooltip label { + color: #${base07}; + } + #window { + /* + Eternal + color: #${base05}; + background: #${base00}; + border-radius: 15px; + margin: 5px; + padding: 2px 20px; + */ + margin: 5px; + padding: 2px 20px; + color: #${base05}; + background: #${base01}; + border-radius: 15px 15px 15px 15px; + } + #memory { + color: #${base0F}; + /* + Eternal + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + */ + background: #${base01}; + margin: 5px; + padding: 2px 20px; + border-radius: 15px 15px 15px 15px; + } + #clock { + color: #${base0B}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + } + #idle_inhibitor { + color: #${base0A}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 3px; + padding: 2px 20px; + } + #cpu { + color: #${base07}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + } + #disk { + color: #${base0F}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + } + #battery { + color: #${base08}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + } + #network { + color: #${base09}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + } + #tray { + color: #${base05}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 15px; + } + #pulseaudio { + color: #${base0D}; + /* + Eternal + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + */ + background: #${base01}; + margin: 4px; + padding: 2px 20px; + border-radius: 15px 15px 15px 15px; + } + #custom-notification { + color: #${base0C}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + } + #custom-startmenu { + color: #${base0E}; + background: #${base00}; + border-radius: 0px 15px 15px 0px; + margin: 5px 5px 5px 0px; + padding: 2px 20px; + } + #idle_inhibitor { + color: #${base09}; + background: #${base00}; + border-radius: 15px 15px 15px 15px; + margin: 5px; + padding: 2px 20px; + } + #custom-exit { + color: #${base0E}; + background: #${base00}; + border-radius: 15px 0px 0px 15px; + margin: 5px 0px 5px 5px; + padding: 2px 20px; + } + '' + ]; + }; +} diff --git a/modules/home/waybar/waybar-ddubs.nix b/modules/home/waybar/waybar-ddubs.nix new file mode 100644 index 0000000..094babe --- /dev/null +++ b/modules/home/waybar/waybar-ddubs.nix @@ -0,0 +1,283 @@ +{ pkgs +, lib +, host +, config +, ... +}: +let + betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)"; + inherit (import ../../../hosts/${host}/variables.nix) clock24h; +in +with lib; { + # Configure & Theme Waybar + programs.waybar = { + enable = true; + package = pkgs.waybar; + settings = [ + { + layer = "top"; + position = "top"; + modules-center = [ "hyprland/workspaces" ]; + modules-left = [ + "custom/startmenu" + "hyprland/window" + "pulseaudio" + "cpu" + "memory" + "idle_inhibitor" + ]; + modules-right = [ + "custom/hyprbindings" + "custom/notification" + "custom/exit" + "battery" + "tray" + "clock" + ]; + + "hyprland/workspaces" = { + format = "{name}"; + format-icons = { + default = " "; + active = " "; + urgent = " "; + }; + on-scroll-up = "hyprctl dispatch workspace e+1"; + on-scroll-down = "hyprctl dispatch workspace e-1"; + }; + "clock" = { + format = + if clock24h == true + then '' {:L%H:%M}'' + else '' {:L%I:%M %p}''; + tooltip = true; + tooltip-format = "{:%A, %d.%B %Y }\n{calendar}"; + }; + "hyprland/window" = { + max-length = 22; + separate-outputs = false; + rewrite = { + "" = " 🙈 No Windows? "; + }; + }; + "memory" = { + interval = 5; + format = " {}%"; + tooltip = true; + }; + "cpu" = { + interval = 5; + format = " {usage:2}%"; + tooltip = true; + }; + "disk" = { + format = " {free}"; + tooltip = true; + }; + "network" = { + format-icons = [ + "󰤯" + "󰤟" + "󰤢" + "󰤥" + "󰤨" + ]; + format-ethernet = " {bandwidthDownOctets}"; + format-wifi = "{icon} {signalStrength}%"; + format-disconnected = "󰤮"; + tooltip = false; + }; + "tray" = { + spacing = 12; + }; + "pulseaudio" = { + format = "{icon} {volume}% {format_source}"; + format-bluetooth = "{volume}% {icon} {format_source}"; + format-bluetooth-muted = " {icon} {format_source}"; + format-muted = " {format_source}"; + format-source = " {volume}%"; + format-source-muted = ""; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ + "" + "" + "" + ]; + }; + on-click = "sleep 0.1 && pavucontrol"; + }; + "custom/exit" = { + tooltip = false; + format = ""; + on-click = "sleep 0.1 && wlogout"; + }; + "custom/startmenu" = { + tooltip = false; + format = ""; + # exec = "rofi -show drun"; + #on-click = "sleep 0.1 && rofi-launcher"; + on-click = "sleep 0.1 && nwg-drawer -mb 200 -mt 200 -mr 200 -ml 200"; + }; + "custom/hyprbindings" = { + tooltip = false; + format = "󱕴"; + on-click = "sleep 0.1 && list-keybinds"; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + tooltip = "true"; + }; + "custom/notification" = { + tooltip = false; + format = "{icon} {}"; + format-icons = { + notification = ""; + none = ""; + dnd-notification = ""; + dnd-none = ""; + inhibited-notification = ""; + inhibited-none = ""; + dnd-inhibited-notification = ""; + dnd-inhibited-none = ""; + }; + return-type = "json"; + exec-if = "which swaync-client"; + exec = "swaync-client -swb"; + on-click = "sleep 0.1 && task-waybar"; + escape = true; + }; + "battery" = { + states = { + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-plugged = "󱘖 {capacity}%"; + format-icons = [ + "󰁺" + "󰁻" + "󰁼" + "󰁽" + "󰁾" + "󰁿" + "󰂀" + "󰂁" + "󰂂" + "󰁹" + ]; + on-click = ""; + tooltip = false; + }; + } + ]; + style = concatStrings [ + '' + * { + font-family: JetBrainsMono Nerd Font Mono; + font-size: 18px; + border-radius: 0px; + border: none; + min-height: 0px; + } + window#waybar { + background: rgba(0,0,0,0); + } + #workspaces { + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base01}; + margin: 4px 4px; + padding: 5px 5px; + border-radius: 16px; + } + #workspaces button { + font-weight: bold; + padding: 0px 5px; + margin: 0px 3px; + border-radius: 16px; + color: #${config.lib.stylix.colors.base00}; + background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + opacity: 0.5; + transition: ${betterTransition}; + } + #workspaces button.active { + font-weight: bold; + padding: 0px 5px; + margin: 0px 3px; + border-radius: 16px; + color: #${config.lib.stylix.colors.base00}; + background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + transition: ${betterTransition}; + opacity: 1.0; + min-width: 40px; + } + #workspaces button:hover { + font-weight: bold; + border-radius: 16px; + color: #${config.lib.stylix.colors.base00}; + background: linear-gradient(45deg, #${config.lib.stylix.colors.base08}, #${config.lib.stylix.colors.base0D}); + opacity: 0.8; + transition: ${betterTransition}; + } + tooltip { + background: #${config.lib.stylix.colors.base00}; + border: 1px solid #${config.lib.stylix.colors.base08}; + border-radius: 12px; + } + tooltip label { + color: #${config.lib.stylix.colors.base08}; + } + #window, #pulseaudio, #cpu, #memory, #idle_inhibitor { + font-weight: bold; + margin: 4px 0px; + margin-left: 7px; + padding: 0px 18px; + background: #${config.lib.stylix.colors.base00}; + color: #${config.lib.stylix.colors.base08}; + border-radius: 8px 8px 8px 8px; + } + #idle_inhibitor { + font-size: 28px; + } + #custom-startmenu { + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base02}; + font-size: 22px; + margin: 0px; + padding: 0px 5px 0px 5px; + border-radius: 16px 16px 16px 16px; + } + #custom-hyprbindings, #network, #battery, + #custom-notification, #tray, #custom-exit { + /* font-weight: bold; */ + font-size: 20px; + background: #${config.lib.stylix.colors.base00}; + color: #${config.lib.stylix.colors.base08}; + margin: 4px 0px; + margin-right: 7px; + border-radius: 8px 8px 8px 8px; + padding: 0px 18px; + } + #clock { + font-weight: bold; + font-size: 16px; + color: #0D0E15; + background: linear-gradient(90deg, #${config.lib.stylix.colors.base0B}, #${config.lib.stylix.colors.base02}); + margin: 0px; + padding: 0px 5px 0px 5px; + border-radius: 16px 16px 16px 16px; + } + '' + ]; + }; +} diff --git a/modules/home/waybar/waybar-dwm-2.nix b/modules/home/waybar/waybar-dwm-2.nix new file mode 100644 index 0000000..862f609 --- /dev/null +++ b/modules/home/waybar/waybar-dwm-2.nix @@ -0,0 +1,480 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [waybar]; + + programs.waybar = { + enable = true; + settings = { + mainBar = { + layer = "top"; + "modules-left" = ["hyprland/workspaces" "temperature" "hyprland/window"]; + "modules-center" = ["custom/spacer"]; + "modules-right" = ["tray" "cpu" "memory" "idle_inhibitor" "clock" "pulseaudio" "bluetooth"]; + "hyprland/window" = { + format = "{title}"; + "max-length" = 333; + "seperate-outputs" = true; + }; + clock = { + format = "{:%I:%M %a %d}"; + "tooltip-format" = "{calendar}"; + calendar = { + mode = "month"; + "mode-mon-col" = 3; + "on-scroll" = 1; + "on-click-right" = "mode"; + format = { + months = "{}"; + days = "{}"; + weeks = "{%W}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + "on-click-middle" = "mode"; + "on-click-right" = "shift_up"; + "on-click" = "shift_down"; + }; + }; + cpu = { + format = "󰯳 {usage}%"; + }; + memory = { + format = "󰍛 {}%"; + interval = 1; + }; + "custom/gpu-util" = { + exec = "./scripts/gpu-util"; + format = "󰯿 {}"; + interval = 1; + }; + "custom/gpu-temp" = { + exec = "./scripts/gpu-temp"; + format = " {}"; + interval = 1; + }; + temperature = { + "hwmon-path" = "/sys/class/hwmon/hwmon1/temp1_input"; + "critical-threshold" = 80; + format = " {temperatureC}°C"; + interval = 1; + }; + "hyprland/workspaces" = { + format = "{icon}"; + "active-only" = false; + "sort-by-number" = false; + "on-click" = "activate"; + "all-outputs" = false; + "format-icons" = { + "1" = "1"; + "2" = "2"; + "3" = "3"; + "4" = "4"; + "5" = "5"; + "6" = "6"; + "7" = "7"; + "8" = "8"; + "9" = "9"; + "10" = "10"; + }; + }; + network = { + format = "󰤭 Off"; + "format-wifi" = "{essid} ({signalStrength}%)"; + "format-ethernet" = "󰈀"; + "format-disconnected" = "󰤭 Disconnected"; + "tooltip-format" = "{ifname} via {gwaddr} "; + "tooltip-format-wifi" = "{essid}({signalStrength}%)  "; + "tooltip-format-ethernet" = "󰈀 {ifname}"; + "tooltip-format-disconnected" = "Disconnected"; + }; + pulseaudio = { + format = "{icon} {volume}% {format_source}"; + "format-bluetooth" = "{icon} {volume}% {format_source}"; + "format-bluetooth-muted" = "󰖁 {format_source}"; + "format-muted" = "󰖁 {format_source}"; + "format-source" = " {volume}%"; + "format-source-muted" = ""; + "format-icons" = { + headphone = ""; + phone = ""; + portable = ""; + default = ["" "" ""]; + }; + "on-click-left" = "pavucontrol"; + input = true; + }; + "custom/playerctl" = { + format = "{icon} {}"; + "return-type" = "json"; + "max-length" = 333; + exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} ~ {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; + "on-click-middle" = "playerctl play-pause"; + "on-click" = "playerctl previous"; + "on-click-right" = "playerctl next"; + "format-icons" = { + Playing = ""; + Paused = ""; + }; + }; + tray = { + format = "{icon}"; + "icon-size" = 14; + spacing = 5; + }; + idle_inhibitor = { + format = "{icon}"; + "format-icons" = { + activated = "󱠛"; + deactivated = "󱤱"; + }; + }; + "custom/subs" = { + format = "󰗃 {}"; + exec = "/usr/local/bin/subsfile.sh"; + "on-click" = "vivaldi-stable https://youtube.com/thelinuxcast"; + "restart-interval" = 1; + }; + "custom/spacer" = { + format = " "; + }; + "wlr/taskbar" = { + format = "{name}"; + "icon-size" = 14; + "icon-theme" = "Numix-Circle"; + "tooltip-format" = "{title}"; + "on-click" = "activate"; + "on-click-middle" = "close"; + "ignore-list" = ["Alacritty"]; + "app_ids-mapping" = { + firefoxdeveloperedition = "firefox-developer-edition"; + }; + rewrite = { + "Firefox Web Browser" = "Firefox"; + "Foot Server" = "Terminal"; + }; + }; + bluetooth = { + "on-click" = "./scripts/bluetooth-control"; + "on-click-right" = "./scripts/rofi-bluetooth"; + "on-click-middle" = "./scripts/rofi-bluetooth"; + format = "{icon}"; + interval = 15; + "format-icons" = { + on = ""; + off = "󰂲"; + disabled = "󰂲"; + connected = ""; + }; + "tooltip-format" = "{device_alias} {status}"; + }; + }; + }; + style = '' + @define-color background #${config.stylix.base16Scheme.base00}; + @define-color foreground #${config.stylix.base16Scheme.base05}; + @define-color border #${config.stylix.base16Scheme.base02}; + @define-color color1 #${config.stylix.base16Scheme.base01}; + @define-color color2 #${config.stylix.base16Scheme.base02}; + @define-color color3 #${config.stylix.base16Scheme.base03}; + @define-color color4 #${config.stylix.base16Scheme.base04}; + @define-color color5 #${config.stylix.base16Scheme.base05}; + @define-color color6 #${config.stylix.base16Scheme.base06}; + @define-color color7 #${config.stylix.base16Scheme.base07}; + @define-color color8 #${config.stylix.base16Scheme.base08}; + @define-color color9 #${config.stylix.base16Scheme.base09}; + @define-color color10 #${config.stylix.base16Scheme.base0A}; + @define-color color11 #${config.stylix.base16Scheme.base0B}; + @define-color color12 #${config.stylix.base16Scheme.base0C}; + @define-color color13 #${config.stylix.base16Scheme.base0D}; + @define-color color14 #${config.stylix.base16Scheme.base0E}; + @define-color color15 #${config.stylix.base16Scheme.base0F}; + + * { + min-height: 0; + margin: 0; + padding: 0; + font-family: "JetBrains Mono Nerd Font"; + font-size: 14pt; + font-weight: 700; + padding-bottom: 0px; + } + + tooltip { + background: @background; + border: 2px solid @border; + } + + #window { + margin: 0px 5px 0px 5px; + padding-left: 10px; + padding-right: 7px; + background-color: @color14; + color: #282828; + } + + window#waybar.empty #window { + background-color: transparent; + border-bottom: none; + border-right: none; + } + + window#waybar { + background-color:@color14; + color: @color2; + } + + /* Workspaces */ + + #workspaces { + margin: 0px 0px 0px 0px; + padding: 0px; + background-color: @background; + color: @color7; + } + + #workspaces button { + margin: 0px 0px 0px 0px; + padding-left: 3px; + padding-right: 9px; + background-color: @background; + color: @color7; + } + + #workspaces button.active { + padding: 0 2px 0 1px; + color: @color3; + } + + #workspaces button.urgent { + color: @color9; + } + + #custom-gpu-util { + margin: 0px 5px 0px 5px; + padding-left: 10px; + padding-right: 10px; + background-color: @background; + color: @foreground; + } + + #tray { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 10px; + background-color: @background; + color: @foreground; + } + + #idle_inhibitor { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 12px; + background-color: @background; + color: @foreground; + } + + #idle_inhibitor.activated { + color: @color9; + } + + #network { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 12px; + background-color: @background; + color: @color11; + } + + #network.linked { + color: @color6; + } + #network.disconnected, + #network.disabled { + color: @color4; + } + + #custom-subs { + color: @foreground; + margin: 0px 5px 0px 5px; + padding-left: 10px; + padding-right: 12px; + border-bottom: 2px solid @background; + border-right: 2px solid @background; + border-color: @color8; + background-color: @color13; + } + + #custom-cliphist { + color: @color14; + margin: 0px 5px 0px 5px; + padding-left: 10px; + padding-right: 12px; + background-color: @background; + } + + #custom-gpu-temp, + #custom-clipboard { + margin: 0px 5px 0px 5px; + padding-left: 10px; + padding-right: 10px; + color: @foreground; + background-color: @background; + } + + #cpu { + margin: 0px 0px 0px 0px; + padding-left: 6px; + padding-right: 6px; + color: @foreground; + background-color: @background; + } + + #custom-cpuicon { + margin: 0px 0px 0px 0px; + padding: 0px 10px 0px 10px; + color: @color14; + background-color: @background; + } + + #custom-diskicon { + margin: 0px 0px 0px 0; + padding: 0 10px 0 10px; + color: @color2; + background-color: @background; + } + + #disk { + margin: 0px 0px 0px 0; + padding-left: 0px; + padding-right: 0px; + color: @foreground; + background-color: @background; + } + + #custom-notification { + background-color: @background; + color: @color15; + padding: 0 12px; + margin-right: 0px; + font-size: 14px; + font-family: "JetBrainsMono Nerd Font"; + } + + #custom-memoryicon { + margin: 0px 0px 0px 0px; + color: @color4; + padding: 0 11px 0 7px; + background-color: @background; + } + + #memory { + margin: 0px 0px 0px 0px; + padding-left: 5px; + padding-right: 10px; + color: @color4; + background-color: @background; + } + + #custom-tempicon { + margin: 0px 0px 0px 0px; + color: @color10; + padding: 0 11px 0 8px; + background-color: @background; + } + + #temperature { + margin: 0px 0px 0px 0px; + padding-left: 5px; + padding-right: 10px; + color: @color10; + background-color: @background; + } + + #custom-playerctl { + margin: 0px 5px 0px 5px; + padding-left: 10px; + padding-right: 10px; + color: @foreground; + background-color: @background; + } + + #battery, + #backlight, + #bluetooth, + #pulseaudio { + margin-top: 0px; + margin-bottom: 0px; + color: @foreground; + background-color: @background; + } + + #pulseaudio { + margin-top: 0px; + margin-bottom: 0px; + color: @color15; + background-color: @background; + } + + #battery, + #bluetooth { + margin-left: 0px; + margin-right: 0px; + padding-left: 0px; + padding-right: 2px; + } + + #backlight, + #pulseaudio { + margin-right: 0px; + margin-left: 0px; + padding-left: 10px; + padding-right: 7.5px; + } + + #clock { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 10px; + color: @color6; + background-color: @background; + } + + #custom-clockicon { + margin: 0px 0 0px 0px; + color: @color6; + padding: 0 5px 0 10px; + background-color: @background; + } + + #taskbar { + padding: 0 3px; + margin: 0 0px; + color: #ffffff; + background-color: rgba(120,118,117,0.3); + } + #taskbar button { + padding: 0 0 0 3px; + margin: 0px 0px; + color: #ffffff; + background-color: rgba(120,118,117,0.1); + } + #taskbar button.active { + background-color: rgba(120,118,117,0.8); + } + + #mode { + margin: 0px 5px 0px 5px; + padding-left: 10px; + padding-right: 10px; + background-color: @background; + color: @color9; + } + ''; + }; +} + diff --git a/modules/home/waybar/waybar-dwm.nix b/modules/home/waybar/waybar-dwm.nix new file mode 100644 index 0000000..c914bb1 --- /dev/null +++ b/modules/home/waybar/waybar-dwm.nix @@ -0,0 +1,429 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [waybar]; + + programs.waybar = { + enable = true; + settings = { + mainBar = { + layer = "top"; + "modules-left" = ["hyprland/workspaces" "hyprland/window"]; + "modules-center" = ["clock"]; + "modules-right" = ["tray" "cpu" "memory" "idle_inhibitor" "pulseaudio" "bluetooth"]; + "hyprland/window" = { + format = "{title}"; + "max-length" = 333; + "seperate-outputs" = true; + }; + clock = { + format = "{:%I:%M %a %d}"; + "tooltip-format" = "{calendar}"; + calendar = { + mode = "month"; + "mode-mon-col" = 3; + "on-scroll" = 1; + "on-click-right" = "mode"; + format = { + months = "{}"; + days = "{}"; + weeks = "{%W}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + "on-click-middle" = "mode"; + "on-click-right" = "shift_up"; + "on-click" = "shift_down"; + }; + }; + cpu = { + format = "󰯳 {usage}%"; + }; + memory = { + format = "󰍛 {}%"; + interval = 1; + }; + "custom/gpu-util" = { + exec = "./scripts/gpu-util"; + format = "󰯿 {}"; + interval = 1; + }; + "custom/gpu-temp" = { + exec = "./scripts/gpu-temp"; + format = " {}"; + interval = 1; + }; + temperature = { + "hwmon-path" = "/sys/class/hwmon/hwmon1/temp1_input"; + "critical-threshold" = 80; + format = " {temperatureC}°C"; + interval = 1; + }; + "hyprland/workspaces" = { + format = "{icon}"; + "active-only" = false; + "sort-by-number" = true; + "on-click" = "activate"; + "all-outputs" = false; + "format-icons" = { + "1" = "1"; + "2" = "2"; + "3" = "3"; + "4" = "4"; + "5" = "5"; + "6" = "6"; + "7" = "7"; + "8" = "8"; + "9" = "9"; + "10" = "10"; + }; + }; + network = { + format = "󰤭 Off"; + "format-wifi" = "{essid} ({signalStrength}%)"; + "format-ethernet" = "󰈀"; + "format-disconnected" = "󰤭 Disconnected"; + "tooltip-format" = "{ifname} via {gwaddr} "; + "tooltip-format-wifi" = "{essid}({signalStrength}%)  "; + "tooltip-format-ethernet" = "󰈀 {ifname}"; + "tooltip-format-disconnected" = "Disconnected"; + }; + pulseaudio = { + format = "{icon} {volume}% {format_source}"; + "format-bluetooth" = "{icon} {volume}% {format_source}"; + "format-bluetooth-muted" = "󰖁 {format_source}"; + "format-muted" = "󰖁 {format_source}"; + "format-source" = " {volume}%"; + "format-source-muted" = ""; + "format-icons" = { + headphone = ""; + phone = ""; + portable = ""; + default = ["" "" ""]; + }; + "on-click-left" = "pavucontrol"; + input = true; + }; + "custom/playerctl" = { + format = "{icon} {}"; + "return-type" = "json"; + "max-length" = 333; + exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} ~ {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; + "on-click-middle" = "playerctl play-pause"; + "on-click" = "playerctl previous"; + "on-click-right" = "playerctl next"; + "format-icons" = { + Playing = ""; + Paused = ""; + }; + }; + tray = { + format = "{icon}"; + "icon-size" = 14; + spacing = 5; + }; + idle_inhibitor = { + format = "{icon}"; + "format-icons" = { + activated = "󱠛"; + deactivated = "󱤱"; + }; + }; + "custom/subs" = { + format = "󰗃 {}"; + exec = "/usr/local/bin/subsfile.sh"; + "on-click" = "vivaldi-stable https://youtube.com/thelinuxcast"; + "restart-interval" = 1; + }; + "custom/spacer" = { + format = " "; + }; + "wlr/taskbar" = { + format = "{name}"; + "icon-size" = 14; + "icon-theme" = "Numix-Circle"; + "tooltip-format" = "{title}"; + "on-click" = "activate"; + "on-click-middle" = "close"; + "ignore-list" = ["Alacritty"]; + "app_ids-mapping" = { + firefoxdeveloperedition = "firefox-developer-edition"; + }; + rewrite = { + "Firefox Web Browser" = "Firefox"; + "Foot Server" = "Terminal"; + }; + }; + bluetooth = { + "on-click" = "./scripts/bluetooth-control"; + "on-click-right" = "./scripts/rofi-bluetooth"; + "on-click-middle" = "./scripts/rofi-bluetooth"; + format = "{icon}"; + interval = 15; + "format-icons" = { + on = ""; + off = "󰂲"; + disabled = "󰂲"; + connected = ""; + }; + "tooltip-format" = "{device_alias} {status}"; + }; + }; + }; + style = '' + @define-color bg #${config.stylix.base16Scheme.base00}; + @define-color fg #${config.stylix.base16Scheme.base05}; + @define-color lbg #${config.stylix.base16Scheme.base01}; + @define-color yellow #${config.stylix.base16Scheme.base0A}; + @define-color lavender #${config.stylix.base16Scheme.base0E}; + @define-color peach #${config.stylix.base16Scheme.base0A}; + @define-color red #${config.stylix.base16Scheme.base08}; + @define-color green #${config.stylix.base16Scheme.base0B}; + @define-color blue #${config.stylix.base16Scheme.base0D}; + @define-color border #${config.stylix.base16Scheme.base02}; + + * { + min-height: 0; + margin: 0px 0px 0px 0px; + padding: 0; + border-radius: 7px; + font-family: "JetBrains Mono Nerd Font"; + font-size: 10pt; + font-weight: 700; + padding-bottom: 0px; + } + + tooltip { + background: @bg; + border-radius: 7px; + border: 2px solid @border; + } + + #window { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 7px; + border-radius: 3px; + border-color: @lbg; + background-color: @yellow; + color: @bg; + } + + window#waybar.empty #window { + background-color: @bg; + border-bottom: none; + border-right: none; + } + + window#waybar { + background-color: @bg; + color: @lavender; + } + + /* Workspaces */ + @keyframes button_activate { + from { opacity: .3 } + to { opacity: 1.; } + } + + #workspaces { + margin: 0px 0px 0px 0px; + border-radius: 3px; + padding: 1px; + background-color: @bg; + color: @bg; + } + + #workspaces button { + margin: 0px 0px 0px 0px; + border-radius: 3px; + padding-left: 3px; + padding-right: 9px; + background-color: @bg; + color: @fg; + } + + #workspaces button.active { + background-color:@blue; + color: @bg; + } + + #workspaces button.urgent { + color: #F38BA8; + } + + #workspaces button:hover { + border: solid transparent; + } + + #custom-gpu-util { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 10px; + border-radius: 7px; + background-color: @bg; + color: @fg; + } + + #tray { + margin: 0px 0px 0px 0px; + border-radius: 3px; + padding-left: 10px; + padding-right: 10px; + background-color: @bg; + color: @fg; + } + + #idle_inhibitor { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 12px; + border-radius: 3px; + background-color: @bg; + color: @fg; + } + + #network { + margin: 5px 5px 2px 5px; + padding-left: 10px; + padding-right: 12px; + border-radius: 7px; + background-color: @bg; + color: @lavender; + } + + #network.linked { + color: @peach; + } + #network.disconnected, + #network.disabled { + color: @red; + } + + #custom-subs { + color: @fg; + margin: 5px 5px 2px 5px; + padding-left: 10px; + padding-right: 12px; + border-radius: 3px; + border-bottom: 2px solid @bg; + border-right: 2px solid @bg; + border-color: @lbg; + background-color: @red; + } + + #custom-spacer { + background-color: @yellow; + } + + #custom-cliphist { + color: @peach; + margin: 5px 5px 2px 5px; + padding-left: 10px; + padding-right: 12px; + border-radius: 3px; + background-color: @bg; + } + + #custom-gpu-temp, + #cpu, + #memory, + #custom-clipboard, + #temperature { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 10px; + border-radius: 3px; + color: @fg; + background-color: @bg; + } + + #custom-playerctl { + margin: 5px 5px 2px 5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 3px; + color: @fg; + background-color: @bg; + } + + #battery, + #backlight, + #bluetooth, + #pulseaudio { + margin-top: 5px; + margin-bottom: 2px; + color: @fg; + background-color: @bg; + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + + #battery, + #bluetooth { + margin-left: 0px; + margin-right: 5px; + padding-left: 7.5px; + padding-right: 10px; + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + } + + #backlight, + #pulseaudio { + margin-right: 0px; + margin-left: 5px; + padding-left: 10px; + padding-right: 7.5px; + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + } + + #clock { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 10px; + border-radius: 3px; + color: @bg; + background-color: @green; + } + + #taskbar { + border-radius: 0px 0px 0px 0; + padding: 0 3px; + margin: 0 0px; + color: #ffffff; + background-color: rgba(120,118,117,0.3); + } + #taskbar button { + border-radius: 0px 0px 0px 0px; + padding: 0 0 0 3px; + margin: 3px 1; + color: #ffffff; + background-color: rgba(120,118,117,0.1); + } + #taskbar button.active { + background-color: rgba(120,118,117,0.8); + } + + #mode { + margin: 0px 0px 0px 0px; + padding-left: 10px; + padding-right: 10px; + border-radius: 3px; + background-color: @bg; + color: @peach; + } + ''; + }; +} diff --git a/modules/home/waybar/waybar-jerry.nix b/modules/home/waybar/waybar-jerry.nix new file mode 100644 index 0000000..96e3c1f --- /dev/null +++ b/modules/home/waybar/waybar-jerry.nix @@ -0,0 +1,356 @@ +{ pkgs +, config +, lib +, ... +}: +let + terminal = "kitty"; + base00 = "0F1419"; + base01 = "131721"; + base03 = "3E4B59"; + base05 = "E6E1CF"; + base06 = "E6E1CF"; + base07 = "F3F4F5"; + base08 = "F07178"; + base09 = "FF8F40"; + base0A = "FFB454"; + base0B = "B8CC52"; + base0C = "95E6CB"; + base0D = "59C2FF"; + base0E = "D2A6FF"; + base0F = "E6B673"; +in +with lib; { + # Configure & Theme Waybar + programs.waybar = { + enable = true; + package = pkgs.waybar; + settings = [ + { + layer = "top"; + position = "top"; + + modules-center = [ "network" "pulseaudio" "cpu" "hyprland/workspaces" "memory" "disk" "clock" ]; # Eterna: [ "hyprland/window" ] + modules-left = [ "custom/startmenu" "hyprland/window" ]; # Eternal: [ "hyprland/workspaces" "cpu" "memory" "network" ] + modules-right = [ "tray" "idle_inhibitor" "custom/notification" "battery" "custom/exit" ]; # Eternal: [ "idle_inhibitor" "pulseaudio" "clock" "custom/notification" "tray" ] + + "hyprland/workspaces" = { + format = "{name}"; + format-icons = { + default = " "; + active = " "; + urgent = " "; + }; + on-scroll-up = "hyprctl dispatch workspace e+1"; + on-scroll-down = "hyprctl dispatch workspace e-1"; + }; + "clock" = { + format = '' {:%H:%M}''; + /* + ''{: %I:%M %p}''; + */ + tooltip = true; + tooltip-format = "{:%A, %d.%B %Y }{calendar}"; + }; + "hyprland/window" = { + max-length = 60; + separate-outputs = false; + }; + "memory" = { + interval = 5; + format = " {}%"; + tooltip = true; + on-click = "${terminal} -e btop"; + }; + "cpu" = { + interval = 5; + format = " {usage:2}%"; + tooltip = true; + on-click = "${terminal} -e btop"; + }; + "disk" = { + format = " {free}"; + tooltip = true; + # Not working with zaneyos window open then closes + #on-click = "${terminal} -e sh -c df -h ; read"; + }; + "network" = { + format-icons = [ "󰤯" "󰤟" "󰤢" "󰤥" "󰤨" ]; + format-ethernet = " {bandwidthDownBits}"; + format-wifi = " {bandwidthDownBits}"; + format-disconnected = "󰤮"; + tooltip = false; + on-click = "${terminal} -e btop"; + }; + "tray" = { + spacing = 12; + }; + "pulseaudio" = { + format = "{icon} {volume}% {format_source}"; + format-bluetooth = "{volume}% {icon} {format_source}"; + format-bluetooth-muted = " {icon} {format_source}"; + format-muted = " {format_source}"; + format-source = " {volume}%"; + format-source-muted = ""; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ "" "" "" ]; + }; + on-click = "pavucontrol"; + }; + "custom/exit" = { + tooltip = false; + format = "⏻"; + on-click = "sleep 0.1 && wlogout"; + }; + "custom/startmenu" = { + tooltip = false; + format = " "; + # exec = "rofi -show drun"; + on-click = "rofi -show drun"; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = " "; + deactivated = " "; + }; + tooltip = "true"; + }; + "custom/notification" = { + tooltip = false; + format = "{icon} {}"; + format-icons = { + notification = ""; + none = ""; + dnd-notification = ""; + dnd-none = ""; + inhibited-notification = ""; + inhibited-none = ""; + dnd-inhibited-notification = ""; + dnd-inhibited-none = ""; + }; + return-type = "json"; + exec-if = "which swaync-client"; + exec = "swaync-client -swb"; + on-click = "swaync-client -t"; + escape = true; + }; + "battery" = { + states = { + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-plugged = "󱘖 {capacity}%"; + format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; + on-click = ""; + tooltip = false; + }; + } + ]; + style = concatStrings [ + '' + * { + font-size: 16px; + font-family: JetBrainsMono Nerd Font, Font Awesome, sans-serif; + font-weight: bold; + } + window#waybar { + /* + + background-color: rgba(26,27,38,0); + border-bottom: 1px solid rgba(26,27,38,0); + border-radius: 0px; + color: #${base0F}; + */ + + background-color: rgba(26,27,38,0); + border-bottom: 1px solid rgba(26,27,38,0); + border-radius: 0px; + color: #${base0F}; + } + #workspaces { + /* + Eternal + background: linear-gradient(180deg, #${base00}, #${base01}); + margin: 5px 5px 5px 0px; + padding: 0px 10px; + border-radius: 0px 15px 50px 0px; + border: 0px; + font-style: normal; + color: #${base00}; + */ + background: linear-gradient(45deg, #${base01}, #${base01}); + margin: 5px; + padding: 0px 1px; + border-radius: 15px; + border: 0px; + font-style: normal; + color: #${base00}; + } + #workspaces button { + padding: 0px 5px; + margin: 4px 3px; + border-radius: 15px; + border: 0px; + color: #${base00}; + background: linear-gradient(45deg, #${base0D}, #${base0E}); + opacity: 0.5; + transition: all 0.3s ease-in-out; + } + #workspaces button.active { + padding: 0px 5px; + margin: 4px 3px; + border-radius: 15px; + border: 0px; + color: #${base00}; + background: linear-gradient(45deg, #${base0D}, #${base0E}); + opacity: 1.0; + min-width: 40px; + transition: all 0.3s ease-in-out; + } + #workspaces button:hover { + border-radius: 15px; + color: #${base00}; + background: linear-gradient(45deg, #${base0D}, #${base0E}); + opacity: 0.8; + } + tooltip { + background: #${base00}; + border: 1px solid #${base0E}; + border-radius: 10px; + } + tooltip label { + color: #${base07}; + } + #window { + /* + Eternal + color: #${base05}; + background: #${base00}; + border-radius: 15px; + margin: 5px; + padding: 2px 20px; + */ + margin: 5px; + padding: 2px 20px; + color: #${base05}; + background: #${base01}; + border-radius: 50px 15px 50px 15px; + } + #memory { + color: #${base0F}; + /* + Eternal + background: #${base00}; + border-radius: 50px 15px 50px 15px; + margin: 5px; + padding: 2px 20px; + */ + background: #${base01}; + margin: 5px; + padding: 2px 20px; + border-radius: 15px 50px 15px 50px; + } + #clock { + color: #${base0B}; + background: #${base00}; + border-radius: 15px 50px 15px 50px; + margin: 5px; + padding: 2px 20px; + } + #idle_inhibitor { + color: #${base0A}; + background: #${base00}; + border-radius: 50px 15px 50px 15px; + margin: 5px; + padding: 2px 20px; + } + #cpu { + color: #${base07}; + background: #${base00}; + border-radius: 50px 15px 50px 15px; + margin: 5px; + padding: 2px 20px; + } + #disk { + color: #${base0F}; + background: #${base00}; + border-radius: 15px 50px 15px 50px; + margin: 5px; + padding: 2px 20px; + } + #battery { + color: #${base08}; + background: #${base00}; + border-radius: 15px 50px 15px 50px; + margin: 5px; + padding: 2px 20px; + } + #network { + color: #${base09}; + background: #${base00}; + border-radius: 50px 15px 50px 15px; + margin: 5px; + padding: 2px 20px; + } + #tray { + color: #${base05}; + background: #${base00}; + border-radius: 15px 50px 15px 50px; + margin: 5px; + padding: 2px 20px; + } + #pulseaudio { + color: #${base0D}; + /* + Eternal + background: #${base00}; + border-radius: 15px 50px 15px 50px; + margin: 5px; + padding: 2px 20px; + */ + background: #${base01}; + margin: 4px; + padding: 2px 20px; + border-radius: 50px 15px 50px 15px; + } + #custom-notification { + color: #${base0C}; + background: #${base00}; + border-radius: 15px 50px 15px 50px; + margin: 5px; + padding: 2px 20px; + } + #custom-startmenu { + color: #${base0E}; + background: #${base00}; + border-radius: 0px 15px 50px 0px; + margin: 5px 5px 5px 0px; + padding: 2px 20px; + } + #idle_inhibitor { + color: #${base09}; + background: #${base00}; + border-radius: 15px 50px 15px 50px; + margin: 5px; + padding: 2px 20px; + } + #custom-exit { + color: #${base0E}; + background: #${base00}; + border-radius: 15px 0px 0px 50px; + margin: 5px 0px 5px 5px; + padding: 2px 20px; + } + '' + ]; + }; +} diff --git a/modules/home/waybar/waybar-nekodyke.nix b/modules/home/waybar/waybar-nekodyke.nix new file mode 100755 index 0000000..5df5cdc --- /dev/null +++ b/modules/home/waybar/waybar-nekodyke.nix @@ -0,0 +1,306 @@ +{ pkgs +, lib +, host +, config +, ... +}: +let + betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)"; + inherit (import ../../../hosts/${host}/variables.nix) clock24h; +in +with lib; { + # Configure & Theme Waybar + programs.waybar = { + enable = true; + package = pkgs.waybar; + settings = [ + { + layer = "top"; + position = "top"; + margin-top = 6; + margin-left = 6; + margin-right = 6; + modules-center = [ "hyprland/workspaces" ]; + modules-left = [ + "custom/startmenu" + "cpu" + "memory" + "temperature" + "disk" + "hyprland/window" + "idle_inhibitor" + ]; + modules-right = [ + "pulseaudio" + "battery" + "custom/hyprbindings" + "custom/notification" + "clock" + "tray" + ]; + + "hyprland/workspaces" = { + format = "{name}"; + format-icons = { + default = " "; + active = " "; + urgent = " "; + }; + on-scroll-up = "hyprctl dispatch workspace e+1"; + on-scroll-down = "hyprctl dispatch workspace e-1"; + }; + "pulseaudio/slider" = { + min = 0; + max = 100; + orientation = "horizontal"; + }; + "temperature" = { + format = " {temperatureC}°C "; + }; + "clock" = { + format = + if clock24h == true + then '' {:L%H:%M}'' + else '' {:L%I:%M %p}''; + tooltip = true; + tooltip-format = "{:%A, %d.%B %Y }\n{calendar}"; + }; + "hyprland/window" = { + max-length = 22; + separate-outputs = false; + rewrite = { + "" = " 🙈 No Windows? "; + }; + }; + "memory" = { + interval = 5; + icon-size = 20; + format = " {}%"; + tooltip = true; + }; + "cpu" = { + interval = 5; + format = " {usage:2}%"; + tooltip = true; + }; + "disk" = { + format = "󱛟 {free}"; + tooltip = true; + }; + "network" = { + format-icons = [ + "󰤯" + "󰤟" + "󰤢" + "󰤥" + "󰤨" + ]; + format-ethernet = " {bandwidthDownOctets}"; + format-wifi = "{icon} {signalStrength}%"; + format-disconnected = "󰤮"; + tooltip = false; + }; + "tray" = { + spacing = 12; + }; + "pulseaudio" = { + format = "{icon} {volume}% {format_source}"; + format-bluetooth = "{volume}% {icon} {format_source}"; + format-bluetooth-muted = " {icon} {format_source}"; + format-muted = " {format_source}"; + format-source = " {volume}%"; + format-source-muted = ""; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ + "" + "" + "" + ]; + }; + on-click = "sleep 0.1 && pavucontrol"; + scroll-step = 2; + }; + "custom/exit" = { + tooltip = false; + format = ""; + on-click = "sleep 0.1 && wlogout"; + }; + "custom/startmenu" = { + tooltip = false; + format = ""; + # exec = "rofi -show drun"; + #on-click = "sleep 0.1 && rofi-launcher"; + on-click = "sleep 0.1 && nwg-drawer -mb 200 -mt 200 -mr 200 -ml 200"; + }; + "custom/hyprbindings" = { + tooltip = false; + format = "󱕴"; + on-click = "sleep 0.1 && list-keybinds"; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + tooltip = "true"; + }; + "custom/notification" = { + tooltip = false; + format = "{icon} {}"; + format-icons = { + notification = ""; + none = ""; + dnd-notification = ""; + dnd-none = ""; + inhibited-notification = ""; + inhibited-none = ""; + dnd-inhibited-notification = ""; + dnd-inhibited-none = ""; + }; + return-type = "json"; + exec-if = "which swaync-client"; + exec = "swaync-client -swb"; + on-click = "sleep 0.1 && task-waybar"; + escape = true; + }; + "battery" = { + states = { + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-plugged = "󱘖 {capacity}%"; + format-icons = [ + "󰁺" + "󰁻" + "󰁼" + "󰁽" + "󰁾" + "󰁿" + "󰂀" + "󰂁" + "󰂂" + "󰁹" + ]; + on-click = ""; + tooltip = false; + }; + } + ]; + style = concatStrings [ + '' + * { + font-family: JetBrainsMono Nerd Font Mono; + font-size: 18px; + border-radius: 0px; + border: none; + min-height: 0px; + margin: 0px; + } + window#waybar { + background: #${config.lib.stylix.colors.base00}; + padding: 2px; + border-radius: 4px; + } + #workspaces { + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base00}; + border: 2px solid #${config.lib.stylix.colors.base0B}; + margin: 2px 4px; + padding: 5px 5px; + border-radius: 4px; + } + #workspaces button { + font-weight: bold; + padding: 0px 5px; + margin: 0px 3px; + border-radius: 16px; + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base00}; + + } + #workspaces button.active { + font-weight: bold; + padding: 0px 5px; + margin: 0px 3px; + border-radius: 4px; + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base0B}; + transition: ${betterTransition}; + opacity: 1.0; + min-width: 40px; + } + #workspaces button:hover { + font-weight: bold; + border-radius: 4px; + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base0B}; + opacity: 0.8; + } + tooltip { + background: #${config.lib.stylix.colors.base00}; + border: 1px solid #${config.lib.stylix.colors.base08}; + border-radius: 12px; + } + tooltip label { + color: #${config.lib.stylix.colors.base08}; + } + #window, #pulseaudio, #temperature, #cpu, #memory, #idle_inhibitor, #disk { + font-weight: bold; + margin: 2px 0px; + margin-right: 7px; + padding: 0px 18px; + background: #${config.lib.stylix.colors.base00}; + color: #${config.lib.stylix.colors.base0B}; + border: 2px solid #${config.lib.stylix.colors.base0B}; + border-radius: 4px; + } + #idle_inhibitor { + font-size: 28px; + } + #custom-startmenu { + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base0B}; + font-size: 22px; + padding: 0px 5px 0px 5px; + border-radius: 4px; + padding: 0px 8px; + margin: 0px; + margin-right:7px; + + } + #custom-hyprbindings, #network, #battery, + #custom-notification, #clock, #custom-exit { + /* font-weight: bold; */ + font-size: 20px; + background: #${config.lib.stylix.colors.base00}; + color: #${config.lib.stylix.colors.base0B}; + margin: 2px 0px; + margin-right: 7px; + border: 2px solid #${config.lib.stylix.colors.base0B}; + border-radius: 4px; + padding: 0px 12px; + } + #tray{ + font-weight: bold; + font-size: 16px; + margin: 0px; + background: #${config.lib.stylix.colors.base0B}; + color: #${config.lib.stylix.colors.base00}; + border: 2px solid #${config.lib.stylix.colors.base0B}; + padding: 0px 18px; + margin: 0px 0px; + border-radius: 4px; + } + '' + ]; + }; +} diff --git a/modules/home/waybar/waybar-simple.nix b/modules/home/waybar/waybar-simple.nix new file mode 100644 index 0000000..9ffb056 --- /dev/null +++ b/modules/home/waybar/waybar-simple.nix @@ -0,0 +1,305 @@ +{ pkgs +, lib +, host +, config +, ... +}: +let + inherit (import ../../../hosts/${host}/variables.nix) clock24h; +in +with lib; { + # Configure & Theme Waybar + programs.waybar = { + enable = true; + package = pkgs.waybar; + settings = [ + { + layer = "top"; + position = "top"; + modules-center = [ "hyprland/workspaces" ]; + modules-left = [ + "custom/startmenu" + "custom/arrow6" + "pulseaudio" + "cpu" + "memory" + "idle_inhibitor" + "custom/arrow7" + "hyprland/window" + ]; + modules-right = [ + "custom/arrow4" + "custom/hyprbindings" + "custom/arrow3" + "custom/notification" + "custom/arrow3" + "custom/exit" + "battery" + "custom/arrow2" + "tray" + "custom/arrow1" + "clock" + ]; + + "hyprland/workspaces" = { + format = "{name}"; + format-icons = { + default = " "; + active = " "; + urgent = " "; + }; + on-scroll-up = "hyprctl dispatch workspace e+1"; + on-scroll-down = "hyprctl dispatch workspace e-1"; + }; + "clock" = { + format = + if clock24h == true + then '' {:L%H:%M}'' + else '' {:L%I:%M %p}''; + tooltip = true; + tooltip-format = "{:%A, %d.%B %Y }\n{calendar}"; + }; + "hyprland/window" = { + max-length = 22; + separate-outputs = false; + rewrite = { + "" = " 🙈 No Windows? "; + }; + }; + "memory" = { + interval = 5; + format = " {}%"; + tooltip = true; + }; + "cpu" = { + interval = 5; + format = " {usage:2}%"; + tooltip = true; + }; + "disk" = { + format = " {free}"; + tooltip = true; + }; + "network" = { + format-icons = [ + "󰤯" + "󰤟" + "󰤢" + "󰤥" + "󰤨" + ]; + format-ethernet = " {bandwidthDownOctets}"; + format-wifi = "{icon} {signalStrength}%"; + format-disconnected = "󰤮"; + tooltip = false; + }; + "tray" = { + spacing = 12; + }; + "pulseaudio" = { + format = "{icon} {volume}% {format_source}"; + format-bluetooth = "{volume}% {icon} {format_source}"; + format-bluetooth-muted = " {icon} {format_source}"; + format-muted = " {format_source}"; + format-source = " {volume}%"; + format-source-muted = ""; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ + "" + "" + "" + ]; + }; + on-click = "sleep 0.1 && pavucontrol"; + }; + "custom/exit" = { + tooltip = false; + format = ""; + on-click = "sleep 0.1 && wlogout"; + }; + "custom/startmenu" = { + tooltip = false; + format = ""; + on-click = "sleep 0.1 && rofi-launcher"; + }; + "custom/hyprbindings" = { + tooltip = false; + format = "󱕴"; + on-click = "sleep 0.1 && list-keybinds"; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + tooltip = "true"; + }; + "custom/notification" = { + tooltip = false; + format = "{icon} {}"; + format-icons = { + notification = ""; + none = ""; + dnd-notification = ""; + dnd-none = ""; + inhibited-notification = ""; + inhibited-none = ""; + dnd-inhibited-notification = ""; + dnd-inhibited-none = ""; + }; + return-type = "json"; + exec-if = "which swaync-client"; + exec = "swaync-client -swb"; + on-click = "sleep 0.1 && task-waybar"; + escape = true; + }; + "battery" = { + states = { + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-plugged = "󱘖 {capacity}%"; + format-icons = [ + "󰁺" + "󰁻" + "󰁼" + "󰁽" + "󰁾" + "󰁿" + "󰂀" + "󰂁" + "󰂂" + "󰁹" + ]; + on-click = ""; + tooltip = false; + }; + "custom/arrow1" = { + format = ""; + }; + "custom/arrow2" = { + format = ""; + }; + "custom/arrow3" = { + format = ""; + }; + "custom/arrow4" = { + format = ""; + }; + "custom/arrow5" = { + format = ""; + }; + "custom/arrow6" = { + format = ""; + }; + "custom/arrow7" = { + format = ""; + }; + } + ]; + style = concatStrings [ + '' + * { + font-family: JetBrainsMono Nerd Font Mono; + font-size: 14px; + border-radius: 0px; + border: none; + min-height: 0px; + } + window#waybar { + background: #${config.lib.stylix.colors.base00}; + color: #${config.lib.stylix.colors.base05}; + } + #workspaces button { + padding: 0px 5px; + background: transparent; + color: #${config.lib.stylix.colors.base04}; + } + #workspaces button.active { + color: #${config.lib.stylix.colors.base08}; + } + #workspaces button:hover { + color: #${config.lib.stylix.colors.base08}; + } + tooltip { + background: #${config.lib.stylix.colors.base00}; + border: 1px solid #${config.lib.stylix.colors.base05}; + border-radius: 12px; + } + tooltip label { + color: #${config.lib.stylix.colors.base05}; + } + #window { + padding: 0px 10px; + } + #pulseaudio, #cpu, #memory, #idle_inhibitor { + padding: 0px 10px; + background: #${config.lib.stylix.colors.base04}; + color: #${config.lib.stylix.colors.base00}; + } + #custom-startmenu { + color: #${config.lib.stylix.colors.base02}; + padding: 0px 14px; + font-size: 20px; + background: #${config.lib.stylix.colors.base0B}; + } + #custom-hyprbindings, #network, #battery, + #custom-notification, #custom-exit { + background: #${config.lib.stylix.colors.base0F}; + color: #${config.lib.stylix.colors.base00}; + padding: 0px 10px; + } + #tray { + background: #${config.lib.stylix.colors.base02}; + color: #${config.lib.stylix.colors.base00}; + padding: 0px 10px; + } + #clock { + font-weight: bold; + padding: 0px 10px; + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base0E}; + } + #custom-arrow1 { + font-size: 24px; + color: #${config.lib.stylix.colors.base0E}; + background: #${config.lib.stylix.colors.base02}; + } + #custom-arrow2 { + font-size: 24px; + color: #${config.lib.stylix.colors.base02}; + background: #${config.lib.stylix.colors.base0F}; + } + #custom-arrow3 { + font-size: 24px; + color: #${config.lib.stylix.colors.base00}; + background: #${config.lib.stylix.colors.base0F}; + } + #custom-arrow4 { + font-size: 24px; + color: #${config.lib.stylix.colors.base0F}; + background: transparent; + } + #custom-arrow6 { + font-size: 24px; + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base04}; + } + #custom-arrow7 { + font-size: 24px; + color: #${config.lib.stylix.colors.base04}; + background: transparent; + } + '' + ]; + }; +} diff --git a/modules/home/wezterm.nix b/modules/home/wezterm.nix new file mode 100644 index 0000000..d939ca0 --- /dev/null +++ b/modules/home/wezterm.nix @@ -0,0 +1,82 @@ +{ pkgs, ... }: { + programs.wezterm = { + enable = true; + package = pkgs.wezterm; + }; + home.file."./.config/wezterm/wezterm.lua".text = '' + -- Config from Drew @justaguylinux small mods + + local wezterm = require("wezterm") + + local config = wezterm.config_builder() + + config.enable_wayland = false + + -- General appearance and visuals + config.colors = { + tab_bar = { + background = "#00141d", -- col_gray1, your main DWM bar background + + active_tab = { + bg_color = "#80bfff", -- col_gray2 (selected tab in bright blue) + fg_color = "#00141d", -- contrast text on active tab + }, + + inactive_tab = { + bg_color = "#1a1a1a", -- col_gray4 (dark background for inactive tabs) + fg_color = "#FFFFFF", -- col_gray3 (white text on inactive tabs) + }, + + new_tab = { + bg_color = "#1a1a1a", -- same as inactive + fg_color = "#4fc3f7", -- col_barbie (for the "+" button) + }, + }, + } + + config.window_background_opacity = 0.90 + config.color_scheme = "nightfox" + config.font_size = 12 + config.font = wezterm.font("FiraCode", { weight = "Regular", italic = false }) + + config.window_padding = { + left = 10, + right = 10, + top = 10, + bottom = 10, + } + + config.use_fancy_tab_bar = true + config.window_frame = { + -- font = wezterm.font({ family = "FiraCode Nerd Font Mono", weight = "Regular" }), + font = wezterm.font({ family = "JetBrainsMono Nerd Font Mono", weight = "Regular" }), + } + + config.default_cursor_style = "BlinkingUnderline" + config.cursor_blink_rate = 500 + config.term = "xterm-256color" + config.max_fps = 144 + config.animation_fps = 30 + + -- Keybindings using ALT for tabs & splits + config.keys = { + -- Tab management + { key = "t", mods = "ALT", action = wezterm.action.SpawnTab("CurrentPaneDomain") }, + { key = "w", mods = "ALT", action = wezterm.action.CloseCurrentTab({ confirm = false }) }, + { key = "n", mods = "ALT", action = wezterm.action.ActivateTabRelative(1) }, + { key = "p", mods = "ALT", action = wezterm.action.ActivateTabRelative(-1) }, + + -- Pane management + { key = "v", mods = "ALT", action = wezterm.action.SplitVertical({ domain = "CurrentPaneDomain" }) }, + { key = "h", mods = "ALT", action = wezterm.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) }, + { key = "q", mods = "ALT", action = wezterm.action.CloseCurrentPane({ confirm = false }) }, + + -- Pane navigation (move between panes with ALT + Arrows) + { key = "LeftArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Left") }, + { key = "RightArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Right") }, + { key = "UpArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Up") }, + { key = "DownArrow", mods = "ALT", action = wezterm.action.ActivatePaneDirection("Down") }, + } + return config + ''; +} diff --git a/modules/home/wlogout/default.nix b/modules/home/wlogout/default.nix new file mode 100644 index 0000000..e51de04 --- /dev/null +++ b/modules/home/wlogout/default.nix @@ -0,0 +1,107 @@ +{ config, ... }: + +{ + programs.wlogout = { + enable = true; + layout = [ + { + label = "shutdown"; + action = "sleep 1; systemctl poweroff"; + text = "Shutdown"; + keybind = "s"; + } + { + "label" = "reboot"; + "action" = "sleep 1; systemctl reboot"; + "text" = "Reboot"; + "keybind" = "r"; + } + { + "label" = "logout"; + "action" = "sleep 1; hyprctl dispatch exit"; + "text" = "Exit"; + "keybind" = "e"; + } + { + "label" = "suspend"; + "action" = "sleep 1; systemctl suspend"; + "text" = "Suspend"; + "keybind" = "u"; + } + { + "label" = "lock"; + "action" = "sleep 1; hyprlock"; + "text" = "Lock"; + "keybind" = "l"; + } + { + "label" = "hibernate"; + "action" = "sleep 1; systemctl hibernate"; + "text" = "Hibernate"; + "keybind" = "h"; + } + ]; + style = '' + * { + font-family: "JetBrainsMono NF", FontAwesome, sans-serif; + background-image: none; + transition: 20ms; + } + window { + background-color: rgba(12, 12, 12, 0.1); + } + button { + color: #${config.lib.stylix.colors.base05}; + font-size:20px; + background-repeat: no-repeat; + background-position: center; + background-size: 25%; + border-style: solid; + background-color: rgba(12, 12, 12, 0.3); + border: 3px solid #${config.lib.stylix.colors.base05}; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + } + button:focus, + button:active, + button:hover { + color: #${config.lib.stylix.colors.base0B}; + background-color: rgba(12, 12, 12, 0.5); + border: 3px solid #${config.lib.stylix.colors.base0B}; + } + #logout { + margin: 10px; + border-radius: 20px; + background-image: image(url("icons/logout.png")); + } + #suspend { + margin: 10px; + border-radius: 20px; + background-image: image(url("icons/suspend.png")); + } + #shutdown { + margin: 10px; + border-radius: 20px; + background-image: image(url("icons/shutdown.png")); + } + #reboot { + margin: 10px; + border-radius: 20px; + background-image: image(url("icons/reboot.png")); + } + #lock { + margin: 10px; + border-radius: 20px; + background-image: image(url("icons/lock.png")); + } + #hibernate { + margin: 10px; + border-radius: 20px; + background-image: image(url("icons/hibernate.png")); + } + ''; + }; + home.file.".config/wlogout/icons" = { + source = ./icons; + recursive = true; + }; +} diff --git a/modules/home/wlogout/icons/hibernate.png b/modules/home/wlogout/icons/hibernate.png new file mode 100644 index 0000000..bf2b001 Binary files /dev/null and b/modules/home/wlogout/icons/hibernate.png differ diff --git a/modules/home/wlogout/icons/lock.png b/modules/home/wlogout/icons/lock.png new file mode 100644 index 0000000..da59b10 Binary files /dev/null and b/modules/home/wlogout/icons/lock.png differ diff --git a/modules/home/wlogout/icons/logout.png b/modules/home/wlogout/icons/logout.png new file mode 100644 index 0000000..8a25922 Binary files /dev/null and b/modules/home/wlogout/icons/logout.png differ diff --git a/modules/home/wlogout/icons/reboot.png b/modules/home/wlogout/icons/reboot.png new file mode 100644 index 0000000..e5fd221 Binary files /dev/null and b/modules/home/wlogout/icons/reboot.png differ diff --git a/modules/home/wlogout/icons/shutdown.png b/modules/home/wlogout/icons/shutdown.png new file mode 100644 index 0000000..663ca03 Binary files /dev/null and b/modules/home/wlogout/icons/shutdown.png differ diff --git a/modules/home/wlogout/icons/suspend.png b/modules/home/wlogout/icons/suspend.png new file mode 100644 index 0000000..af099b9 Binary files /dev/null and b/modules/home/wlogout/icons/suspend.png differ diff --git a/modules/home/xdg.nix b/modules/home/xdg.nix new file mode 100644 index 0000000..b485c29 --- /dev/null +++ b/modules/home/xdg.nix @@ -0,0 +1,14 @@ +{ pkgs, ... }: { + xdg = { + enable = true; + mime.enable = true; + mimeApps = { + enable = true; + }; + portal = { + enable = true; + extraPortals = [ pkgs.xdg-desktop-portal-hyprland ]; + configPackages = [ pkgs.hyprland ]; + }; + }; +} diff --git a/modules/home/yazi/default.nix b/modules/home/yazi/default.nix new file mode 100644 index 0000000..2b758e2 --- /dev/null +++ b/modules/home/yazi/default.nix @@ -0,0 +1,32 @@ +{ pkgs, ... }: +let + settings = import ./yazi.nix; + keymap = import ./keymap.nix; + theme = import ./theme.nix; +in +{ + programs.yazi = { + enable = true; + enableZshIntegration = true; + enableBashIntegration = true; + enableFishIntegration = true; + shellWrapperName = "yy"; + settings = settings; + keymap = keymap; + theme = theme; + plugins = { + lazygit = pkgs.yaziPlugins.lazygit; + full-border = pkgs.yaziPlugins.full-border; + git = pkgs.yaziPlugins.git; + smart-enter = pkgs.yaziPlugins.smart-enter; + }; + + initLua = '' + require("full-border"):setup() + require("git"):setup() + require("smart-enter"):setup { + open_multi = true, + } + ''; + }; +} diff --git a/modules/home/yazi/keymap.nix b/modules/home/yazi/keymap.nix new file mode 100644 index 0000000..d4e4267 --- /dev/null +++ b/modules/home/yazi/keymap.nix @@ -0,0 +1,1201 @@ +{ + mgr = { + keymap = [ + { + on = ""; + run = "escape"; + desc = "Exit visual mode, clear selected, or cancel search"; + } + { + on = ""; + run = "escape"; + desc = "Exit visual mode, clear selected, or cancel search"; + } + { + on = "q"; + run = "quit"; + desc = "Quit the process"; + } + { + on = "Q"; + run = "quit --no-cwd-file"; + desc = "Quit the process without outputting cwd-file"; + } + { + on = ""; + run = "close"; + desc = "Close the current tab, or quit if it's last"; + } + { + on = ""; + run = "suspend"; + desc = "Suspend the process"; + } + { + on = "k"; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = "j"; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -50%"; + desc = "Move cursor up half page"; + } + { + on = ""; + run = "arrow 50%"; + desc = "Move cursor down half page"; + } + { + on = ""; + run = "arrow -100%"; + desc = "Move cursor up one page"; + } + { + on = ""; + run = "arrow 100%"; + desc = "Move cursor down one page"; + } + { + on = ""; + run = "arrow -50%"; + desc = "Move cursor up half page"; + } + { + on = ""; + run = "arrow 50%"; + desc = "Move cursor down half page"; + } + { + on = ""; + run = "arrow -100%"; + desc = "Move cursor up one page"; + } + { + on = ""; + run = "arrow 100%"; + desc = "Move cursor down one page"; + } + { + on = [ "g" "g" ]; + run = "arrow top"; + desc = "Move cursor to the top"; + } + { + on = "G"; + run = "arrow bot"; + desc = "Move cursor to the bottom"; + } + { + on = "h"; + run = "leave"; + desc = "Go back to the parent directory"; + } + { + on = "l"; + run = "enter"; + desc = "Enter the child directory"; + } + { + on = ""; + run = "leave"; + desc = "Go back to the parent directory"; + } + { + on = ""; + run = "enter"; + desc = "Enter the child directory"; + } + { + on = "H"; + run = "back"; + desc = "Go back to the previous directory"; + } + { + on = "L"; + run = "forward"; + desc = "Go forward to the next directory"; + } + { + on = ""; + run = [ "toggle" "arrow 1" ]; + desc = "Toggle the current selection state"; + } + { + on = ""; + run = "toggle_all --state=on"; + desc = "Select all files"; + } + { + on = ""; + run = "toggle_all"; + desc = "Invert selection of all files"; + } + { + on = "v"; + run = "visual_mode"; + desc = "Enter visual mode (selection mode)"; + } + { + on = "V"; + run = "visual_mode --unset"; + desc = "Enter visual mode (unset mode)"; + } + { + on = "K"; + run = "seek -5"; + desc = "Seek up 5 units in the preview"; + } + { + on = "J"; + run = "seek 5"; + desc = "Seek down 5 units in the preview"; + } + { + on = ""; + run = "spot"; + desc = "Spot hovered file"; + } + { + on = "o"; + run = "open"; + desc = "Open selected files"; + } + { + on = "O"; + run = "open --interactive"; + desc = "Open selected files interactively"; + } + { + on = ""; + run = "open"; + desc = "Open selected files"; + } + { + on = ""; + run = "open --interactive"; + desc = "Open selected files interactively"; + } + { + on = "y"; + run = "yank"; + desc = "Yank selected files (copy)"; + } + { + on = "x"; + run = "yank --cut"; + desc = "Yank selected files (cut)"; + } + { + on = "p"; + run = "paste"; + desc = "Paste yanked files"; + } + { + on = "P"; + run = "paste --force"; + desc = "Paste yanked files (overwrite if the destination exists)"; + } + { + on = "-"; + run = "link"; + desc = "Symlink the absolute path of yanked files"; + } + { + on = "_"; + run = "link --relative"; + desc = "Symlink the relative path of yanked files"; + } + { + on = ""; + run = "hardlink"; + desc = "Hardlink yanked files"; + } + { + on = "Y"; + run = "unyank"; + desc = "Cancel the yank status"; + } + { + on = "X"; + run = "unyank"; + desc = "Cancel the yank status"; + } + { + on = "d"; + run = "remove"; + desc = "Trash selected files"; + } + { + on = "D"; + run = "remove --permanently"; + desc = "Permanently delete selected files"; + } + { + on = "a"; + run = "create"; + desc = "Create a file (ends with / for directories)"; + } + { + on = "r"; + run = "rename --cursor=before_ext"; + desc = "Rename selected file(s)"; + } + { + on = ";"; + run = "shell --interactive"; + desc = "Run a shell command"; + } + { + on = ":"; + run = "shell --block --interactive"; + desc = "Run a shell command (block until finishes)"; + } + { + on = "."; + run = "hidden toggle"; + desc = "Toggle the visibility of hidden files"; + } + { + on = "s"; + run = "search --via=fd"; + desc = "Search files by name via fd"; + } + { + on = "S"; + run = "search --via=rg"; + desc = "Search files by content via ripgrep"; + } + { + on = ""; + run = "escape --search"; + desc = "Cancel the ongoing search"; + } + { + on = "z"; + run = "plugin zoxide"; + desc = "Jump to a directory via zoxide"; + } + { + on = "Z"; + run = "plugin fzf"; + desc = "Jump to a file/directory via fzf"; + } + { + on = [ "m" "s" ]; + run = "linemode size"; + desc = "Linemode: size"; + } + { + on = [ "m" "p" ]; + run = "linemode permissions"; + desc = "Linemode: permissions"; + } + { + on = [ "m" "b" ]; + run = "linemode btime"; + desc = "Linemode: btime"; + } + { + on = [ "m" "m" ]; + run = "linemode mtime"; + desc = "Linemode: mtime"; + } + { + on = [ "m" "o" ]; + run = "linemode owner"; + desc = "Linemode: owner"; + } + { + on = [ "m" "n" ]; + run = "linemode none"; + desc = "Linemode: none"; + } + { + on = [ "c" "c" ]; + run = "copy path"; + desc = "Copy the file path"; + } + { + on = [ "c" "d" ]; + run = "copy dirname"; + desc = "Copy the directory path"; + } + { + on = [ "c" "f" ]; + run = "copy filename"; + desc = "Copy the filename"; + } + { + on = [ "c" "n" ]; + run = "copy name_without_ext"; + desc = "Copy the filename without extension"; + } + { + on = "f"; + run = "filter --smart"; + desc = "Filter files"; + } + { + on = "/"; + run = "find --smart"; + desc = "Find next file"; + } + { + on = "?"; + run = "find --previous --smart"; + desc = "Find previous file"; + } + { + on = "n"; + run = "find_arrow"; + desc = "Goto the next found"; + } + { + on = "N"; + run = "find_arrow --previous"; + desc = "Goto the previous found"; + } + { + on = [ "," "m" ]; + run = [ "sort mtime --reverse=no" "linemode mtime" ]; + desc = "Sort by modified time"; + } + { + on = [ "," "M" ]; + run = [ "sort mtime --reverse" "linemode mtime" ]; + desc = "Sort by modified time (reverse)"; + } + { + on = [ "," "b" ]; + run = [ "sort btime --reverse=no" "linemode btime" ]; + desc = "Sort by birth time"; + } + { + on = [ "," "B" ]; + run = [ "sort btime --reverse" "linemode btime" ]; + desc = "Sort by birth time (reverse)"; + } + { + on = [ "," "e" ]; + run = "sort extension --reverse=no"; + desc = "Sort by extension"; + } + { + on = [ "," "E" ]; + run = "sort extension --reverse"; + desc = "Sort by extension (reverse)"; + } + { + on = [ "," "a" ]; + run = "sort alphabetical --reverse=no"; + desc = "Sort alphabetically"; + } + { + on = [ "," "A" ]; + run = "sort alphabetical --reverse"; + desc = "Sort alphabetically (reverse)"; + } + { + on = [ "," "n" ]; + run = "sort natural --reverse=no"; + desc = "Sort naturally"; + } + { + on = [ "," "N" ]; + run = "sort natural --reverse"; + desc = "Sort naturally (reverse)"; + } + { + on = [ "," "s" ]; + run = [ "sort size --reverse=no" "linemode size" ]; + desc = "Sort by size"; + } + { + on = [ "," "S" ]; + run = [ "sort size --reverse" "linemode size" ]; + desc = "Sort by size (reverse)"; + } + { + on = [ "," "r" ]; + run = "sort random --reverse=no"; + desc = "Sort randomly"; + } + { + on = [ "g" "h" ]; + run = "cd ~"; + desc = "Go home"; + } + { + on = [ "g" "c" ]; + run = "cd ~/.config"; + desc = "Goto ~/.config"; + } + { + on = [ "g" "d" ]; + run = "cd ~/Downloads"; + desc = "Goto ~/Downloads"; + } + { + on = [ "g" "" ]; + run = "cd --interactive"; + desc = "Jump interactively"; + } + { + on = "t"; + run = "tab_create --current"; + desc = "Create a new tab with CWD"; + } + { + on = "1"; + run = "tab_switch 0"; + desc = "Switch to the first tab"; + } + { + on = "2"; + run = "tab_switch 1"; + desc = "Switch to the second tab"; + } + { + on = "3"; + run = "tab_switch 2"; + desc = "Switch to the third tab"; + } + { + on = "4"; + run = "tab_switch 3"; + desc = "Switch to the fourth tab"; + } + { + on = "5"; + run = "tab_switch 4"; + desc = "Switch to the fifth tab"; + } + { + on = "6"; + run = "tab_switch 5"; + desc = "Switch to the sixth tab"; + } + { + on = "7"; + run = "tab_switch 6"; + desc = "Switch to the seventh tab"; + } + { + on = "8"; + run = "tab_switch 7"; + desc = "Switch to the eighth tab"; + } + { + on = "9"; + run = "tab_switch 8"; + desc = "Switch to the ninth tab"; + } + { + on = "["; + run = "tab_switch -1 --relative"; + desc = "Switch to the previous tab"; + } + { + on = "]"; + run = "tab_switch 1 --relative"; + desc = "Switch to the next tab"; + } + { + on = "{"; + run = "tab_swap -1"; + desc = "Swap current tab with previous tab"; + } + { + on = "}"; + run = "tab_swap 1"; + desc = "Swap current tab with next tab"; + } + { + on = "w"; + run = "tasks_show"; + desc = "Show task manager"; + } + { + on = "~"; + run = "help"; + desc = "Open help"; + } + { + on = ""; + run = "help"; + desc = "Open help"; + } + ]; + prepend_keymap = [ + { + on = [ "g" "i" ]; + run = "plugin lazygit"; + desc = "run lazygit"; + } + { + on = "l"; + run = "plugin smart-enter"; + desc = "Enter the child directory, or open the file"; + } + ]; + }; + tasks = { + keymap = [ + { + on = ""; + run = "close"; + desc = "Close task manager"; + } + { + on = ""; + run = "close"; + desc = "Close task manager"; + } + { + on = ""; + run = "close"; + desc = "Close task manager"; + } + { + on = "w"; + run = "close"; + desc = "Close task manager"; + } + { + on = "k"; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = "j"; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "inspect"; + desc = "Inspect the task"; + } + { + on = "x"; + run = "cancel"; + desc = "Cancel the task"; + } + { + on = "~"; + run = "help"; + desc = "Open help"; + } + { + on = ""; + run = "help"; + desc = "Open help"; + } + ]; + }; + spot = { + keymap = [ + { + on = ""; + run = "close"; + desc = "Close the spot"; + } + { + on = ""; + run = "close"; + desc = "Close the spot"; + } + { + on = ""; + run = "close"; + desc = "Close the spot"; + } + { + on = ""; + run = "close"; + desc = "Close the spot"; + } + { + on = "k"; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = "j"; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = "h"; + run = "swipe -1"; + desc = "Swipe to the previous file"; + } + { + on = "l"; + run = "swipe 1"; + desc = "Swipe to the next file"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "swipe -1"; + desc = "Swipe to the next file"; + } + { + on = ""; + run = "swipe 1"; + desc = "Swipe to the previous file"; + } + { + on = [ "c" "c" ]; + run = "copy cell"; + desc = "Copy selected cell"; + } + { + on = "~"; + run = "help"; + desc = "Open help"; + } + { + on = ""; + run = "help"; + desc = "Open help"; + } + ]; + }; + pick = { + keymap = [ + { + on = ""; + run = "close"; + desc = "Cancel pick"; + } + { + on = ""; + run = "close"; + desc = "Cancel pick"; + } + { + on = ""; + run = "close"; + desc = "Cancel pick"; + } + { + on = ""; + run = "close --submit"; + desc = "Submit the pick"; + } + { + on = "k"; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = "j"; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = "~"; + run = "help"; + desc = "Open help"; + } + { + on = ""; + run = "help"; + desc = "Open help"; + } + ]; + }; + input = { + keymap = [ + { + on = ""; + run = "close"; + desc = "Cancel input"; + } + { + on = ""; + run = "close --submit"; + desc = "Submit input"; + } + { + on = ""; + run = "escape"; + desc = "Go back the normal mode, or cancel input"; + } + { + on = ""; + run = "escape"; + desc = "Go back the normal mode, or cancel input"; + } + { + on = "i"; + run = "insert"; + desc = "Enter insert mode"; + } + { + on = "I"; + run = [ "move first-char" "insert" ]; + desc = "Move to the BOL, and enter insert mode"; + } + { + on = "a"; + run = "insert --append"; + desc = "Enter append mode"; + } + { + on = "A"; + run = [ "move eol" "insert --append" ]; + desc = "Move to the EOL, and enter append mode"; + } + { + on = "v"; + run = "visual"; + desc = "Enter visual mode"; + } + { + on = "r"; + run = "replace"; + desc = "Replace a single character"; + } + { + on = "V"; + run = [ "move bol" "visual" "move eol" ]; + desc = "Select from BOL to EOL"; + } + { + on = ""; + run = [ "move eol" "visual" "move bol" ]; + desc = "Select from EOL to BOL"; + } + { + on = ""; + run = [ "move bol" "visual" "move eol" ]; + desc = "Select from BOL to EOL"; + } + { + on = "h"; + run = "move -1"; + desc = "Move back a character"; + } + { + on = "l"; + run = "move 1"; + desc = "Move forward a character"; + } + { + on = ""; + run = "move -1"; + desc = "Move back a character"; + } + { + on = ""; + run = "move 1"; + desc = "Move forward a character"; + } + { + on = ""; + run = "move -1"; + desc = "Move back a character"; + } + { + on = ""; + run = "move 1"; + desc = "Move forward a character"; + } + { + on = "b"; + run = "backward"; + desc = "Move back to the start of the current or previous word"; + } + { + on = "B"; + run = "backward --far"; + desc = "Move back to the start of the current or previous WORD"; + } + { + on = "w"; + run = "forward"; + desc = "Move forward to the start of the next word"; + } + { + on = "W"; + run = "forward --far"; + desc = "Move forward to the start of the next WORD"; + } + { + on = "e"; + run = "forward --end-of-word"; + desc = "Move forward to the end of the current or next word"; + } + { + on = "E"; + run = "forward --far --end-of-word"; + desc = "Move forward to the end of the current or next WORD"; + } + { + on = ""; + run = "backward"; + desc = "Move back to the start of the current or previous word"; + } + { + on = ""; + run = "forward --end-of-word"; + desc = "Move forward to the end of the current or next word"; + } + { + on = "0"; + run = "move bol"; + desc = "Move to the BOL"; + } + { + on = "$"; + run = "move eol"; + desc = "Move to the EOL"; + } + { + on = "_"; + run = "move first-char"; + desc = "Move to the first non-whitespace character"; + } + { + on = "^"; + run = "move first-char"; + desc = "Move to the first non-whitespace character"; + } + { + on = ""; + run = "move bol"; + desc = "Move to the BOL"; + } + { + on = ""; + run = "move eol"; + desc = "Move to the EOL"; + } + { + on = ""; + run = "move bol"; + desc = "Move to the BOL"; + } + { + on = ""; + run = "move eol"; + desc = "Move to the EOL"; + } + { + on = ""; + run = "backspace"; + desc = "Delete the character before the cursor"; + } + { + on = ""; + run = "backspace --under"; + desc = "Delete the character under the cursor"; + } + { + on = ""; + run = "backspace"; + desc = "Delete the character before the cursor"; + } + { + on = ""; + run = "backspace --under"; + desc = "Delete the character under the cursor"; + } + { + on = ""; + run = "kill bol"; + desc = "Kill backwards to the BOL"; + } + { + on = ""; + run = "kill eol"; + desc = "Kill forwards to the EOL"; + } + { + on = ""; + run = "kill backward"; + desc = "Kill backwards to the start of the current word"; + } + { + on = ""; + run = "kill forward"; + desc = "Kill forwards to the end of the current word"; + } + { + on = "d"; + run = "delete --cut"; + desc = "Cut the selected characters"; + } + { + on = "D"; + run = [ "delete --cut" "move eol" ]; + desc = "Cut until the EOL"; + } + { + on = "c"; + run = "delete --cut --insert"; + desc = "Cut the selected characters, and enter insert mode"; + } + { + on = "C"; + run = [ "delete --cut --insert" "move eol" ]; + desc = "Cut until the EOL, and enter insert mode"; + } + { + on = "x"; + run = [ "delete --cut" "move 1 --in-operating" ]; + desc = "Cut the current character"; + } + { + on = "y"; + run = "yank"; + desc = "Copy the selected characters"; + } + { + on = "p"; + run = "paste"; + desc = "Paste the copied characters after the cursor"; + } + { + on = "P"; + run = "paste --before"; + desc = "Paste the copied characters before the cursor"; + } + { + on = "u"; + run = "undo"; + desc = "Undo the last operation"; + } + { + on = ""; + run = "redo"; + desc = "Redo the last operation"; + } + { + on = "~"; + run = "help"; + desc = "Open help"; + } + { + on = ""; + run = "help"; + desc = "Open help"; + } + ]; + }; + confirm = { + keymap = [ + { + on = ""; + run = "close"; + desc = "Cancel the confirm"; + } + { + on = ""; + run = "close"; + desc = "Cancel the confirm"; + } + { + on = ""; + run = "close"; + desc = "Cancel the confirm"; + } + { + on = ""; + run = "close --submit"; + desc = "Submit the confirm"; + } + { + on = "n"; + run = "close"; + desc = "Cancel the confirm"; + } + { + on = "y"; + run = "close --submit"; + desc = "Submit the confirm"; + } + { + on = "k"; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = "j"; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = "~"; + run = "help"; + desc = "Open help"; + } + { + on = ""; + run = "help"; + desc = "Open help"; + } + ]; + }; + cmp = { + keymap = [ + { + on = ""; + run = "close"; + desc = "Cancel completion"; + } + { + on = ""; + run = "close --submit"; + desc = "Submit the completion"; + } + { + on = ""; + run = [ "close --submit" "close_input --submit" ]; + desc = "Submit the completion and input"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = "~"; + run = "help"; + desc = "Open help"; + } + { + on = ""; + run = "help"; + desc = "Open help"; + } + ]; + }; + help = { + keymap = [ + { + on = ""; + run = "escape"; + desc = "Clear the filter, or hide the help"; + } + { + on = ""; + run = "escape"; + desc = "Clear the filter, or hide the help"; + } + { + on = ""; + run = "close"; + desc = "Hide the help"; + } + { + on = "k"; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = "j"; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = ""; + run = "arrow -1"; + desc = "Move cursor up"; + } + { + on = ""; + run = "arrow 1"; + desc = "Move cursor down"; + } + { + on = "f"; + run = "filter"; + desc = "Apply a filter for the help items"; + } + ]; + }; +} diff --git a/modules/home/yazi/theme.nix b/modules/home/yazi/theme.nix new file mode 100644 index 0000000..77bee22 --- /dev/null +++ b/modules/home/yazi/theme.nix @@ -0,0 +1,3404 @@ +{ + flavor = { + dark = ""; + light = ""; + }; + mgr = { + marker_marked = { + fg = "lightcyan"; + bg = "lightcyan"; + }; + tab_width = 1; + border_symbol = "│"; + }; + mode = { }; + status = { + overall = { bold = true; }; + sep_left = [ "░▒▓" "▓▒░" ]; + sep_right = [ "░▒▓" "▓▒░" ]; + }; + which = { + cols = 3; + separator = "  "; + }; + confirm = { + border = { fg = "gray"; }; + title = { + fg = "blue"; + bold = true; + }; + content = { }; + list = { }; + btn_yes = { + bg = "green"; + fg = "black"; + bold = true; + }; + btn_no = { + bg = "red"; + fg = "black"; + bold = true; + }; + btn_labels = [ " [Y]es " " (N)o " ]; + }; + spot = { + border = { fg = "blue"; }; + title = { fg = "blue"; }; + tbl_col = { fg = "blue"; }; + tbl_cell = { + fg = "yellow"; + reversed = true; + }; + }; + notify = { + title_info = { fg = "green"; }; + title_warn = { fg = "yellow"; }; + title_error = { fg = "red"; }; + icon_info = ""; + icon_warn = ""; + icon_error = ""; + }; + pick = { }; + input = { }; + cmp = { + active = { reversed = true; }; + inactive = { }; + icon_file = ""; + icon_folder = ""; + icon_command = ""; + }; + tasks = { }; + help = { }; + filetype = { }; + icon = { + globs = [ ]; + dirs = [ + { + name = ".config"; + text = ""; + } + { + name = ".git"; + text = ""; + } + { + name = ".github"; + text = ""; + } + { + name = ".npm"; + text = ""; + } + { + name = "Desktop"; + text = ""; + } + { + name = "Development"; + text = ""; + } + { + name = "Documents"; + text = ""; + } + { + name = "Downloads"; + text = ""; + } + { + name = "Library"; + text = ""; + } + { + name = "Movies"; + text = ""; + } + { + name = "Music"; + text = ""; + } + { + name = "Pictures"; + text = ""; + } + { + name = "Public"; + text = ""; + } + { + name = "Videos"; + text = ""; + } + ]; + files = [ + { + name = ".babelrc"; + text = ""; + fg = "#cbcb41"; + } + { + name = ".bash_profile"; + text = ""; + fg = "#89e051"; + } + { + name = ".bashrc"; + text = ""; + fg = "#89e051"; + } + { + name = ".clang-format"; + text = ""; + fg = "#6d8086"; + } + { + name = ".clang-tidy"; + text = ""; + fg = "#6d8086"; + } + { + name = ".codespellrc"; + text = "󰓆"; + fg = "#35da60"; + } + { + name = ".condarc"; + text = ""; + fg = "#43b02a"; + } + { + name = ".dockerignore"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = ".ds_store"; + text = ""; + fg = "#41535b"; + } + { + name = ".editorconfig"; + text = ""; + fg = "#fff2f2"; + } + { + name = ".env"; + text = ""; + fg = "#faf743"; + } + { + name = ".eslintignore"; + text = ""; + fg = "#4b32c3"; + } + { + name = ".eslintrc"; + text = ""; + fg = "#4b32c3"; + } + { + name = ".git-blame-ignore-revs"; + text = ""; + fg = "#f54d27"; + } + { + name = ".gitattributes"; + text = ""; + fg = "#f54d27"; + } + { + name = ".gitconfig"; + text = ""; + fg = "#f54d27"; + } + { + name = ".gitignore"; + text = ""; + fg = "#f54d27"; + } + { + name = ".gitlab-ci.yml"; + text = ""; + fg = "#e24329"; + } + { + name = ".gitmodules"; + text = ""; + fg = "#f54d27"; + } + { + name = ".gtkrc-2.0"; + text = ""; + fg = "#ffffff"; + } + { + name = ".gvimrc"; + text = ""; + fg = "#019833"; + } + { + name = ".justfile"; + text = ""; + fg = "#6d8086"; + } + { + name = ".luacheckrc"; + text = ""; + fg = "#00a2ff"; + } + { + name = ".luaurc"; + text = ""; + fg = "#00a2ff"; + } + { + name = ".mailmap"; + text = "󰊢"; + fg = "#f54d27"; + } + { + name = ".nanorc"; + text = ""; + fg = "#440077"; + } + { + name = ".npmignore"; + text = ""; + fg = "#e8274b"; + } + { + name = ".npmrc"; + text = ""; + fg = "#e8274b"; + } + { + name = ".nuxtrc"; + text = "󱄆"; + fg = "#00c58e"; + } + { + name = ".nvmrc"; + text = ""; + fg = "#5fa04e"; + } + { + name = ".pre-commit-config.yaml"; + text = "󰛢"; + fg = "#f8b424"; + } + { + name = ".prettierignore"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.cjs"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.js"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.json"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.json5"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.mjs"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.toml"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.yaml"; + text = ""; + fg = "#4285f4"; + } + { + name = ".prettierrc.yml"; + text = ""; + fg = "#4285f4"; + } + { + name = ".pylintrc"; + text = ""; + fg = "#6d8086"; + } + { + name = ".settings.json"; + text = ""; + fg = "#854cc7"; + } + { + name = ".SRCINFO"; + text = "󰣇"; + fg = "#0f94d2"; + } + { + name = ".vimrc"; + text = ""; + fg = "#019833"; + } + { + name = ".Xauthority"; + text = ""; + fg = "#e54d18"; + } + { + name = ".xinitrc"; + text = ""; + fg = "#e54d18"; + } + { + name = ".Xresources"; + text = ""; + fg = "#e54d18"; + } + { + name = ".xsession"; + text = ""; + fg = "#e54d18"; + } + { + name = ".zprofile"; + text = ""; + fg = "#89e051"; + } + { + name = ".zshenv"; + text = ""; + fg = "#89e051"; + } + { + name = ".zshrc"; + text = ""; + fg = "#89e051"; + } + { + name = "_gvimrc"; + text = ""; + fg = "#019833"; + } + { + name = "_vimrc"; + text = ""; + fg = "#019833"; + } + { + name = "AUTHORS"; + text = ""; + fg = "#a172ff"; + } + { + name = "AUTHORS.txt"; + text = ""; + fg = "#a172ff"; + } + { + name = "brewfile"; + text = ""; + fg = "#701516"; + } + { + name = "bspwmrc"; + text = ""; + fg = "#2f2f2f"; + } + { + name = "build"; + text = ""; + fg = "#89e051"; + } + { + name = "build.gradle"; + text = ""; + fg = "#005f87"; + } + { + name = "build.zig.zon"; + text = ""; + fg = "#f69a1b"; + } + { + name = "bun.lockb"; + text = ""; + fg = "#eadcd1"; + } + { + name = "cantorrc"; + text = ""; + fg = "#1c99f3"; + } + { + name = "checkhealth"; + text = "󰓙"; + fg = "#75b4fb"; + } + { + name = "cmakelists.txt"; + text = ""; + fg = "#dce3eb"; + } + { + name = "code_of_conduct"; + text = ""; + fg = "#e41662"; + } + { + name = "code_of_conduct.md"; + text = ""; + fg = "#e41662"; + } + { + name = "commit_editmsg"; + text = ""; + fg = "#f54d27"; + } + { + name = "commitlint.config.js"; + text = "󰜘"; + fg = "#2b9689"; + } + { + name = "commitlint.config.ts"; + text = "󰜘"; + fg = "#2b9689"; + } + { + name = "compose.yaml"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = "compose.yml"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = "config"; + text = ""; + fg = "#6d8086"; + } + { + name = "containerfile"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = "copying"; + text = ""; + fg = "#cbcb41"; + } + { + name = "copying.lesser"; + text = ""; + fg = "#cbcb41"; + } + { + name = "Directory.Build.props"; + text = ""; + fg = "#00a2ff"; + } + { + name = "Directory.Build.targets"; + text = ""; + fg = "#00a2ff"; + } + { + name = "Directory.Packages.props"; + text = ""; + fg = "#00a2ff"; + } + { + name = "docker-compose.yaml"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = "docker-compose.yml"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = "dockerfile"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = "eslint.config.cjs"; + text = ""; + fg = "#4b32c3"; + } + { + name = "eslint.config.js"; + text = ""; + fg = "#4b32c3"; + } + { + name = "eslint.config.mjs"; + text = ""; + fg = "#4b32c3"; + } + { + name = "eslint.config.ts"; + text = ""; + fg = "#4b32c3"; + } + { + name = "ext_typoscript_setup.txt"; + text = ""; + fg = "#ff8700"; + } + { + name = "favicon.ico"; + text = ""; + fg = "#cbcb41"; + } + { + name = "fp-info-cache"; + text = ""; + fg = "#ffffff"; + } + { + name = "fp-lib-table"; + text = ""; + fg = "#ffffff"; + } + { + name = "FreeCAD.conf"; + text = ""; + fg = "#cb333b"; + } + { + name = "Gemfile"; + text = ""; + fg = "#701516"; + } + { + name = "gnumakefile"; + text = ""; + fg = "#6d8086"; + } + { + name = "go.mod"; + text = ""; + fg = "#519aba"; + } + { + name = "go.sum"; + text = ""; + fg = "#519aba"; + } + { + name = "go.work"; + text = ""; + fg = "#519aba"; + } + { + name = "gradle-wrapper.properties"; + text = ""; + fg = "#005f87"; + } + { + name = "gradle.properties"; + text = ""; + fg = "#005f87"; + } + { + name = "gradlew"; + text = ""; + fg = "#005f87"; + } + { + name = "groovy"; + text = ""; + fg = "#4a687c"; + } + { + name = "gruntfile.babel.js"; + text = ""; + fg = "#e37933"; + } + { + name = "gruntfile.coffee"; + text = ""; + fg = "#e37933"; + } + { + name = "gruntfile.js"; + text = ""; + fg = "#e37933"; + } + { + name = "gruntfile.ts"; + text = ""; + fg = "#e37933"; + } + { + name = "gtkrc"; + text = ""; + fg = "#ffffff"; + } + { + name = "gulpfile.babel.js"; + text = ""; + fg = "#cc3e44"; + } + { + name = "gulpfile.coffee"; + text = ""; + fg = "#cc3e44"; + } + { + name = "gulpfile.js"; + text = ""; + fg = "#cc3e44"; + } + { + name = "gulpfile.ts"; + text = ""; + fg = "#cc3e44"; + } + { + name = "hypridle.conf"; + text = ""; + fg = "#00aaae"; + } + { + name = "hyprland.conf"; + text = ""; + fg = "#00aaae"; + } + { + name = "hyprlock.conf"; + text = ""; + fg = "#00aaae"; + } + { + name = "hyprpaper.conf"; + text = ""; + fg = "#00aaae"; + } + { + name = "i18n.config.js"; + text = "󰗊"; + fg = "#7986cb"; + } + { + name = "i18n.config.ts"; + text = "󰗊"; + fg = "#7986cb"; + } + { + name = "i3blocks.conf"; + text = ""; + fg = "#e8ebee"; + } + { + name = "i3status.conf"; + text = ""; + fg = "#e8ebee"; + } + { + name = "index.theme"; + text = ""; + fg = "#2db96f"; + } + { + name = "ionic.config.json"; + text = ""; + fg = "#4f8ff7"; + } + { + name = "justfile"; + text = ""; + fg = "#6d8086"; + } + { + name = "kalgebrarc"; + text = ""; + fg = "#1c99f3"; + } + { + name = "kdeglobals"; + text = ""; + fg = "#1c99f3"; + } + { + name = "kdenlive-layoutsrc"; + text = ""; + fg = "#83b8f2"; + } + { + name = "kdenliverc"; + text = ""; + fg = "#83b8f2"; + } + { + name = "kritadisplayrc"; + text = ""; + fg = "#f245fb"; + } + { + name = "kritarc"; + text = ""; + fg = "#f245fb"; + } + { + name = "license"; + text = ""; + fg = "#d0bf41"; + } + { + name = "license.md"; + text = ""; + fg = "#d0bf41"; + } + { + name = "lxde-rc.xml"; + text = ""; + fg = "#909090"; + } + { + name = "lxqt.conf"; + text = ""; + fg = "#0192d3"; + } + { + name = "makefile"; + text = ""; + fg = "#6d8086"; + } + { + name = "mix.lock"; + text = ""; + fg = "#a074c4"; + } + { + name = "mpv.conf"; + text = ""; + fg = "#3b1342"; + } + { + name = "node_modules"; + text = ""; + fg = "#e8274b"; + } + { + name = "nuxt.config.cjs"; + text = "󱄆"; + fg = "#00c58e"; + } + { + name = "nuxt.config.js"; + text = "󱄆"; + fg = "#00c58e"; + } + { + name = "nuxt.config.mjs"; + text = "󱄆"; + fg = "#00c58e"; + } + { + name = "nuxt.config.ts"; + text = "󱄆"; + fg = "#00c58e"; + } + { + name = "package-lock.json"; + text = ""; + fg = "#7a0d21"; + } + { + name = "package.json"; + text = ""; + fg = "#e8274b"; + } + { + name = "PKGBUILD"; + text = ""; + fg = "#0f94d2"; + } + { + name = "platformio.ini"; + text = ""; + fg = "#f6822b"; + } + { + name = "pom.xml"; + text = ""; + fg = "#7a0d21"; + } + { + name = "prettier.config.cjs"; + text = ""; + fg = "#4285f4"; + } + { + name = "prettier.config.js"; + text = ""; + fg = "#4285f4"; + } + { + name = "prettier.config.mjs"; + text = ""; + fg = "#4285f4"; + } + { + name = "prettier.config.ts"; + text = ""; + fg = "#4285f4"; + } + { + name = "procfile"; + text = ""; + fg = "#a074c4"; + } + { + name = "PrusaSlicer.ini"; + text = ""; + fg = "#ec6b23"; + } + { + name = "PrusaSlicerGcodeViewer.ini"; + text = ""; + fg = "#ec6b23"; + } + { + name = "py.typed"; + text = ""; + fg = "#ffbc03"; + } + { + name = "QtProject.conf"; + text = ""; + fg = "#40cd52"; + } + { + name = "rakefile"; + text = ""; + fg = "#701516"; + } + { + name = "readme"; + text = "󰂺"; + fg = "#ededed"; + } + { + name = "readme.md"; + text = "󰂺"; + fg = "#ededed"; + } + { + name = "rmd"; + text = ""; + fg = "#519aba"; + } + { + name = "robots.txt"; + text = "󰚩"; + fg = "#5d7096"; + } + { + name = "security"; + text = "󰒃"; + fg = "#bec4c9"; + } + { + name = "security.md"; + text = "󰒃"; + fg = "#bec4c9"; + } + { + name = "settings.gradle"; + text = ""; + fg = "#005f87"; + } + { + name = "svelte.config.js"; + text = ""; + fg = "#ff3e00"; + } + { + name = "sxhkdrc"; + text = ""; + fg = "#2f2f2f"; + } + { + name = "sym-lib-table"; + text = ""; + fg = "#ffffff"; + } + { + name = "tailwind.config.js"; + text = "󱏿"; + fg = "#20c2e3"; + } + { + name = "tailwind.config.mjs"; + text = "󱏿"; + fg = "#20c2e3"; + } + { + name = "tailwind.config.ts"; + text = "󱏿"; + fg = "#20c2e3"; + } + { + name = "tmux.conf"; + text = ""; + fg = "#14ba19"; + } + { + name = "tmux.conf.local"; + text = ""; + fg = "#14ba19"; + } + { + name = "tsconfig.json"; + text = ""; + fg = "#519aba"; + } + { + name = "unlicense"; + text = ""; + fg = "#d0bf41"; + } + { + name = "vagrantfile"; + text = ""; + fg = "#1563ff"; + } + { + name = "vercel.json"; + text = ""; + fg = "#ffffff"; + } + { + name = "vlcrc"; + text = "󰕼"; + fg = "#ee7a00"; + } + { + name = "webpack"; + text = "󰜫"; + fg = "#519aba"; + } + { + name = "weston.ini"; + text = ""; + fg = "#ffbb01"; + } + { + name = "workspace"; + text = ""; + fg = "#89e051"; + } + { + name = "xmobarrc"; + text = ""; + fg = "#fd4d5d"; + } + { + name = "xmobarrc.hs"; + text = ""; + fg = "#fd4d5d"; + } + { + name = "xmonad.hs"; + text = ""; + fg = "#fd4d5d"; + } + { + name = "xorg.conf"; + text = ""; + fg = "#e54d18"; + } + { + name = "xsettingsd.conf"; + text = ""; + fg = "#e54d18"; + } + ]; + exts = [ + { + name = "3gp"; + text = ""; + fg = "#fd971f"; + } + { + name = "3mf"; + text = "󰆧"; + fg = "#888888"; + } + { + name = "7z"; + text = ""; + fg = "#eca517"; + } + { + name = "a"; + text = ""; + fg = "#dcddd6"; + } + { + name = "aac"; + text = ""; + fg = "#00afff"; + } + { + name = "adb"; + text = ""; + fg = "#22ffff"; + } + { + name = "ads"; + text = ""; + fg = "#ffffff"; + } + { + name = "ai"; + text = ""; + fg = "#cbcb41"; + } + { + name = "aif"; + text = ""; + fg = "#00afff"; + } + { + name = "aiff"; + text = ""; + fg = "#00afff"; + } + { + name = "android"; + text = ""; + fg = "#34a853"; + } + { + name = "ape"; + text = ""; + fg = "#00afff"; + } + { + name = "apk"; + text = ""; + fg = "#34a853"; + } + { + name = "apl"; + text = ""; + fg = "#24a148"; + } + { + name = "app"; + text = ""; + fg = "#9f0500"; + } + { + name = "applescript"; + text = ""; + fg = "#6d8085"; + } + { + name = "asc"; + text = "󰦝"; + fg = "#576d7f"; + } + { + name = "asm"; + text = ""; + fg = "#0091bd"; + } + { + name = "ass"; + text = "󰨖"; + fg = "#ffb713"; + } + { + name = "astro"; + text = ""; + fg = "#e23f67"; + } + { + name = "avif"; + text = ""; + fg = "#a074c4"; + } + { + name = "awk"; + text = ""; + fg = "#4d5a5e"; + } + { + name = "azcli"; + text = ""; + fg = "#0078d4"; + } + { + name = "bak"; + text = "󰁯"; + fg = "#6d8086"; + } + { + name = "bash"; + text = ""; + fg = "#89e051"; + } + { + name = "bat"; + text = ""; + fg = "#c1f12e"; + } + { + name = "bazel"; + text = ""; + fg = "#89e051"; + } + { + name = "bib"; + text = "󱉟"; + fg = "#cbcb41"; + } + { + name = "bicep"; + text = ""; + fg = "#519aba"; + } + { + name = "bicepparam"; + text = ""; + fg = "#9f74b3"; + } + { + name = "bin"; + text = ""; + fg = "#9f0500"; + } + { + name = "blade.php"; + text = ""; + fg = "#f05340"; + } + { + name = "blend"; + text = "󰂫"; + fg = "#ea7600"; + } + { + name = "blp"; + text = "󰺾"; + fg = "#5796e2"; + } + { + name = "bmp"; + text = ""; + fg = "#a074c4"; + } + { + name = "bqn"; + text = ""; + fg = "#24a148"; + } + { + name = "brep"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "bz"; + text = ""; + fg = "#eca517"; + } + { + name = "bz2"; + text = ""; + fg = "#eca517"; + } + { + name = "bz3"; + text = ""; + fg = "#eca517"; + } + { + name = "bzl"; + text = ""; + fg = "#89e051"; + } + { + name = "c"; + text = ""; + fg = "#599eff"; + } + { + name = "c++"; + text = ""; + fg = "#f34b7d"; + } + { + name = "cache"; + text = ""; + fg = "#ffffff"; + } + { + name = "cast"; + text = ""; + fg = "#fd971f"; + } + { + name = "cbl"; + text = ""; + fg = "#005ca5"; + } + { + name = "cc"; + text = ""; + fg = "#f34b7d"; + } + { + name = "ccm"; + text = ""; + fg = "#f34b7d"; + } + { + name = "cfg"; + text = ""; + fg = "#6d8086"; + } + { + name = "cjs"; + text = ""; + fg = "#cbcb41"; + } + { + name = "clj"; + text = ""; + fg = "#8dc149"; + } + { + name = "cljc"; + text = ""; + fg = "#8dc149"; + } + { + name = "cljd"; + text = ""; + fg = "#519aba"; + } + { + name = "cljs"; + text = ""; + fg = "#519aba"; + } + { + name = "cmake"; + text = ""; + fg = "#dce3eb"; + } + { + name = "cob"; + text = ""; + fg = "#005ca5"; + } + { + name = "cobol"; + text = ""; + fg = "#005ca5"; + } + { + name = "coffee"; + text = ""; + fg = "#cbcb41"; + } + { + name = "conda"; + text = ""; + fg = "#43b02a"; + } + { + name = "conf"; + text = ""; + fg = "#6d8086"; + } + { + name = "config.ru"; + text = ""; + fg = "#701516"; + } + { + name = "cow"; + text = "󰆚"; + fg = "#965824"; + } + { + name = "cp"; + text = ""; + fg = "#519aba"; + } + { + name = "cpp"; + text = ""; + fg = "#519aba"; + } + { + name = "cppm"; + text = ""; + fg = "#519aba"; + } + { + name = "cpy"; + text = ""; + fg = "#005ca5"; + } + { + name = "cr"; + text = ""; + fg = "#c8c8c8"; + } + { + name = "crdownload"; + text = ""; + fg = "#44cda8"; + } + { + name = "cs"; + text = "󰌛"; + fg = "#596706"; + } + { + name = "csh"; + text = ""; + fg = "#4d5a5e"; + } + { + name = "cshtml"; + text = "󱦗"; + fg = "#512bd4"; + } + { + name = "cson"; + text = ""; + fg = "#cbcb41"; + } + { + name = "csproj"; + text = "󰪮"; + fg = "#512bd4"; + } + { + name = "css"; + text = ""; + fg = "#42a5f5"; + } + { + name = "csv"; + text = ""; + fg = "#89e051"; + } + { + name = "cts"; + text = ""; + fg = "#519aba"; + } + { + name = "cu"; + text = ""; + fg = "#89e051"; + } + { + name = "cue"; + text = "󰲹"; + fg = "#ed95ae"; + } + { + name = "cuh"; + text = ""; + fg = "#a074c4"; + } + { + name = "cxx"; + text = ""; + fg = "#519aba"; + } + { + name = "cxxm"; + text = ""; + fg = "#519aba"; + } + { + name = "d"; + text = ""; + fg = "#b03931"; + } + { + name = "d.ts"; + text = ""; + fg = "#d59855"; + } + { + name = "dart"; + text = ""; + fg = "#03589c"; + } + { + name = "db"; + text = ""; + fg = "#dad8d8"; + } + { + name = "dconf"; + text = ""; + fg = "#ffffff"; + } + { + name = "desktop"; + text = ""; + fg = "#563d7c"; + } + { + name = "diff"; + text = ""; + fg = "#41535b"; + } + { + name = "dll"; + text = ""; + fg = "#4d2c0b"; + } + { + name = "doc"; + text = "󰈬"; + fg = "#185abd"; + } + { + name = "Dockerfile"; + text = "󰡨"; + fg = "#458ee6"; + } + { + name = "docx"; + text = "󰈬"; + fg = "#185abd"; + } + { + name = "dot"; + text = "󱁉"; + fg = "#30638e"; + } + { + name = "download"; + text = ""; + fg = "#44cda8"; + } + { + name = "drl"; + text = ""; + fg = "#ffafaf"; + } + { + name = "dropbox"; + text = ""; + fg = "#0061fe"; + } + { + name = "dump"; + text = ""; + fg = "#dad8d8"; + } + { + name = "dwg"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "dxf"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "ebook"; + text = ""; + fg = "#eab16d"; + } + { + name = "ebuild"; + text = ""; + fg = "#4c416e"; + } + { + name = "edn"; + text = ""; + fg = "#519aba"; + } + { + name = "eex"; + text = ""; + fg = "#a074c4"; + } + { + name = "ejs"; + text = ""; + fg = "#cbcb41"; + } + { + name = "el"; + text = ""; + fg = "#8172be"; + } + { + name = "elc"; + text = ""; + fg = "#8172be"; + } + { + name = "elf"; + text = ""; + fg = "#9f0500"; + } + { + name = "elm"; + text = ""; + fg = "#519aba"; + } + { + name = "eln"; + text = ""; + fg = "#8172be"; + } + { + name = "env"; + text = ""; + fg = "#faf743"; + } + { + name = "eot"; + text = ""; + fg = "#ececec"; + } + { + name = "epp"; + text = ""; + fg = "#ffa61a"; + } + { + name = "epub"; + text = ""; + fg = "#eab16d"; + } + { + name = "erb"; + text = ""; + fg = "#701516"; + } + { + name = "erl"; + text = ""; + fg = "#b83998"; + } + { + name = "ex"; + text = ""; + fg = "#a074c4"; + } + { + name = "exe"; + text = ""; + fg = "#9f0500"; + } + { + name = "exs"; + text = ""; + fg = "#a074c4"; + } + { + name = "f#"; + text = ""; + fg = "#519aba"; + } + { + name = "f3d"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "f90"; + text = "󱈚"; + fg = "#734f96"; + } + { + name = "fbx"; + text = "󰆧"; + fg = "#888888"; + } + { + name = "fcbak"; + text = ""; + fg = "#cb333b"; + } + { + name = "fcmacro"; + text = ""; + fg = "#cb333b"; + } + { + name = "fcmat"; + text = ""; + fg = "#cb333b"; + } + { + name = "fcparam"; + text = ""; + fg = "#cb333b"; + } + { + name = "fcscript"; + text = ""; + fg = "#cb333b"; + } + { + name = "fcstd"; + text = ""; + fg = "#cb333b"; + } + { + name = "fcstd1"; + text = ""; + fg = "#cb333b"; + } + { + name = "fctb"; + text = ""; + fg = "#cb333b"; + } + { + name = "fctl"; + text = ""; + fg = "#cb333b"; + } + { + name = "fdmdownload"; + text = ""; + fg = "#44cda8"; + } + { + name = "fish"; + text = ""; + fg = "#4d5a5e"; + } + { + name = "flac"; + text = ""; + fg = "#0075aa"; + } + { + name = "flc"; + text = ""; + fg = "#ececec"; + } + { + name = "flf"; + text = ""; + fg = "#ececec"; + } + { + name = "fnl"; + text = ""; + fg = "#fff3d7"; + } + { + name = "fodg"; + text = ""; + fg = "#fffb57"; + } + { + name = "fodp"; + text = ""; + fg = "#fe9c45"; + } + { + name = "fods"; + text = ""; + fg = "#78fc4e"; + } + { + name = "fodt"; + text = ""; + fg = "#2dcbfd"; + } + { + name = "fs"; + text = ""; + fg = "#519aba"; + } + { + name = "fsi"; + text = ""; + fg = "#519aba"; + } + { + name = "fsscript"; + text = ""; + fg = "#519aba"; + } + { + name = "fsx"; + text = ""; + fg = "#519aba"; + } + { + name = "gcode"; + text = "󰐫"; + fg = "#1471ad"; + } + { + name = "gd"; + text = ""; + fg = "#6d8086"; + } + { + name = "gemspec"; + text = ""; + fg = "#701516"; + } + { + name = "gif"; + text = ""; + fg = "#a074c4"; + } + { + name = "git"; + text = ""; + fg = "#f14c28"; + } + { + name = "glb"; + text = ""; + fg = "#ffb13b"; + } + { + name = "gleam"; + text = ""; + fg = "#ffaff3"; + } + { + name = "gnumakefile"; + text = ""; + fg = "#6d8086"; + } + { + name = "go"; + text = ""; + fg = "#519aba"; + } + { + name = "godot"; + text = ""; + fg = "#6d8086"; + } + { + name = "gpr"; + text = ""; + fg = "#ff33ff"; + } + { + name = "gql"; + text = ""; + fg = "#e535ab"; + } + { + name = "gradle"; + text = ""; + fg = "#005f87"; + } + { + name = "graphql"; + text = ""; + fg = "#e535ab"; + } + { + name = "gresource"; + text = ""; + fg = "#ffffff"; + } + { + name = "gv"; + text = "󱁉"; + fg = "#30638e"; + } + { + name = "gz"; + text = ""; + fg = "#eca517"; + } + { + name = "h"; + text = ""; + fg = "#a074c4"; + } + { + name = "haml"; + text = ""; + fg = "#eaeae1"; + } + { + name = "hbs"; + text = ""; + fg = "#f0772b"; + } + { + name = "heex"; + text = ""; + fg = "#a074c4"; + } + { + name = "hex"; + text = ""; + fg = "#2e63ff"; + } + { + name = "hh"; + text = ""; + fg = "#a074c4"; + } + { + name = "hpp"; + text = ""; + fg = "#a074c4"; + } + { + name = "hrl"; + text = ""; + fg = "#b83998"; + } + { + name = "hs"; + text = ""; + fg = "#a074c4"; + } + { + name = "htm"; + text = ""; + fg = "#e34c26"; + } + { + name = "html"; + text = ""; + fg = "#e44d26"; + } + { + name = "http"; + text = ""; + fg = "#008ec7"; + } + { + name = "huff"; + text = "󰡘"; + fg = "#4242c7"; + } + { + name = "hurl"; + text = ""; + fg = "#ff0288"; + } + { + name = "hx"; + text = ""; + fg = "#ea8220"; + } + { + name = "hxx"; + text = ""; + fg = "#a074c4"; + } + { + name = "ical"; + text = ""; + fg = "#2b2e83"; + } + { + name = "icalendar"; + text = ""; + fg = "#2b2e83"; + } + { + name = "ico"; + text = ""; + fg = "#cbcb41"; + } + { + name = "ics"; + text = ""; + fg = "#2b2e83"; + } + { + name = "ifb"; + text = ""; + fg = "#2b2e83"; + } + { + name = "ifc"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "ige"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "iges"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "igs"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "image"; + text = ""; + fg = "#d0bec8"; + } + { + name = "img"; + text = ""; + fg = "#d0bec8"; + } + { + name = "import"; + text = ""; + fg = "#ececec"; + } + { + name = "info"; + text = ""; + fg = "#ffffcd"; + } + { + name = "ini"; + text = ""; + fg = "#6d8086"; + } + { + name = "ino"; + text = ""; + fg = "#56b6c2"; + } + { + name = "ipynb"; + text = ""; + fg = "#f57d01"; + } + { + name = "iso"; + text = ""; + fg = "#d0bec8"; + } + { + name = "ixx"; + text = ""; + fg = "#519aba"; + } + { + name = "java"; + text = ""; + fg = "#cc3e44"; + } + { + name = "jl"; + text = ""; + fg = "#a270ba"; + } + { + name = "jpeg"; + text = ""; + fg = "#a074c4"; + } + { + name = "jpg"; + text = ""; + fg = "#a074c4"; + } + { + name = "js"; + text = ""; + fg = "#cbcb41"; + } + { + name = "json"; + text = ""; + fg = "#cbcb41"; + } + { + name = "json5"; + text = ""; + fg = "#cbcb41"; + } + { + name = "jsonc"; + text = ""; + fg = "#cbcb41"; + } + { + name = "jsx"; + text = ""; + fg = "#20c2e3"; + } + { + name = "jwmrc"; + text = ""; + fg = "#0078cd"; + } + { + name = "jxl"; + text = ""; + fg = "#a074c4"; + } + { + name = "kbx"; + text = "󰯄"; + fg = "#737672"; + } + { + name = "kdb"; + text = ""; + fg = "#529b34"; + } + { + name = "kdbx"; + text = ""; + fg = "#529b34"; + } + { + name = "kdenlive"; + text = ""; + fg = "#83b8f2"; + } + { + name = "kdenlivetitle"; + text = ""; + fg = "#83b8f2"; + } + { + name = "kicad_dru"; + text = ""; + fg = "#ffffff"; + } + { + name = "kicad_mod"; + text = ""; + fg = "#ffffff"; + } + { + name = "kicad_pcb"; + text = ""; + fg = "#ffffff"; + } + { + name = "kicad_prl"; + text = ""; + fg = "#ffffff"; + } + { + name = "kicad_pro"; + text = ""; + fg = "#ffffff"; + } + { + name = "kicad_sch"; + text = ""; + fg = "#ffffff"; + } + { + name = "kicad_sym"; + text = ""; + fg = "#ffffff"; + } + { + name = "kicad_wks"; + text = ""; + fg = "#ffffff"; + } + { + name = "ko"; + text = ""; + fg = "#dcddd6"; + } + { + name = "kpp"; + text = ""; + fg = "#f245fb"; + } + { + name = "kra"; + text = ""; + fg = "#f245fb"; + } + { + name = "krz"; + text = ""; + fg = "#f245fb"; + } + { + name = "ksh"; + text = ""; + fg = "#4d5a5e"; + } + { + name = "kt"; + text = ""; + fg = "#7f52ff"; + } + { + name = "kts"; + text = ""; + fg = "#7f52ff"; + } + { + name = "lck"; + text = ""; + fg = "#bbbbbb"; + } + { + name = "leex"; + text = ""; + fg = "#a074c4"; + } + { + name = "less"; + text = ""; + fg = "#563d7c"; + } + { + name = "lff"; + text = ""; + fg = "#ececec"; + } + { + name = "lhs"; + text = ""; + fg = "#a074c4"; + } + { + name = "lib"; + text = ""; + fg = "#4d2c0b"; + } + { + name = "license"; + text = ""; + fg = "#cbcb41"; + } + { + name = "liquid"; + text = ""; + fg = "#95bf47"; + } + { + name = "lock"; + text = ""; + fg = "#bbbbbb"; + } + { + name = "log"; + text = "󰌱"; + fg = "#dddddd"; + } + { + name = "lrc"; + text = "󰨖"; + fg = "#ffb713"; + } + { + name = "lua"; + text = ""; + fg = "#51a0cf"; + } + { + name = "luac"; + text = ""; + fg = "#51a0cf"; + } + { + name = "luau"; + text = ""; + fg = "#00a2ff"; + } + { + name = "m"; + text = ""; + fg = "#599eff"; + } + { + name = "m3u"; + text = "󰲹"; + fg = "#ed95ae"; + } + { + name = "m3u8"; + text = "󰲹"; + fg = "#ed95ae"; + } + { + name = "m4a"; + text = ""; + fg = "#00afff"; + } + { + name = "m4v"; + text = ""; + fg = "#fd971f"; + } + { + name = "magnet"; + text = ""; + fg = "#a51b16"; + } + { + name = "makefile"; + text = ""; + fg = "#6d8086"; + } + { + name = "markdown"; + text = ""; + fg = "#dddddd"; + } + { + name = "material"; + text = ""; + fg = "#b83998"; + } + { + name = "md"; + text = ""; + fg = "#dddddd"; + } + { + name = "md5"; + text = "󰕥"; + fg = "#8c86af"; + } + { + name = "mdx"; + text = ""; + fg = "#519aba"; + } + { + name = "mint"; + text = "󰌪"; + fg = "#87c095"; + } + { + name = "mjs"; + text = ""; + fg = "#f1e05a"; + } + { + name = "mk"; + text = ""; + fg = "#6d8086"; + } + { + name = "mkv"; + text = ""; + fg = "#fd971f"; + } + { + name = "ml"; + text = ""; + fg = "#e37933"; + } + { + name = "mli"; + text = ""; + fg = "#e37933"; + } + { + name = "mm"; + text = ""; + fg = "#519aba"; + } + { + name = "mo"; + text = ""; + fg = "#9772fb"; + } + { + name = "mobi"; + text = ""; + fg = "#eab16d"; + } + { + name = "mojo"; + text = ""; + fg = "#ff4c1f"; + } + { + name = "mov"; + text = ""; + fg = "#fd971f"; + } + { + name = "mp3"; + text = ""; + fg = "#00afff"; + } + { + name = "mp4"; + text = ""; + fg = "#fd971f"; + } + { + name = "mpp"; + text = ""; + fg = "#519aba"; + } + { + name = "msf"; + text = ""; + fg = "#137be1"; + } + { + name = "mts"; + text = ""; + fg = "#519aba"; + } + { + name = "mustache"; + text = ""; + fg = "#e37933"; + } + { + name = "nfo"; + text = ""; + fg = "#ffffcd"; + } + { + name = "nim"; + text = ""; + fg = "#f3d400"; + } + { + name = "nix"; + text = ""; + fg = "#7ebae4"; + } + { + name = "norg"; + text = ""; + fg = "#4878be"; + } + { + name = "nswag"; + text = ""; + fg = "#85ea2d"; + } + { + name = "nu"; + text = ""; + fg = "#3aa675"; + } + { + name = "o"; + text = ""; + fg = "#9f0500"; + } + { + name = "obj"; + text = "󰆧"; + fg = "#888888"; + } + { + name = "odf"; + text = ""; + fg = "#ff5a96"; + } + { + name = "odg"; + text = ""; + fg = "#fffb57"; + } + { + name = "odin"; + text = "󰟢"; + fg = "#3882d2"; + } + { + name = "odp"; + text = ""; + fg = "#fe9c45"; + } + { + name = "ods"; + text = ""; + fg = "#78fc4e"; + } + { + name = "odt"; + text = ""; + fg = "#2dcbfd"; + } + { + name = "oga"; + text = ""; + fg = "#0075aa"; + } + { + name = "ogg"; + text = ""; + fg = "#0075aa"; + } + { + name = "ogv"; + text = ""; + fg = "#fd971f"; + } + { + name = "ogx"; + text = ""; + fg = "#fd971f"; + } + { + name = "opus"; + text = ""; + fg = "#0075aa"; + } + { + name = "org"; + text = ""; + fg = "#77aa99"; + } + { + name = "otf"; + text = ""; + fg = "#ececec"; + } + { + name = "out"; + text = ""; + fg = "#9f0500"; + } + { + name = "part"; + text = ""; + fg = "#44cda8"; + } + { + name = "patch"; + text = ""; + fg = "#41535b"; + } + { + name = "pck"; + text = ""; + fg = "#6d8086"; + } + { + name = "pcm"; + text = ""; + fg = "#0075aa"; + } + { + name = "pdf"; + text = ""; + fg = "#b30b00"; + } + { + name = "php"; + text = ""; + fg = "#a074c4"; + } + { + name = "pl"; + text = ""; + fg = "#519aba"; + } + { + name = "pls"; + text = "󰲹"; + fg = "#ed95ae"; + } + { + name = "ply"; + text = "󰆧"; + fg = "#888888"; + } + { + name = "pm"; + text = ""; + fg = "#519aba"; + } + { + name = "png"; + text = ""; + fg = "#a074c4"; + } + { + name = "po"; + text = ""; + fg = "#2596be"; + } + { + name = "pot"; + text = ""; + fg = "#2596be"; + } + { + name = "pp"; + text = ""; + fg = "#ffa61a"; + } + { + name = "ppt"; + text = "󰈧"; + fg = "#cb4a32"; + } + { + name = "pptx"; + text = "󰈧"; + fg = "#cb4a32"; + } + { + name = "prisma"; + text = ""; + fg = "#5a67d8"; + } + { + name = "pro"; + text = ""; + fg = "#e4b854"; + } + { + name = "ps1"; + text = "󰨊"; + fg = "#4273ca"; + } + { + name = "psb"; + text = ""; + fg = "#519aba"; + } + { + name = "psd"; + text = ""; + fg = "#519aba"; + } + { + name = "psd1"; + text = "󰨊"; + fg = "#6975c4"; + } + { + name = "psm1"; + text = "󰨊"; + fg = "#6975c4"; + } + { + name = "pub"; + text = "󰷖"; + fg = "#e3c58e"; + } + { + name = "pxd"; + text = ""; + fg = "#5aa7e4"; + } + { + name = "pxi"; + text = ""; + fg = "#5aa7e4"; + } + { + name = "py"; + text = ""; + fg = "#ffbc03"; + } + { + name = "pyc"; + text = ""; + fg = "#ffe291"; + } + { + name = "pyd"; + text = ""; + fg = "#ffe291"; + } + { + name = "pyi"; + text = ""; + fg = "#ffbc03"; + } + { + name = "pyo"; + text = ""; + fg = "#ffe291"; + } + { + name = "pyw"; + text = ""; + fg = "#5aa7e4"; + } + { + name = "pyx"; + text = ""; + fg = "#5aa7e4"; + } + { + name = "qm"; + text = ""; + fg = "#2596be"; + } + { + name = "qml"; + text = ""; + fg = "#40cd52"; + } + { + name = "qrc"; + text = ""; + fg = "#40cd52"; + } + { + name = "qss"; + text = ""; + fg = "#40cd52"; + } + { + name = "query"; + text = ""; + fg = "#90a850"; + } + { + name = "r"; + text = "󰟔"; + fg = "#2266ba"; + } + { + name = "R"; + text = "󰟔"; + fg = "#2266ba"; + } + { + name = "rake"; + text = ""; + fg = "#701516"; + } + { + name = "rar"; + text = ""; + fg = "#eca517"; + } + { + name = "razor"; + text = "󱦘"; + fg = "#512bd4"; + } + { + name = "rb"; + text = ""; + fg = "#701516"; + } + { + name = "res"; + text = ""; + fg = "#cc3e44"; + } + { + name = "resi"; + text = ""; + fg = "#f55385"; + } + { + name = "rlib"; + text = ""; + fg = "#dea584"; + } + { + name = "rmd"; + text = ""; + fg = "#519aba"; + } + { + name = "rproj"; + text = "󰗆"; + fg = "#358a5b"; + } + { + name = "rs"; + text = ""; + fg = "#dea584"; + } + { + name = "rss"; + text = ""; + fg = "#fb9d3b"; + } + { + name = "s"; + text = ""; + fg = "#0071c5"; + } + { + name = "sass"; + text = ""; + fg = "#f55385"; + } + { + name = "sbt"; + text = ""; + fg = "#cc3e44"; + } + { + name = "sc"; + text = ""; + fg = "#cc3e44"; + } + { + name = "scad"; + text = ""; + fg = "#f9d72c"; + } + { + name = "scala"; + text = ""; + fg = "#cc3e44"; + } + { + name = "scm"; + text = "󰘧"; + fg = "#eeeeee"; + } + { + name = "scss"; + text = ""; + fg = "#f55385"; + } + { + name = "sh"; + text = ""; + fg = "#4d5a5e"; + } + { + name = "sha1"; + text = "󰕥"; + fg = "#8c86af"; + } + { + name = "sha224"; + text = "󰕥"; + fg = "#8c86af"; + } + { + name = "sha256"; + text = "󰕥"; + fg = "#8c86af"; + } + { + name = "sha384"; + text = "󰕥"; + fg = "#8c86af"; + } + { + name = "sha512"; + text = "󰕥"; + fg = "#8c86af"; + } + { + name = "sig"; + text = "󰘧"; + fg = "#e37933"; + } + { + name = "signature"; + text = "󰘧"; + fg = "#e37933"; + } + { + name = "skp"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "sldasm"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "sldprt"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "slim"; + text = ""; + fg = "#e34c26"; + } + { + name = "sln"; + text = ""; + fg = "#854cc7"; + } + { + name = "slnx"; + text = ""; + fg = "#854cc7"; + } + { + name = "slvs"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "sml"; + text = "󰘧"; + fg = "#e37933"; + } + { + name = "so"; + text = ""; + fg = "#dcddd6"; + } + { + name = "sol"; + text = ""; + fg = "#519aba"; + } + { + name = "spec.js"; + text = ""; + fg = "#cbcb41"; + } + { + name = "spec.jsx"; + text = ""; + fg = "#20c2e3"; + } + { + name = "spec.ts"; + text = ""; + fg = "#519aba"; + } + { + name = "spec.tsx"; + text = ""; + fg = "#1354bf"; + } + { + name = "spx"; + text = ""; + fg = "#0075aa"; + } + { + name = "sql"; + text = ""; + fg = "#dad8d8"; + } + { + name = "sqlite"; + text = ""; + fg = "#dad8d8"; + } + { + name = "sqlite3"; + text = ""; + fg = "#dad8d8"; + } + { + name = "srt"; + text = "󰨖"; + fg = "#ffb713"; + } + { + name = "ssa"; + text = "󰨖"; + fg = "#ffb713"; + } + { + name = "ste"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "step"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "stl"; + text = "󰆧"; + fg = "#888888"; + } + { + name = "stp"; + text = "󰻫"; + fg = "#839463"; + } + { + name = "strings"; + text = ""; + fg = "#2596be"; + } + { + name = "styl"; + text = ""; + fg = "#8dc149"; + } + { + name = "sub"; + text = "󰨖"; + fg = "#ffb713"; + } + { + name = "sublime"; + text = ""; + fg = "#e37933"; + } + { + name = "suo"; + text = ""; + fg = "#854cc7"; + } + { + name = "sv"; + text = "󰍛"; + fg = "#019833"; + } + { + name = "svelte"; + text = ""; + fg = "#ff3e00"; + } + { + name = "svg"; + text = "󰜡"; + fg = "#ffb13b"; + } + { + name = "svh"; + text = "󰍛"; + fg = "#019833"; + } + { + name = "swift"; + text = ""; + fg = "#e37933"; + } + { + name = "t"; + text = ""; + fg = "#519aba"; + } + { + name = "tbc"; + text = "󰛓"; + fg = "#1e5cb3"; + } + { + name = "tcl"; + text = "󰛓"; + fg = "#1e5cb3"; + } + { + name = "templ"; + text = ""; + fg = "#dbbd30"; + } + { + name = "terminal"; + text = ""; + fg = "#31b53e"; + } + { + name = "test.js"; + text = ""; + fg = "#cbcb41"; + } + { + name = "test.jsx"; + text = ""; + fg = "#20c2e3"; + } + { + name = "test.ts"; + text = ""; + fg = "#519aba"; + } + { + name = "test.tsx"; + text = ""; + fg = "#1354bf"; + } + { + name = "tex"; + text = ""; + fg = "#3d6117"; + } + { + name = "tf"; + text = ""; + fg = "#5f43e9"; + } + { + name = "tfvars"; + text = ""; + fg = "#5f43e9"; + } + { + name = "tgz"; + text = ""; + fg = "#eca517"; + } + { + name = "tmux"; + text = ""; + fg = "#14ba19"; + } + { + name = "toml"; + text = ""; + fg = "#9c4221"; + } + { + name = "torrent"; + text = ""; + fg = "#44cda8"; + } + { + name = "tres"; + text = ""; + fg = "#6d8086"; + } + { + name = "ts"; + text = ""; + fg = "#519aba"; + } + { + name = "tscn"; + text = ""; + fg = "#6d8086"; + } + { + name = "tsconfig"; + text = ""; + fg = "#ff8700"; + } + { + name = "tsx"; + text = ""; + fg = "#1354bf"; + } + { + name = "ttf"; + text = ""; + fg = "#ececec"; + } + { + name = "twig"; + text = ""; + fg = "#8dc149"; + } + { + name = "txt"; + text = "󰈙"; + fg = "#89e051"; + } + { + name = "txz"; + text = ""; + fg = "#eca517"; + } + { + name = "typ"; + text = ""; + fg = "#0dbcc0"; + } + { + name = "typoscript"; + text = ""; + fg = "#ff8700"; + } + { + name = "ui"; + text = ""; + fg = "#015bf0"; + } + { + name = "v"; + text = "󰍛"; + fg = "#019833"; + } + { + name = "vala"; + text = ""; + fg = "#7b3db9"; + } + { + name = "vh"; + text = "󰍛"; + fg = "#019833"; + } + { + name = "vhd"; + text = "󰍛"; + fg = "#019833"; + } + { + name = "vhdl"; + text = "󰍛"; + fg = "#019833"; + } + { + name = "vi"; + text = ""; + fg = "#fec60a"; + } + { + name = "vim"; + text = ""; + fg = "#019833"; + } + { + name = "vsh"; + text = ""; + fg = "#5d87bf"; + } + { + name = "vsix"; + text = ""; + fg = "#854cc7"; + } + { + name = "vue"; + text = ""; + fg = "#8dc149"; + } + { + name = "wasm"; + text = ""; + fg = "#5c4cdb"; + } + { + name = "wav"; + text = ""; + fg = "#00afff"; + } + { + name = "webm"; + text = ""; + fg = "#fd971f"; + } + { + name = "webmanifest"; + text = ""; + fg = "#f1e05a"; + } + { + name = "webp"; + text = ""; + fg = "#a074c4"; + } + { + name = "webpack"; + text = "󰜫"; + fg = "#519aba"; + } + { + name = "wma"; + text = ""; + fg = "#00afff"; + } + { + name = "woff"; + text = ""; + fg = "#ececec"; + } + { + name = "woff2"; + text = ""; + fg = "#ececec"; + } + { + name = "wrl"; + text = "󰆧"; + fg = "#888888"; + } + { + name = "wrz"; + text = "󰆧"; + fg = "#888888"; + } + { + name = "wv"; + text = ""; + fg = "#00afff"; + } + { + name = "wvc"; + text = ""; + fg = "#00afff"; + } + { + name = "x"; + text = ""; + fg = "#599eff"; + } + { + name = "xaml"; + text = "󰙳"; + fg = "#512bd4"; + } + { + name = "xcf"; + text = ""; + fg = "#635b46"; + } + { + name = "xcplayground"; + text = ""; + fg = "#e37933"; + } + { + name = "xcstrings"; + text = ""; + fg = "#2596be"; + } + { + name = "xls"; + text = "󰈛"; + fg = "#207245"; + } + { + name = "xlsx"; + text = "󰈛"; + fg = "#207245"; + } + { + name = "xm"; + text = ""; + fg = "#519aba"; + } + { + name = "xml"; + text = "󰗀"; + fg = "#e37933"; + } + { + name = "xpi"; + text = ""; + fg = "#ff1b01"; + } + { + name = "xul"; + text = ""; + fg = "#e37933"; + } + { + name = "xz"; + text = ""; + fg = "#eca517"; + } + { + name = "yaml"; + text = ""; + fg = "#6d8086"; + } + { + name = "yml"; + text = ""; + fg = "#6d8086"; + } + { + name = "zig"; + text = ""; + fg = "#f69a1b"; + } + { + name = "zip"; + text = ""; + fg = "#eca517"; + } + { + name = "zsh"; + text = ""; + fg = "#89e051"; + } + { + name = "zst"; + text = ""; + fg = "#eca517"; + } + { + name = "🔥"; + text = ""; + fg = "#ff4c1f"; + } + ]; + conds = [ + { + "if" = "orphan"; + text = ""; + } + { + "if" = "link"; + text = ""; + } + { + "if" = "block"; + text = ""; + } + { + "if" = "char"; + text = ""; + } + { + "if" = "fifo"; + text = ""; + } + { + "if" = "sock"; + text = ""; + } + { + "if" = "sticky"; + text = ""; + } + { + "if" = "dummy"; + text = ""; + } + { + "if" = "dir"; + text = ""; + } + { + "if" = "exec"; + text = ""; + } + { + "if" = "!dir"; + text = ""; + } + ]; + }; +} diff --git a/modules/home/yazi/yazi.nix b/modules/home/yazi/yazi.nix new file mode 100644 index 0000000..1fe053b --- /dev/null +++ b/modules/home/yazi/yazi.nix @@ -0,0 +1,389 @@ +{ + settings = { + manager = { + ratio = [ 1 4 3 ]; + sort_by = "alphabetical"; + sort_sensitive = false; + sort_reverse = false; + sort_dir_first = true; + sort_translit = false; + linemode = "none"; + show_hidden = false; + show_symlink = true; + scrolloff = 5; + mouse_events = [ "click" "scroll" ]; + title_format = "Yazi: {cwd}"; + }; + preview = { + wrap = "no"; + tab_size = 2; + max_width = 600; + max_height = 900; + cache_dir = ""; + image_delay = 30; + image_filter = "triangle"; + image_quality = 75; + sixel_fraction = 15; + ueberzug_scale = 1; + ueberzug_offset = [ 0 0 0 0 ]; + }; + opener = { + edit = [ + { + run = ''${"EDITOR:-vi"} "$@"''; + desc = "$EDITOR"; + block = true; + for = "unix"; + } + { + run = "code %*"; + orphan = true; + desc = "code"; + for = "windows"; + } + { + run = "code -w %*"; + block = true; + desc = "code (block)"; + for = "windows"; + } + ]; + open = [ + { + run = ''xdg-open "$1"''; + desc = "Open"; + for = "linux"; + } + { + run = ''open "$@"''; + desc = "Open"; + for = "macos"; + } + { + run = ''start "" "%1"''; + orphan = true; + desc = "Open"; + for = "windows"; + } + { + run = ''termux-open "$1"''; + desc = "Open"; + for = "android"; + } + ]; + reveal = [ + { + run = ''xdg-open "$(dirname "$1")"''; + desc = "Reveal"; + for = "linux"; + } + { + run = ''open -R "$1"''; + desc = "Reveal"; + for = "macos"; + } + { + run = ''explorer /select,"%1"''; + orphan = true; + desc = "Reveal"; + for = "windows"; + } + { + run = ''termux-open "$(dirname "$1")"''; + desc = "Reveal"; + for = "android"; + } + { + run = ''exiftool "$1"; echo "Press enter to exit"; read _''; + block = true; + desc = "Show EXIF"; + for = "unix"; + } + ]; + extract = [ + { + run = ''ya pub extract --list "$@"''; + desc = "Extract here"; + for = "unix"; + } + { + run = "ya pub extract --list %*"; + desc = "Extract here"; + for = "windows"; + } + ]; + play = [ + { + run = ''mpv --force-window "$@"''; + orphan = true; + for = "unix"; + } + { + run = "mpv --force-window %*"; + orphan = true; + for = "windows"; + } + { + run = ''mediainfo "$1"; echo "Press enter to exit"; read _''; + block = true; + desc = "Show media info"; + for = "unix"; + } + ]; + }; + open = { + rules = [ + { + name = "*/"; + use = [ "edit" "open" "reveal" ]; + } + { + mime = "text/*"; + use = [ "edit" "reveal" ]; + } + { + mime = "image/*"; + use = [ "open" "reveal" ]; + } + { + mime = "{audio,video}/*"; + use = [ "play" "reveal" ]; + } + { + mime = + "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}"; + use = [ "extract" "reveal" ]; + } + { + mime = "application/{json,ndjson}"; + use = [ "edit" "reveal" ]; + } + { + mime = "*/javascript"; + use = [ "edit" "reveal" ]; + } + { + mime = "inode/empty"; + use = [ "edit" "reveal" ]; + } + { + name = "*"; + use = [ "open" "reveal" ]; + } + ]; + }; + tasks = { + micro_workers = 10; + macro_workers = 10; + bizarre_retry = 3; + image_alloc = 536870912; + image_bound = [ 0 0 ]; + suppress_preload = false; + }; + plugin = { + fetchers = [{ + id = "mime"; + name = "*"; + run = "mime"; + prio = "high"; + }]; + spotters = [ + { + name = "*/"; + run = "folder"; + } + { + mime = "text/*"; + run = "code"; + } + { + mime = "application/{mbox,javascript,wine-extension-ini}"; + run = "code"; + } + { + mime = "image/{avif,hei?,jxl,svg+xml}"; + run = "magick"; + } + { + mime = "image/*"; + run = "image"; + } + { + mime = "video/*"; + run = "video"; + } + { + name = "*"; + run = "file"; + } + ]; + preloaders = [ + { + mime = "image/{avif,hei?,jxl,svg+xml}"; + run = "magick"; + } + { + mime = "image/*"; + run = "image"; + } + { + mime = "video/*"; + run = "video"; + } + { + mime = "application/pdf"; + run = "pdf"; + } + { + mime = "font/*"; + run = "font"; + } + { + mime = "application/ms-opentype"; + run = "font"; + } + ]; + previewers = [ + { + name = "*/"; + run = "folder"; + sync = true; + } + { + mime = "text/*"; + run = "code"; + } + { + mime = "application/{mbox,javascript,wine-extension-ini}"; + run = "code"; + } + { + mime = "application/{json,ndjson}"; + run = "json"; + } + { + mime = "image/{avif,hei?,jxl,svg+xml}"; + run = "magick"; + } + { + mime = "image/*"; + run = "image"; + } + { + mime = "video/*"; + run = "video"; + } + { + mime = "application/pdf"; + run = "pdf"; + } + { + mime = + "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}"; + run = "archive"; + } + { + mime = + "application/{debian*-package,redhat-package-manager,rpm,android.package-archive}"; + run = "archive"; + } + { + name = "*.{AppImage,appimage}"; + run = "archive"; + } + { + mime = "application/{iso9660-image,qemu-disk,ms-wim,apple-diskimage}"; + run = "archive"; + } + { + mime = "application/virtualbox-{vhd,vhdx}"; + run = "archive"; + } + { + name = "*.{img,fat,ext,ext2,ext3,ext4,squashfs,ntfs,hfs,hfsx}"; + run = "archive"; + } + { + mime = "font/*"; + run = "font"; + } + { + mime = "application/ms-opentype"; + run = "font"; + } + { + mime = "inode/empty"; + run = "empty"; + } + { + name = "*"; + run = "file"; + } + ]; + prepend_fetchers = [ + { + id = "git"; + name = "*"; + run = "git"; + } + { + id = "git"; + name = "*/"; + run = "git"; + } + ]; + }; + input = { + cursor_blink = false; + cd_title = "Change directory:"; + cd_origin = "top-center"; + cd_offset = [ 0 2 50 3 ]; + create_title = [ "Create:" "Create (dir):" ]; + create_origin = "top-center"; + create_offset = [ 0 2 50 3 ]; + rename_title = "Rename:"; + rename_origin = "hovered"; + rename_offset = [ 0 1 50 3 ]; + filter_title = "Filter:"; + filter_origin = "top-center"; + filter_offset = [ 0 2 50 3 ]; + find_title = [ "Find next:" "Find previous:" ]; + find_origin = "top-center"; + find_offset = [ 0 2 50 3 ]; + search_title = "Search via {n}:"; + search_origin = "top-center"; + search_offset = [ 0 2 50 3 ]; + shell_title = [ "Shell:" "Shell (block):" ]; + shell_origin = "top-center"; + shell_offset = [ 0 2 50 3 ]; + }; + confirm = { + trash_title = "Trash {n} selected file{s}?"; + trash_origin = "center"; + trash_offset = [ 0 0 70 20 ]; + delete_title = "Permanently delete {n} selected file{s}?"; + delete_origin = "center"; + delete_offset = [ 0 0 70 20 ]; + overwrite_title = "Overwrite file?"; + overwrite_content = "Will overwrite the following file:"; + overwrite_origin = "center"; + overwrite_offset = [ 0 0 50 15 ]; + quit_title = "Quit?"; + quit_content = + "The following tasks are still running, are you sure you want to quit?"; + quit_origin = "center"; + quit_offset = [ 0 0 50 15 ]; + }; + pick = { + open_title = "Open with:"; + open_origin = "hovered"; + open_offset = [ 0 1 50 7 ]; + }; + which = { + sort_by = "none"; + sort_sensitive = false; + sort_reverse = false; + sort_translit = false; + }; + }; +} diff --git a/modules/home/zoxide.nix b/modules/home/zoxide.nix new file mode 100644 index 0000000..9ab1845 --- /dev/null +++ b/modules/home/zoxide.nix @@ -0,0 +1,13 @@ +_: { + programs = { + zoxide = { + enable = true; + enableZshIntegration = true; + enableBashIntegration = true; + options = [ + "--cmd cd" + ]; + }; + }; +} + diff --git a/modules/home/zsh/default.nix b/modules/home/zsh/default.nix new file mode 100644 index 0000000..50e0f7d --- /dev/null +++ b/modules/home/zsh/default.nix @@ -0,0 +1,64 @@ +{ profile +, pkgs +, lib +, ... +}: { + imports = [ + ./zshrc-personal.nix + ]; + + programs.zsh = { + enable = true; + autosuggestion.enable = true; + syntaxHighlighting = { + enable = true; + highlighters = [ "main" "brackets" "pattern" "regexp" "root" "line" ]; + }; + historySubstringSearch.enable = true; + + history = { + ignoreDups = true; + save = 10000; + size = 10000; + }; + + oh-my-zsh = { + enable = true; + }; + + plugins = [ + { + name = "powerlevel10k"; + src = pkgs.zsh-powerlevel10k; + file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme"; + } + { + name = "powerlevel10k-config"; + src = lib.cleanSource ./p10k-config; + file = "p10k.zsh"; + } + ]; + + initContent = '' + bindkey "\eh" backward-word + bindkey "\ej" down-line-or-history + bindkey "\ek" up-line-or-history + bindkey "\el" forward-word + if [ -f $HOME/.zshrc-personal ]; then + source $HOME/.zshrc-personal + fi + ''; + + shellAliases = { + sv = "sudo nvim"; + v = "nvim"; + c = "clear"; + fr = "nh os switch --hostname ${profile}"; + fu = "nh os switch --hostname ${profile} --update"; + zu = "sh <(curl -L https://gitlab.com/Zaney/zaneyos/-/releases/latest/download/install-zaneyos.sh)"; + ncg = "nix-collect-garbage --delete-old && sudo nix-collect-garbage -d && sudo /run/current-system/bin/switch-to-configuration boot"; + cat = "bat"; + man = "batman"; + }; + }; +} diff --git a/modules/home/zsh/p10k-config/p10k.zsh b/modules/home/zsh/p10k-config/p10k.zsh new file mode 100644 index 0000000..a3958bf --- /dev/null +++ b/modules/home/zsh/p10k-config/p10k.zsh @@ -0,0 +1,1827 @@ +# Generated by Powerlevel10k configuration wizard on 2025-03-18 at 20:56 CDT. +# Based on romkatv/powerlevel10k/config/p10k-rainbow.zsh. +# Wizard options: nerdfont-v3 + powerline, small icons, rainbow, unicode, +# angled separators, sharp heads, round tails, 1 line, sparse, many icons, concise, +# transient_prompt, instant_prompt=verbose. +# Type `p10k configure` to generate another config. +# +# Config for Powerlevel10k with powerline prompt style with colorful background. +# Type `p10k configure` to generate your own config based on it. +# +# Tip: Looking for a nice color? Here's a one-liner to print colormap. +# +# for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done + +# Temporarily change options. +'builtin' 'local' '-a' 'p10k_config_opts' +[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases') +[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob') +[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand') +'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' + +() { + emulate -L zsh -o extended_glob + + # Unset all configuration options. This allows you to apply configuration changes without + # restarting zsh. Edit ~/.p10k.zsh and type `source ~/.p10k.zsh`. + unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' + + # Zsh >= 5.1 is required. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + os_icon # os identifier + dir # current directory + vcs # git status + hostname # show hostname when not on local host + # prompt_char # prompt symbol + ) + + # The list of segments shown on the right. Fill it with less important segments. + # Right prompt on the last prompt line (where you are typing your commands) gets + # automatically hidden when the input line reaches it. Right prompt above the + # last prompt line gets hidden if it would overlap with left prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + status # exit code of the last command + command_execution_time # duration of the last command + background_jobs # presence of background jobs + direnv # direnv status (https://direnv.net/) + asdf # asdf version manager (https://github.com/asdf-vm/asdf) + virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html) + anaconda # conda environment (https://conda.io/) + pyenv # python environment (https://github.com/pyenv/pyenv) + goenv # go environment (https://github.com/syndbg/goenv) + nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv) + nvm # node.js version from nvm (https://github.com/nvm-sh/nvm) + nodeenv # node.js environment (https://github.com/ekalinin/nodeenv) + # node_version # node.js version + # go_version # go version (https://golang.org) + # rust_version # rustc version (https://www.rust-lang.org) + # dotnet_version # .NET version (https://dotnet.microsoft.com) + # php_version # php version (https://www.php.net/) + # laravel_version # laravel php framework version (https://laravel.com/) + # java_version # java version (https://www.java.com/) + # package # name@version from package.json (https://docs.npmjs.com/files/package.json) + rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv) + rvm # ruby version from rvm (https://rvm.io) + fvm # flutter version management (https://github.com/leoafarias/fvm) + luaenv # lua version from luaenv (https://github.com/cehoffman/luaenv) + jenv # java version from jenv (https://github.com/jenv/jenv) + plenv # perl version from plenv (https://github.com/tokuhirom/plenv) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + phpenv # php version from phpenv (https://github.com/phpenv/phpenv) + scalaenv # scala version from scalaenv (https://github.com/scalaenv/scalaenv) + haskell_stack # haskell version from stack (https://haskellstack.org/) + kubecontext # current kubernetes context (https://kubernetes.io/) + terraform # terraform workspace (https://www.terraform.io) + # terraform_version # terraform version (https://www.terraform.io) + aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) + aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) + azure # azure account name (https://docs.microsoft.com/en-us/cli/azure) + gcloud # google cloud cli account and project (https://cloud.google.com/) + google_app_cred # google application credentials (https://cloud.google.com/docs/authentication/production) + toolbox # toolbox name (https://github.com/containers/toolbox) + context # user@hostname + nordvpn # nordvpn connection status, linux only (https://nordvpn.com/) + ranger # ranger shell (https://github.com/ranger/ranger) + nnn # nnn shell (https://github.com/jarun/nnn) + lf # lf shell (https://github.com/gokcehan/lf) + xplr # xplr shell (https://github.com/sayanarijit/xplr) + vim_shell # vim shell indicator (:sh) + midnight_commander # midnight commander shell (https://midnight-commander.org/) + nix_shell # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) + chezmoi_shell # chezmoi shell (https://www.chezmoi.io/) + vi_mode # vi mode (you don't need this if you've enabled prompt_char) + # vpn_ip # virtual private network indicator + # load # CPU load + # disk_usage # disk usage + # ram # free RAM + # swap # used swap + todo # todo items (https://github.com/todotxt/todo.txt-cli) + timewarrior # timewarrior tracking status (https://timewarrior.net/) + taskwarrior # taskwarrior task count (https://taskwarrior.org/) + per_directory_history # Oh My Zsh per-directory-history local/global indicator + # cpu_arch # CPU architecture + # time # current time + # ip # ip address and bandwidth usage for a specified network interface + # public_ip # public IP address + # proxy # system-wide http/https/ftp proxy + # battery # internal battery + # wifi # wifi speed + # example # example user-defined segment (see prompt_example function below) + ) + + # Defines character set used by powerlevel10k. It's best to let `p10k configure` set it for you. + typeset -g POWERLEVEL9K_MODE=nerdfont-v3 + # When set to `moderate`, some icons will have an extra space after them. This is meant to avoid + # icon overlap when using non-monospace fonts. When set to `none`, spaces are not added. + typeset -g POWERLEVEL9K_ICON_PADDING=none + + # When set to true, icons appear before content on both sides of the prompt. When set + # to false, icons go after content. If empty or not set, icons go before content in the left + # prompt and after content in the right prompt. + # + # You can also override it for a specific segment: + # + # POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false + # + # Or for a specific segment in specific state: + # + # POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false + typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT= + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Connect left prompt lines with these symbols. You'll probably want to use the same color + # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%242F╭─' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX='%242F├─' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%242F╰─' + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX='%242F─╮' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX='%242F─┤' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX='%242F─╯' + + # Filler between left and right prompt on the first prompt line. You can set it to ' ', '·' or + # '─'. The last two make it easier to see the alignment between left and right prompt and to + # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + # for more compact prompt if using this option. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_GAP_BACKGROUND= + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE + # ornaments defined above. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 + # Start filler from the edge of the screen if there are no left segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}' + # End filler on the edge of the screen if there are no right segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}' + fi + + # Separator between same-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='\uE0B1' + # Separator between same-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\uE0B3' + # Separator between different-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B0' + # Separator between different-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0B2' + # To remove a separator between two segments, add "_joined" to the second segment name. + # For example: POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(os_icon context_joined) + + # The right end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B0' + # The left end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B2' + # The left end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B6' + # The right end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B4' + # Left prompt terminator for lines without any segments. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=232 + typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐' + + ################################[ prompt_char: prompt symbol ]################################ + # Transparent background. + typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND= + # Green prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76 + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196 + # Default prompt symbol. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯' + # Prompt symbol in command vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮' + # Prompt symbol in visual vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V' + # Prompt symbol in overwrite vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='▶' + typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true + # No line terminator if prompt_char is the last segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + # No line introducer if prompt_char is the first segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= + # No surrounding whitespace. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE= + + ##################################[ dir: current directory ]################################## + # Current directory background color. + typeset -g POWERLEVEL9K_DIR_BACKGROUND=4 + # Default current directory foreground color. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=254 + # If directory is too long, shorten some of its segments to the shortest possible unique + # prefix. The shortened directory can be tab-completed to the original. + typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique + # Replace removed segment suffixes with this symbol. + typeset -g POWERLEVEL9K_SHORTEN_DELIMITER= + # Color of the shortened directory segments. + typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=250 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=255 + # Display anchor directory segments in bold. + typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true + # Don't shorten directories that contain any of these files. They are anchors. + local anchor_files=( + .bzr + .citc + .git + .hg + .node-version + .python-version + .go-version + .ruby-version + .lua-version + .java-version + .perl-version + .php-version + .tool-versions + .shorten_folder_marker + .svn + .terraform + CVS + Cargo.toml + composer.json + go.mod + package.json + stack.yaml + ) + typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})" + # If set to "first" ("last"), remove everything before the first (last) subdirectory that contains + # files matching $POWERLEVEL9K_SHORTEN_FOLDER_MARKER. For example, when the current directory is + # /foo/bar/git_repo/nested_git_repo/baz, prompt will display git_repo/nested_git_repo/baz (first) + # or nested_git_repo/baz (last). This assumes that git_repo and nested_git_repo contain markers + # and other directories don't. + # + # Optionally, "first" and "last" can be followed by ":" where is an integer. + # This moves the truncation point to the right (positive offset) or to the left (negative offset) + # relative to the marker. Plain "first" and "last" are equivalent to "first:0" and "last:0" + # respectively. + typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=false + # Don't shorten this many last directory segments. They are anchors. + typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 + # Shorten directory if it's longer than this even if there is space for it. The value can + # be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty, + # directory will be shortened only when prompt doesn't fit or when other parameters demand it + # (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below). + # If set to `0`, directory will always be shortened to its minimum length. + typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this + # many columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least + # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50 + # If set to true, embed a hyperlink into the directory. Useful for quickly + # opening a directory in the file manager simply by clicking the link. + # Can also be handy when the directory is shortened, as it allows you to see + # the full directory that was used in previous commands. + typeset -g POWERLEVEL9K_DIR_HYPERLINK=false + + # Enable special styling for non-writable and non-existent directories. See POWERLEVEL9K_LOCK_ICON + # and POWERLEVEL9K_DIR_CLASSES below. + typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v3 + + # The default icon shown next to non-writable and non-existent directories when + # POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3. + # typeset -g POWERLEVEL9K_LOCK_ICON='⭐' + + # POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons and colors for different + # directories. It must be an array with 3 * N elements. Each triplet consists of: + # + # 1. A pattern against which the current directory ($PWD) is matched. Matching is done with + # extended_glob option enabled. + # 2. Directory class for the purpose of styling. + # 3. An empty string. + # + # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. + # + # If POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3, non-writable and non-existent directories + # acquire class suffix _NOT_WRITABLE and NON_EXISTENT respectively. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_DIR_CLASSES=( + # '~/work(|/*)' WORK '' + # '~(|/*)' HOME '' + # '*' DEFAULT '') + # + # Whenever the current directory is ~/work or a subdirectory of ~/work, it gets styled with one + # of the following classes depending on its writability and existence: WORK, WORK_NOT_WRITABLE or + # WORK_NON_EXISTENT. + # + # Simply assigning classes to directories doesn't have any visible effects. It merely gives you an + # option to define custom colors and icons for different directory classes. + # + # # Styling for WORK. + # typeset -g POWERLEVEL9K_DIR_WORK_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=255 + # + # If a styling parameter isn't explicitly defined for some class, it falls back to the classless + # parameter. For example, if POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND is not set, it falls + # back to POWERLEVEL9K_DIR_FOREGROUND. + # + # typeset -g POWERLEVEL9K_DIR_CLASSES=() + + # Custom prefix. + # typeset -g POWERLEVEL9K_DIR_PREFIX='in ' + + #####################################[ vcs: git status ]###################################### + # Version control background colors. + typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_CONFLICTED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=8 + + # Branch icon. Set this parameter to '\UE0A0 ' for the popular Powerline branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 ' + + # Untracked files icon. It's really a question mark, your font isn't broken. + # Change the value of this parameter to show a different icon. + typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' + + # Formatter for Git status. + # + # Example output: master wip ⇣42⇡42 *42 merge ~42 +42 !42 ?42. + # + # You can edit the function to customize how Git status looks. + # + # VCS_STATUS_* parameters are set by gitstatus plugin. See reference: + # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. + function my_git_formatter() { + emulate -L zsh + + if [[ -n $P9K_CONTENT ]]; then + # If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from + # gitstatus plugin). VCS_STATUS_* parameters are not available in this case. + typeset -g my_git_format=$P9K_CONTENT + return + fi + + # Styling for different parts of Git status. + local meta='%7F' # white foreground + local clean='%0F' # black foreground + local modified='%0F' # black foreground + local untracked='%0F' # black foreground + local conflicted='%1F' # red foreground + + local res + + if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then + local branch=${(V)VCS_STATUS_LOCAL_BRANCH} + # If local branch name is at most 32 characters long, show it in full. + # Otherwise show the first 12 … the last 12. + # Tip: To always show local branch name in full without truncation, delete the next line. + (( $#branch > 32 )) && branch[13,-13]="…" # <-- this line + res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}" + fi + + if [[ -n $VCS_STATUS_TAG + # Show tag only if not on a branch. + # Tip: To always show tag, delete the next line. + && -z $VCS_STATUS_LOCAL_BRANCH # <-- this line + ]]; then + local tag=${(V)VCS_STATUS_TAG} + # If tag name is at most 32 characters long, show it in full. + # Otherwise show the first 12 … the last 12. + # Tip: To always show tag name in full without truncation, delete the next line. + (( $#tag > 32 )) && tag[13,-13]="…" # <-- this line + res+="${meta}#${clean}${tag//\%/%%}" + fi + + # Display the current Git commit if there is no branch and no tag. + # Tip: To always display the current Git commit, delete the next line. + [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] && # <-- this line + res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}" + + # Show tracking branch name if it differs from local branch. + if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then + res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}" + fi + + # Display "wip" if the latest commit's summary contains "wip" or "WIP". + if [[ $VCS_STATUS_COMMIT_SUMMARY == (|*[^[:alnum:]])(wip|WIP)(|[^[:alnum:]]*) ]]; then + res+=" ${modified}wip" + fi + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + # ⇣42 if behind the remote. + (( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}⇣${VCS_STATUS_COMMITS_BEHIND}" + # ⇡42 if ahead of the remote; no leading space if also behind the remote: ⇣42⇡42. + (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" " + (( VCS_STATUS_COMMITS_AHEAD )) && res+="${clean}⇡${VCS_STATUS_COMMITS_AHEAD}" + elif [[ -n $VCS_STATUS_REMOTE_BRANCH ]]; then + # Tip: Uncomment the next line to display '=' if up to date with the remote. + # res+=" ${clean}=" + fi + + # ⇠42 if behind the push remote. + (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" ${clean}⇠${VCS_STATUS_PUSH_COMMITS_BEHIND}" + (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" " + # ⇢42 if ahead of the push remote; no leading space if also behind: ⇠42⇢42. + (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && res+="${clean}⇢${VCS_STATUS_PUSH_COMMITS_AHEAD}" + # *42 if have stashes. + (( VCS_STATUS_STASHES )) && res+=" ${clean}*${VCS_STATUS_STASHES}" + # 'merge' if the repo is in an unusual state. + [[ -n $VCS_STATUS_ACTION ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}" + # ~42 if have merge conflicts. + (( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" + # +42 if have staged changes. + (( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}" + # !42 if have unstaged changes. + (( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" + # ?42 if have untracked files. It's really a question mark, your font isn't broken. + # See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon. + # Remove the next line if you don't want to see untracked files at all. + (( VCS_STATUS_NUM_UNTRACKED )) && res+=" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}" + # "─" if the number of unstaged files is unknown. This can happen due to + # POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY (see below) being set to a non-negative number lower + # than the number of files in the Git index, or due to bash.showDirtyState being set to false + # in the repository config. The number of staged and untracked files may also be unknown + # in this case. + (( VCS_STATUS_HAS_UNSTAGED == -1 )) && res+=" ${modified}─" + + typeset -g my_git_format=$res + } + functions -M my_git_formatter 2>/dev/null + + # Don't count the number of unstaged, untracked and conflicted files in Git repositories with + # more than this many files in the index. Negative value means infinity. + # + # If you are working in Git repositories with tens of millions of files and seeing performance + # sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output + # of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's + # config: `git config bash.showDirtyState false`. + typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1 + + # Don't show Git status in prompt for repositories whose workdir matches this pattern. + # For example, if set to '~', the Git repository at $HOME/.git will be ignored. + # Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'. + typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~' + + # Disable the default Git status formatting. + typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true + # Install our own Git status formatter. + typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter()))+${my_git_format}}' + # Enable counters for staged, unstaged, etc. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 + + # Custom icon. + # typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_VCS_PREFIX='on ' + + # Show status of repositories of these types. You can add svn and/or hg if you are + # using them. If you do, your prompt may become slow even when your current directory + # isn't in an svn or hg repository. + typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) + + ##########################[ status: exit code of the last command ]########################### + # Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and + # style them independently from the regular OK and ERROR state. + typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true + + # Status on success. No content, just an icon. No need to show it if prompt_char is enabled as + # it will signify success by turning green. + typeset -g POWERLEVEL9K_STATUS_OK=true + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='✔' + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=0 + + # Status when some part of a pipe command fails but the overall exit status is zero. It may look + # like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='✔' + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_BACKGROUND=0 + + # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as + # it will signify error by turning red. + typeset -g POWERLEVEL9K_STATUS_ERROR=true + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=1 + + # Status when the last command was terminated by a signal. + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + # Use terse signal names: "INT" instead of "SIGINT(2)". + typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_BACKGROUND=1 + + # Status when some part of a pipe command fails and the overall exit status is also non-zero. + # It may look like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='✘' + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_BACKGROUND=1 + + ###################[ command_execution_time: duration of the last command ]################### + # Execution time color. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0 + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=3 + # Show duration of the last command if takes at least this many seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 + # Show this many fractional digits. Zero means round to seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 + # Duration format: 1d 2h 3m 4s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' + # Custom icon. + # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='took ' + + #######################[ background_jobs: presence of background jobs ]####################### + # Background jobs color. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=6 + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=0 + # Don't show the number of background jobs. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=3 + typeset -g POWERLEVEL9K_DIRENV_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ asdf: asdf version manager (https://github.com/asdf-vm/asdf) ]############### + # Default asdf color. Only used to display tools for which there is no color override (see below). + # Tip: Override these parameters for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND and + # POWERLEVEL9K_ASDF_${TOOL}_BACKGROUND. + typeset -g POWERLEVEL9K_ASDF_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_BACKGROUND=7 + + # There are four parameters that can be used to hide asdf tools. Each parameter describes + # conditions under which a tool gets hidden. Parameters can hide tools but not unhide them. If at + # least one parameter decides to hide a tool, that tool gets hidden. If no parameter decides to + # hide a tool, it gets shown. + # + # Special note on the difference between POWERLEVEL9K_ASDF_SOURCES and + # POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW. Consider the effect of the following commands: + # + # asdf local python 3.8.1 + # asdf global python 3.8.1 + # + # After running both commands the current python version is 3.8.1 and its source is "local" as + # it takes precedence over "global". If POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW is set to false, + # it'll hide python version in this case because 3.8.1 is the same as the global version. + # POWERLEVEL9K_ASDF_SOURCES will hide python version only if the value of this parameter doesn't + # contain "local". + + # Hide tool versions that don't come from one of these sources. + # + # Available sources: + # + # - shell `asdf current` says "set by ASDF_${TOOL}_VERSION environment variable" + # - local `asdf current` says "set by /some/not/home/directory/file" + # - global `asdf current` says "set by /home/username/file" + # + # Note: If this parameter is set to (shell local global), it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SOURCES. + typeset -g POWERLEVEL9K_ASDF_SOURCES=(shell local global) + + # If set to false, hide tool versions that are the same as global. + # + # Note: The name of this parameter doesn't reflect its meaning at all. + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_PROMPT_ALWAYS_SHOW. + typeset -g POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW=false + + # If set to false, hide tool versions that are equal to "system". + # + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_SYSTEM. + typeset -g POWERLEVEL9K_ASDF_SHOW_SYSTEM=true + + # If set to non-empty value, hide tools unless there is a file matching the specified file pattern + # in the current directory, or its parent directory, or its grandparent directory, and so on. + # + # Note: If this parameter is set to empty value, it won't hide tools. + # Note: SHOW_ON_UPGLOB isn't specific to asdf. It works with all prompt segments. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_ON_UPGLOB. + # + # Example: Hide nodejs version when there is no package.json and no *.js files in the current + # directory, in `..`, in `../..` and so on. + # + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.js|package.json' + typeset -g POWERLEVEL9K_ASDF_SHOW_ON_UPGLOB= + + # Ruby version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUBY_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_RUBY_BACKGROUND=1 + # typeset -g POWERLEVEL9K_ASDF_RUBY_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUBY_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Python version from asdf. + typeset -g POWERLEVEL9K_ASDF_PYTHON_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_PYTHON_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_PYTHON_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PYTHON_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Go version from asdf. + typeset -g POWERLEVEL9K_ASDF_GOLANG_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_GOLANG_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_GOLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_GOLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Node.js version from asdf. + typeset -g POWERLEVEL9K_ASDF_NODEJS_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_NODEJS_BACKGROUND=2 + # typeset -g POWERLEVEL9K_ASDF_NODEJS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Rust version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUST_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_RUST_BACKGROUND=208 + # typeset -g POWERLEVEL9K_ASDF_RUST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUST_SHOW_ON_UPGLOB='*.foo|*.bar' + + # .NET Core version from asdf. + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_FLUTTER_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Lua version from asdf. + typeset -g POWERLEVEL9K_ASDF_LUA_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_LUA_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_LUA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_LUA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Java version from asdf. + typeset -g POWERLEVEL9K_ASDF_JAVA_FOREGROUND=1 + typeset -g POWERLEVEL9K_ASDF_JAVA_BACKGROUND=7 + # typeset -g POWERLEVEL9K_ASDF_JAVA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JAVA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Perl version from asdf. + typeset -g POWERLEVEL9K_ASDF_PERL_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_PERL_BACKGROUND=4 + # typeset -g POWERLEVEL9K_ASDF_PERL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PERL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Erlang version from asdf. + typeset -g POWERLEVEL9K_ASDF_ERLANG_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_ERLANG_BACKGROUND=1 + # typeset -g POWERLEVEL9K_ASDF_ERLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ERLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Elixir version from asdf. + typeset -g POWERLEVEL9K_ASDF_ELIXIR_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_ELIXIR_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Postgres version from asdf. + typeset -g POWERLEVEL9K_ASDF_POSTGRES_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_POSTGRES_BACKGROUND=6 + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_SHOW_ON_UPGLOB='*.foo|*.bar' + + # PHP version from asdf. + typeset -g POWERLEVEL9K_ASDF_PHP_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_PHP_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_PHP_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PHP_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Haskell version from asdf. + typeset -g POWERLEVEL9K_ASDF_HASKELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_HASKELL_BACKGROUND=3 + # typeset -g POWERLEVEL9K_ASDF_HASKELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_HASKELL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Julia version from asdf. + typeset -g POWERLEVEL9K_ASDF_JULIA_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_JULIA_BACKGROUND=2 + # typeset -g POWERLEVEL9K_ASDF_JULIA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JULIA_SHOW_ON_UPGLOB='*.foo|*.bar' + + ##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]########### + # NordVPN connection indicator color. + typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=7 + typeset -g POWERLEVEL9K_NORDVPN_BACKGROUND=4 + # Hide NordVPN connection indicator when not connected. + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION= + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION= + # Custom icon. + # typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]################## + # Ranger shell color. + typeset -g POWERLEVEL9K_RANGER_FOREGROUND=3 + typeset -g POWERLEVEL9K_RANGER_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=0 + typeset -g POWERLEVEL9K_NNN_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ lf: lf shell (https://github.com/gokcehan/lf) ]####################### + # lf shell color. + typeset -g POWERLEVEL9K_LF_FOREGROUND=0 + typeset -g POWERLEVEL9K_LF_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_LF_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################[ xplr: xplr shell (https://github.com/sayanarijit/xplr) ]################## + # xplr shell color. + typeset -g POWERLEVEL9K_XPLR_FOREGROUND=0 + typeset -g POWERLEVEL9K_XPLR_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_XPLR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########################[ vim_shell: vim shell indicator (:sh) ]########################### + # Vim shell indicator color. + typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_VIM_SHELL_BACKGROUND=2 + # Custom icon. + # typeset -g POWERLEVEL9K_VIM_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######[ midnight_commander: midnight commander shell (https://midnight-commander.org/) ]###### + # Midnight Commander shell color. + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_FOREGROUND=3 + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ nix_shell: nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) ]## + # Nix shell color. + typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_NIX_SHELL_BACKGROUND=4 + + # Display the icon of nix_shell if PATH contains a subdirectory of /nix/store. + # typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=false + + # Tip: If you want to see just the icon without "pure" and "impure", uncomment the next line. + # typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_NIX_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################[ chezmoi_shell: chezmoi shell (https://www.chezmoi.io/) ]################## + # chezmoi shell color. + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_CHEZMOI_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ disk_usage: disk usage ]################################## + # Colors for different levels of disk usage. + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_BACKGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_BACKGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=7 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_BACKGROUND=1 + # Thresholds for different levels of disk usage (percentage points). + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=90 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=95 + # If set to true, hide disk usage when below $POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL percent. + typeset -g POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=false + # Custom icon. + # typeset -g POWERLEVEL9K_DISK_USAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ vi_mode: vi mode (you don't need this if you've enabled prompt_char) ]########### + # Foreground color. + typeset -g POWERLEVEL9K_VI_MODE_FOREGROUND=0 + # Text and color for normal (a.k.a. command) vi mode. + typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL + typeset -g POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=2 + # Text and color for visual vi mode. + typeset -g POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL + typeset -g POWERLEVEL9K_VI_MODE_VISUAL_BACKGROUND=4 + # Text and color for overtype (a.k.a. overwrite and replace) vi mode. + typeset -g POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE + typeset -g POWERLEVEL9K_VI_MODE_OVERWRITE_BACKGROUND=3 + # Text and color for insert vi mode. + typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING= + typeset -g POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=8 + + ######################################[ ram: free RAM ]####################################### + # RAM color. + typeset -g POWERLEVEL9K_RAM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RAM_BACKGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=0 + typeset -g POWERLEVEL9K_SWAP_BACKGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_SWAP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################################[ load: CPU load ]###################################### + # Show average CPU load over this many last minutes. Valid values are 1, 5 and 15. + typeset -g POWERLEVEL9K_LOAD_WHICH=5 + # Load color when load is under 50%. + typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_NORMAL_BACKGROUND=2 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_WARNING_BACKGROUND=3 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_CRITICAL_BACKGROUND=1 + # Custom icon. + # typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ todo: todo items (https://github.com/todotxt/todo.txt-cli) ]################ + # Todo color. + typeset -g POWERLEVEL9K_TODO_FOREGROUND=0 + typeset -g POWERLEVEL9K_TODO_BACKGROUND=8 + # Hide todo when the total number of tasks is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL=true + # Hide todo when the number of tasks after filtering is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED=false + + # Todo format. The following parameters are available within the expansion. + # + # - P9K_TODO_TOTAL_TASK_COUNT The total number of tasks. + # - P9K_TODO_FILTERED_TASK_COUNT The number of tasks after filtering. + # + # These variables correspond to the last line of the output of `todo.sh -p ls`: + # + # TODO: 24 of 42 tasks shown + # + # Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT. + # + # typeset -g POWERLEVEL9K_TODO_CONTENT_EXPANSION='$P9K_TODO_FILTERED_TASK_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TODO_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ timewarrior: timewarrior tracking status (https://timewarrior.net/) ]############ + # Timewarrior color. + typeset -g POWERLEVEL9K_TIMEWARRIOR_FOREGROUND=255 + typeset -g POWERLEVEL9K_TIMEWARRIOR_BACKGROUND=8 + + # If the tracked task is longer than 24 characters, truncate and append "…". + # Tip: To always display tasks without truncation, delete the following parameter. + # Tip: To hide task names and display just the icon when time tracking is enabled, set the + # value of the following parameter to "". + typeset -g POWERLEVEL9K_TIMEWARRIOR_CONTENT_EXPANSION='${P9K_CONTENT:0:24}${${P9K_CONTENT:24}:+…}' + + # Custom icon. + # typeset -g POWERLEVEL9K_TIMEWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ taskwarrior: taskwarrior task count (https://taskwarrior.org/) ]############## + # Taskwarrior color. + typeset -g POWERLEVEL9K_TASKWARRIOR_FOREGROUND=0 + typeset -g POWERLEVEL9K_TASKWARRIOR_BACKGROUND=6 + + # Taskwarrior segment format. The following parameters are available within the expansion. + # + # - P9K_TASKWARRIOR_PENDING_COUNT The number of pending tasks: `task +PENDING count`. + # - P9K_TASKWARRIOR_OVERDUE_COUNT The number of overdue tasks: `task +OVERDUE count`. + # + # Zero values are represented as empty parameters. + # + # The default format: + # + # '${P9K_TASKWARRIOR_OVERDUE_COUNT:+"!$P9K_TASKWARRIOR_OVERDUE_COUNT/"}$P9K_TASKWARRIOR_PENDING_COUNT' + # + # typeset -g POWERLEVEL9K_TASKWARRIOR_CONTENT_EXPANSION='$P9K_TASKWARRIOR_PENDING_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TASKWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + # Color when using local/global history. + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_BACKGROUND=5 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_BACKGROUND=3 + + # Tip: Uncomment the next two lines to hide "local"/"global" text and leave just the icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_CONTENT_EXPANSION='' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_CONTENT_EXPANSION='' + + # Custom icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################################[ cpu_arch: CPU architecture ]################################ + # CPU architecture color. + typeset -g POWERLEVEL9K_CPU_ARCH_FOREGROUND=0 + typeset -g POWERLEVEL9K_CPU_ARCH_BACKGROUND=3 + + # Hide the segment when on a specific CPU architecture. + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_CONTENT_EXPANSION= + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_VISUAL_IDENTIFIER_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CPU_ARCH_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ context: user@hostname ]################################## + # Context color when running with privileges. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=1 + typeset -g POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND=0 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_BACKGROUND=0 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=0 + + # Context format when running with privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%n@%m' + # Context format when in SSH without privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m' + # Default context format (no privileges, no SSH): user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m' + + # Don't show context unless running with privileges or in SSH. + # Tip: Remove the next line to always show context. + typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_CONTEXT_PREFIX='with ' + + ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### + # Python virtual environment color. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_VIRTUALENV_BACKGROUND=4 + # Don't show Python version next to the virtual environment name. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false + # If set to "false", won't show virtualenv if pyenv is already shown. + # If set to "if-different", won't show virtualenv if it's the same as pyenv. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV=false + # Separate environment name from Python version only with a space. + typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ anaconda: conda environment (https://conda.io/) ]###################### + # Anaconda environment color. + typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=0 + typeset -g POWERLEVEL9K_ANACONDA_BACKGROUND=4 + + # Anaconda segment format. The following parameters are available within the expansion. + # + # - CONDA_PREFIX Absolute path to the active Anaconda/Miniconda environment. + # - CONDA_DEFAULT_ENV Name of the active Anaconda/Miniconda environment. + # - CONDA_PROMPT_MODIFIER Configurable prompt modifier (see below). + # - P9K_ANACONDA_PYTHON_VERSION Current python version (python --version). + # + # CONDA_PROMPT_MODIFIER can be configured with the following command: + # + # conda config --set env_prompt '({default_env}) ' + # + # The last argument is a Python format string that can use the following variables: + # + # - prefix The same as CONDA_PREFIX. + # - default_env The same as CONDA_DEFAULT_ENV. + # - name The last segment of CONDA_PREFIX. + # - stacked_env Comma-separated list of names in the environment stack. The first element is + # always the same as default_env. + # + # Note: '({default_env}) ' is the default value of env_prompt. + # + # The default value of POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION expands to $CONDA_PROMPT_MODIFIER + # without the surrounding parentheses, or to the last path component of CONDA_PREFIX if the former + # is empty. + typeset -g POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION='${${${${CONDA_PROMPT_MODIFIER#\(}% }%\)}:-${CONDA_PREFIX:t}}' + + # Custom icon. + # typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################ + # Pyenv color. + typeset -g POWERLEVEL9K_PYENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_PYENV_BACKGROUND=4 + # Hide python version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PYENV_SOURCES=(shell local global) + # If set to false, hide python version if it's the same as global: + # $(pyenv version-name) == $(pyenv global). + typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide python version if it's equal to "system". + typeset -g POWERLEVEL9K_PYENV_SHOW_SYSTEM=true + + # Pyenv segment format. The following parameters are available within the expansion. + # + # - P9K_CONTENT Current pyenv environment (pyenv version-name). + # - P9K_PYENV_PYTHON_VERSION Current python version (python --version). + # + # The default format has the following logic: + # + # 1. Display just "$P9K_CONTENT" if it's equal to "$P9K_PYENV_PYTHON_VERSION" or + # starts with "$P9K_PYENV_PYTHON_VERSION/". + # 2. Otherwise display "$P9K_CONTENT $P9K_PYENV_PYTHON_VERSION". + typeset -g POWERLEVEL9K_PYENV_CONTENT_EXPANSION='${P9K_CONTENT}${${P9K_CONTENT:#$P9K_PYENV_PYTHON_VERSION(|/*)}:+ $P9K_PYENV_PYTHON_VERSION}' + + # Custom icon. + # typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ goenv: go environment (https://github.com/syndbg/goenv) ]################ + # Goenv color. + typeset -g POWERLEVEL9K_GOENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_GOENV_BACKGROUND=4 + # Hide go version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_GOENV_SOURCES=(shell local global) + # If set to false, hide go version if it's the same as global: + # $(goenv version-name) == $(goenv global). + typeset -g POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide go version if it's equal to "system". + typeset -g POWERLEVEL9K_GOENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_GOENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]########## + # Nodenv color. + typeset -g POWERLEVEL9K_NODENV_FOREGROUND=2 + typeset -g POWERLEVEL9K_NODENV_BACKGROUND=0 + # Hide node version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_NODENV_SOURCES=(shell local global) + # If set to false, hide node version if it's the same as global: + # $(nodenv version-name) == $(nodenv global). + typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NODENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]############### + # Nvm color. + typeset -g POWERLEVEL9K_NVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_NVM_BACKGROUND=5 + # If set to false, hide node version if it's the same as default: + # $(nvm version current) == $(nvm version default). + typeset -g POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NVM_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############ + # Nodeenv color. + typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=2 + typeset -g POWERLEVEL9K_NODEENV_BACKGROUND=0 + # Don't show Node version next to the environment name. + typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false + # Separate environment name from Node version only with a space. + typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############################[ node_version: node.js version ]############################### + # Node version color. + typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=7 + typeset -g POWERLEVEL9K_NODE_VERSION_BACKGROUND=2 + # Show node version only when in a directory tree containing package.json. + typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ go_version: go version (https://golang.org) ]######################## + # Go version color. + typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=255 + typeset -g POWERLEVEL9K_GO_VERSION_BACKGROUND=2 + # Show go version only when in a go project subdirectory. + typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ rust_version: rustc version (https://www.rust-lang.org) ]################## + # Rust version color. + typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=0 + typeset -g POWERLEVEL9K_RUST_VERSION_BACKGROUND=208 + # Show rust version only when in a rust project subdirectory. + typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################ + # .NET version color. + typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=7 + typeset -g POWERLEVEL9K_DOTNET_VERSION_BACKGROUND=5 + # Show .NET version only when in a .NET project subdirectory. + typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ php_version: php version (https://www.php.net/) ]###################### + # PHP version color. + typeset -g POWERLEVEL9K_PHP_VERSION_FOREGROUND=0 + typeset -g POWERLEVEL9K_PHP_VERSION_BACKGROUND=5 + # Show PHP version only when in a PHP project subdirectory. + typeset -g POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHP_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ laravel_version: laravel php framework version (https://laravel.com/) ]########### + # Laravel version color. + typeset -g POWERLEVEL9K_LARAVEL_VERSION_FOREGROUND=1 + typeset -g POWERLEVEL9K_LARAVEL_VERSION_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## + # Rbenv color. + typeset -g POWERLEVEL9K_RBENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_RBENV_BACKGROUND=1 + # Hide ruby version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_RBENV_SOURCES=(shell local global) + # If set to false, hide ruby version if it's the same as global: + # $(rbenv version-name) == $(rbenv global). + typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide ruby version if it's equal to "system". + typeset -g POWERLEVEL9K_RBENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ####################[ java_version: java version (https://www.java.com/) ]#################### + # Java version color. + typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=1 + typeset -g POWERLEVEL9K_JAVA_VERSION_BACKGROUND=7 + # Show java version only when in a java project subdirectory. + typeset -g POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY=true + # Show brief version. + typeset -g POWERLEVEL9K_JAVA_VERSION_FULL=false + # Custom icon. + # typeset -g POWERLEVEL9K_JAVA_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###[ package: name@version from package.json (https://docs.npmjs.com/files/package.json) ]#### + # Package color. + typeset -g POWERLEVEL9K_PACKAGE_FOREGROUND=0 + typeset -g POWERLEVEL9K_PACKAGE_BACKGROUND=6 + + # Package format. The following parameters are available within the expansion. + # + # - P9K_PACKAGE_NAME The value of `name` field in package.json. + # - P9K_PACKAGE_VERSION The value of `version` field in package.json. + # + # typeset -g POWERLEVEL9K_PACKAGE_CONTENT_EXPANSION='${P9K_PACKAGE_NAME//\%/%%}@${P9K_PACKAGE_VERSION//\%/%%}' + + # Custom icon. + # typeset -g POWERLEVEL9K_PACKAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## + # Rvm color. + typeset -g POWERLEVEL9K_RVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RVM_BACKGROUND=240 + # Don't show @gemset at the end. + typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false + # Don't show ruby- at the front. + typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ fvm: flutter version management (https://github.com/leoafarias/fvm) ]############ + # Fvm color. + typeset -g POWERLEVEL9K_FVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_FVM_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_FVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ luaenv: lua version from luaenv (https://github.com/cehoffman/luaenv) ]########### + # Lua color. + typeset -g POWERLEVEL9K_LUAENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_LUAENV_BACKGROUND=4 + # Hide lua version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_LUAENV_SOURCES=(shell local global) + # If set to false, hide lua version if it's the same as global: + # $(luaenv version-name) == $(luaenv global). + typeset -g POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide lua version if it's equal to "system". + typeset -g POWERLEVEL9K_LUAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_LUAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ jenv: java version from jenv (https://github.com/jenv/jenv) ]################ + # Java color. + typeset -g POWERLEVEL9K_JENV_FOREGROUND=1 + typeset -g POWERLEVEL9K_JENV_BACKGROUND=7 + # Hide java version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_JENV_SOURCES=(shell local global) + # If set to false, hide java version if it's the same as global: + # $(jenv version-name) == $(jenv global). + typeset -g POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide java version if it's equal to "system". + typeset -g POWERLEVEL9K_JENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_JENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ plenv: perl version from plenv (https://github.com/tokuhirom/plenv) ]############ + # Perl color. + typeset -g POWERLEVEL9K_PLENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_PLENV_BACKGROUND=4 + # Hide perl version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PLENV_SOURCES=(shell local global) + # If set to false, hide perl version if it's the same as global: + # $(plenv version-name) == $(plenv global). + typeset -g POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide perl version if it's equal to "system". + typeset -g POWERLEVEL9K_PLENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PLENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############ + # PHP color. + typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_PHPENV_BACKGROUND=5 + # Hide php version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PHPENV_SOURCES=(shell local global) + # If set to false, hide php version if it's the same as global: + # $(phpenv version-name) == $(phpenv global). + typeset -g POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide PHP version if it's equal to "system". + typeset -g POWERLEVEL9K_PHPENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHPENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######[ scalaenv: scala version from scalaenv (https://github.com/scalaenv/scalaenv) ]####### + # Scala color. + typeset -g POWERLEVEL9K_SCALAENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_SCALAENV_BACKGROUND=1 + # Hide scala version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_SCALAENV_SOURCES=(shell local global) + # If set to false, hide scala version if it's the same as global: + # $(scalaenv version-name) == $(scalaenv global). + typeset -g POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide scala version if it's equal to "system". + typeset -g POWERLEVEL9K_SCALAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_SCALAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ haskell_stack: haskell version from stack (https://haskellstack.org/) ]########### + # Haskell color. + typeset -g POWERLEVEL9K_HASKELL_STACK_FOREGROUND=0 + typeset -g POWERLEVEL9K_HASKELL_STACK_BACKGROUND=3 + + # Hide haskell version if it doesn't come from one of these sources. + # + # shell: version is set by STACK_YAML + # local: version is set by stack.yaml up the directory tree + # global: version is set by the implicit global project (~/.stack/global-project/stack.yaml) + typeset -g POWERLEVEL9K_HASKELL_STACK_SOURCES=(shell local) + # If set to false, hide haskell version if it's the same as in the implicit global project. + typeset -g POWERLEVEL9K_HASKELL_STACK_ALWAYS_SHOW=true + # Custom icon. + # typeset -g POWERLEVEL9K_HASKELL_STACK_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ terraform: terraform workspace (https://www.terraform.io) ]################# + # Don't show terraform workspace if it's literally "default". + typeset -g POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT=false + # POWERLEVEL9K_TERRAFORM_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current terraform workspace gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_TERRAFORM_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_TERRAFORM_CLASSES defines the workspace class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current terraform workspace is "project_test", its class is TEST because "project_test" + # doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_FOREGROUND=2 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_BACKGROUND=0 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_FOREGROUND=4 + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_BACKGROUND=0 + # typeset -g POWERLEVEL9K_TERRAFORM_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ terraform_version: terraform version (https://www.terraform.io) ]############## + # Terraform version color. + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_FOREGROUND=4 + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_TERRAFORM_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ terraform_version: It shows active terraform version (https://www.terraform.io) ]################# + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_SHOW_ON_COMMAND='terraform|tf' + + #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# + # Show kubecontext only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show kubecontext. + typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens|kubectx|oc|istioctl|kogito|k9s|helmfile|flux|fluxctl|stern|kubeseal|skaffold|kubent|kubecolor|cmctl|sparkctl' + + # Kubernetes context classes for the purpose of using different colors, icons and expansions with + # different contexts. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current kubernetes context gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current kubernetes context is "deathray-testing/default", its class is TEST + # because "deathray-testing/default" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=0 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_BACKGROUND=2 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=7 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_BACKGROUND=5 + # typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext + # segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # Within the expansion the following parameters are always available: + # + # - P9K_CONTENT The content that would've been displayed if there was no content + # expansion defined. + # - P9K_KUBECONTEXT_NAME The current context's name. Corresponds to column NAME in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_CLUSTER The current context's cluster. Corresponds to column CLUSTER in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_NAMESPACE The current context's namespace. Corresponds to column NAMESPACE + # in the output of `kubectl config get-contexts`. If there is no + # namespace, the parameter is set to "default". + # - P9K_KUBECONTEXT_USER The current context's user. Corresponds to column AUTHINFO in the + # output of `kubectl config get-contexts`. + # + # If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS), + # the following extra parameters are available: + # + # - P9K_KUBECONTEXT_CLOUD_NAME Either "gke" or "eks". + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT Account/project ID. + # - P9K_KUBECONTEXT_CLOUD_ZONE Availability zone. + # - P9K_KUBECONTEXT_CLOUD_CLUSTER Cluster. + # + # P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example, + # if P9K_KUBECONTEXT_CLUSTER is "gke_my-account_us-east1-a_my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=gke + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + # + # If P9K_KUBECONTEXT_CLUSTER is "arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=eks + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012 + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1 + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION= + # Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME. + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}' + # Append the current context's namespace if it's not "default". + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}' + + # Custom prefix. + # typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='at ' + + #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# + # Show aws only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show aws. + typeset -g POWERLEVEL9K_AWS_SHOW_ON_COMMAND='aws|awless|cdk|terraform|pulumi|terragrunt' + + # POWERLEVEL9K_AWS_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current AWS profile gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_AWS_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AWS_CLASSES defines the profile class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current AWS profile is "company_test", its class is TEST + # because "company_test" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_AWS_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_AWS_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_AWS_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_AWS_DEFAULT_FOREGROUND=7 + typeset -g POWERLEVEL9K_AWS_DEFAULT_BACKGROUND=1 + # typeset -g POWERLEVEL9K_AWS_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # AWS segment format. The following parameters are available within the expansion. + # + # - P9K_AWS_PROFILE The name of the current AWS profile. + # - P9K_AWS_REGION The region associated with the current AWS profile. + typeset -g POWERLEVEL9K_AWS_CONTENT_EXPANSION='${P9K_AWS_PROFILE//\%/%%}${P9K_AWS_REGION:+ ${P9K_AWS_REGION//\%/%%}}' + + #[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]# + # AWS Elastic Beanstalk environment color. + typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=2 + typeset -g POWERLEVEL9K_AWS_EB_ENV_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]########## + # Show azure only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show azure. + typeset -g POWERLEVEL9K_AZURE_SHOW_ON_COMMAND='az|terraform|pulumi|terragrunt' + + # POWERLEVEL9K_AZURE_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current azure account name gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_AZURE_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AZURE_CLASSES defines the account class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current azure account is "company_test", its class is TEST because "company_test" + # doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_AZURE_TEST_FOREGROUND=2 + # typeset -g POWERLEVEL9K_AZURE_TEST_BACKGROUND=0 + # typeset -g POWERLEVEL9K_AZURE_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_AZURE_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_OTHER_FOREGROUND=7 + typeset -g POWERLEVEL9K_AZURE_OTHER_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show gcloud. + typeset -g POWERLEVEL9K_GCLOUD_SHOW_ON_COMMAND='gcloud|gcs|gsutil' + # Google cloud color. + typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=7 + typeset -g POWERLEVEL9K_GCLOUD_BACKGROUND=4 + + # Google cloud format. Change the value of POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION and/or + # POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION if the default is too verbose or not informative + # enough. You can use the following parameters in the expansions. Each of them corresponds to the + # output of `gcloud` tool. + # + # Parameter | Source + # -------------------------|-------------------------------------------------------------------- + # P9K_GCLOUD_CONFIGURATION | gcloud config configurations list --format='value(name)' + # P9K_GCLOUD_ACCOUNT | gcloud config get-value account + # P9K_GCLOUD_PROJECT_ID | gcloud config get-value project + # P9K_GCLOUD_PROJECT_NAME | gcloud projects describe $P9K_GCLOUD_PROJECT_ID --format='value(name)' + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced with '%%'. + # + # Obtaining project name requires sending a request to Google servers. This can take a long time + # and even fail. When project name is unknown, P9K_GCLOUD_PROJECT_NAME is not set and gcloud + # prompt segment is in state PARTIAL. When project name gets known, P9K_GCLOUD_PROJECT_NAME gets + # set and gcloud prompt segment transitions to state COMPLETE. + # + # You can customize the format, icon and colors of gcloud segment separately for states PARTIAL + # and COMPLETE. You can also hide gcloud in state PARTIAL by setting + # POWERLEVEL9K_GCLOUD_PARTIAL_VISUAL_IDENTIFIER_EXPANSION and + # POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION to empty. + typeset -g POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_ID//\%/%%}' + typeset -g POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_NAME//\%/%%}' + + # Send a request to Google (by means of `gcloud projects describe ...`) to obtain project name + # this often. Negative value disables periodic polling. In this mode project name is retrieved + # only when the current configuration, account or project id changes. + typeset -g POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS=60 + + # Custom icon. + # typeset -g POWERLEVEL9K_GCLOUD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ google_app_cred: google application credentials (https://cloud.google.com/docs/authentication/production) ]# + # Show google_app_cred only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show google_app_cred. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_SHOW_ON_COMMAND='terraform|pulumi|terragrunt' + + # Google application credentials classes for the purpose of using different colors, icons and + # expansions with different credentials. + # + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES is an array with even number of elements. The first + # element in each pair defines a pattern against which the current kubernetes context gets + # matched. More specifically, it's P9K_CONTENT prior to the application of context expansion + # (see below) that gets matched. If you unset all POWERLEVEL9K_GOOGLE_APP_CRED_*CONTENT_EXPANSION + # parameters, you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES defines the context class. Patterns are tried in order. + # The first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD + # '*:*test*:*' TEST + # '*' DEFAULT) + # + # If your current Google application credentials is "service_account deathray-testing x@y.com", + # its class is TEST because it doesn't match the pattern '* *prod* *' but does match '* *test* *'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_CONTENT_EXPANSION='$P9K_GOOGLE_APP_CRED_PROJECT_ID' + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD # These values are examples that are unlikely + # '*:*test*:*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_FOREGROUND=7 + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_BACKGROUND=4 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_GOOGLE_APP_CRED_CONTENT_EXPANSION to specify the content displayed by + # google_app_cred segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # You can use the following parameters in the expansion. Each of them corresponds to one of the + # fields in the JSON file pointed to by GOOGLE_APPLICATION_CREDENTIALS. + # + # Parameter | JSON key file field + # ---------------------------------+--------------- + # P9K_GOOGLE_APP_CRED_TYPE | type + # P9K_GOOGLE_APP_CRED_PROJECT_ID | project_id + # P9K_GOOGLE_APP_CRED_CLIENT_EMAIL | client_email + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced by '%%'. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_CONTENT_EXPANSION='${P9K_GOOGLE_APP_CRED_PROJECT_ID//\%/%%}' + + ##############[ toolbox: toolbox name (https://github.com/containers/toolbox) ]############### + # Toolbox color. + typeset -g POWERLEVEL9K_TOOLBOX_FOREGROUND=0 + typeset -g POWERLEVEL9K_TOOLBOX_BACKGROUND=3 + # Don't display the name of the toolbox if it matches fedora-toolbox-*. + typeset -g POWERLEVEL9K_TOOLBOX_CONTENT_EXPANSION='${P9K_TOOLBOX_NAME:#fedora-toolbox-*}' + # Custom icon. + # typeset -g POWERLEVEL9K_TOOLBOX_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_TOOLBOX_PREFIX='in ' + + ###############################[ public_ip: public IP address ]############################### + # Public IP color. + typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=7 + typeset -g POWERLEVEL9K_PUBLIC_IP_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ########################[ vpn_ip: virtual private network indicator ]######################### + # VPN IP color. + typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=0 + typeset -g POWERLEVEL9K_VPN_IP_BACKGROUND=6 + # When on VPN, show just an icon without the IP address. + # Tip: To display the private IP address when on VPN, remove the next line. + typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION= + # Regular expression for the VPN network interface. Run `ifconfig` or `ip -4 a show` while on VPN + # to see the name of the interface. + typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(gpd|wg|(.*tun)|tailscale)[0-9]*|(zt.*)' + # If set to true, show one segment per matching network interface. If set to false, show only + # one segment corresponding to the first matching network interface. + # Tip: If you set it to true, you'll probably want to unset POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION. + typeset -g POWERLEVEL9K_VPN_IP_SHOW_ALL=false + # Custom icon. + # typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ ip: ip address and bandwidth usage for a specified network interface ]########### + # IP color. + typeset -g POWERLEVEL9K_IP_BACKGROUND=4 + typeset -g POWERLEVEL9K_IP_FOREGROUND=0 + # The following parameters are accessible within the expansion: + # + # Parameter | Meaning + # ----------------------+------------------------------------------- + # P9K_IP_IP | IP address + # P9K_IP_INTERFACE | network interface + # P9K_IP_RX_BYTES | total number of bytes received + # P9K_IP_TX_BYTES | total number of bytes sent + # P9K_IP_RX_BYTES_DELTA | number of bytes received since last prompt + # P9K_IP_TX_BYTES_DELTA | number of bytes sent since last prompt + # P9K_IP_RX_RATE | receive rate (since last prompt) + # P9K_IP_TX_RATE | send rate (since last prompt) + typeset -g POWERLEVEL9K_IP_CONTENT_EXPANSION='${P9K_IP_RX_RATE:+⇣$P9K_IP_RX_RATE }${P9K_IP_TX_RATE:+⇡$P9K_IP_TX_RATE }$P9K_IP_IP' + # Show information for the first network interface whose name matches this regular expression. + # Run `ifconfig` or `ip -4 a show` to see the names of all network interfaces. + typeset -g POWERLEVEL9K_IP_INTERFACE='[ew].*' + # Custom icon. + # typeset -g POWERLEVEL9K_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #########################[ proxy: system-wide http/https/ftp proxy ]########################## + # Proxy color. + typeset -g POWERLEVEL9K_PROXY_FOREGROUND=4 + typeset -g POWERLEVEL9K_PROXY_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################################[ battery: internal battery ]################################# + # Show battery in red when it's below this level and not connected to power supply. + typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20 + typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=1 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES='\UF008E\UF007A\UF007B\UF007C\UF007D\UF007E\UF007F\UF0080\UF0081\UF0082\UF0079' + # Don't show the remaining time to charge/discharge. + typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false + typeset -g POWERLEVEL9K_BATTERY_BACKGROUND=0 + + #####################################[ wifi: wifi speed ]##################################### + # WiFi color. + typeset -g POWERLEVEL9K_WIFI_FOREGROUND=0 + typeset -g POWERLEVEL9K_WIFI_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use different colors and icons depending on signal strength ($P9K_WIFI_BARS). + # + # # Wifi colors and icons for different signal strength levels (low to high). + # typeset -g my_wifi_fg=(0 0 0 0 0) # <-- change these values + # typeset -g my_wifi_icon=('WiFi' 'WiFi' 'WiFi' 'WiFi' 'WiFi') # <-- change these values + # + # typeset -g POWERLEVEL9K_WIFI_CONTENT_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}$P9K_WIFI_LAST_TX_RATE Mbps' + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}${my_wifi_icon[P9K_WIFI_BARS+1]}' + # + # The following parameters are accessible within the expansions: + # + # Parameter | Meaning + # ----------------------+--------------- + # P9K_WIFI_SSID | service set identifier, a.k.a. network name + # P9K_WIFI_LINK_AUTH | authentication protocol such as "wpa2-psk" or "none"; empty if unknown + # P9K_WIFI_LAST_TX_RATE | wireless transmit rate in megabits per second + # P9K_WIFI_RSSI | signal strength in dBm, from -120 to 0 + # P9K_WIFI_NOISE | noise in dBm, from -120 to 0 + # P9K_WIFI_BARS | signal strength in bars, from 0 to 4 (derived from P9K_WIFI_RSSI and P9K_WIFI_NOISE) + + ####################################[ time: current time ]#################################### + # Current time color. + typeset -g POWERLEVEL9K_TIME_FOREGROUND=0 + typeset -g POWERLEVEL9K_TIME_BACKGROUND=7 + # Format for the current time: 09:51:02. See `man 3 strftime`. + typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' + # If set to true, time will update when you hit enter. This way prompts for the past + # commands will contain the start times of their commands as opposed to the default + # behavior where they contain the end times of their preceding commands. + typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false + # Custom icon. + # typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_TIME_PREFIX='at ' + + # Example of a user-defined prompt segment. Function prompt_example will be called on every + # prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or + # POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and yellow text on red background + # greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -b 1 -f 3 -i '⭐' -t 'hello, %n' + } + + # User-defined prompt segments may optionally provide an instant_prompt_* function. Its job + # is to generate the prompt segment for display in instant prompt. See + # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. + # + # Powerlevel10k will call instant_prompt_* at the same time as the regular prompt_* function + # and will record all `p10k segment` calls it makes. When displaying instant prompt, Powerlevel10k + # will replay these calls without actually calling instant_prompt_*. It is imperative that + # instant_prompt_* always makes the same `p10k segment` calls regardless of environment. If this + # rule is not observed, the content of instant prompt will be incorrect. + # + # Usually, you should either not define instant_prompt_* or simply call prompt_* from it. If + # instant_prompt_* is not defined for a segment, the segment won't be shown in instant prompt. + function instant_prompt_example() { + # Since prompt_example always makes the same `p10k segment` calls, we can call it from + # instant_prompt_example. This will give us the same `example` prompt segment in the instant + # and regular prompts. + prompt_example + } + + # User-defined prompt segments can be customized the same way as built-in segments. + typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=3 + typeset -g POWERLEVEL9K_EXAMPLE_BACKGROUND=1 + # typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt + # when accepting a command line. Supported values: + # + # - off: Don't change prompt when accepting a command line. + # - always: Trim down prompt when accepting a command line. + # - same-dir: Trim down prompt when accepting a command line unless this is the first command + # typed after changing current working directory. + typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always + + # Instant prompt mode. + # + # - off: Disable instant prompt. Choose this if you've tried instant prompt and found + # it incompatible with your zsh configuration files. + # - quiet: Enable instant prompt and don't print warnings when detecting console output + # during zsh initialization. Choose this if you've read and understood + # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. + # - verbose: Enable instant prompt and print a warning when detecting console output during + # zsh initialization. Choose this if you've never tried instant prompt, haven't + # seen the warning, or if you are unsure what this all means. + typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose + + # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. + # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload + # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you + # really need it. + typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true + + # If p10k is already loaded, reload configuration. + # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true. + (( ! $+functions[p10k] )) || p10k reload +} + +# Tell `p10k configure` which file it should overwrite. +typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a} + +(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} +'builtin' 'unset' 'p10k_config_opts' diff --git a/modules/home/zsh/zshrc-personal.nix b/modules/home/zsh/zshrc-personal.nix new file mode 100644 index 0000000..545cfd2 --- /dev/null +++ b/modules/home/zsh/zshrc-personal.nix @@ -0,0 +1,20 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ zsh ]; + + home.file."./.zshrc-personal".text = '' + + # This file allows you to define your own aliases, functions, etc + # below are just some examples of what you can use this file for + + #!/usr/bin/env zsh + # Set defaults + # + #export EDITOR="nvim" + #export VISUAL="nvim" + + #alias c="clear" + + + ''; +} + diff --git a/profiles/amd/default.nix b/profiles/amd/default.nix new file mode 100644 index 0000000..9c1d8ce --- /dev/null +++ b/profiles/amd/default.nix @@ -0,0 +1,13 @@ +{ host, ... }: { + imports = [ + ../../hosts/${host} + ../../modules/drivers + ../../modules/core + ]; + # Enable GPU Drivers + drivers.amdgpu.enable = true; + drivers.nvidia.enable = false; + drivers.nvidia-prime.enable = false; + drivers.intel.enable = false; + vm.guest-services.enable = false; +} diff --git a/profiles/intel/default.nix b/profiles/intel/default.nix new file mode 100644 index 0000000..cc0d3d6 --- /dev/null +++ b/profiles/intel/default.nix @@ -0,0 +1,13 @@ +{ host, ... }: { + imports = [ + ../../hosts/${host} + ../../modules/drivers + ../../modules/core + ]; + # Enable GPU Drivers + drivers.amdgpu.enable = false; + drivers.nvidia.enable = false; + drivers.nvidia-prime.enable = false; + drivers.intel.enable = true; + vm.guest-services.enable = false; +} diff --git a/profiles/nvidia-laptop/default.nix b/profiles/nvidia-laptop/default.nix new file mode 100644 index 0000000..6d58b83 --- /dev/null +++ b/profiles/nvidia-laptop/default.nix @@ -0,0 +1,21 @@ +{ host, ... }: +let + inherit (import ../../hosts/${host}/variables.nix) intelID nvidiaID; +in +{ + imports = [ + ../../hosts/${host} + ../../modules/drivers + ../../modules/core + ]; + # Enable GPU Drivers + drivers.amdgpu.enable = false; + drivers.nvidia.enable = true; + drivers.nvidia-prime = { + enable = true; + intelBusID = "${intelID}"; + nvidiaBusID = "${nvidiaID}"; + }; + drivers.intel.enable = false; + vm.guest-services.enable = false; +} diff --git a/profiles/nvidia/default.nix b/profiles/nvidia/default.nix new file mode 100644 index 0000000..6beee5f --- /dev/null +++ b/profiles/nvidia/default.nix @@ -0,0 +1,13 @@ +{ host, ... }: { + imports = [ + ../../hosts/${host} + ../../modules/drivers + ../../modules/core + ]; + # Enable GPU Drivers + drivers.amdgpu.enable = false; + drivers.nvidia.enable = true; + drivers.nvidia-prime.enable = false; + drivers.intel.enable = false; + vm.guest-services.enable = false; +} diff --git a/profiles/vm/default.nix b/profiles/vm/default.nix new file mode 100644 index 0000000..cf51f94 --- /dev/null +++ b/profiles/vm/default.nix @@ -0,0 +1,13 @@ +{ host, ... }: { + imports = [ + ../../hosts/${host} + ../../modules/drivers + ../../modules/core + ]; + # Enable GPU Drivers + drivers.amdgpu.enable = false; + drivers.nvidia.enable = false; + drivers.nvidia-prime.enable = false; + drivers.intel.enable = false; + vm.guest-services.enable = true; +} diff --git a/wallpapers/Anime-Purple-eyes.png b/wallpapers/Anime-Purple-eyes.png new file mode 100644 index 0000000..1cfd093 Binary files /dev/null and b/wallpapers/Anime-Purple-eyes.png differ diff --git a/wallpapers/AnimeGirlNightSky.jpg b/wallpapers/AnimeGirlNightSky.jpg new file mode 100644 index 0000000..5552326 Binary files /dev/null and b/wallpapers/AnimeGirlNightSky.jpg differ diff --git a/wallpapers/Rainnight.jpg b/wallpapers/Rainnight.jpg new file mode 100644 index 0000000..ffa2dc9 Binary files /dev/null and b/wallpapers/Rainnight.jpg differ diff --git a/wallpapers/attack-on-titan-mikasa-ackerman.jpg b/wallpapers/attack-on-titan-mikasa-ackerman.jpg new file mode 100644 index 0000000..c30a5f6 Binary files /dev/null and b/wallpapers/attack-on-titan-mikasa-ackerman.jpg differ diff --git a/wallpapers/beautifulmountainscape.jpg b/wallpapers/beautifulmountainscape.jpg new file mode 100644 index 0000000..f98608c Binary files /dev/null and b/wallpapers/beautifulmountainscape.jpg differ diff --git a/wallpapers/mountainscapedark.jpg b/wallpapers/mountainscapedark.jpg new file mode 100644 index 0000000..c3259d8 Binary files /dev/null and b/wallpapers/mountainscapedark.jpg differ diff --git a/wallpapers/nix-wallpaper-stripes-logo.png b/wallpapers/nix-wallpaper-stripes-logo.png new file mode 100644 index 0000000..b223bfa Binary files /dev/null and b/wallpapers/nix-wallpaper-stripes-logo.png differ diff --git a/wallpapers/zaney-wallpaper.jpg b/wallpapers/zaney-wallpaper.jpg new file mode 100644 index 0000000..b1f40db Binary files /dev/null and b/wallpapers/zaney-wallpaper.jpg differ