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