Subject: 24.4; flyspell doesn't work with abbreviations ending in a period

From: Reuben Thomas <[email-masked]>
Date: Fri, 05 Jun 2015 15:06:40 +0100

flyspell marks as incorrect “etc.”, “i.e.”, “e.g.” &c.

flyspell is of course behaving as expected: “.” is in OTHERCHARS, and as
it comes after the word, it is not included.

ispell sets my default dictionary to en_GB (from my locale, I presume),
and I’m using hunspell.

If I run ispell-buffer on a buffer containing the above words, they
pass, which is surprising in that it seems that the OTHERCHARS
specification has not been applied in this case. It is not surprising in
the sense that these definitions are in my dictionary.

The somewhat nonsensical result is that if I run ispell-word on such a
word marked incorrect by flyspell, the first correction offered is the
word I already have, plus a period. If I select it, the net effect is
that an extra period is inserted, and flyspell complains again.

I tried to move “.” to CASECHARS and NOT-CASECHARS in a custom
dictionary definition:

("en_GB" "[[:alpha:].]" "[^[:alpha:].]" "['0-9’-]" t
  ("-d" "en_GB")
  nil utf-8)

but this causes flyspell to give an error saying it got nil where it
expected a stringp in its post-command-hook. In any case, I guess this
would not do what I wanted without adding an inflexion rule to the
dictionary that allowed any word to add “.” (except, ideally, a word
that already ends in a period).

In GNU Emacs 24.4.1 (x86_64-pc-linux-gnu, GTK+ Version 3.10.8)
 of 2014-11-21 on skwd, modified by Debian
Windowing system distributor `The X.Org Foundation', version 11.0.11501000
System Description:	Ubuntu 14.04.2 LTS

Configured using:
 `configure --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/lib
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --with-pop=yes
 --enable-locallisppath=/etc/emacs24:/etc/emacs:/usr/local/share/emacs/24.4/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/24.4/site-lisp:/usr/share/emacs/site-lisp
 --build x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib
 --libexecdir=/usr/lib --localstatedir=/var/lib
 --infodir=/usr/share/info --mandir=/usr/share/man --with-pop=yes
 --enable-locallisppath=/etc/emacs24:/etc/emacs:/usr/local/share/emacs/24.4/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/24.4/site-lisp:/usr/share/emacs/site-lisp
 --with-x=yes --with-x-toolkit=gtk3 --with-toolkit-scroll-bars
 'CFLAGS=-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat
 -Werror=format-security -Wall' CPPFLAGS=-D_FORTIFY_SOURCE=2
 'LDFLAGS=-Wl,-Bsymbolic-functions -Wl,-z,relro''

Important settings:
  value of $LC_MONETARY: en_GB.UTF-8
  value of $LC_NUMERIC: en_GB.UTF-8
  value of $LC_TIME: en_GB.UTF-8
  value of $LANG: en_GB.UTF-8
  value of $XMODIFIERS: @im=local
  locale-coding-system: utf-8-unix

Major mode: Emacs-Lisp

Minor modes in effect:
  TeX-PDF-mode: t
  TeX-source-correlate-mode: t
  shell-dirtrack-mode: t
  paredit-mode: t
  show-paren-mode: t
  savehist-mode: t
  minibuffer-electric-default-mode: t
  icomplete-mode: t
  global-auto-revert-mode: t
  desktop-save-mode: t
  bug-reference-prog-mode: t
  global-undo-tree-mode: t
  undo-tree-mode: t
  global-whitespace-mode: t
  ido-everywhere: t
  dtrt-indent-mode: t
  global-auto-complete-mode: t
  auto-complete-mode: t
  eldoc-mode: t
  tooltip-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: (only . t)

Recent input:
<switch-frame> C-x b A g <tab> <return> C-n C-n C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-f C-f C-f C-f C-f C-f C-f 
C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f 
C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f 
C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f 
C-f C-f C-f C-f C-f C-f C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-p C-p C-p C-p C-p C-p C-p 
C-p C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b 
C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-b C-p 
C-b C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f C-f 
C-x b * N <backspace> M e s s <tab> <return> C-r f 
g g l C-a C-x b <return> C-x b c u s t <tab> <return> 
C-a <switch-frame> <switch-frame> <switch-frame> <help-echo> 
<switch-frame> <down-mouse-1> <mouse-movement> <mouse-movement> 
<drag-mouse-1> M-x r e p o r t - e m a c s - b u g 
<return>

