emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/matlab-mode 6ec11ebe5a: emacsdocomplete.m: improve matl


From: ELPA Syncer
Subject: [elpa] externals/matlab-mode 6ec11ebe5a: emacsdocomplete.m: improve matlab-shell tab completion for R2025a
Date: Mon, 7 Apr 2025 21:58:42 -0400 (EDT)

branch: externals/matlab-mode
commit 6ec11ebe5a60171e82048557fabf96da7b63b441
Author: John Ciolfi <john.ciolfi.32@gmail.com>
Commit: John Ciolfi <john.ciolfi.32@gmail.com>

    emacsdocomplete.m: improve matlab-shell tab completion for R2025a
    
    This commit updates matlab-shell tab completion to complete filenames in 
R2025a and later.
---
 toolbox/emacsdocomplete.m | 99 +++++++++++++++++++++++++++--------------------
 1 file changed, 57 insertions(+), 42 deletions(-)

diff --git a/toolbox/emacsdocomplete.m b/toolbox/emacsdocomplete.m
index e713b1e001..ac11487590 100644
--- a/toolbox/emacsdocomplete.m
+++ b/toolbox/emacsdocomplete.m
@@ -27,63 +27,71 @@ function emacsdocomplete(substring)
 
     persistent verNum;
     if isempty(verNum)
-        v = ver('MATLAB'); %#ok<*VERMATLAB>
+        v      = ver('MATLAB'); %#ok<*VERMATLAB>
         verNum = str2double(v.Version);
     end
 
