SiteMap / AllPages / Out

WikiSpell

This piece of code is an extension to WikiMode. It sets the ispell dictionary automatically based on the language returned by the GuessBufferLanguage code.

First, we need to match a language returned by the GuessBufferLanguage code with an ispell dictionary. We define a table to match the languages with the dictionaries (note that I use a non-standard Swiss dictionary for German texts), and we add a new funtion to the hook for switching WikiMode on.

    (defvar guess-language-dictionaries
      '(("fr" . "francais")
        ("en" . "english")
        ("de" . "swiss"))
      "Alist of rules to determine the ispell dictionary for a language.
    Each rule has the form (CODE . DICTIONARY) where CODE is a string to
    identify the language (probably according to ISO 639), and DICTIONARY is
    the name of an ispell dictionary that can be passed to
    `ispell-change-dictionary'.")
    (defun my-wiki-change-ispell-dictionary ()
      "Call `ispell-change-dictionary' with buffer language.
    The buffer language is guessed by `guess-buffer-language'."
      (let ((language (cdr (assoc (guess-buffer-language)
                                  guess-language-dictionaries))))
        (if (null language)
            (message "Language unknown, ispell dictionary unchanged")
          (message "Guessing language: %s" language)
          (ispell-change-dictionary language))))
    (add-hook 'wiki-mode-on-hook 'my-wiki-change-ispell-dictionary)

Now we need to tell ispell that WikiNames must be skipped. This is a little bit difficult since our regexp requires case sensitive matching. That's why I had to advise ispell-region. When used while WikiMode is active, case-fold-search is set to nil. Up to now, I haven't found any problems with that. It is a dirty hack, however.

    (defun my-wiki-ispell-skip-setup ()
      "Modify ispell to exclude WikiNames?.
    We do that by locally setting `ispell-skip-region-alists'.
    This will only work if some advice is given to ispell-region in
    order to do all skipping with `case-fold-search'."
      (make-local-variable 'ispell-skip-region-alists)
      (add-to-list 'ispell-skip-region-alist (list wiki-name-regexp)))
    (add-hook 'wiki-mode-on-hook 'my-wiki-ispell-skip-setup)
    (defadvice ispell-region (around ispell-case-fold activate)
      "When variable `wiki-mode' is non-nil, `case-fold-search' will be
    bound to nil."
      (let ((case-fold-search case-fold-search))
        (when wiki-mode
          (setq case-fold-search nil))
        ad-do-it))

SiteMap / AllPages / Out / kensanata@gmail.com / Last change: 2001-04-27