conda update spyder
(or pip
, if not using Anaconda)jupyter qtconsole
(if console-related)spyder --reset
Sometimes the autocomplete will not work as expected. Usually after using Spyder for a while
I would expect "np.newaxis"
Instead I get "np.newanewaxis"
pygments >=2.0 : 2.2.0 (OK)
sphinx >=0.6.6 : 1.8.1 (OK)
psutil >=0.3 : 5.4.7 (OK)
pyls >=0.19.0 : 0.21.2 (OK)
nbconvert >=4.0 : 5.4.0 (OK)
pandas >=0.13.1 : 0.23.4 (OK)
numpy >=1.7 : 1.15.2 (OK)
sympy >=0.7.3 : 1.3 (OK)
cython >=0.21 : 0.28.5 (OK)
qtconsole >=4.2.0 : 4.4.1 (OK)
IPython >=4.0 : 7.0.1 (OK)
matplotlib >=2.0.0: 3.0.0 (OK)
pylint >=0.25 : 2.1.1 (OK)
I can reproduce this on Windows 10 too.
Yes, I noticed that too. It should be an easy fix.
@dalthviz, please work on this one.
I used the latest git clone. If there is the parentheses at the end of the statement, autocomplete does not seem to work well.
@ccordoba12 I do not see how PR #8387 addresses this issue since only the tests were changed.
This issue was already fixed in PR #8257. I only asked @dalthviz to improve a little bit the completion test.
@ok97465, are you using the latest master?
I just updated to the newest master and can reproduce @ok97465
This issue was already fixed in PR #8257. I only asked @dalthviz to improve a little bit the completion test.
Ah ok thanks, that makes sense. For the record, I can reproduce this also on Windows.
@dalthviz, I can reproduce @ok97465 example. You only need to type until line 7 to get the error.
I don't even need any of that:
In an otherwise empty file:
(sli<tab>)
gives (slislice)
but:
(sli<tab>
gives (slice
Ok, so it's the presence of braces which generates that! Thanks @impact27!
More generally this seems to be reproducible whenever there isn't white-space after the word that is being <tab>
completed.
np.ze<tab>,
gives np.zezeros,
Interestingly if there are non punctuation characters after the cursor the completion is even more strange:
np.ze<tab>m
gives np.zeosm
I'm not sure what to do in this case but I think np.zerosm
would be best so the user can continue with a space or brackets and complete the line.
The problem, from what I checked so far, is in the logic of the TextEditBaseWidget.insert_completion
and BaseEditMixin.get_current_word
since it only makes a guess of what is the current word under the cursor and uses the diff in length between the completion and the current word to insert a certain amount of characters
So the "completion" from pls is is the whole word zeros
and not just the actual completion of np.ze
in this case ros
?
Yep, I think so, and then there is where it comes the logic of the diff
According to my reading of this:
https://microsoft.github.io/language-server-protocol/specification#textDocument_completion
It seems like textEdit?: TextEdit;
parameter should give us only the string that is needed for completion from the server.
/**
* A string that should be inserted into a document when selecting
* this completion. When `falsy` the label is used.
*
* The `insertText` is subject to interpretation by the client side.
* Some tools might not take the string literally. For example
* VS Code when code complete is requested in this example `con<cursor position>`
* and a completion item with an `insertText` of `console` is provided it
* will only insert `sole`. Therefore it is recommended to use `textEdit` instead
* since it avoids additional client side interpretation.
*
* @deprecated Use textEdit instead.
*/
insertText?: string;
Checking the current reponse of pyls
at this line, seems like the textEdit
value is not returned. So probably that's why we made the current logic and then textEdit
value needs to be added over pyls
side.
So we could handle this client side (basically fixing the insert_completion
and using the whole word) or appending the textEdit
value to the responses of the completions of pyls
(probably here and here) and managing this value in the QListWidgetItem
(probably as data)
@spyder-ide/core-developers what do you guys think?
Another idea would be to compute the starting prefix between the existing string and the textEdit
value.
Let's talk about this in our meeting tomorrow.