Recent messages:
Applying style hooks... done
Applying style hooks... done
Applying style hooks... done
Applying style hooks... done
Wrote /home/rrt/.emacs.desktop.lock
Desktop: 4 frames, 16 buffers restored.
For information about GNU Emacs and the GNU system, type C-h C-a.
call-interactively: End of buffer [18 times]
Mark saved where search started
Mark set

Load-path shadows:
/home/rrt/.emacs.d/el-get/xrdb-mode/xrdb-mode hides /usr/share/emacs24/site-lisp/emacs-goodies-el/xrdb-mode
/home/rrt/.emacs.d/el-get/csv-mode/csv-mode hides /usr/share/emacs24/site-lisp/emacs-goodies-el/csv-mode
/home/rrt/.emacs.d/el-get/quack/quack hides /usr/share/emacs24/site-lisp/emacs-goodies-el/quack
/home/rrt/.emacs.d/el-get/markdown-mode/markdown-mode hides /usr/share/emacs24/site-lisp/emacs-goodies-el/markdown-mode
/home/rrt/.emacs.d/el-get/filladapt/filladapt hides /usr/share/emacs24/site-lisp/emacs-goodies-el/filladapt
/home/rrt/.emacs.d/el-get/graphviz-dot-mode/graphviz-dot-mode hides /usr/share/emacs24/site-lisp/emacs-goodies-el/graphviz-dot-mode
/home/rrt/.emacs.d/el-get/browse-kill-ring/browse-kill-ring hides /usr/share/emacs24/site-lisp/emacs-goodies-el/browse-kill-ring
/home/rrt/.emacs.d/el-get/apache-mode/apache-mode hides /usr/share/emacs24/site-lisp/emacs-goodies-el/apache-mode
/usr/share/emacs/24.4/site-lisp/debian-startup hides /usr/share/emacs/site-lisp/debian-startup
/home/rrt/.local/share/emacs/site-lisp/lilypond-mode hides /usr/share/emacs/site-lisp/lilypond-mode
/home/rrt/.local/share/emacs/site-lisp/lilypond-what-beat hides /usr/share/emacs/site-lisp/lilypond-what-beat
/usr/share/emacs/24.4/site-lisp/cdargs hides /usr/share/emacs/site-lisp/cdargs
/home/rrt/.emacs.d/el-get/cmake-mode/cmake-mode hides /usr/share/emacs/site-lisp/cmake-mode
/home/rrt/.local/share/emacs/site-lisp/lilypond-init hides /usr/share/emacs/site-lisp/lilypond-init
/home/rrt/.local/share/emacs/site-lisp/lilypond-song hides /usr/share/emacs/site-lisp/lilypond-song
/home/rrt/.local/share/emacs/site-lisp/lilypond-indent hides /usr/share/emacs/site-lisp/lilypond-indent
/home/rrt/.local/share/emacs/site-lisp/lilypond-font-lock hides /usr/share/emacs/site-lisp/lilypond-font-lock
/home/rrt/.local/share/emacs/site-lisp/whitespace hides /usr/share/emacs/24.4/lisp/whitespace
/usr/share/emacs24/site-lisp/dictionaries-common/ispell hides /usr/share/emacs/24.4/lisp/textmodes/ispell
/usr/share/emacs/site-lisp/rst hides /usr/share/emacs/24.4/lisp/textmodes/rst
/usr/share/emacs24/site-lisp/dictionaries-common/flyspell hides /usr/share/emacs/24.4/lisp/textmodes/flyspell
/home/rrt/.emacs.d/el-get/flymake/flymake hides /usr/share/emacs/24.4/lisp/progmodes/flymake
/home/rrt/.emacs.d/el-get/cperl-mode/cperl-mode hides /usr/share/emacs/24.4/lisp/progmodes/cperl-mode

