Subject: bug#32280: 26.1; FLYSPELL-BUFFER sometimes misbehaves for some input in a large enough buffer

From: Artem Boldarev <[email-masked]>
Date: Thu, 26 Jul 2018 12:44:26 +0300

Checking large enough buffer with FlySpell leads to the unexpected
results (at least, when spell checking Russian, but I believe that it is
possible to reproduce the bug for other languages, at least Ukrainian).

For example, when checking large enough buffer (large enough to trigger
flyspell-large-region) I got the following messages in the *Messages*
buffer:

Local Ispell dictionary set to ru_RU
Starting new Ispell process hunspell with ru_RU dictionary...
Checking region...
Spell Checking...100% [посимвольно]
Spell Checking completed.
  -> смом - 346: word not found
  -> стостояния - 319: word not found
  -> рекрсивного - 308: word not found
  -> универсальнее - 266: word not found
  -> генериует - 222: word not found

It was not able to find the misspelt words to highlight them in the 
buffer which I tried
to spell check. On the other hand, some not misspelt words were 
highlighted (именно,
бесконечный, усложняет).  Under other circumstances, these words are not 
highlighted as misspelt (which is as it should be).

The problem turned out to be in the flyspell-external-point-words: It
makes some heuristic checks before calling (flyspell-word nil t). It
seems that these checks are OK for English, as I never encountered any
problems when spell-checking English texts.

Here is the version of the function which seems to be correct:

