mirror of
https://github.com/ivuorinen/dotfiles.git
synced 2026-02-19 11:55:08 +00:00
433 lines
7.7 KiB
Markdown
433 lines
7.7 KiB
Markdown
# Chezmoi Quick Reference
|
|
|
|
Quick reference guide for common chezmoi operations with your dotfiles.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
# Fresh install on a new machine
|
|
sh -c "$(curl -fsLS get.chezmoi.io/lb)" -- init --apply ivuorinen
|
|
|
|
# Or if chezmoi is already installed
|
|
chezmoi init --apply ivuorinen
|
|
```
|
|
|
|
## Daily Workflow
|
|
|
|
### Making Changes
|
|
|
|
```bash
|
|
# Edit a dotfile (opens in $EDITOR)
|
|
chezmoi edit ~/.bashrc
|
|
|
|
# Or edit directly and add to chezmoi
|
|
vim ~/.bashrc
|
|
chezmoi add ~/.bashrc
|
|
|
|
# See what would change
|
|
chezmoi diff
|
|
|
|
# Apply changes
|
|
chezmoi apply
|
|
```
|
|
|
|
### Syncing Across Machines
|
|
|
|
```bash
|
|
# On machine A: commit and push changes
|
|
cd $(chezmoi source-path)
|
|
git add -A
|
|
git commit -m "Update configuration"
|
|
git push
|
|
|
|
# On machine B: pull and apply changes
|
|
chezmoi update
|
|
# This is equivalent to:
|
|
# cd $(chezmoi source-path) && git pull && chezmoi apply
|
|
```
|
|
|
|
## Common Commands
|
|
|
|
### Viewing and Inspecting
|
|
|
|
```bash
|
|
# See what chezmoi would do
|
|
chezmoi diff
|
|
|
|
# List all managed files
|
|
chezmoi managed
|
|
|
|
# List unmanaged files
|
|
chezmoi unmanaged
|
|
|
|
# Show the source path
|
|
chezmoi source-path
|
|
|
|
# Show what a file would look like after templating
|
|
chezmoi cat ~/.bashrc
|
|
|
|
# Show available template data
|
|
chezmoi data
|
|
```
|
|
|
|
### Adding and Removing Files
|
|
|
|
```bash
|
|
# Add a file
|
|
chezmoi add ~/.newfile
|
|
|
|
# Add a file as a template
|
|
chezmoi add --template ~/.newfile
|
|
|
|
# Add a directory recursively
|
|
chezmoi add --recursive ~/.config/newapp
|
|
|
|
# Add with autodetection (templates, scripts, etc.)
|
|
chezmoi add --autotemplate ~/.newfile
|
|
|
|
# Stop managing a file (removes from chezmoi)
|
|
chezmoi forget ~/.oldfile
|
|
|
|
# Remove a file from both chezmoi and home directory
|
|
chezmoi remove ~/.oldfile
|
|
```
|
|
|
|
### Working with Templates
|
|
|
|
```bash
|
|
# Execute a template expression
|
|
chezmoi execute-template "{{ .chezmoi.hostname }}"
|
|
|
|
# Edit template data
|
|
chezmoi edit-config
|
|
|
|
# Verify templates
|
|
chezmoi verify
|
|
```
|
|
|
|
### Applying Changes
|
|
|
|
```bash
|
|
# Apply all changes
|
|
chezmoi apply
|
|
|
|
# Apply with verbose output
|
|
chezmoi apply -v
|
|
|
|
# Dry run (show what would happen)
|
|
chezmoi apply --dry-run -v
|
|
|
|
# Force apply (re-runs scripts)
|
|
chezmoi apply --force
|
|
|
|
# Apply only specific files
|
|
chezmoi apply ~/.bashrc ~/.zshrc
|
|
```
|
|
|
|
### Updating from Repository
|
|
|
|
```bash
|
|
# Update dotfiles from repository
|
|
chezmoi update
|
|
|
|
# Update but don't apply
|
|
cd $(chezmoi source-path) && git pull
|
|
|
|
# Update with interactive merge
|
|
chezmoi update --interactive
|
|
```
|
|
|
|
## File Naming Conventions
|
|
|
|
### Basic Prefixes
|
|
|
|
| Source File | Destination | Description |
|
|
|------------|-------------|-------------|
|
|
| `dot_bashrc` | `~/.bashrc` | Dot file |
|
|
| `dot_config/` | `~/.config/` | Dot directory |
|
|
| `private_dot_ssh/` | `~/.ssh/` | Private directory (0700) |
|
|
| `executable_dot_local/bin/script` | `~/.local/bin/script` | Executable |
|
|
| `symlink_dot_vim` | `~/.vim` | Symlink |
|
|
| `readonly_dot_file` | `~/.file` | Read-only |
|
|
|
|
### Template Files
|
|
|
|
| Source File | Description |
|
|
|------------|-------------|
|
|
| `dot_bashrc.tmpl` | Template file |
|
|
| `dot_config/fish/config.fish.tmpl` | Nested template |
|
|
|
|
### Scripts
|
|
|
|
| Script Name | When It Runs |
|
|
|------------|--------------|
|
|
| `run_once_before_*.sh` | Once before applying |
|
|
| `run_once_after_*.sh` | Once after applying |
|
|
| `run_before_*.sh` | Every time before applying |
|
|
| `run_after_*.sh` | Every time after applying |
|
|
| `run_onchange_*.sh` | When script content changes |
|
|
|
|
## Template Syntax
|
|
|
|
### Basic Variables
|
|
|
|
```go
|
|
// Hostname
|
|
{{ .chezmoi.hostname }}
|
|
|
|
// Username
|
|
{{ .chezmoi.username }}
|
|
|
|
// Operating system
|
|
{{ .chezmoi.os }}
|
|
|
|
// Home directory
|
|
{{ .chezmoi.homeDir }}
|
|
|
|
// Source directory
|
|
{{ .chezmoi.sourceDir }}
|
|
|
|
// Custom data from .chezmoi.yaml
|
|
{{ .is_macos }}
|
|
{{ .is_linux }}
|
|
```
|
|
|
|
### Conditionals
|
|
|
|
```go
|
|
{{ if eq .chezmoi.hostname "air" }}
|
|
# Configuration for air
|
|
{{ else if eq .chezmoi.hostname "lakka" }}
|
|
# Configuration for lakka
|
|
{{ else }}
|
|
# Default configuration
|
|
{{ end }}
|
|
|
|
{{ if .is_macos }}
|
|
# macOS-specific
|
|
{{ end }}
|
|
|
|
{{ if and .is_macos (eq .chezmoi.hostname "air") }}
|
|
# macOS on air
|
|
{{ end }}
|
|
```
|
|
|
|
### Loops
|
|
|
|
```go
|
|
{{ range $key, $value := .data }}
|
|
{{ $key }}: {{ $value }}
|
|
{{ end }}
|
|
```
|
|
|
|
### Including Files
|
|
|
|
```go
|
|
{{ include "template-file.txt" }}
|
|
{{ includeTemplate "template-file.tmpl" }}
|
|
```
|
|
|
|
## Host-Specific Configuration
|
|
|
|
### Method 1: Template Conditionals
|
|
|
|
In `dot_bashrc.tmpl`:
|
|
```bash
|
|
# Common configuration
|
|
export PATH="$HOME/.local/bin:$PATH"
|
|
|
|
{{ if eq .chezmoi.hostname "air" }}
|
|
# air-specific configuration
|
|
export WORK_DIR="$HOME/Work"
|
|
{{ end }}
|
|
|
|
{{ if eq .chezmoi.hostname "lakka" }}
|
|
# lakka-specific configuration
|
|
export WORK_DIR="$HOME/Projects"
|
|
{{ end }}
|
|
```
|
|
|
|
### Method 2: Separate Files with Symlinks
|
|
|
|
Use `.chezmoiignore` to exclude files for specific hosts:
|
|
|
|
```
|
|
{{ if ne .chezmoi.hostname "air" }}
|
|
dot_config/air-specific-app/
|
|
{{ end }}
|
|
|
|
{{ if ne .chezmoi.hostname "lakka" }}
|
|
dot_config/lakka-specific-app/
|
|
{{ end }}
|
|
```
|
|
|
|
## Working with Secrets
|
|
|
|
### Environment Variables
|
|
|
|
```go
|
|
{{ .Env.MY_SECRET }}
|
|
```
|
|
|
|
### 1Password
|
|
|
|
```go
|
|
{{ (onepasswordDocument "my-secret").content }}
|
|
{{ (onepasswordItemFields "my-item").password.value }}
|
|
```
|
|
|
|
### External Commands
|
|
|
|
```go
|
|
{{ output "op" "read" "op://vault/item/field" }}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Check Configuration
|
|
|
|
```bash
|
|
# Verify chezmoi is working correctly
|
|
chezmoi doctor
|
|
|
|
# Check state
|
|
chezmoi verify
|
|
|
|
# See detailed info
|
|
chezmoi data
|
|
```
|
|
|
|
### Debug Templates
|
|
|
|
```bash
|
|
# See what a template would produce
|
|
chezmoi cat ~/.bashrc
|
|
|
|
# Execute a template
|
|
chezmoi execute-template "{{ .chezmoi.hostname }}"
|
|
|
|
# Verbose output
|
|
chezmoi apply -v
|
|
```
|
|
|
|
### Fix Issues
|
|
|
|
```bash
|
|
# Re-apply everything
|
|
chezmoi apply --force
|
|
|
|
# Reset state (dangerous!)
|
|
chezmoi state reset
|
|
|
|
# Clear cache
|
|
rm -rf $(chezmoi source-path)/.git/chezmoi-*
|
|
```
|
|
|
|
### Common Errors
|
|
|
|
**Error: template: ... undefined variable**
|
|
- Check template syntax
|
|
- Verify data with `chezmoi data`
|
|
|
|
**Error: entry ... is not in source state**
|
|
- File not added to chezmoi: `chezmoi add <file>`
|
|
|
|
**Error: ... has been modified since chezmoi last wrote it**
|
|
- See changes: `chezmoi diff`
|
|
- Re-add: `chezmoi add <file>`
|
|
- Or force apply: `chezmoi apply --force`
|
|
|
|
## Useful Aliases
|
|
|
|
Add these to your shell configuration:
|
|
|
|
```bash
|
|
# Chezmoi shortcuts
|
|
alias cm='chezmoi'
|
|
alias cma='chezmoi apply'
|
|
alias cmd='chezmoi diff'
|
|
alias cme='chezmoi edit'
|
|
alias cmu='chezmoi update'
|
|
alias cmcd='cd $(chezmoi source-path)'
|
|
|
|
# Common workflows
|
|
alias cmup='chezmoi git pull && chezmoi apply'
|
|
alias cmpush='cd $(chezmoi source-path) && git add -A && git commit && git push'
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
```bash
|
|
# Change source directory (default: ~/.local/share/chezmoi)
|
|
export CHEZMOI_SOURCE_DIR="$HOME/.dotfiles"
|
|
|
|
# Change config file location
|
|
export CHEZMOI_CONFIG_FILE="$HOME/.config/chezmoi/chezmoi.yaml"
|
|
|
|
# Use different editor
|
|
export EDITOR="vim"
|
|
```
|
|
|
|
## Advanced Usage
|
|
|
|
### Using chezmoi as a dotfiles manager
|
|
|
|
```bash
|
|
# Initialize with local directory
|
|
chezmoi init --source ~/.dotfiles
|
|
|
|
# Use current directory as source
|
|
chezmoi init --source $(pwd)
|
|
```
|
|
|
|
### Managing Multiple Machines
|
|
|
|
Use data in `.chezmoi.yaml.tmpl`:
|
|
|
|
```yaml
|
|
data:
|
|
is_work_machine: {{ or (eq .chezmoi.hostname "work-laptop") (eq .chezmoi.hostname "work-desktop") }}
|
|
is_personal: {{ eq .chezmoi.hostname "personal-laptop" }}
|
|
```
|
|
|
|
Then in templates:
|
|
|
|
```go
|
|
{{ if .is_work_machine }}
|
|
# Work configuration
|
|
{{ end }}
|
|
```
|
|
|
|
### External Files
|
|
|
|
```yaml
|
|
# .chezmoiexternal.yaml
|
|
".config/nvim/lua/plugins":
|
|
type: "archive"
|
|
url: "https://github.com/user/nvim-config/archive/main.tar.gz"
|
|
stripComponents: 1
|
|
refreshPeriod: "168h"
|
|
```
|
|
|
|
## Resources
|
|
|
|
- [Official Documentation](https://www.chezmoi.io/)
|
|
- [User Guide](https://www.chezmoi.io/user-guide/)
|
|
- [Template Reference](https://www.chezmoi.io/reference/templates/)
|
|
- [Command Reference](https://www.chezmoi.io/reference/commands/)
|
|
- [FAQ](https://www.chezmoi.io/faq/)
|
|
|
|
## Help
|
|
|
|
```bash
|
|
# General help
|
|
chezmoi help
|
|
|
|
# Command-specific help
|
|
chezmoi help apply
|
|
chezmoi help add
|
|
|
|
# Show version
|
|
chezmoi --version
|
|
```
|