+    qStr = strrep(substring, '''', '''''');
+    lStr = num2str(length(substring));
+
     if verNum >= 25 % R2025a and later
 
-        cmd = ['builtin(''_programmingAidsTest'', '''', ''', ...
-               substring, ''', ', num2str(length(substring)), ', [])'];
-        json = evalin('base', cmd);
-        completionInfo = jsondecode(json);
+        cmd   = ['builtin(''_programmingAidsTest'', '''', ''', qStr, ''', ', 
lStr, ', [])'];
+        cInfo = jsondecode(evalin('base', cmd)); % use base workspace for 
variable completions
+        cMap  = dictionary('', true);
+
         disp(['Completions-Lisp:', newline, '''(']);
-        if strcmp(completionInfo.widgetType, 'completion')
-            useCellIndex = iscell(completionInfo.widgetData.choices);
-            nChoices = length(completionInfo.widgetData.choices);
-            for idx = 1 : nChoices
-                if useCellIndex
-                    entry = completionInfo.widgetData.choices{idx};
-                else
-                    entry = completionInfo.widgetData.choices(idx);
-                end
-                if isfield(entry, 'purpose')
-                    purpose = [entry.purpose, ' '];
-                else
-                    purpose = '';
+        if isfield(cInfo, "signatures")
+            sigs  = cInfo.signatures;
+            cSigs = iscell(sigs);
+            for i = 1 : length(sigs)
+                if cSigs, args = sigs{i}.inputArguments; else, args = 
sigs(i).inputArguments; end
+                cArgs = iscell(args);
+                for j = 1 : length(args)
+                    if cArgs, arg = args{j}; else, arg = args(j); end
+                    if isfield(arg, 'widgetData') && isfield(arg.widgetData, 
'choices')
+                        DispCompletionChoices(arg.widgetData.choices);
+                    end
                 end
-                desc = [purpose, '(' entry.matchType, ')'];
-                desc = regexprep(desc,'"', '\\"');
-                disp(['  ("', entry.completion, '" . "', desc, '")']);
             end
+        elseif isfield(cInfo, 'widgetData') && isfield(cInfo.widgetData, 
'choices')
+            DispCompletionChoices(cInfo.widgetData.choices);
         end
         disp(')');
 
     else % R2024b and earlier
 
         if verNum < 8.4
-            % Pre R2014b: partial_string
-            extracmd = '';
+            extracmd = ''; % Pre R2014b: partial_string
         else
-            % Post R2014b: partial_string, caret, num
-            extracmd = [ ', ' num2str(length(substring)) ',0' ];
+            extracmd = [', ', lStr, ', 0']; % Post R2014b: partial_string, 
caret, num
         end
+        cmd = ['matlabMCRprocess_emacs = com.mathworks.jmi.MatlabMCR;' ...
+               'emacs_completions_output = 
matlabMCRprocess_emacs.mtFindAllTabCompletions(''' ...
+               qStr '''' extracmd '),' ...
+               
'clear(''matlabMCRprocess_emacs'',''emacs_completions_output'');'];
+        evalin('base', cmd); % run in base to get completions on base 
workspace variables
 
-        substringQuoted = strrep(substring, '''', '''''');
-
-        command = ...
-            ['matlabMCRprocess_emacs = com.mathworks.jmi.MatlabMCR;' ...
-             'emacs_completions_output = 
matlabMCRprocess_emacs.mtFindAllTabCompletions(''' ...
-             substringQuoted '''' extracmd '),' ...
-             
'clear(''matlabMCRprocess_emacs'',''emacs_completions_output'');'];
-
-        % Completion engine needs to run in the base workspace to know what 
the variables you have
-        % to work with are.
-        evalin('base', command);
+    end
 
+    function DispCompletionChoices(choices)
+        nChoices = length(choices);
+        cChoices = iscell(choices);
+        for choiceIdx = 1 : nChoices
+            if cChoices, entry = choices{choiceIdx}; else, entry = 
choices(choiceIdx); end
+            if ~cMap.isKey(entry.completion)
+                cMap(entry.completion) = true;
+                if isfield(entry, 'purpose'), info = [entry.purpose, ' ']; 
else, info = ''; end
+                desc = [info, '(' entry.matchType, ')'];
+                desc = regexprep(desc, '"', '\\"');
+                comp = regexprep(entry.completion, '"', '\\"');
+                disp(['  ("', comp, '" . "', desc, '")']);
+            end
+        end
     end
 
-end
+end % emacsdocomplete
+
 
 
 function done = UseDashComplete(substring)
@@ -106,11 +114,14 @@ function done = UseDashComplete(substring)
 %       'sub3'
 %
 % See details in `matlab-shell-completion-list'.
+%
+% TODO: remove and use function signatures.
+%       
https://www.mathworks.com/help/mps/restfuljson/matlab-function-signatures-in-json.html
 %
 
     persistent completeSw; % if completeSw(cmd), then supports -complete
     if isempty(completeSw)
-        completeSw=containers.Map();
+        completeSw = containers.Map(); % use containers.Map instead of 
dictionary for old releases
     end
 
     done = false;
@@ -124,13 +135,13 @@ function done = UseDashComplete(substring)
         else
             supportsDashComplete = false; % assume
             f = which(cmd);
-            if regexp(f,'\.m$')
+            if regexp(f, '\.m$')
                 fid=fopen(f, 'r');
                 if fid ~= -1
                     while true
                         l = fgetl(fid);
                         if ~ischar(l), break, end
-                        if regexp(l,'SUPPORTS_DASH_COMPLETE')
+                        if regexp(l, 'SUPPORTS_DASH_COMPLETE')
                             supportsDashComplete = true;
                             break
                         end
@@ -145,11 +156,15 @@ function done = UseDashComplete(substring)
             % For /path/to/cmd.ext we have /path/to/cmd.complete which
             % signals that we can get the completions by calling
             %    CMD -complete ARGS
-            completeCmd = regexprep(substring,'^(\w+)','$1 -complete');
+            completeCmd = regexprep(substring, '^(\w+)', '$1 -complete');
             disp('emacs_completions_output =');
-            evalin('base',completeCmd);
+            evalin('base', completeCmd);
             done = true;
         end
     end
 
 end
+
+% [EOF] toolbox/emacsdocomplete.m
+
+% LocalWords:  ciolfi ludlam zappo gmail Rprocess Sw



reply via email to

[Prev in Thread] Current Thread [Next in Thread]