(defun flyspell-external-point-words ()
   "Mark words from a buffer listing incorrect words in order of appearance.
The list of incorrect words should be in `flyspell-external-ispell-buffer'.
\(We finish by killing that buffer and setting the variable to nil.)
The buffer to mark them in is `flyspell-large-region-buffer'."
   (let (words-not-found
     (ispell-otherchars (ispell-get-otherchars))
     (buffer-scan-pos flyspell-large-region-beg)
     case-fold-search)
     (with-current-buffer flyspell-external-ispell-buffer
       (goto-char (point-min))
       ;; Loop over incorrect words, in the order they were reported,
       ;; which is also the order they appear in the buffer being checked.
       (while (re-search-forward "\\([^\n]+\\)\n" nil t)
     ;; Bind WORD to the next one.
     (let ((word (match-string 1)) (wordpos (point)))
       ;; Here there used to be code to see if WORD is the same
       ;; as the previous iteration, and count the number of consecutive
       ;; identical words, and the loop below would search for that many.
       ;; That code seemed to be incorrect, and on principle, should
       ;; be unnecessary too. -- rms.
       (if flyspell-issue-message-flag
           (message "Spell Checking...%d%% [%s]"
                (floor (* 100.0 (point)) (point-max))
                word))
       (with-current-buffer flyspell-large-region-buffer
         (goto-char buffer-scan-pos)
         (let ((keep t))
           ;; Iterate on string search until string is found as word,
           ;; not as substring.
           (while keep
         (if (search-forward word
                     flyspell-large-region-end t)
             (let* ((found-list
                 (save-excursion
                   ;; Move back into the match
                   ;; so flyspell-get-word will find it.
                   (forward-char -1)
                   (flyspell-get-word)))
                (found (car found-list))
                (found-length (length found))
                (misspell-length (length word)))
               (when (or
                  ;; Size and content matches, we really found it.
                  (and (= found-length misspell-length)
                       (string= found word))
                  ;; Matches as part of a boundary-char separated
                  ;; word.
                  (member word
                          (split-string found ispell-otherchars))
                  ;; ispell treats beginning of some TeX
                  ;; commands as nroff control sequences
                  ;; and strips them in the list of
                  ;; misspelled words thus giving a
                  ;; non-existent word.  Skip if ispell
                  ;; is used, string is a TeX command
                  ;; (char before beginning of word is
                  ;; backslash) and none of the previous
                  ;; conditions match.
                  (and (not ispell-really-aspell)
                   (save-excursion
                     (goto-char (- (nth 1 found-list) 1))
                     (if (looking-at "[\\]" )
                     t
                       nil))))
             (setq keep nil)
             (flyspell-word nil t)
             ;; Search for next misspelled word will begin from
             ;; end of last validated match.
             (setq buffer-scan-pos (point))))
           ;; Record if misspelling is not found and try new one
           (cl-pushnew (concat " -> " word " - "
                        (int-to-string wordpos))
                               words-not-found :test #'equal)
           (setq keep nil)))))))
       ;; we are done
       (if flyspell-issue-message-flag (message "Spell Checking 
completed.")))
     ;; Warn about not found misspellings
     (dolist (word words-not-found)
       (message "%s: word not found" word))
     ;; Kill and forget the buffer with the list of incorrect words.
     (kill-buffer flyspell-external-ispell-buffer)
     (setq flyspell-external-ispell-buffer nil)))

The important lines are the following:

                  ;; Size and content matches, we really found it.
                  (and (= found-length misspell-length)
                       (string= found word))
                  ;; Matches as part of a boundary-char separated
                  ;; word.
                  (member word
                          (split-string found ispell-otherchars))
                  ;; ispell treats beginning of some TeX
                  ;; commands as nroff control sequences
                  ;; and strips them in the list of
                  ;; misspelled words thus giving a
                  ;; non-existent word.  Skip if ispell
                  ;; is used, string is a TeX command
                  ;; (char before beginning of word is
                  ;; backslash) and none of the previous
                  ;; conditions match.
                  (and (not ispell-really-aspell)
                   (save-excursion
                     (goto-char (- (nth 1 found-list) 1))
                     (if (looking-at "[\\]" )
                     t
                       nil))))

The important parts of my configuration:

     (setq ispell-program-name "hunspell")
     ;; set dictionaries
     (setq ispell-dictionary-alist
           '(("en_GB"
              "[A-Za-z]" "[^A-Za-z]"
              "[']" nil ("-d en_GB") nil iso-8859-1)

             ("ru_RU"
  "[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"
  "[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"
              "[-]" nil ("-d ru_RU") nil utf-8)

             ("uk_UA"
  "[АБВГДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯАабвгдеєжзиіїйклмнопрстуфхцчшщьюя]"
  "[^АБВГДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯАабвгдеєжзиіїйклмнопрстуфхцчшщьюя]"
              "[-']" nil ("-d uk_UA") nil utf-8)
             ))

I hope you will investigate the problem.

In GNU Emacs 26.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.30)
  of 2018-07-05 built on juergen
Windowing system distributor 'HC-Consult', version 11.0.12000000
Recent messages:
Omitted 3 lines.
Omitting...
(Nothing to omit)
Wrote /home/artem/.emacs.data/desktop/emacs.desktop-lock
Desktop: 1 frame, 19 buffers restored, 1 failed to restore.
Turning on magit-auto-revert-mode...done (0.427s, 27 buffers checked)
For information about GNU Emacs and the GNU system, type C-h C-a.
Making completion list...
user-error: Beginning of history; no preceding item
user-error: End of history; no default available

Configured using:
  'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib
  --localstatedir=/var --with-x-toolkit=gtk3 --with-xft --with-modules
  'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong
  -fno-plt' CPPFLAGS=-D_FORTIFY_SOURCE=2
  LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now'

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY
ACL GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS
GTK3 X11 MODULES THREADS LIBSYSTEMD LCMS2

Important settings:
   value of $LANG: en_US.UTF-8
   locale-coding-system: utf-8-unix

Major mode: Text

