5

Autocomplete and company completes the word . But is there any package which helps predict the next word expected in the sentence.

3
  • Good question. Maybe clarify whether you mean (1) editing at some position in an existing sentence (e.g. replacing a word or otherwise having Emacs look at the text that follows the cursor to figure out what word you might want to insert) or (2) inserting a word based only on the text that comes before the cursor.
    – Drew
    Commented Dec 17, 2018 at 18:30
  • I tried to predict the next words in this question, but failed.
    – phils
    Commented Dec 17, 2018 at 21:01
  • 1
    Most of the time you are writing the same sentences again and again. Based on the context of what you are writing, the artificial intelligence should predict what the person’s next word would be. As a doctor, I keep writing about patient’s symptoms and signs. In a day I had to repeat myself many times. E.g. If I write lower, it is many times followed by abdominal pain. The software should be able to predict abdominal pain.
    – Vaibhav
    Commented Dec 18, 2018 at 3:50

2 Answers 2

3

You can use company-ngram for this.

showing off company-ngram

Do mind that you'll need to (setq-local company-auto-complete t) and (setq-local company-auto-complete-chars '(? )) to trigger completion after (inserting) a space, not only in the middle of a word and specially after a whitespace.

NOTE: the image is from the repo and is actually licensed under GPLv3.

EDIT: sample code to get it working with markdown-mode

(with-eval-after-load 'company-ngram                                                                                       
  ;; ~/data/ngram/*.txt are used as data                                                                                   
  (setq company-ngram-data-dir "~/data/ngram")                                                                             
  ;; company-ngram supports python 3 or newer                                                                              
  (setq company-ngram-python "pypy3")                                                                                      
  (company-ngram-init)                                                                                                     
  ;; or use `M-x turn-on-company-ngram' and                                                                                
  ;; `M-x turn-off-company-ngram' on individual buffers                                                                    
  ;;                                                                                                                       
  ;; save the cache of candidates                                                                                          
  (run-with-idle-timer 7200 t                                                                                              
                       (lambda ()                                                                                          
                         (company-ngram-command "save_cache")                                                              
                         ))                                                                                                
  )                                                                                                                        

(require 'company-ngram nil t)                                                                                             

;; to make it work with markdown-mode                                                                                      
(require 'markdown-mode)                                                                                                   
(add-hook 'markdown-mode-hook 'company-mode)                                                                               
(add-hook 'markdown-mode-hook (lambda ()                                                                                   
                (add-to-list 'company-backends 'company-ngram-backend)                                                     
                (setq-local company-auto-complete t)                                                                       
                (setq-local company-auto-complete-chars '(? )))) 
12
  • Does it require python installation
    – Vaibhav
    Commented Dec 20, 2018 at 6:28
  • Yes. See the configuration pointer: (setq company-ngram-python "python3") Commented Dec 20, 2018 at 12:54
  • I successfully installed. I have 5 mb txt file which I created by copying all my .org files to one text file. I put it in a ~/data/ngram directory. But now emacs shows an ongoing process even after keeping it running for 5 hours !
    – Vaibhav
    Commented Dec 20, 2018 at 16:26
  • This process is a listening server. It's supposed to be running for company-ngram to work: github.com/kshramt/company-ngram/blob/… Commented Dec 20, 2018 at 16:34
  • Thanks for the suggestion. But I couldn’t get any predictions . Is it working for you?
    – Vaibhav
    Commented Dec 22, 2018 at 2:17
1

dabbrev solves this and is part of the standard Emacs distribution. Suppose that you have already typed "lower abdominal pain" either in the file you are editing or else in an open buffer. If you now type "lower " and then press "M-/", Emacs will insert "abdominal", if you now add a space and press "M-/" again it will insert "pain". If you find that Emacs inserts a thing you do not want (for example you may have typed "lower the boom" and Emacs finds this first so inserts "the"), you simply press "M-/" again and it replaces the thing you do not want by the next possibility it finds.

It is possible to set up dabbrev so that it looks in files that are not open but at this moment I do not remember how this goes; it is just a question of looking this up in the info file for Emacs.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.