Spyder: Autocomplete doesn't replace text sometimes

Created on 23 Nov 2018  路  19Comments  路  Source: spyder-ide/spyder

Issue Report Checklist

  • [x] Searched the issues page for similar reports
  • [x] Read the relevant sections of the Spyder Troubleshooting Guide and followed its advice
  • [x] Reproduced the issue after updating with conda update spyder (or pip, if not using Anaconda)
  • [x] Could not reproduce inside jupyter qtconsole (if console-related)
  • [x] Tried basic troubleshooting (if a bug/error)

    • [x] Restarted Spyder

    • [x] Reset preferences with spyder --reset

    • [ ] Reinstalled the latest version of Anaconda

    • [ ] Tried the other applicable steps from the Troubleshooting Guide

  • [x] Completed the Problem Description, Steps to Reproduce and Version sections below

Problem Description

Sometimes the autocomplete will not work as expected. Usually after using Spyder for a while

What steps reproduce the problem?

  1. type "np.newa"
  2. press "tab" to get an autocompletion

What is the expected output? What do you see instead?

I would expect "np.newaxis"

Instead I get "np.newanewaxis"

Versions

  • Spyder version: Spyder 4.0.0.dev0
  • Python version: Python 3.7.0 64-bit | Qt 5.9.3 | PyQt5 5.9.2 | Darwin 18.2.0
  • Qt version:
  • PyQt version:
  • Operating System name/version: Mojave 10.14.1

Dependencies


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)

Editor 4-Low Reproduced Bug

All 19 comments

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.

testautocomplete

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.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

spyder-bot picture spyder-bot  路  3Comments

keith-golden picture keith-golden  路  3Comments

yogu220172 picture yogu220172  路  3Comments

goanpeca picture goanpeca  路  3Comments

marianux picture marianux  路  3Comments