Repair the Default Ispell Dictionary Safely

A dictionary package half-installs and ispell stops finding a default, and someone reaches for update-default-ispell to fix it. Read the manpage first: it warns explicitly against casual command-line use.

This guide shows what its two modes actually do and how to check the files it maintains, so you treat a package-maintainer helper as exactly that, not an ordinary interactive command. The examples describe the dictionaries-common 1.29.7 installation on this machine.

Checkpoint: This is not a dictionary selector. If you only want to choose the dictionary ispell uses, use the package's select-default-ispell workflow. Use this updater when package installation or configuration needs its database and integration files rebuilt.

1. Confirm the installed helper and package version

Check that the command belongs to the package you think you are repairing:

$ command -v update-default-ispell
/usr/sbin/update-default-ispell
$ dpkg-query -W -f='${Package} ${Version}\n' dictionaries-common
dictionaries-common 1.29.7

Your version may differ. The option names here are the ones this installed release documents. Do not assume behaviour from a similarly named tool on another distribution.

There is no normal help screen. The documented synopsis is only:

update-default-ispell [--skip-symlinks] [--triggered]

An unrecognised option is an error. Do not add guessed switches such as --help to an automated repair.

2. Inspect the state before changing it

The updater rebuilds its ispell information from files below /var/lib/dictionaries-common/ispell and writes the resulting database to /var/cache/dictionaries-common/ispell.db. It also maintains the system default at /etc/dictionaries-common/ispell-default, integration data for Emacs, JED and SquirrelMail, and, when enabled, default links below /etc/dictionaries-common.

Inspect those paths first. None of this changes the system:

$ ls -l /var/cache/dictionaries-common/ispell.db \
    /etc/dictionaries-common/ispell-default
$ find /var/lib/dictionaries-common/ispell -maxdepth 2 -type f -print 2>/dev/null
$ find /etc/dictionaries-common -maxdepth 1 -type l -ls

A missing dictionary directory can be a perfectly valid result on a machine with no ispell dictionary package installed. That is not a reason to invent a dictionary name or hand-edit the generated default file.

Checkpoint: Save the listing, or note the package operation that led you here. The updater regenerates state from package metadata; it does not preserve manual edits to generated files.

3. Understand the ordinary trigger mode

Without --triggered, the program updates its information and tries to enable the update-default-ispell dpkg trigger for a later run. This is the path a maintainer script uses to defer work; it is not a general "refresh everything now" flag.

--skip-symlinks has a narrower job: it tells the updater not to set links in /etc/dictionaries-common. Package configuration can need this while automatically built ispell hashes are not yet available. Skipping links does not select a different default, and it does not stop the database or the other integration files being processed.

That explains a common false alarm: a command can exit successfully while deferring the part that should run after package processing. Check the package manager's transaction and trigger processing rather than assuming a quiet terminal means every link just changed.

4. Run the complete maintenance pass only when required

Warning: Complete mode changes system-managed files and can rebuild dictionary hashes or integration data. Do not run it just to see what it prints. Let the dictionary package's post-installation script, select-default-ispell, or the dictionaries-common post-installation script call it whenever possible.

If you have a specific, authorised repair reason and package documentation tells you to run the helper directly, use the documented complete-mode switch with elevated privileges:

$ sudo update-default-ispell --triggered

The command may produce little or no output. Its work includes rebuilding /var/cache/dictionaries-common/ispell.db, reading the default from debconf, updating the ispell default and editor integrations, and setting default links unless manual mode or --skip-symlinks stops that last step. A successful exit status means the helper completed; it does not prove a particular dictionary was available or that an application is using it.

When a maintainer script specifically needs links to stay untouched while hashes are being built, the documented combination is:

$ sudo update-default-ispell --triggered --skip-symlinks

Use that combination only for the workflow that calls for it. Applying it as a generic fix leaves the default links stale, which is exactly why the option exists.

5. Verify the result without editing generated files

After an authorised run, check the exit status immediately and inspect the outputs again:

$ printf '%s\n' "$?"
0
$ stat /var/cache/dictionaries-common/ispell.db \
    /etc/dictionaries-common/ispell-default
$ ls -l /etc/dictionaries-common

The timestamp should reflect the run, though exact output depends on whether dictionaries are installed and what debconf says the default should be. An empty ispell-default can mean manual mode, or that no usable ispell dictionary exists; do not replace it with a guessed value.

For a package problem, finish the package manager's own recovery path and read its error rather than repeatedly invoking this helper:

$ sudo dpkg --configure -a
$ sudo dpkg --audit

Those commands can configure pending packages, so run them only when you intend to complete that transaction. If they report a particular dictionary package failure, repair that package through your normal package process, then let its maintainer scripts call the updater again.

6. Common traps

If the command fails, keep the exact error, exit status and package-manager context. Check that the package is installed, its dependencies are configured, and the relevant directories are writable by root. Avoid deleting the cache or default files as a first response: removal discards useful evidence and does not repair the package metadata the updater consumes.

Done means