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