Hi Karthik, I finally had a moment to look at this. Sorry for the delay.
The way xref works is unfamiliar to me, as I haven't used some of the techniques it depends on, so I have questions but don't feel like I can provide any useful feedback.
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.
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?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