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 <karthikchikmaga...@gmail.com> 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 <ericlud...@gmail.com> 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, <ericlud...@gmail.com
>>>>> <mailto:ericlud...@gmail.com>> 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
>>>>>      > <ericlud...@gmail.com
>>>>>      <mailto:ericlud...@gmail.com>
>>>>>      > <mailto:ericlud...@gmail.com <mailto:ericlud...@gmail.com>>> 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
>>>> Matlab-emacs-discuss@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/matlab-emacs-discuss
_______________________________________________
Matlab-emacs-discuss mailing list
Matlab-emacs-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matlab-emacs-discuss

Reply via email to