Features:
(shadow sort mail-extr emacsbug message rfc822 mml mml-sec mm-decode
mm-bodies mm-encode mailabbrev gmm-utils mailheader sendmail mail-utils
misearch multi-isearch mule-util plain-tex gitignore-mode conf-mode
latexenc preview prv-emacs tex-buf font-latex latex tex-style tex dbus
xml crm tex-mode shell yaml-mode tern url-http tls url-auth mail-parse
rfc2231 rfc2047 rfc2045 ietf-drums url-gw json js3-mode imenu js3-parse
js3-browse js3-highlight js3-ast js3-messages js3-scan js3-util js3-vars
cc-langs js3-externs adaptive-wrap window-margin face-remap flyspell
ispell goto-addr smart-quotes org-element org-indent org-rmail org-mhe
org-irc org-info org-gnus org-docview doc-view jka-compr image-mode
org-bibtex bibtex org-bbdb org-w3m flymake compile paredit info tex-site
sws-mode-autoloads server paren savehist minibuf-eldef icomplete
autorevert filenotify desktop frameset cus-start cus-load iimage org
org-macro org-footnote org-pcomplete pcomplete org-list org-faces
org-entities noutline outline org-version ob-emacs-lisp ob ob-tangle
ob-ref ob-lob ob-table ob-exp org-src ob-keys ob-comint comint
ansi-color ob-core ob-eval org-compat org-macs org-loaddefs format-spec
find-func cal-menu calendar cal-loaddefs go-mode url url-proxy
url-privacy url-expand url-methods url-history url-cookie url-domsuf
url-util mailcap ffap thingatpt url-parse auth-source gnus-util mm-util
mail-prsvr password-cache url-vars dired-x bug-reference-github
bug-reference vc-git undo-tree diff whitespace locate yasnippet derived
po-mode php-mode etags ring cc-mode cc-fonts cc-guess cc-menus cc-cmds
cc-styles cc-align cc-engine cc-vars cc-defs speedbar sb-image ezimage
dframe init-paredit ido-hacks ido magit-autoloads geiser-load geiser
flymake-point filladapt dtrt-indent csv auto-complete-config
auto-complete edmacro kmacro popup init-eldoc eldoc-extension cl-macs
advice eldoc .loaddefs eieio byte-opt eieio-core el-get
el-get-autoloading el-get-list-packages el-get-dependencies el-get-build
el-get-status pp el-get-methods el-get-fossil el-get-svn el-get-pacman
el-get-github-zip el-get-github-tar el-get-http-zip el-get-http-tar
el-get-hg el-get-go el-get-git-svn el-get-fink el-get-emacswiki
el-get-http el-get-notify help-mode easymenu el-get-emacsmirror
el-get-github el-get-git el-get-elpa package epg-config el-get-darcs
el-get-cvs el-get-bzr el-get-brew el-get-builtin el-get-apt-get
el-get-recipes el-get-byte-compile el-get-custom el-get-core autoload
help-fns lisp-mnt bytecomp byte-compile cconv cl gv cl-loaddefs cl-lib
dired user-site-loaddefs debian-el debian-el-loaddefs emacs-goodies-el
emacs-goodies-custom emacs-goodies-loaddefs easy-mmode dpkg-dev-el
dpkg-dev-el-loaddefs devhelp time-date tooltip electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel x-win x-dnd tool-bar dnd
fontset image regexp-opt fringe tabulated-list newcomment lisp-mode
prog-mode register page menu-bar rfn-eshadow timer select scroll-bar
mouse jit-lock font-lock syntax facemenu font-core frame cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev
minibuffer nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote make-network-process
dbusbind gfilenotify dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty emacs)

Memory information:
((conses 16 603598 45229)
 (symbols 48 50761 0)
 (miscs 40 267 443)
 (strings 32 171824 23445)
 (string-bytes 1 5482137)
 (vectors 16 49781)
 (vector-slots 8 1578059 70586)
 (floats 8 291 310)
 (intervals 56 3314 78)
 (buffers 960 28)
 (heap 1024 62706 2723))

-- 
http://rrt.sc3d.org/