---
title: "Fish Fisher — conf.d/ Conflict with Manually Copied Files"
aliases: [fish-fisher-conflict, fisher-plugins, fish-conf-d-conflict, fisher-reinstall]
tags: [fish, fisher, dotfiles, terminal, migration, plugins]
sources:
  - "daily/2026-04-22.md"
created: 2026-04-22
updated: 2026-04-22
---

# Fish Fisher — conf.d/ Conflict with Manually Copied Files

Fisher (the Fish shell plugin manager) installs plugins by writing initialization files into `~/.config/fish/conf.d/`. When a Mac migration copies these files verbatim to the new machine (e.g., via rsync of the entire `~/.config/fish/` directory), Fisher on the new machine sees the conf.d files but the plugin binaries they reference may not exist. This causes Fisher to show only a subset of plugins as installed and for those plugins to fail silently or partially.

## Key Points

- **Fisher manages conf.d/ files** — each installed plugin gets a `.fish` init file in `~/.config/fish/conf.d/`; manually placed files there confuse Fisher's state tracking
- **Symptom:** `fisher list` shows only 2 of 9 plugins — the ones whose conf.d files were not copied over; the remaining 7 appear installed but are broken
- **Fix:** delete all manually copied conf.d files and run `fisher update` — Fisher reinstalls all plugins cleanly from its `~/.config/fish/fish_plugins` list
- `~/.config/fish/fish_plugins` is the source of truth for Fisher — it lists all plugins by URL; the conf.d files are generated output, not input
- Safe to rsync `~/.config/fish/` from old Mac, but must delete all conf.d files afterwards and let Fisher regenerate them on the new machine

## Details

### Why This Happens

Fisher tracks installed plugins in `~/.config/fish/fish_plugins` (one plugin URL per line). When a plugin is installed, Fisher also writes a helper `.fish` file into `~/.config/fish/conf.d/` that sources the plugin's functions and completions. These conf.d files contain absolute paths to the plugin cache directory (typically `~/.local/share/fisher/`).

When the conf.d files are copied from the old Mac, they may reference the old machine's paths or the old machine's user home directory. On the new machine, the paths don't match — Fish sources the conf.d file on startup, encounters missing paths, and silently ignores the plugin's functions. The plugin appears "installed" (conf.d file exists) but doesn't work.

### The Fix

```fish
# Step 1: Delete all Fisher-managed conf.d files
rm ~/.config/fish/conf.d/*.fish

# Step 2: Reinstall all plugins from fish_plugins list
fisher update

# Step 3: Verify all plugins are loaded
fisher list
# Should show all 9 (or N) plugins
```

`fisher update` reads `~/.config/fish/fish_plugins`, downloads each plugin fresh, and regenerates all conf.d files correctly for the new machine. This takes 10–30 seconds depending on the number of plugins and network speed.

### What to rsync vs What to Regenerate

When migrating Fish config to a new machine:

| File/Dir | Action | Why |
|----------|--------|-----|
| `~/.config/fish/config.fish` | rsync ✓ | Hand-edited config, safe to copy |
| `~/.config/fish/functions/` | rsync ✓ | Custom functions, safe to copy |
| `~/.config/fish/fish_plugins` | rsync ✓ | Fisher's plugin list — this is the input |
| `~/.config/fish/conf.d/` | DELETE after rsync | Generated output — must be regenerated |
| `~/.local/share/fisher/` | skip | Fisher will recreate on `fisher update` |
| `~/.config/fish/completions/` | rsync if custom; skip if Fisher-managed | Check if files are hand-written or auto-generated |

### Distinguishing Manual vs Fisher-Managed conf.d Files

Fisher-generated conf.d files typically have names matching the plugin (e.g., `jorgebucaran_fisher.fish`, `PatrickF1_fzf_fish.fish`). If you have custom conf.d files with your own names (e.g., `00-paths.fish`, `01-starship.fish`), those are safe to keep — only delete files that Fisher wrote.

A simple heuristic: delete all conf.d files whose names contain `_` (the author_plugin pattern Fisher uses for naming), keep everything else.

```fish
# Safe approach: delete only Fisher-style named files
rm ~/.config/fish/conf.d/*_*.fish

# Then reinstall
fisher update
```

### Verification

After `fisher update`, confirm each plugin loads correctly:

```fish
# Check a specific plugin works
# e.g., for fzf.fish
Ctrl+R  # should show fzf history search

# For tide (prompt plugin)
tide configure  # should launch the configuration wizard

# For jorgebucaran/autopair.fish
# Type ( — should auto-complete with )
```

## Related Concepts

- [[wiki/concepts/fish-abbr-patterns]] — Fish abbreviations and aliases that coexist with Fisher plugins
- [[wiki/concepts/fish-shell-path-config]] — Fish PATH configuration and conf.d patterns for init files
- [[wiki/concepts/remote-server-dotfiles-bootstrap]] — dotfiles migration approach using rsync and conf.d pattern
- [[wiki/concepts/memory-compiler-mac-migration]] — Mac migration context where this issue was encountered

## Sources

- [[daily/2026-04-22.md]] — Mac migration to ai_leed@192.168.1.44: Fisher showed 2/9 plugins due to manually copied conf.d files from old Mac; fix was deleting the manually copied files and running `fisher update` to reinstall all plugins cleanly