Minor modes in effect:
   display-line-numbers-mode: t
   desktop-save-mode: t
   global-magit-file-mode: t
   diff-auto-refine-mode: t
   magit-auto-revert-mode: t
   global-git-commit-mode: t
   async-bytecomp-package-mode: t
   gud-tooltip-mode: t
   flyspell-mode: t
   shell-dirtrack-mode: t
   winner-mode: t
   global-auto-complete-mode: t
   ido-everywhere: t
   show-paren-mode: t
   global-auto-revert-mode: t
   cl-old-struct-compat-mode: t
   tooltip-mode: t
   global-eldoc-mode: t
   electric-indent-mode: t
   mouse-wheel-mode: t
   menu-bar-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: t

Load-path shadows:
/home/artem/.emacs.data/elpa/xcscope-20180426.12/xcscope hides 
/usr/share/emacs/site-lisp/xcscope
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox hides 
/usr/share/emacs/26.1/lisp/org/ox
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-texinfo hides 
/usr/share/emacs/26.1/lisp/org/ox-texinfo
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-publish hides 
/usr/share/emacs/26.1/lisp/org/ox-publish
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-org hides 
/usr/share/emacs/26.1/lisp/org/ox-org
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-odt hides 
/usr/share/emacs/26.1/lisp/org/ox-odt
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-md hides 
/usr/share/emacs/26.1/lisp/org/ox-md
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-man hides 
/usr/share/emacs/26.1/lisp/org/ox-man
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-latex hides 
/usr/share/emacs/26.1/lisp/org/ox-latex
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-icalendar 
hides /usr/share/emacs/26.1/lisp/org/ox-icalendar
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-html hides 
/usr/share/emacs/26.1/lisp/org/ox-html
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-beamer hides 
/usr/share/emacs/26.1/lisp/org/ox-beamer
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ox-ascii hides 
/usr/share/emacs/26.1/lisp/org/ox-ascii
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org hides 
/usr/share/emacs/26.1/lisp/org/org
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-w3m hides 
/usr/share/emacs/26.1/lisp/org/org-w3m
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-version hides 
/usr/share/emacs/26.1/lisp/org/org-version
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-timer hides 
/usr/share/emacs/26.1/lisp/org/org-timer
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-table hides 
/usr/share/emacs/26.1/lisp/org/org-table
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-src hides 
/usr/share/emacs/26.1/lisp/org/org-src
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-rmail hides 
/usr/share/emacs/26.1/lisp/org/org-rmail
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-protocol 
hides /usr/share/emacs/26.1/lisp/org/org-protocol
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-plot hides 
/usr/share/emacs/26.1/lisp/org/org-plot
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-pcomplete 
hides /usr/share/emacs/26.1/lisp/org/org-pcomplete
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-mouse hides 
/usr/share/emacs/26.1/lisp/org/org-mouse
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-mobile hides 
/usr/share/emacs/26.1/lisp/org/org-mobile
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-mhe hides 
/usr/share/emacs/26.1/lisp/org/org-mhe
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-macs hides 
/usr/share/emacs/26.1/lisp/org/org-macs
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-macro hides 
/usr/share/emacs/26.1/lisp/org/org-macro
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-loaddefs 
hides /usr/share/emacs/26.1/lisp/org/org-loaddefs
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-list hides 
/usr/share/emacs/26.1/lisp/org/org-list
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-lint hides 
/usr/share/emacs/26.1/lisp/org/org-lint
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-irc hides 
/usr/share/emacs/26.1/lisp/org/org-irc
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-install hides 
/usr/share/emacs/26.1/lisp/org/org-install
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-inlinetask 
hides /usr/share/emacs/26.1/lisp/org/org-inlinetask
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-info hides 
/usr/share/emacs/26.1/lisp/org/org-info
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-indent hides 
/usr/share/emacs/26.1/lisp/org/org-indent
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-id hides 
/usr/share/emacs/26.1/lisp/org/org-id
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-habit hides 
/usr/share/emacs/26.1/lisp/org/org-habit
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-gnus hides 
/usr/share/emacs/26.1/lisp/org/org-gnus
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-footnote 
hides /usr/share/emacs/26.1/lisp/org/org-footnote
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-feed hides 
/usr/share/emacs/26.1/lisp/org/org-feed
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-faces hides 
/usr/share/emacs/26.1/lisp/org/org-faces
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-eww hides 
/usr/share/emacs/26.1/lisp/org/org-eww
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-eshell hides 
/usr/share/emacs/26.1/lisp/org/org-eshell
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-entities 
hides /usr/share/emacs/26.1/lisp/org/org-entities
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-element hides 
/usr/share/emacs/26.1/lisp/org/org-element
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-duration 
hides /usr/share/emacs/26.1/lisp/org/org-duration
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-docview hides 
/usr/share/emacs/26.1/lisp/org/org-docview
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-datetree 
hides /usr/share/emacs/26.1/lisp/org/org-datetree
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-ctags hides 
/usr/share/emacs/26.1/lisp/org/org-ctags
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-crypt hides 
/usr/share/emacs/26.1/lisp/org/org-crypt
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-compat hides 
/usr/share/emacs/26.1/lisp/org/org-compat
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-colview hides 
/usr/share/emacs/26.1/lisp/org/org-colview
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-clock hides 
/usr/share/emacs/26.1/lisp/org/org-clock
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-capture hides 
/usr/share/emacs/26.1/lisp/org/org-capture
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-bibtex hides 
/usr/share/emacs/26.1/lisp/org/org-bibtex
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-bbdb hides 
/usr/share/emacs/26.1/lisp/org/org-bbdb
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-attach hides 
/usr/share/emacs/26.1/lisp/org/org-attach
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-archive hides 
/usr/share/emacs/26.1/lisp/org/org-archive
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/org-agenda hides 
/usr/share/emacs/26.1/lisp/org/org-agenda
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob hides 
/usr/share/emacs/26.1/lisp/org/ob
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-vala hides 
/usr/share/emacs/26.1/lisp/org/ob-vala
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-tangle hides 
/usr/share/emacs/26.1/lisp/org/ob-tangle
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-table hides 
/usr/share/emacs/26.1/lisp/org/ob-table
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-stan hides 
/usr/share/emacs/26.1/lisp/org/ob-stan
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-sqlite hides 
/usr/share/emacs/26.1/lisp/org/ob-sqlite
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-sql hides 
/usr/share/emacs/26.1/lisp/org/ob-sql
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-shen hides 
/usr/share/emacs/26.1/lisp/org/ob-shen
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-shell hides 
/usr/share/emacs/26.1/lisp/org/ob-shell
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-sed hides 
/usr/share/emacs/26.1/lisp/org/ob-sed
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-screen hides 
/usr/share/emacs/26.1/lisp/org/ob-screen
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-scheme hides 
/usr/share/emacs/26.1/lisp/org/ob-scheme
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-sass hides 
/usr/share/emacs/26.1/lisp/org/ob-sass
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-ruby hides 
/usr/share/emacs/26.1/lisp/org/ob-ruby
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-ref hides 
/usr/share/emacs/26.1/lisp/org/ob-ref
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-python hides 
/usr/share/emacs/26.1/lisp/org/ob-python
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-processing 
hides /usr/share/emacs/26.1/lisp/org/ob-processing
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-plantuml hides 
/usr/share/emacs/26.1/lisp/org/ob-plantuml
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-picolisp hides 
/usr/share/emacs/26.1/lisp/org/ob-picolisp
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-perl hides 
/usr/share/emacs/26.1/lisp/org/ob-perl
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-org hides 
/usr/share/emacs/26.1/lisp/org/ob-org
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-octave hides 
/usr/share/emacs/26.1/lisp/org/ob-octave
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-ocaml hides 
/usr/share/emacs/26.1/lisp/org/ob-ocaml
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-mscgen hides 
/usr/share/emacs/26.1/lisp/org/ob-mscgen
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-maxima hides 
/usr/share/emacs/26.1/lisp/org/ob-maxima
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-matlab hides 
/usr/share/emacs/26.1/lisp/org/ob-matlab
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-makefile hides 
/usr/share/emacs/26.1/lisp/org/ob-makefile
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-lua hides 
/usr/share/emacs/26.1/lisp/org/ob-lua
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-lob hides 
/usr/share/emacs/26.1/lisp/org/ob-lob
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-lisp hides 
/usr/share/emacs/26.1/lisp/org/ob-lisp
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-lilypond hides 
/usr/share/emacs/26.1/lisp/org/ob-lilypond
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-ledger hides 
/usr/share/emacs/26.1/lisp/org/ob-ledger
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-latex hides 
/usr/share/emacs/26.1/lisp/org/ob-latex
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-keys hides 
/usr/share/emacs/26.1/lisp/org/ob-keys
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-js hides 
/usr/share/emacs/26.1/lisp/org/ob-js
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-java hides 
/usr/share/emacs/26.1/lisp/org/ob-java
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-io hides 
/usr/share/emacs/26.1/lisp/org/ob-io
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-hledger hides 
/usr/share/emacs/26.1/lisp/org/ob-hledger
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-haskell hides 
/usr/share/emacs/26.1/lisp/org/ob-haskell
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-groovy hides 
/usr/share/emacs/26.1/lisp/org/ob-groovy
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-gnuplot hides 
/usr/share/emacs/26.1/lisp/org/ob-gnuplot
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-fortran hides 
/usr/share/emacs/26.1/lisp/org/ob-fortran
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-forth hides 
/usr/share/emacs/26.1/lisp/org/ob-forth
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-exp hides 
/usr/share/emacs/26.1/lisp/org/ob-exp
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-eval hides 
/usr/share/emacs/26.1/lisp/org/ob-eval
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-emacs-lisp 
hides /usr/share/emacs/26.1/lisp/org/ob-emacs-lisp
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-ebnf hides 
/usr/share/emacs/26.1/lisp/org/ob-ebnf
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-dot hides 
/usr/share/emacs/26.1/lisp/org/ob-dot
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-ditaa hides 
/usr/share/emacs/26.1/lisp/org/ob-ditaa
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-css hides 
/usr/share/emacs/26.1/lisp/org/ob-css
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-core hides 
/usr/share/emacs/26.1/lisp/org/ob-core
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-coq hides 
/usr/share/emacs/26.1/lisp/org/ob-coq
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-comint hides 
/usr/share/emacs/26.1/lisp/org/ob-comint
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-clojure hides 
/usr/share/emacs/26.1/lisp/org/ob-clojure
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-calc hides 
/usr/share/emacs/26.1/lisp/org/ob-calc
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-awk hides 
/usr/share/emacs/26.1/lisp/org/ob-awk
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-asymptote 
hides /usr/share/emacs/26.1/lisp/org/ob-asymptote
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-abc hides 
/usr/share/emacs/26.1/lisp/org/ob-abc
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-R hides 
/usr/share/emacs/26.1/lisp/org/ob-R
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-J hides 
/usr/share/emacs/26.1/lisp/org/ob-J
/home/artem/.emacs.data/elpa/org-plus-contrib-20180709/ob-C hides 
/usr/share/emacs/26.1/lisp/org/ob-C

