# ISPELL(5) - man - phpMan

[ISPELL(5)](https://www.chedong.com/phpMan.php/man/ISPELL/5/markdown)                                File Formats Manual                               [ISPELL(5)](https://www.chedong.com/phpMan.php/man/ISPELL/5/markdown)



## NAME
       ispell - format of ispell dictionaries and affix files

## DESCRIPTION
       [_Ispell_(1)](https://www.chedong.com/phpMan.php/man/Ispell/1/markdown)  requires  two  files  to define the language that it is spell-checking.  The first
       file is a dictionary containing words for the language, and the second  is  an  "affix"  file
       that  defines  the meaning of special flags in the dictionary.  The two files are combined by
       _buildhash_ (see [_ispell_(1)](https://www.chedong.com/phpMan.php/man/ispell/1/markdown)) and written to a hash file which is not described here.

       A raw _ispell_ dictionary (either the main dictionary or your own personal dictionary) contains
       a list of words, one per line.  Each word may optionally be followed by a slash ("/") and one
       or more flags, which modify the root word as explained below.  Depending on the options  with
       which  _ispell_  was  built,  case may or may not be significant in either the root word or the
       flags, independently.  Specifically, if the compile-time option  CAPITALIZATION  is  defined,
       case  is significant in the root word; if not, case is ignored in the root word.  If the com‐
       pile-time option MASKBITS is set to a value of 32, case is ignored in  the  flags;  otherwise
       case is significant in the flags.  Contact your system administrator or _ispell_ maintainer for
       more information (or use the **-vv** flag to find out).  The dictionary should be sorted with the
### -f
       which is the normal way of building dictionaries.

       If the dictionary contains words that have string characters (see the  affix-file  documenta‐
       tion  below),  they must be written in the format given by the **defstringtype** statement in the
       affix file.  This will be the case for most non-English languages.  Be careful  to  use  this
       format,  rather than that of your favorite formatter, when adding words to a dictionary.  (If
       you add words to your personal dictionary during an _ispell_ session, they  will  automatically
       be converted to the correct format.  This feature can be used to convert an entire dictionary
       if necessary:)

                   echo qqqqq > dummy.dict
                   buildhash dummy.dict _affix-file_ dummy.hash
                   awk '{print "*"}END{print "#"}' _old-dict-file_ \
                   | ispell -a -T _old-dict-string-type_ \
                     -d ./dummy.hash -p ./_new-dict-file_ \
                     > /dev/null
                   rm dummy.*

       The case of the root word controls the case of words accepted by _ispell_, as follows:

       (1)    If the root word appears only in lower case (e.g., _bob_), it will be accepted in  lower
              case, capitalized, or all capitals.

       (2)    If  the  root word appears capitalized (e.g., _Robert_), it will not be accepted in all-
              lower case, but will be accepted capitalized or all in capitals.

       (3)    If the root word appears all in capitals (e.g., _UNIX_), it will only be accepted all in
              capitals.

       (4)    If  the root word appears with a "funny" capitalization (e.g., _ITCorp_), a word will be
              accepted only if it follows that capitalization, or if it appears all in capitals.

       (5)    More than one capitalization of a root word may appear in the dictionary.  Flags  from
              different capitalizations are combined by OR-ing them together.

       Redundant  capitalizations  (e.g.,  _bob_  and _Bob_) will be combined by _buildhash_ and by _ispell_
       (for personal dictionaries), and can be removed from a raw dictionary by _munchlist_.

       For example, the dictionary:

              bob
              Robert
              UNIX
              ITcorp
              ITCorp

       will accept _bob_, _Bob_, _BOB_, _Robert_, _ROBERT_, _UNIX_, _ITcorp_, _ITCorp_, and _ITCORP_, and will  reject
       all others.  Some of the unacceptable forms are _bOb_, _robert_, _Unix_, and _ItCorp_.

       As  mentioned  above,  root words in any dictionary may be extended by flags.  Each flag is a
       single alphabetic character, which represents a prefix or suffix that may  be  added  to  the
       root  to  form  a new word.  For example, in an English dictionary the **D** flag can be added to
       _bathe_ to make _bathed_.  Since flags are represented as a single bit in the hashed  dictionary,
       this  results in significant space savings.  The _munchlist_ script will reduce an existing raw
       dictionary by adding flags when possible.

       When a word is extended with an affix, the affix will be accepted only if it appears  in  the
       same  case  as the initial (prefix) or final (suffix) letter of the word.  Thus, for example,
       the entry _UNIX/M_ in the main dictionary (**M** means add an apostrophe and an "s" to make a  pos‐
       sessive)  would accept _UNIX'S_ but would reject _UNIX's_.  If _UNIX's_ is legal, it must appear as
       a separate dictionary entry, and it will not be combined  by  _munchlist_.   (In  general,  you
       don't  need to worry about these things; _munchlist_ guarantees that its output dictionary will
       accept the same set of words as its input, so all you have to do is add words to the  dictio‐
       nary and occasionally run munchlist to reduce its size).

       As  mentioned,  the  affix  definition  file describes the affixes associated with particular
       flags.  It also describes the character set used by the language.

       Although the affix-definition grammar is designed for a line-oriented layout, it is  actually
       a  free-format yacc grammar and can be laid out weirdly if you want.  Comments are started by
       a pound (sharp) sign (#), and continue to the end of the line.  Backslashes are supported  in
       the  usual fashion (**\**_nnn_, plus specials **\n**, **\r**, **\t**, **\v**, **\f**, **\b**, and the new hex format **\x**_nn_).
       Any character with special meaning to the parser can be changed to an uninterpreted token  by
       backslashing  it;  for  example, you can declare a flag named 'asterisk' or 'colon' with _flag_
       _\*:_ or _flag_ _\::_.

       The grammar will be presented in a top-down fashion, with discussion of each element.  An af‐
       fix-definition file must contain exactly one table:

              _table_     :    [_headers_] [_prefixes_] [_suffixes_]

       At least one of _prefixes_ and _suffixes_ is required.  They can appear in either order.

              _headers_   :    [ _options_ ] _char-sets_

       The headers describe options global to this dictionary and language.  These include the char‐
       acter sets to be used and the formatter, and the defaults for certain _ispell_ flags.

              _options_   :    { _fmtr-stmt_ | _opt-stmt_ | _flag-stmt_ | _num-stmt_ }

       The options statements define the defaults for certain ispell flags  and  for  the  character
       sets used by the formatters.

              _fmtr-stmt_ :    { _nroff-stmt_ | _tex-stmt_ }

       A  _fmtr-stmt_  describes  characters that have special meaning to a formatter.  Normally, this
       statement is not necessary, but some languages may have preempted the usual defaults for  use
       as  language-specific characters.  In this case, these statements may be used to redefine the
       special characters expected by the formatter.

              _nroff-stmt_ :   { **nroffchars** | **troffchars** } _string_

       The **nroffchars** statement allows redefinition of certain _nroff_ control characters.  The string
       given  must  be  exactly  five  characters long, and must list substitutions for the left and
       right parentheses ("()") , the period ("."), the backslash ("\"),  and  the  asterisk  ("*").
       (The  right  parenthesis is not currently used, but is included for completeness.)  For exam‐
       ple, the statement:

              **nroffchars** {}.\\*

       would replace the left and right parentheses with left and right curly braces for purposes of
       parsing  _nroff_/_troff_  strings, with no effect on the others (admittedly a contrived example).
       Note that the backslash is escaped with a backslash.

              _tex-stmt_  :    { **TeXchars** | **texchars** } _string_

       The **TeXchars** statement allows redefinition of  certain  TeX/LaTeX  control  characters.   The
       string  given  must  be exactly thirteen characters long, and must list substitutions for the
       left and right parentheses ("()") , the left and right square brackets ("[]"), the  left  and
       right curly braces ("{}"), the left and right angle brackets ("<>"), the backslash ("\"), the
       dollar sign ("$"), the asterisk ("*"), the period or dot ("."), and the percent  sign  ("%").
       For example, the statement:

              **texchars** ()\[]<\><\>\\$*.%

       would  replace the functions of the left and right curly braces with the left and right angle
       brackets for purposes of parsing TeX/LaTeX constructs, while retaining  their  functions  for
       the  _tib_  bibliographic  preprocessor.  Note that the backslash, the left square bracket, and
       the right angle bracket must be escaped with a backslash.

              _opt-stmt_  :    { _cmpnd-stmt_ | _aff-stmt_ }

              _cmpnd-stmt_ :   **compoundwords** _compound-opt_

              _aff-stmt_  :    **allaffixes** _on-or-off_

              _on-or-off_ :    { **on** | **off** }

              _compound-opt_ : { _on-or-off_ | **controlled** _character_ }

       An _opt-stmt_ controls certain ispell defaults that are best made language-specific.   The  **al**‐‐
       **laffixes**  statement  controls the default for the **-P** and **-m** options to _ispell._  If **allaffixes**
       is turned **off** (the default), _ispell_ will default to the behavior of the _-P_  flag:  root/affix
       suggestions will only be made if there are no "near misses".  If **allaffixes** is turned **on**, _is__‐
       _pell_ will default to the behavior of the _-m_ flag: root/affix suggestions will always be made.
       The  **compoundwords**  statement  controls  the default for the **-B** and **-C** options to _ispell._  If
       **compoundwords** is turned **off** (the default), _ispell_ will default to  the  behavior  of  the  _-B_
       flag:  run-together  words will be reported as errors.  If **compoundwords** is turned **on**, _ispell_
       will default to the behavior of the _-C_ flag: run-together words will be  considered  as  com‐
       pounds if both are in the dictionary.  This is useful for languages such as German and Norwe‐
       gian, which form large numbers of compound words.  Finally, if **compoundwords** is set  to  _con__‐
       _trolled_,  only  words marked with the flag indicated by _character_ (which should not be other‐
       wise used) will be allowed to participate in compound formation.   Because  this  option  re‐
       quires  the  flags  to  be  specified in the dictionary, it is not available from the command
       line.

              _flag-stmt_ :    **flagmarker** _character_

       The **flagmarker** statement describes the character which is used to separate affix  flags  from
       the  root  word in a raw dictionary file.  This must be a character which is not found in any
       word (including in string characters; see below).  The default is "/" because this  character
       is not normally used to represent special characters in any language.

              _num-stmt_  :    **compoundmin** _digit_

       The **compoundmin** statement controls the length of the two components of a compound word.  This
       only has an effect if **compoundwords** is turned **on** or if the **-C** flag is given  to  _ispell_.   In
       that case, only words at least as long as the given minimum will be accepted as components of
       a compound.  The default is 3 characters.

              _char-sets_ :    _norm-sets_ [ _alt-sets_ ]

       The character-set section describes the characters that can be part of a  word,  and  defines
       their collating order.  There must always be a definition of "normal" character sets;  in ad‐
       dition, there may be one or more partial definitions of "alternate" sets which are used  with
       various text formatters.

              _norm-sets_ :    [ _deftype_ ] [ _set-options_ ] _charset-group_

       A  "normal"  character  set  may optionally begin with a definition of the file suffixes that
       make use of this set.  Following this are one or more character-set declarations.

              _deftype_   :         **defstringtype** _name_ _deformatter_ _suffix_*

       The **defstringtype** declaration gives a list of file suffixes which should make use of the  de‐
       fault  string  characters  defined as part of the base character set; it is only necessary if
       string characters are being defined.  The _name_ parameter is a string giving the  unique  name
       associated  with  these suffixes; often it is a formatter name.  If the formatter is a member
       of the troff family, "nroff" should be used for the name associated  with  the  most  popular
       macro package; members of the TeX family should use "tex".  Other names may be chosen freely,
       but they should be kept simple, as they are used in _ispell_ _'s_ **-T** switch to specify a  format‐
       ter  type.  The _deformatter_ parameter specifies the deformatting style to use when processing
       files with the given suffixes.  Currently, this must be **plain**, **tex**, **nroff**, or **html**.  The _suf__‐
       _fix_  parameters  are a whitespace-separated list of strings which, if present at the end of a
       filename, indicate that the associated set of string characters should be used by default for
       this  file.   For  example,  the suffix list for the troff family typically includes suffixes
       such as ".ms", ".me", ".mm", etc.

              _set-options_ :  **options** _charset-options_*

       The **options** declaration activates one or more white-separated options for the given character
       set (default or alternate).  Currently, two options are supported: The **raw**___**display** option in‐
       dicates that string characters should be displayed as-is even if some of their components ap‐
       pear  to  be  non-printing; this option is useful for character sets such as UTF-8 or (if the
       terminal is configured appropriately) ISO Latin-1.  The **squeeze**___**string** option indicates  that
       when  _ispell_  is  interacting with an external client such as _emacs_ (via the **-a** flag), string
       characters should be considered to be of length 1 rather than their  true  length  in  bytes.
       This  option  is  needed to allow _ispell_ to synchronize with _emacs_ when processing files con‐
       taining UTF-8 characters; it should only be given for UTF-8 character sets.

              _charset-group_ :     { _char-stmt_ | _string-stmt_ | _dup-stmt_}*

       A _char-stmt_ describes single characters; a _string-stmt_ describes characters that must  appear
       together  as a string, and which usually represent a single character in the target language.
       Either may also describe conversion between upper and lower case.  A _dup-stmt_ is used to  de‐
       scribe  alternate  forms  of  string characters, so that a single dictionary may be used with
       several formatting programs that use different conventions for representing non-ASCII charac‐
       ters.

              _char-stmt_ :    **wordchars** _character-range_
                        |    **wordchars** _lowercase-range_ _uppercase-range_
                        |    **boundarychars** _character-range_
                        |    **boundarychars** _lowercase-range_ _uppercase-range_
              _string-stmt_ :  **stringchar** _string_
                        |    **stringchar** _lowercase-string_ _uppercase-string_

       Characters  described  with the **boundarychars** statement are considered part of a word only if
       they appear singly, embedded between characters declared with  the  **wordchars**  or  **stringchar**
       statements.   For  example,  if  the  hyphen  is a boundary character (useful in French), the
       string "foo-bar" would be a single  word,  but  "-foo"  would  be  the  same  as  "foo",  and
       "foo--bar" would be two words separated by non-word characters.

       If two ranges or strings are given in a _char-stmt_ or _string-stmt_, the first describes charac‐
       ters that are interpreted as lowercase and the second describes uppercase.  In the case of  a
       **stringchar**  statement,  the  two  strings  must be of the same length.  Also, in a **stringchar**
       statement, the actual strings may contain both uppercase and  characters  themselves  without
       difficulty; for instance, the statement

              stringchar     "\\*(sS"  "\\*(Ss"

       is  legal and will not interfere with (or be interfered with by) other declarations of of "s"
       and "S" as lower and upper case, respectively.

       A final note on string characters: some languages collate certain special  characters  as  if
       they  were strings.  For example, the German "a-umlaut" is traditionally sorted as if it were
       "ae".  Ispell is not capable of this; each character must be treated as an individual entity.
       So  in  certain cases, ispell will sort a list of words into a different order than the stan‐
       dard "dictionary" order for the target language.

              _alt-sets_  :    _alttype_ [ _set-options_ ] [ _alt-stmt_* ]

       Because different formatters use different notations to represent non-ASCII  characters,  _is__‐
       _pell_  must  be  aware of the representations used by these formatters.  These are declared as
       alternate sets of string characters.

              _alttype_   :    **altstringtype** _name_ _suffix_*

       The **altstringtype** statement introduces each set by declaring the  associated  formatter  name
       and filename suffix list.  This name and list are interpreted exactly as in the **defstringtype**
       statement above.  Following this header are one or more _alt-stmt_s which declare the alternate
       string characters used by this formatter.

              _alt-stmt_  :    **altstringchar** _alt-string_ _std-string_

       The  _altstringchar_  statement describes alternate representations for string characters.  For
       example, the -mm macro package of _troff_ represents the German "a-umlaut" as _a\*:_,  while  _TeX_
       uses  the  sequence  _\"a_.   If the _troff_ versions are declared as the standard versions using
       **stringchar**, the _TeX_ versions may be declared as alternates by using the statement

              **altstringchar**  \\\"a     a\\*

       When the **altstringchar** statement is used to specify alternate forms, all forms for a particu‐
       lar  formatter  must  be declared together as a group.  Also, each formatter or macro package
       must provide a complete set of characters, both upper- and lower-case, and the character  se‐
       quences  used  for each formatter must be completely distinct.  Character sequences which de‐
       scribe upper- and lower-case versions of the same printable character must also be  the  same
       length.  It may be necessary to define some new macros for a given formatter to satisfy these
       restrictions.  (The current version of _buildhash_ does not  enforce  these  restrictions,  but
       failure to obey them may result in errors being introduced into files that are processed with
       _ispell_.)

       An important minor point is that _ispell_ assumes that all characters declared as **wordchars**  or
       **boundarychars** will occupy exactly one position on the terminal screen.

       A  single character-set statement can declare either a single character or a contiguous range
       of characters.  A range is given as in egrep and the shell: [a-z] means  lowercase  alphabet‐
       ics;  [^a-z]  means  all  but  lowercase,  etc.   All  character-set  statements are combined
       (unioned) to produce the final list of characters that may be part of a word.  The  collating
       order of the characters is defined by the order of their declaration; if a range is used, the
       characters are considered to have been declared in ASCII order.  Characters  that  have  case
       are collated next to each other, with the uppercase character first.

       The  character-declaration  statements  have  a rather strange behavior caused by its need to
       match each lowercase character with its uppercase equivalent.   In  any  given  **wordchars**  or
       **boundarychars**  statement,  the characters in each range are first sorted into a collating se‐
       quence by their byte values, then matched one-for-one with the other range.  (The two  ranges
       must have the same number of characters).  Thus, for example, the two statements:

              **wordchars** [aeiou] [AEIOU]
              **wordchars** [aeiou] [UOIEA]

       would produce exactly the same effect.  To get the vowels to match up "wrong", you would have
       to use separate statements:

              **wordchars** a U
              **wordchars** e O
              **wordchars** i I
              **wordchars** o E
              **wordchars** u A

       which would cause uppercase 'e' to be 'O', and lowercase 'O' to be 'e'.  This should normally
       be  a  problem only with languages that have been forced to use a strange collating sequence.
       If your uppercase and lowercase letters both collate in the same order, you shouldn't have to
       worry about this "feature".

       The  prefixes and suffixes sections have exactly the same syntax, except for the introductory
       keyword.

              _prefixes_  :    **prefixes** _flagdef_*
              _suffixes_  :    **suffixes** _flagdef_*
              _flagdef_   :    **flag** [*****|**~**] _char_ **:** _repl_*

       A prefix or suffix table consists of an introductory keyword and a list of flag  definitions.
       Flags  can  be defined more than once, in which case the definitions are combined.  Each flag
       controls one or more _repl_s (replacements) which are conditionally applied to  the  beginnings
       or endings of various words.

       Flags  are named by a single character _char_.  Depending on a configuration option, this char‐
       acter can be either any uppercase letter (the default configuration) or any 7-bit ASCII char‐
       acter.  Most languages should be able to get along with just 26 flags.

       A flag character may be prefixed with one or more option characters.  (If you wish to use one
       of the option characters as a flag character, simply enclose it in double quotes.)

       The asterisk (*****) option means that this flag participates in _cross-product_  formation.   This
       only  matters  if  the  file contains both prefix and suffix tables.  If so, all prefixes and
       suffixes marked with an asterisk will be applied in all cross-combinations to the root  word.
       For  example, consider the root _fix_ with prefixes _pre_ and _in_, and suffixes _es_ and _ed_.  If all
       flags controlling these prefixes and suffixes are marked with an asterisk,  then  the  single
       root _fix_ would also generate _prefix_, _prefixes_, _prefixed_, _infix_, _infixes_, _infixed_, _fix_, _fixes_,
       and _fixed_.  Cross-product formation can produce a large number  of  words  quickly,  some  of
       which  may be illegal, so watch out.  If cross-products produce illegal words, _munchlist_ will
       not produce those flag combinations, and the flag will not be useful.

              _repl_ :    _condition_* **>** [ **-** _strip-string_ **,** ] _append-string_

       The **~** option specifies that the associated flag is only active when a compound word is  being
       formed.  This is useful in a language like German, where the form of a word sometimes changes
       inside a compound.

       A _repl_ is a conditional rule for modifying a root word.  Up to 8 _conditions_ may be specified.
       If the _conditions_ are satisfied, the rules on the right-hand side of the _repl_ are applied, as
       follows:

       (1)    If a strip-string is given, it is first stripped from the beginning or ending (as  ap‐
              propriate) of the root word.

       (2)    Then the append-string is added at that point.

       For example, the _condition_ **.**  means "any word", and the _condition_ **Y** means "any word ending in
       Y".  The following (suffix) replacements:

              .    >    MENT
              Y    >    -Y,IES

       would change _induce_ to _inducement_ and _fly_ to _flies_.  (If they were  controlled  by  the  same
       flag,  they  would also change _fly_ to _flyment_, which might not be what was wanted.  _Munchlist_
       can be used to protect against this sort of problem; see the command sequence given below.)

       No matter how much you might wish it, the strings on the right must be  strings  of  specific
       characters,  not ranges.  The reasons are rooted deeply in the way _ispell_ works, and it would
       be difficult or impossible to provide for more flexibility.  For example, you might  wish  to
       write:

              [EY] >    -[EY],IES

       This will not work.  Instead, you must use two separate rules:

              E    >    -E,IES
              Y    >    -Y,IES

       The application of _repl_s can be restricted to certain words with _conditions_:

              _condition_ :    { **.** | _character_ | _range_ }

       A  _condition_  is  a  restriction  on  the characters that adjoin, and/or are replaced by, the
       right-hand side of the _repl_.  Up to 8 _conditions_ may be given, which should be enough context
       for  anyone.  The right-hand side will be applied only if the _conditions_ in the _repl_ are sat‐
       isfied.  The _conditions_ also implicitly define a length; roots shorter  than  the  number  of
       _conditions_  will  not pass the test.  (As a special case, a _condition_ of a single dot "." de‐
       fines a length of zero, so that the rule applies to all words indiscriminately).  This length
       is independent of the separate test that insists that all flags produce an output word length
       of at least four.

       _Conditions_ that are single characters should be separated by white space.   For  example,  to
       specify words ending in "ED", write:

              E D  >    -ED,ING        # As in covered > covering

       If you write:

              ED   >    -ED,ING

       the effect will be the same as:

              [ED] >    -ED,ING

       As  a  final  minor, but important point, it is sometimes useful to rebuild a dictionary file
       using an incompatible suffix file.  For example, suppose you expanded the "R" flag to  gener‐
       ate  "er"  and  "ers"  (thus making the Z flag somewhat obsolete).  To build a new dictionary
       _newdict_ that, using _newaffixes_, will accept exactly the same list of words as  the  old  list
       _olddict_ did using _oldaffixes_, the **-c** switch of _munchlist_ is useful, as in the following exam‐
       ple:

              $ munchlist -c oldaffixes -l newaffixes olddict > newdict

       If you use this procedure, your new dictionary will always accept the same list the  original
       did,  even  if  you  badly screwed up the affix file.  This is because _munchlist_ compares the
       words generated by a flag with the original word list, and refuses to use any flags that gen‐
       erate illegal words.

## EXAMPLES
       As  an example of conditional suffixes, here is the specification of the **S** flag from the Eng‐
       lish affix file:

              flag *S:
                  [^AEIOU]Y  >    -Y,IES    # As in imply > implies
                  [AEIOU]Y   >    S         # As in convey > conveys
                  [SXZH]     >    ES        # As in fix > fixes
                  [^SXZHY]   >    S         # As in bat > bats

       The first line applies to words ending in Y, but not in vowel-Y.  The second  takes  care  of
       the  vowel-Y  words.  The third then handles those words that end in a sibilant or near-sibi‐
       lant, and the last picks up everything else.

       Note that the _conditions_ are written very carefully so that they apply to  disjoint  sets  of
       words.   In  particular,  note that the fourth line excludes words ending in Y as well as the
       obvious SXZH.  Otherwise, it would convert "imply" into "implys".

       Although the English affix file does not do so, you can also have a flag generate  more  than
       one variation on a root word.  For example, we could extend the English "R" flag as follows:

              flag *R:
                 E           >    R         # As in skate > skater
                 E           >    RS        # As in skate > skaters
                 [^AEIOU]Y   >    -Y,IER    # As in multiply > multiplier
                 [^AEIOU]Y   >    -Y,IERS   # As in multiply > multipliers
                 [AEIOU]Y    >    ER        # As in convey > conveyer
                 [AEIOU]Y    >    ERS       # As in convey > conveyers
                 [^EY]       >    ER        # As in build > builder
                 [^EY]       >    ERS       # As in build > builders

       This  flag  would  generate both "skater" and "skaters" from "skate".  This capability can be
       very useful in languages that make use of noun, verb, and adjective endings.   For  instance,
       one could define a single flag that generated all of the German "weak" verb endings.

## SEE ALSO
       [ispell(1)](https://www.chedong.com/phpMan.php/man/ispell/1/markdown)



                                                local                                      [ISPELL(5)](https://www.chedong.com/phpMan.php/man/ISPELL/5/markdown)
