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

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-29 00:29:09.481302887 -0800
@@ -1536,6 +1536,34 @@
 	      (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))))
+      (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))
+         (matlab-shell-buffer-barf-not-running)
+         'matlab-shell)))
+
 
 ;;; MATLAB Shell Commands =====================================================
 ;;

Diff finished.  Sun Nov 29 00:29:33 2020


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