Is there any completion plugin for Emacs?

Hi there,

The Julia REPL is really awesome, quiet comparable to what Common Lisp has.

However the code completion tool is rather weak compared with SLIME.

I wonder if there is any existing (or ongoing) code completion for Emacs users?
(Company only completes built-in functions that is a little bit weak.)

Any clues? Thanks!

Thanks for pointing me to Company. I use dabbrev-expand (part of GNU Emacs) with the following key-binding:

(local-set-key (kbd "S-SPC") 'dabbrev-expand)

Emacs expands every word found in the current and also in other buffers according to your customization. I find it very useful.

you can use lsp-julia with company. lsp-julia uses LanguageServer.jl which is not yet available for julia 0.7/1.0.

Well, company does work with dabbrev source…However it is really far from satisfying.

Considering the quality of Julia’s REPL, it is really a pity not to have a matching completion framework.

By the way, does Julia have completion back-end anyway?
I think it would be really nice to have a completion back-end that can be used by various completion front-end, so that we have a uniformed completion framework for atom, Emacs, Vim etc etc etc.

As far as I’m aware, that is what LanguageServer.jl is all about.

1 Like

I would already be satisfied to have something that works only for emacs. In particular I would really like to bind the completion with tab. Unfortunately, to the best of my knowledge and after some negative empirical test, this does not seem to be doable.

Also, periodically I google emacs completion (\pm julia) and typically I don’t fill any wiser. The lsp-julia using LanguageServer.jl seems interesting. Looking forward the 0.7/1.0 compatibility.

However, my ideal solution would be to embed a (possibly minimal) version of autocompletion into julia-emacs.

I have thought about this when writing julia-repl, and we discussed this recently in an issue. If someone wants to take up the Julia side (having a background process running which one can query about the names in, say, Main of the actual inferior process), then I am happy to help with the Emacs part.

Tab completion in Emacs is doable, but a little bit tricky.

You may have a look at function completion-at-point-functions that might give you some clues.

I personally wrapped my own completion function as below.

  (defun complete-or-indent ()
	"Complete using company-mode or indent current line by checking "
	(interactive)
	(cond
	 ;; When in region, indent the region.
	 ((use-region-p)
	  (indent-region (region-beginning) (region-end)))
	 ;; When yasnippet is active, move to next field.
	 ((yas-active-snippets)
	  (yas-next-field))
	 ;; When it is possible to complete, do it.
	 ((and (string-match-p company-begin-regex (char-to-string (char-before)))
           (call-when-defined 'company-manual-begin))
	  (call-when-defined 'company-complete-common))
	 (t (indent-for-tab-command))))

I bind it to <tab> key in company-mode. Since I am using company and yasnippet, you may modify the code accordingly…

May it be helpful. :smiley:

You may have a look at completion facility of Common Lisp or Clojure, which I think is really powerful.

I always imagine that there would be a similar tool for Julia.

I would like to help, but do not know exactly where to start… :wink:

The question is not about whether this is possible, or how to do it. Replicating SLIME or equivalent is a major undertaking, and as I say in the issue, this is not something I have time for at the moment.

Thank you @sheepduke. I tried your solution but I guess I have a deeper problem with company-mode. Indeed it seems that company mode does not understand. So my first question is how make company-mode understand julia.

For instance if I open a test.jl file and I try to complete

printl

with M-x company-complete it tells me No completion found. If I tab (after the insertion of your lisp function in my .emacs file there is no reaction from emacs side.

Perhaps could you tell me how did you set up company-mode? BTW my Company version is 0.9.6 (from a `M-x company-version).
Thanks in advance!

A

Actually we have talked about two questions:

  1. How to (in general) setup company-mode and make it work with indention;
  2. How to make company-mode work with Julia.

I actually answered the first question.

For the second question…I do not have completion for printl either.

The problem is, currently company-mode just does not know Julia. That is why I started this thread…

Thanks again @sheepduke for the clarification on the lack of support on company mode.

You are welcome. :smiley:

I will update this thread and let you know when something new happens in the future.

Have you guys tried Hippie expand? It works very well for me.