Features:
(shadow mail-extr emacsbug sendmail linum lisp-mnt macrostep-c cmacexp
macrostep irony-cdb-libclang irony-cdb-json irony-cdb-clang-complete
irony-cdb company-oddmuse company-keywords company-etags company-gtags
company-dabbrev-code company-dabbrev company-files company-capf
company-cmake company-xcode company-clang company-semantic company-eclim
company-bbdb company-irony company-template irony-eldoc flycheck-irony
irony-diagnostics irony-completion irony-snippet ac-slime sort dired-aux
jka-compr display-line-numbers hl-line plan9-theme basic-theme desktop
frameset magit-bookmark magit-obsolete magit-blame magit-stash
magit-bisect magit-remote magit-commit magit-sequence magit-notes
magit-worktree magit-tag magit-merge magit-branch magit-reset
magit-collab ghub let-alist magit-files magit-refs magit-status magit
magit-repos magit-apply magit-wip magit-log which-func imenu magit-diff
smerge-mode diff-mode magit-core magit-autorevert magit-process
magit-margin magit-mode git-commit magit-git magit-section magit-utils
crm magit-popup log-edit message rfc822 mml mml-sec epa derived epg
mm-decode mm-bodies mm-encode mailabbrev gmm-utils mailheader pcvs-util
add-log with-editor async-bytecomp async irony irony-iotask ggtags ewoc
xcscope cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align
cc-engine cc-vars cc-defs deft cl ox-bibtex ox-odt rng-loc rng-uri
rng-parse rng-match rng-dt rng-util rng-pttrn nxml-parse nxml-ns
nxml-enc xmltok nxml-util ox-latex ox-icalendar ox-html table ox-ascii
ox-publish ox org-element avl-tree generator org org-macro org-footnote
org-pcomplete org-list org-faces org-entities org-version ob-emacs-lisp
ob ob-tangle org-src ob-ref ob-lob ob-table ob-keys ob-exp ob-comint
ob-core ob-eval org-compat org-macs org-loaddefs cal-menu calendar
cal-loaddefs robe url-http tls gnutls url-auth mail-parse rfc2231 url-gw
nsm rmc inf-ruby ruby-mode smie flymake-lua company-lua lua-mode rcirc
cargo cargo-process markdown-mode color company-racer deferred company
pcase racer pos-tip f s rust-mode gud flyspell ispell eww puny mm-url
gnus nnheader gnus-util rmail rmail-loaddefs rfc2047 rfc2045 ietf-drums
mail-utils url-queue shr svg xml dom slime-trace-dialog
slime-xref-browser tree-widget wid-edit slime-fancy-inspector
slime-fuzzy slime-c-p-c slime-editing-commands slime-asdf grep
slime-references slime-compiler-notes-tree slime-autodoc slime-repl
slime-parse slime arc-mode archive-mode noutline outline easy-mmode
hyperspec browse-url elec-pair dired-x dired dired-loaddefs esh-var
esh-io esh-cmd esh-opt esh-ext esh-proc esh-arg esh-groups eshell
esh-module esh-mode esh-util bookmark pp url url-proxy url-privacy
url-expand url-methods url-history url-cookie url-domsuf url-util
mailcap tramp tramp-compat tramp-loaddefs trampver ucs-normalize shell
pcomplete parse-time format-spec elisp-slime-nav etags xref project
winner flycheck json map find-func subr-x dash advice flymake-proc
flymake warnings thingatpt auto-complete-config auto-complete edmacro
kmacro popup ido windmove paren autorevert filenotify mm-util mail-prsvr
cl-extra help-mode finder-inf tex-site rx slime-autoloads info package
easymenu epg-config url-handlers url-parse auth-source cl-seq eieio
eieio-core cl-macs eieio-loaddefs password-cache url-vars seq byte-opt
gv compile comint ansi-color ring bytecomp byte-compile cconv server
cl-loaddefs cl-lib time-date mule-util tooltip eldoc electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win
term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode elisp-mode lisp-mode
prog-mode register page menu-bar rfn-eshadow isearch timer select
scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded 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 dbusbind inotify lcms2 dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty
make-network-process emacs)

Memory information:
((conses 16 589646 60784)
  (symbols 48 55348 4)
  (miscs 40 871 2775)
  (strings 32 161266 15744)
  (string-bytes 1 4916243)
  (vectors 16 85794)
  (vector-slots 8 1289279 103516)
  (floats 8 429 500)
  (intervals 56 2676 0)
  (buffers 992 34))