Hi Eric,
> I did look at the elisp backend which it advertised as the prime
> example. That one is quite large compared to your patch. Do you
> think the below would expand out to be much larger? I'm considering
> if xref support would move into it's own file or not.
The xref support for MATLAB in my patch is very short (relatively)
because
- I wrote it as a wrapper around `matlab-shell-which-fcn', which does
the heavy lifing of finding the function in question. Matlab-shell
already has support for jumping to definitions so I reused it. The
downside is that matlab-shell needs to be running for xref support to
work. This is not ideal, but the alternative is to write code to find
function definitions from scratch.
- Only jump to definition is implemented. Two other xref functions:
`xref-backend-apropos' and `xref-find-references', are not implemented
at all. I want to look into adding these, but I'm not sure right now
how to go about it.
> I also note that the elisp version doesn't use require for xref, and
> your patch depends on the feature existing when the code loads. I
> think it does so via:
>
> (declare-function xref-make "xref" (summary location))
>
> Will that work here too?
I think `declare-function' keeps the byte-compiler from complaining and
doesn't do much else. This should help here, though, and checking if
xref is loaded should be unnecessary.
In summary, a slightly modified version of this patch can be included as
preliminary xref support for matlab-mode. It can be its own file if it's
expected to be expanded in the future with `xref-find-references' and
other functionality, and prehaps written in a way as to not require
matlab-shell to be running.
Attached is a patch (as a separate file) with some minor modifications
from last time. For it to be integrated into matlab-mode, one other
piece of configuration is needed:
(add-hook 'xref-backend-definitions #'matlab-shell-xref-activate)
This needs to be added in the matlab-mode major mode definition in
`define-derived-mode matlab-mode' in matlab.el.
Karthik
(declare-function xref-make-prompt "xref" (summary location))
(declare-function xref-make-file-location "xref" (file line column))
(cl-defmethod xref-backend-identifier-at-point ((_backend (eql matlab-shell)))
(let ((ident (matlab-read-word-at-point)))
(and (not (equal ident "")) ident)))
(cl-defmethod xref-backend-definitions ((_backend (eql matlab-shell)) prompt)
(let* ((file-and-flag (matlab-shell-which-fcn prompt))
(built-in-p (cdr file-and-flag))
(file (if built-in-p
(replace-regexp-in-string "/@[^/]+" "" (car file-and-flag))
(car file-and-flag))))
(when (and (not (equal file "")) (file-exists-p file))
(list (xref-make prompt
(xref-make-file-location
file
1 0))))))
(cl-defmethod xref-backend-apropos ((_backend (eql matlab-shell)) pattern)
(xref-backend-definitions 'matlab-shell pattern))
(defun matlab-shell-xref-activate ()
"Function to activate xref backend.
Add this function to `xref-backend-functions' for matlab shell to
use xref to find function and variable definitions."
(and (member major-mode '(matlab-mode matlab-shell-mode org-mode))
(matlab-shell-active-p)
'matlab-shell))
(provide 'matlab-xref)
> In other news I pushed a 'shellcomplete' branch that has a
> `completion-at-point' version of matlab completion, which should
> enable a range of tools to work with MATLAB now. I ended up mixing
> the shell completion with bits of the old local completion to get
> something pretty good.
>
> Thanks Eric
>
> On 11/29/20 3:31 AM, Karthik Chikmagalur wrote:
>> Hi,
>>
>> Please ignore the patch in my previous email, it failed on some edge
>> cases. This one should work better and only use matlab-shell for
>> jumping to definitions when xref is invoked from matlab-mode or
>> matlab-shell-mode.
>>
>> Karthik
>>
>>
>>
>>
>> Karthik Chikmagalur <[email protected]> writes:
>>
>>> Hi Jonathan and Eric,
>>>
>>> Jon, to get help on the function at point you can do something like
>>> this:
>>>
>>> (defun matlab-shell-help-at-point ()
>>> (interactive) (let ((fcn (matlab-read-word-at-point)))
>>> (if (and fcn (not (equal fcn "")))
>>> (matlab-shell-describe-command fcn)))) (define-key
>>> matlab-mode-map (kbd "C-h .") #'matlab-shell-help-at-point)
>>>
>>> Matlab-mode works with company out of the box for me. Can you
>>> describe the error(s) you are getting?
>>>
>>> For jump-to-function you have two options (three including Eric's
>>> suggestion):
>>>
>>> 1. Install dumb-jump from MELPA. Then hitting 'M-.' on a function
>>> name should take you to the definition. Note that this only works
>>> for functions that are defined in m files in the same directory or
>>> project.
>>>
>>> 2. Patch matlab-shell.el with the attached patch, then put
>>>
>>> (add-hook 'xref-backend-functions #'matlab-shell-xref-activate)
>>>
>>> In your init file somewhere. This should enable xref support for
>>> Matlab shell. This should work for all functions that MATLAB shell
>>> knows about, including built-in ones.
>>>
>>> Eric, I'm working on better completion in matlab-mode buffers using
>>> matlab-shell with your patch as a starting point. I should have
>>> something decent in a few days. Could you take a look at the xref
>>> integration? I tested it on matlab built-ins, user functions and
>>> variables, and tried to make sure it failed gracefully when it
>>> couldn't find a definition. More testing is probably required.
>>>
>>> Thanks, Karthik
>>>
>>> diff -u
>>> /home/karthik/.local/share/git/matlab-emacs-src/matlab-shell.el
>>> /home/karthik/.local/share/git/matlab-emacs-src/matlab-shell-new.el
>>> --- /home/karthik/.local/share/git/matlab-emacs-src/matlab-shell.el
>>> 2020-11-28 23:04:08.875674271 -0800 +++
>>> /home/karthik/.local/share/git/matlab-emacs-src/matlab-shell-new.el
>>> 2020-11-28 23:44:32.755934812 -0800 @@ -1536,6 +1536,33 @@
>>> (substring output 0 (match-beginning 0)))))))
>>>
>>>
>>> +;;; MATLAB Shell integration with xref
>>> ======================================== +(when (featurep 'xref) +
>>> (cl-defmethod xref-backend-identifier-at-point ((_backend (eql
>>> matlab-shell))) + (let ((ident (matlab-read-word-at-point))) + (and
>>> (not (equal ident "")) ident))) + + (cl-defmethod
>>> xref-backend-definitions ((_backend (eql matlab-shell)) prompt) +
>>> (let* ((file-and-flag (matlab-shell-which-fcn prompt)) + (built-in-p
>>> (cdr file-and-flag)) + (file (if built-in-p +
>>> (replace-regexp-in-string "/@[^/]+" "" (car file-and-flag)) + (car
>>> file-and-flag)))) + (message file) + (if (file-exists-p file) +
>>> (list (xref-make prompt + (xref-make-file-location + file + 1
>>> 0)))))) + + (cl-defmethod xref-backend-apropos ((_backend (eql
>>> matlab-shell)) pattern) + (xref-backend-definitions 'matlab-shell
>>> pattern)) + + (defun matlab-shell-xref-activate () + "Function to
>>> activate xref backend. +Add this function to
>>> `xref-backend-functions' for matlab shell to use xref to find
>>> function and variable definitions." + (and
>>> (matlab-shell-buffer-barf-not-running) + 'matlab-shell)))
>>> ;;; MATLAB Shell Commands
>>> ===================================================== ;;
>>>
>>> Diff finished. Sat Nov 28 23:44:47 2020 .
>>>
>>> Eric Ludlam <[email protected]> writes:
>>>
>>>> Hi,
>>>>
>>>> The existing matlab completion stuff should work with company .. or
>>>> at least there is code in there referencing company completion
>>>> engine. I was never a fan so I don't use that particular package.
>>>>
>>>> In the MATLAB menu, you will find a "Locate MATLAB function" option
>>>> which is similar to jump-to functionality like etags.
>>>>
>>>> Newer emacsen now how 'xref' as a bit of infrastructure and
>>>> keybinding but matlab mode doesn't plug into it yet. In theory
>>>> matlab mode could hook matlab-shell-locate-fcn into xref but I
>>>> haven't researched how to do that yet.
>>>>
>>>> Eric
>>>>
>>>> On 11/27/20 12:44 AM, Jonathan Sahar wrote:
>>>>> Hi Eric,
>>>>>
>>>>> Thanks so much for taking the time to test it! It's not unique to
>>>>> that sturct. Is there anything that I need/can configure on terms
>>>>> of the completion engine? I'm using company for most other things,
>>>>> maybe there's some conflict, or some missing configuration?
>>>>>
>>>>> Thank you for the patch! I'll try it out, and I'll using Matlab
>>>>> mode from the git source as well.
>>>>>
>>>>> Do you have a pointers for setting up jump-to-function
>>>>> functionally?
>>>>>
>>>>> Thanks again for all the help and information, it's really
>>>>> appreciated.
>>>>>
>>>>> Jonathan
>>>>>
>>>>> On Thu, 26 Nov 2020, 19:01 Eric Ludlam, <[email protected]
>>>>> <mailto:[email protected]>> wrote:
>>>>>
>>>>> Hi Jonathan,
>>>>>
>>>>> I happened to have MATLAB 18a installed and was able to test
>>>>> using matlab.el, and matlab-shell.el from git, but could not
>>>>> replicate a completion problem. Sorry. Is it special to the
>>>>> "EEG" data structure, or does this occur everywhere?
>>>>>
>>>>> You had some other questions too.
>>>>>
>>>>> Matlab mode does support CEDET, but you do not need to use
>>>>> CEDET in order to use matlab mode. MATLAB mode without
>>>>> support packages supports a bunch of different completion
>>>>> features, but most are pretty simple. If you enable CEDET
>>>>> with the data base and have matlab-shell running, it will try
>>>>> to use the shell to find files on your path, but it doesn't
>>>>> use the shell for completions. That code is pretty old and I
>>>>> don't think those bits were every plugged together.
>>>>>
>>>>> I did a little hacking and put together the attached patch
>>>>> that enables completion via MATLAB shell in MATLAB buffers.
>>>>> It is rather primitive as it only does global symbols and
>>>>> knows nothing about the local context, but perhaps it can
>>>>> serve as inspiration for putting something more complete
>>>>> together.
>>>>>
>>>>> Lastly, in a MATLAB buffer, you can type:
>>>>>
>>>>> M-x matlab-shell-describe-command RET
>>>>>
>>>>> on a symbol and it should do vaguely what you were asking for
>>>>> below.
>>>>>
>>>>> Eric
>>>>>
>>>>> On 11/25/20 11:41 AM, Jonathan Sahar wrote:
>>>>> > Hi Eric, thanks for your reply!
>>>>> >
>>>>> > I'm running version '9.4.0.949201 (R2018a) Update 6'. I've
>>>>> > installed matlab-mode through Doom emacs' (package! ...)
>>>>> > directive, but I've looked at the changelog locally and on
>>>>> > sourceforge, and the latest commit is the same one...
>>>>> >
>>>>> > Best, Jonathan
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> > On Wed, 25 Nov 2020 at 18:03, Eric Ludlam
>>>>> > <[email protected]
>>>>> <mailto:[email protected]>
>>>>> > <mailto:[email protected] <mailto:[email protected]>>> wrote:
>>>>> >
>>>>> > Hi Jonathan,
>>>>> >
>>>>> > As new version of MATLAB come out, the text that comes
>>>>> >out for errors, completions, and all sorts of
>>>>> >things change which can break
>>>>> the shell.
>>>>> >
>>>>> > What version of MATLAB are you using, and which version
>>>>> >of
>>>>> the matlab
>>>>> > mode code are you using?
>>>>> >
>>>>> > We made a bunch of updates last winter to ML shell
>>>>> >which you
>>>>> can get
>>>>> > from the git repository:
>>>>> >
>>>>> > https://sourceforge.net/p/matlab-emacs/src/ci/master/tree/
>>>>> >
>>>>> > There are also a few extra fixes on the 'usage1' branch
>>>>> which haven't
>>>>> > been merged into the main branch yet.
>>>>> >
>>>>> > That all said, I don't recall big changes needed for
>>>>> >completion lately. :(
>>>>> >
>>>>> > Eric
>>>>> >
>>>>> >
>>>>> > On 11/18/20 10:03 AM, Jonathan Sahar wrote:
>>>>> > > > I've been working with matlab-mode and
>>>>> >matlab-shell for
>>>>> the last
>>>>> > few > days, and I'm really digging it so far. The
>>>>> >only two
>>>>> things I can't
>>>>> > > get to work properly are completion - neither in
>>>>> >shell,
>>>>> nor in .m
>>>>> > > files - and jumping to function definitions, and I
>>>>> >would
>>>>> really
>>>>> > > appreciate some help with these. when I hit TAB in
>>>>> >shell,
>>>>> my text
>>>>> > > turns into > > |>>
>>>>> >emacsdocomplete('EEG.(cond') | > > and when I hit
>>>>> >RETURN I get (the appropriate): > >
>>>>> >|emacs_completions_output = java.lang.String[]: 'cond'
>>>>> 'condeig' |
>>>>> > > > but it's not integrated into the shell
>>>>> >properly, i.e. I can't choose > which of the above
>>>>> >I want, I have to re-type the command
>>>>> along with
>>>>> > > the chosen completion. In .m files I just get nothing
>>>>> except for
>>>>> > the > word completion for words already in the
>>>>> >buffer - which I've > configured myself. > >
>>>>> >I've read somewhere that the completion is meant to be
>>>>> related to
>>>>> > > CEDET somehow but I couldn't make out much more (I'm
>>>>> working on
>>>>> > Doom > Emacs, and I seen to have CEDET installed,
>>>>> >and can run > matlab-cedet-setup, which does nothing as
>>>>> >far as I can tell). > > As to function
>>>>> >definitions - I don't even know where to
>>>>> start..
>>>>> > I've > read that ctags now supports matlab, but I
>>>>> >don't know
>>>>> where (if)
>>>>> > the > actual .m files for the built-in functions
>>>>> >reside in the
>>>>> install
>>>>> > dir. > > Ideally I'd love to be able to
>>>>> >stand on a function name and be able to > get the
>>>>> >"help funcName" output in another buffer or
>>>>> something (this
>>>>> > > works from the shell). > > Thanks a lot!
>>>>> > >
>>>>> >
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Matlab-emacs-discuss mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/matlab-emacs-discuss
_______________________________________________
Matlab-emacs-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matlab-emacs-discuss